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