s/qmail
4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
sqmail-4.2.29a
src
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
13
void
die_usage
()
14
{
15
logmsg(
WHO
,100,USAGE,
"preline cmd [ arg ... ]"
);
16
}
17
18
int
flagufline
= 1;
char
*
ufline
;
19
int
flagrpline
= 1;
char
*
rpline
;
20
int
flagdtline
= 1;
char
*
dtline
;
21
22
char
outbuf
[BUFFER_OUTSIZE];
23
buffer
bo
= BUFFER_INIT(
write
,1,
outbuf
,
sizeof
(
outbuf
));
24
char
inbuf
[BUFFER_INSIZE];
25
buffer
bi
= BUFFER_INIT(read,0,
inbuf
,
sizeof
(
inbuf
));
26
27
int
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
}
main
int main()
Definition:
chkshsgr.c:6
exit.h
_exit
void _exit()
inbuf
char inbuf[BUFFER_INSIZE]
Definition:
preline.c:24
flagufline
int flagufline
Definition:
preline.c:18
die_usage
void die_usage()
Definition:
preline.c:13
dtline
char * dtline
Definition:
preline.c:20
rpline
char * rpline
Definition:
preline.c:19
flagrpline
int flagrpline
Definition:
preline.c:19
bi
buffer bi
Definition:
preline.c:25
ufline
char * ufline
Definition:
preline.c:18
flagdtline
int flagdtline
Definition:
preline.c:20
outbuf
char outbuf[BUFFER_OUTSIZE]
Definition:
preline.c:22
bo
buffer bo
Definition:
preline.c:23
WHO
#define WHO
Definition:
preline.c:11
write
void write()
Generated on Thu Feb 29 2024 20:44:52 for s/qmail by
1.9.6