#include #include #include #include "buffer.h" #include "exit.h" #include "fd.h" #include "fmt.h" #include "logmsg.h" #include "sig.h" #include "wait.h" #include "datetime.h" #define WHO "predate" static char *montab[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; char num[FMT_ULONG]; char outbuf[1024]; int main(int argc, char **argv) { time_t now; struct tm *tm; struct datetime dt; datetime_sec utc; datetime_sec local; int minutes; int pi[2]; buffer bo; int wstat; int pid; sig_pipeignore(); if (!argv[1]) logmsg(WHO, 100, USAGE, "predate child"); if (pipe(pi) == -1) logmsg(WHO, 111, FATAL, "unable to create pipe"); switch (pid = fork()) { case -1: logmsg(WHO, 111, FATAL, "unable to fork"); case 0: close(pi[1]); if (fd_move(0, pi[0]) == -1) logmsg(WHO, 111, FATAL, "unable to set up fds"); sig_pipedefault(); execvp(argv[1], argv + 1); logmsg(WHO, 111, FATAL, B("unable to run: ", argv[1])); } close(pi[0]); buffer_init(&bo, write, pi[1], outbuf, sizeof(outbuf)); time(&now); tm = gmtime(&now); dt.year = tm->tm_year; dt.mon = tm->tm_mon; dt.mday = tm->tm_mday; dt.hour = tm->tm_hour; dt.min = tm->tm_min; dt.sec = tm->tm_sec; utc = datetime_untai(&dt); /* utc == now, if gmtime ignores leap seconds */ tm = localtime(&now); dt.year = tm->tm_year; dt.mon = tm->tm_mon; dt.mday = tm->tm_mday; dt.hour = tm->tm_hour; dt.min = tm->tm_min; dt.sec = tm->tm_sec; local = datetime_untai(&dt); buffer_puts(&bo, "Date: "); buffer_put(&bo, num, fmt_uint(num, dt.mday)); buffer_puts(&bo, " "); buffer_puts(&bo, montab[dt.mon]); buffer_puts(&bo, " "); buffer_put(&bo, num, fmt_uint(num, dt.year + 1900)); buffer_puts(&bo, " "); buffer_put(&bo, num, fmt_uint0(num, dt.hour, 2)); buffer_puts(&bo, ":"); buffer_put(&bo, num, fmt_uint0(num, dt.min, 2)); buffer_puts(&bo, ":"); buffer_put(&bo, num, fmt_uint0(num, dt.sec, 2)); if (local < utc) { minutes = (utc - local + 30) / 60; buffer_puts(&bo, " -"); buffer_put(&bo, num, fmt_uint0(num, minutes / 60, 2)); buffer_put(&bo, num, fmt_uint0(num, minutes % 60, 2)); } else { minutes = (local - utc + 30) / 60; buffer_puts(&bo, " +"); buffer_put(&bo, num, fmt_uint0(num, minutes / 60, 2)); buffer_put(&bo, num, fmt_uint0(num, minutes % 60, 2)); } buffer_puts(&bo, "\n"); buffer_copy(&bo, buffer_0); buffer_flush(&bo); close(pi[1]); if (wait_pid(&wstat, pid) == -1) logmsg(WHO, 111, FATAL, "wait failed"); if (wait_crashed(wstat)) logmsg(WHO, 111, FATAL, "child crashed"); _exit(wait_exitcode(wstat)); }