#include #include #include #include #include #include #define CTIME 1 #define ASCTIME 2 #define TZSET 3 #define LOCALTIME 4 #define GMTIME 5 #define OFFTIME 6 extern struct tm *offtime(); jmp_buf env; char *cp, junk[52]; long l, off; int timeout(), checkppid(); struct tm tmtmp, *tp; main() { register int i; struct itimerval it; u_char c; signal(SIGPIPE, SIG_DFL); for (i = getdtablesize(); --i > 2; ) close(i); /* * Need a timer running while we disassociate from the control terminal * in case of a modem line which has lost carrier. */ timerclear(&it.it_interval); it.it_value.tv_sec = 5; it.it_value.tv_usec = 0; signal(SIGALRM, timeout); setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL); if (setjmp(env) == 0) { i = open("/dev/tty", 0); if (i >= 0) { ioctl(i, TIOCNOTTY, NULL); close(i); } } /* * Now start a timer with one minute refresh. In the signal service * routine, check the parent process id to see if this process has * been orphaned and if so exit. This is primarily aimed at removing * the 'ctimed' process left behind by 'sendmail's multi-fork startup * but may prove useful in preventing accumulation of 'ctimed' processes * in other circumstances as well. Normally this process is short * lived. */ it.it_interval.tv_sec = 60; it.it_interval.tv_usec = 0; it.it_value.tv_sec = 60; it.it_value.tv_usec = 0; signal(SIGALRM, checkppid); setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL); while (read(fileno(stdin), &c, 1) == 1) { switch (c) { case CTIME: l = 0L; getb(fileno(stdin), &l, sizeof l); cp = ctime(&l); write(fileno(stdout), cp, 26); break; case ASCTIME: getb(fileno(stdin), &tmtmp, sizeof tmtmp); cp = asctime(&tmtmp); write(fileno(stdout), cp, 26); break; case TZSET: (void) tzset(); break; case LOCALTIME: l = 0L; getb(fileno(stdin), &l, sizeof l); tp = localtime(&l); write(fileno(stdout), tp, sizeof (*tp)); strcpy(junk, tp->tm_zone); junk[24] = '\0'; write(fileno(stdout), junk, 24); break; case GMTIME: l = 0L; getb(fileno(stdin), &l, sizeof l); tp = gmtime(&l); write(fileno(stdout), tp, sizeof (*tp)); strcpy(junk, tp->tm_zone); junk[24] = '\0'; write(fileno(stdout), junk, 24); break; case OFFTIME: getb(fileno(stdin), &l, sizeof l); getb(fileno(stdin), &off, sizeof off); tp = offtime(&l, off); write(fileno(stdout), tp, sizeof (*tp)); break; default: abort("switch"); } } } getb(f, p, n) int f; register char *p; register int n; { register int i; while (n) { i = read(f, p, n); if (i <= 0) return; p += i; n -= i; } } timeout() { longjmp(env, 1); } checkppid() { if (getppid() == 1) exit(0); }