diff options
Diffstat (limited to 'pies/progman.c')
-rw-r--r-- | pies/progman.c | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/pies/progman.c b/pies/progman.c index 4fa6c81..215500d 100644 --- a/pies/progman.c +++ b/pies/progman.c @@ -213,9 +213,9 @@ progman_register_retranslators () if (IS_PROG (prog)) { struct component *comp = prog->v.p.comp; - if (comp->retr[RETR_OUT] != -1) + if (comp->retr[RETR_OUT].type != retr_null) register_retr (RETR_OUT, prog); - if (comp->retr[RETR_ERR] != -1) + if (comp->retr[RETR_ERR].type != retr_null) register_retr (RETR_ERR, prog); } } @@ -246,7 +246,7 @@ register_prog0 (struct component *comp) comp->act[i] = default_component.act[i]; if (comp->mode != pies_comp_exec) - comp->retr[RETR_OUT] = -1; + comp->retr[RETR_OUT].type = retr_null; link_prog (newp, 0); return newp; @@ -348,24 +348,54 @@ retr_exit (int sig) } int -open_retranslator (struct prog *master, int type) +redirect_to_file (struct prog *master, int stream) +{ + struct passwd *pw; + int fd = open (master->v.p.comp->retr[stream].v.file, O_RDWR|O_CREAT, + 0644 & ~master->v.p.comp->umask); + if (fd == -1) + { + mu_error (_("cannot open output file %s: %s"), + master->v.p.comp->retr[stream].v.file, + mu_strerror (errno)); + return -1; + } + /* Fix file ownership */ + pw = getpwnam (master->v.p.comp->privs.user); + if (pw) + chown (master->v.p.comp->retr[stream].v.file, pw->pw_uid, pw->pw_gid); + return fd; +} + +int +open_retranslator (struct prog *master, int stream) { int p[2]; FILE *fp; char *buf = NULL; size_t size = 0; pid_t pid; - int i; + int i, prio; char *tag; - if (master->v.p.comp->retr[type] == -1) - return -1; + switch (master->v.p.comp->retr[stream].type) + { + case retr_null: + return -1; + + case retr_file: + return redirect_to_file (master, stream); + + case retr_syslog: + break; + } + pipe (p); switch (pid = fork ()) { case 0: /* Retranslator process */ - tag = retr_tag (master->tag, type); + tag = retr_tag (master->tag, stream); mf_proctitle_format ("pies: %s retranslator", tag); free (tag); @@ -383,8 +413,9 @@ open_retranslator (struct prog *master, int type) if (fp == NULL) exit (1); openlog (master->tag, LOG_PID, master->facility); + prio = master->v.p.comp->retr[stream].v.prio; while (getline (&buf, &size, fp) > 0) - syslog (master->v.p.comp->retr[type], "%s", buf); + syslog (prio, "%s", buf); exit (0); case -1: @@ -394,7 +425,7 @@ open_retranslator (struct prog *master, int type) return -1; default: - update_retr (type, master, pid); + update_retr (stream, master, pid); close (p[0]); return p[1]; } @@ -687,7 +718,7 @@ prog_start (struct prog *prog) if (retr[RETR_OUT] == -1) { close (1); - open ("/dev/null", O_RDWR); + open ("/dev/null", O_WRONLY); } else if (retr[RETR_OUT] != 1) { @@ -707,7 +738,7 @@ prog_start (struct prog *prog) if (retr[RETR_ERR] == -1) { close (2); - open ("/dev/null", O_RDWR); + open ("/dev/null", O_WRONLY); } else if (retr[RETR_ERR] != 1) { |