summaryrefslogtreecommitdiffstats
path: root/maildrop/filter.C
diff options
context:
space:
mode:
authorSam Varshavchik2017-07-23 23:16:48 -0400
committerSam Varshavchik2017-07-23 23:16:48 -0400
commit4238d38f75d45793521a3b49ba421413d2b53a21 (patch)
tree241d230890014f5e69ae4738cdf0f520dafc1992 /maildrop/filter.C
parentde2a130974e1a76daa1893e18442154c7fc90321 (diff)
downloadcourier-libs-4238d38f75d45793521a3b49ba421413d2b53a21.tar.bz2
maildrop: add the "system" command.
Diffstat (limited to 'maildrop/filter.C')
-rw-r--r--maildrop/filter.C63
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);
+ }
+}