diff options
| author | Sam Varshavchik | 2017-07-23 23:16:48 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2017-07-23 23:16:48 -0400 | 
| commit | 4238d38f75d45793521a3b49ba421413d2b53a21 (patch) | |
| tree | 241d230890014f5e69ae4738cdf0f520dafc1992 /maildrop/filter.C | |
| parent | de2a130974e1a76daa1893e18442154c7fc90321 (diff) | |
| download | courier-libs-4238d38f75d45793521a3b49ba421413d2b53a21.tar.bz2 | |
maildrop: add the "system" command.
Diffstat (limited to 'maildrop/filter.C')
| -rw-r--r-- | maildrop/filter.C | 63 | 
1 files changed, 62 insertions, 1 deletions
| diff --git a/maildrop/filter.C b/maildrop/filter.C index d59e2ec..abc3872 100644 --- a/maildrop/filter.C +++ b/maildrop/filter.C @@ -100,7 +100,7 @@ pid_t	pid=fork();  		{  			if (write(2, p, strlen(p)) < 0 ||  			    write(2, "\n", 1) < 0) -				; /* ignore */  +				; /* ignore */  			_exit(100);  		}  #if NEED_NONCONST_EXCEPTIONS @@ -273,3 +273,64 @@ int	wait_stat;  		return (-1);  	return (0);  } + +void executesystem(const char *cmd) +{ +	int devnull=open("/dev/null", O_RDONLY); +	pid_t	pid; + +	if (devnull < 0) +		throw "Cannot open /dev/null"; + +	pid=fork(); +	if (pid < 0) +	{ +		close(devnull); +		throw "Cannot fork."; +	} + +	if (pid == 0) +	{ +		try +		{ +			dup2(devnull, 0); +			close(devnull); +			subshell(cmd); +		} +		catch (const char *p) +		{ +			if (write(2, p, strlen(p)) < 0 || +			    write(2, "\n", 1) < 0) +				; /* ignore */ +			_exit(100); +		} +#if NEED_NONCONST_EXCEPTIONS +		catch (char *p) +		{ +			if (write(2, p, strlen(p)) < 0 || +			    write(2, "\n", 1) < 0) +				; /* ignore */ +			_exit(100); +		} +#endif +		catch (...) +		{ +			_exit(101); +		} +	} +	close(devnull); + +int	wait_stat; + +	while (wait(&wait_stat) != pid) +		; +	wait_stat= WIFEXITED(wait_stat) ? WEXITSTATUS(wait_stat):-1; + +	{ +	Buffer	name, val; + +		val.append( (unsigned long)wait_stat); +		name="RETURNCODE"; +		SetVar(name, val); +	} +} | 
