aboutsummaryrefslogtreecommitdiff
path: root/pies/progman.c
diff options
context:
space:
mode:
Diffstat (limited to 'pies/progman.c')
-rw-r--r--pies/progman.c55
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)
{

Return to:

Send suggestions and report system problems to the System administrator.