s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
preline.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "fd.h"
3#include "buffer.h"
4#include "exit.h"
5#include "wait.h"
6#include "env.h"
7#include "sig.h"
8#include "getoptb.h"
9#include "logmsg.h"
10
11#define WHO "preline"
12
14{
15 logmsg(WHO,100,USAGE,"preline cmd [ arg ... ]");
16}
17
18int flagufline = 1; char *ufline;
19int flagrpline = 1; char *rpline;
20int flagdtline = 1; char *dtline;
21
22char outbuf[BUFFER_OUTSIZE];
23buffer bo = BUFFER_INIT(write,1,outbuf,sizeof(outbuf));
24char inbuf[BUFFER_INSIZE];
25buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
26
27int main(int argc, char **argv)
28{
29 int opt;
30 int pi[2];
31 int pid;
32 int wstat;
33
34 sig_pipeignore();
35
36 if (!(ufline = env_get("UFLINE"))) die_usage();
37 if (!(rpline = env_get("RPLINE"))) die_usage();
38 if (!(dtline = env_get("DTLINE"))) die_usage();
39
40 while ((opt = getopt(argc,argv,"frdFRD")) != opteof)
41 switch (opt) {
42 case 'f': flagufline = 0; break;
43 case 'r': flagrpline = 0; break;
44 case 'd': flagdtline = 0; break;
45 case 'F': flagufline = 1; break;
46 case 'R': flagrpline = 1; break;
47 case 'D': flagdtline = 1; break;
48 default: die_usage();
49 }
50 argc -= optind;
51 argv += optind;
52 if (!*argv) die_usage();
53
54 if (pipe(pi) == -1)
55 logmsg(WHO,111,FATAL,"unable to create pipe");
56
57 pid = fork();
58 if (pid == -1)
59 logmsg(WHO,111,FATAL,"unable to fork");
60
61 if (pid == 0) {
62 close(pi[1]);
63 if (fd_move(0,pi[0]) == -1)
64 logmsg(WHO,111,FATAL,"unable to set up fds");
65 sig_pipedefault();
66 execvp(*argv,argv);
67 logmsg(WHO,errno,FATAL,B("unable to run: ",*argv));
68 }
69 close(pi[0]);
70 if (fd_move(1,pi[1]) == -1)
71 logmsg(WHO,111,FATAL,"unable to set up fds");
72
73 if (flagufline) buffer_puts(&bo,ufline);
74 if (flagrpline) buffer_puts(&bo,rpline);
75 if (flagdtline) buffer_puts(&bo,dtline);
76 if (buffer_copy(&bo,&bi) != 0)
77 logmsg(WHO,111,FATAL,"unable to copy input");
78 buffer_flush(&bo);
79 close(1);
80
81 if (wait_pid(&wstat,pid) == -1)
82 logmsg(WHO,111,FATAL,"wait failed");
83 if (wait_crashed(wstat))
84 logmsg(WHO,111,FATAL,"child crashed");
85 _exit(wait_exitcode(wstat));
86}
int main()
Definition: chkshsgr.c:6
void _exit()
char inbuf[BUFFER_INSIZE]
Definition: preline.c:24
int flagufline
Definition: preline.c:18
void die_usage()
Definition: preline.c:13
char * dtline
Definition: preline.c:20
char * rpline
Definition: preline.c:19
int flagrpline
Definition: preline.c:19
buffer bi
Definition: preline.c:25
char * ufline
Definition: preline.c:18
int flagdtline
Definition: preline.c:20
char outbuf[BUFFER_OUTSIZE]
Definition: preline.c:22
buffer bo
Definition: preline.c:23
#define WHO
Definition: preline.c:11
void write()