s/qmail 4.3.20
Next generation secure email transport
Loading...
Searching...
No Matches
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
16static char *montab[12] = {
17"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
18};
19
20char num[FMT_ULONG];
22
23int main(int argc, char * const *argv)
24{
25 time_t now;
26 struct tm *tm;
27 struct datetime dt;
28 datetime_sec utc;
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;
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}
int main()
Definition: chkshsgr.c:6
buffer bo
Definition: columnt.c:13
datetime_sec datetime_untai(struct datetime *dt)
Definition: datetime.c:57
long datetime_sec
Definition: datetime.h:15
void _exit(int)
datetime_sec now()
Definition: now.c:5
char outbuf[BUFSIZE_LINE]
Definition: predate.c:21
char num[FMT_ULONG]
Definition: predate.c:20
#define WHO
Definition: predate.c:14
char * local
Definition: qmail-getpw.c:18
struct datetime dt
Definition: qmail-queue.c:35
#define BUFSIZE_LINE
Definition: qmail.h:8
int hour
Definition: datetime.h:5
int mon
Definition: datetime.h:11
int min
Definition: datetime.h:6
int mday
Definition: datetime.h:9
int sec
Definition: datetime.h:7
int year
Definition: datetime.h:12
void write()