s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
condredirect.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "sig.h"
3#include "exit.h"
4#include "env.h"
5#include "logmsg.h"
6#include "wait.h"
7#include "seek.h"
8#include "qmail.h"
9#include "buffer.h"
10#include "fmt.h"
11
12#define WHO "condredirect"
13
14struct qmail qqt;
15
16ssize_t mywrite(int fd,char *buf,int len)
17{
18 qmail_put(&qqt,buf,len);
19 return len;
20}
21
22char inbuf[BUFFER_INSIZE];
23buffer bi = BUFFER_INIT(read,0,inbuf,sizeof(inbuf));
24char outbuf[1];
25buffer bo = BUFFER_INIT(mywrite,-1,outbuf,sizeof(outbuf));
26
27char num[FMT_ULONG];
28
29int main(int argc,char **argv)
30{
31 char *sender;
32 char *dtline;
33 int pid;
34 int wstat;
35 char *qqx;
36
37 if (!argv[1] || !argv[2])
38 logmsg(WHO,100,USAGE,"condredirect newaddress program [ arg ... ]");
39
40 pid = fork();
41 if (pid == -1)
42 logmsg(WHO,111,FATAL,"unable to fork: ");
43 if (pid == 0) {
44 execvp(argv[2],argv + 2);
45 if (errno) _exit(111);
46 _exit(100);
47 }
48 if (wait_pid(&wstat,pid) == -1)
49 logmsg(WHO,111,FATAL,"wait failed");
50 if (wait_crashed(wstat))
51 logmsg(WHO,111,FATAL,"child crashed");
52 switch (wait_exitcode(wstat)) {
53 case 0: break;
54 case 111: logmsg(WHO,111,FATAL,"temporary child error");
55 default: _exit(0);
56 }
57
58 if (seek_begin(0) == -1)
59 logmsg(WHO,111,FATAL,"unable to rewind: ");
60 sig_pipeignore();
61
62 sender = env_get("SENDER");
63 if (!sender) logmsg(WHO,100,ERROR,"SENDER not set");
64 dtline = env_get("DTLINE");
65 if (!dtline) logmsg(WHO,100,ERROR,"DTLINE not set");
66
67 if (qmail_open(&qqt) == -1)
68 logmsg(WHO,111,FATAL,"unable to fork: ");
70 if (buffer_copy(&bo,&bi) != 0)
71 logmsg(WHO,111,FATAL,"unable to read message: ");
72 buffer_flush(&bo);
73
74 num[fmt_ulong(num,qmail_qp(&qqt))] = 0;
75
77 qmail_to(&qqt,argv[1]);
78 qqx = qmail_close(&qqt);
79 if (*qqx) logmsg(WHO,*qqx == 'D' ? 100 : 111,FATAL,qqx + 1);
80 logmsg(WHO,0,LOG,B("qp ",num));
81}
int main()
Definition: chkshsgr.c:6
ssize_t mywrite(int fd, char *buf, int len)
Definition: condredirect.c:16
char inbuf[BUFFER_INSIZE]
Definition: condredirect.c:22
struct qmail qqt
Definition: condredirect.c:14
char num[FMT_ULONG]
Definition: condredirect.c:27
buffer bi
Definition: condredirect.c:23
char outbuf[1]
Definition: condredirect.c:24
buffer bo
Definition: condredirect.c:25
#define WHO
Definition: condredirect.c:12
void _exit()
stralloc sender
Definition: fastforward.c:71
char * dtline
Definition: fastforward.c:70
char buf[100+FMT_ULONG]
Definition: hier.c:10
int fd
void qmail_to(struct qmail *, char *)
Definition: qmail.c:83
void qmail_from(struct qmail *, char *)
Definition: qmail.c:73
void qmail_put(struct qmail *, char *, int)
Definition: qmail.c:63
char * qmail_close(struct qmail *)
Definition: qmail.c:90
unsigned long qmail_qp(struct qmail *)
Definition: qmail.c:53
void qmail_puts(struct qmail *, char *)
Definition: qmail.c:68
int qmail_open(struct qmail *)
Definition: qmail.c:21
Definition: qmail.h:6
unsigned long pid
Definition: qmail.h:8