s/qmail
4.3.21
Next generation secure email transport
Loading...
Searching...
No Matches
4.3
sqmail-4.3.21
src
predate.c
Go to the documentation of this file.
1
#include <sys/types.h>
2
#include <time.h>
3
#include <unistd.h>
4
#include "
datetime.h
"
5
#include "wait.h"
6
#include "fd.h"
7
#include "fmt.h"
8
#include "logmsg.h"
9
#include "buffer.h"
10
#include "
exit.h
"
11
#include "sig.h"
12
#include "
qmail.h
"
13
14
#define WHO "predate"
15
16
static
char
*montab[12] = {
17
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"Jun"
,
"Jul"
,
"Aug"
,
"Sep"
,
"Oct"
,
"Nov"
,
"Dec"
18
};
19
20
char
num
[FMT_ULONG];
21
char
outbuf
[
BUFSIZE_LINE
];
22
23
int
main
(
int
argc,
char
*
const
*argv)
24
{
25
time_t
now
;
26
struct
tm *tm;
27
struct
datetime
dt
;
28
datetime_sec
utc;
29
datetime_sec
local
;
30
int
minutes;
31
int
pi[2];
32
buffer
bo
;
33
int
wstat;
34
int
pid;
35
36
sig_pipeignore();
37
38
if
(!argv[1])
39
logmsg(
WHO
,100,USAGE,
"predate child"
);
40
41
if
(pipe(pi) == -1)
42
logmsg(
WHO
,111,FATAL,
"unable to create pipe"
);
43
44
switch
(pid = fork()) {
45
case
-1:
46
logmsg(
WHO
,111,FATAL,
"unable to fork"
);
47
case
0:
48
close(pi[1]);
49
if
(fd_move(0,pi[0]) == -1)
50
logmsg(
WHO
,111,FATAL,
"unable to set up fds"
);
51
sig_pipedefault();
52
execvp(argv[1],argv + 1);
53
logmsg(
WHO
,111,FATAL,B(
"unable to run: "
,argv[1]));
54
}
55
close(pi[0]);
56
buffer_init(&
bo
,
write
,pi[1],
outbuf
,
sizeof
(
outbuf
));
57
58
time(&
now
);
59
60
tm = gmtime(&
now
);
61
dt
.year = tm->tm_year;
62
dt
.mon = tm->tm_mon;
63
dt
.mday = tm->tm_mday;
64
dt
.hour = tm->tm_hour;
65
dt
.min = tm->tm_min;
66
dt
.sec = tm->tm_sec;
67
utc =
datetime_untai
(&
dt
);
/* utc == now, if gmtime ignores leap seconds */
68
69
tm = localtime(&
now
);
70
dt
.year = tm->tm_year;
71
dt
.mon = tm->tm_mon;
72
dt
.mday = tm->tm_mday;
73
dt
.hour = tm->tm_hour;
74
dt
.min = tm->tm_min;
75
dt
.sec = tm->tm_sec;
76
local
=
datetime_untai
(&
dt
);
77
78
buffer_puts(&
bo
,
"Date: "
);
79
buffer_put(&
bo
,
num
,fmt_uint(
num
,
dt
.mday));
80
buffer_puts(&
bo
,
" "
);
81
buffer_puts(&
bo
,montab[
dt
.mon]);
82
buffer_puts(&
bo
,
" "
);
83
buffer_put(&
bo
,
num
,fmt_uint(
num
,
dt
.year + 1900));
84
buffer_puts(&
bo
,
" "
);
85
buffer_put(&
bo
,
num
,fmt_uint0(
num
,
dt
.hour,2));
86
buffer_puts(&
bo
,
":"
);
87
buffer_put(&
bo
,
num
,fmt_uint0(
num
,
dt
.min,2));
88
buffer_puts(&
bo
,
":"
);
89
buffer_put(&
bo
,
num
,fmt_uint0(
num
,
dt
.sec,2));
90
91
if
(
local
< utc) {
92
minutes = (utc -
local
+ 30) / 60;
93
buffer_puts(&
bo
,
" -"
);
94
buffer_put(&
bo
,
num
,fmt_uint0(
num
,minutes / 60,2));
95
buffer_put(&
bo
,
num
,fmt_uint0(
num
,minutes % 60,2));
96
}
97
else
{
98
minutes = (
local
- utc + 30) / 60;
99
buffer_puts(&
bo
,
" +"
);
100
buffer_put(&
bo
,
num
,fmt_uint0(
num
,minutes / 60,2));
101
buffer_put(&
bo
,
num
,fmt_uint0(
num
,minutes % 60,2));
102
}
103
104
buffer_puts(&
bo
,
"\n"
);
105
buffer_copy(&
bo
,buffer_0);
106
buffer_flush(&
bo
);
107
close(pi[1]);
108
109
if
(wait_pid(&wstat,pid) == -1)
110
logmsg(
WHO
,111,FATAL,
"wait failed"
);
111
if
(wait_crashed(wstat))
112
logmsg(
WHO
,111,FATAL,
"child crashed"
);
113
_exit
(wait_exitcode(wstat));
114
}
WHO
#define WHO
Definition
bouncesaying.c:8
main
int main()
Definition
chkshsgr.c:6
num
char num[FMT_ULONG]
Definition
chkspawn.c:8
outbuf
char outbuf[BUFSIZE_MESS]
Definition
columnt.c:12
bo
buffer bo
Definition
columnt.c:13
datetime_untai
datetime_sec datetime_untai(struct datetime *dt)
Definition
datetime.c:57
datetime.h
datetime_sec
long datetime_sec
Definition
datetime.h:15
exit.h
_exit
void _exit(int)
now
datetime_sec now()
Definition
now.c:5
local
char * local
Definition
qmail-getpw.c:18
dt
struct datetime dt
Definition
qmail-queue.c:35
qmail.h
BUFSIZE_LINE
#define BUFSIZE_LINE
Definition
qmail.h:8
datetime
Definition
datetime.h:4
write
void write()
Generated on
for s/qmail by
1.14.0