|
|
1.1 root 1: #include <signal.h>
2: #include <stdio.h>
3: #include <setjmp.h>
4: #include <sys/ioctl.h>
5: #include <sys/types.h>
6: #include <sys/time.h>
7:
8: #define CTIME 1
9: #define ASCTIME 2
10: #define TZSET 3
11: #define LOCALTIME 4
12: #define GMTIME 5
13: #define OFFTIME 6
14:
15: extern struct tm *offtime();
16:
17: jmp_buf env;
18: char *cp, junk[52];
19: long l, off;
20: int timeout(), checkppid();
21: struct tm tmtmp, *tp;
22:
23: main()
24: {
25: register int i;
26: struct itimerval it;
27: u_char c;
28:
29: signal(SIGPIPE, SIG_DFL);
30: for (i = getdtablesize(); --i > 2; )
31: close(i);
32: /*
33: * Need a timer running while we disassociate from the control terminal
34: * in case of a modem line which has lost carrier.
35: */
36: timerclear(&it.it_interval);
37: it.it_value.tv_sec = 5;
38: it.it_value.tv_usec = 0;
39: signal(SIGALRM, timeout);
40: setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
41: if (setjmp(env) == 0)
42: {
43: i = open("/dev/tty", 0);
44: if (i >= 0)
45: {
46: ioctl(i, TIOCNOTTY, NULL);
47: close(i);
48: }
49: }
50: /*
51: * Now start a timer with one minute refresh. In the signal service
52: * routine, check the parent process id to see if this process has
53: * been orphaned and if so exit. This is primarily aimed at removing
54: * the 'ctimed' process left behind by 'sendmail's multi-fork startup
55: * but may prove useful in preventing accumulation of 'ctimed' processes
56: * in other circumstances as well. Normally this process is short
57: * lived.
58: */
59: it.it_interval.tv_sec = 60;
60: it.it_interval.tv_usec = 0;
61: it.it_value.tv_sec = 60;
62: it.it_value.tv_usec = 0;
63: signal(SIGALRM, checkppid);
64: setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL);
65:
66: while (read(fileno(stdin), &c, 1) == 1)
67: {
68: switch (c)
69: {
70: case CTIME:
71: l = 0L;
72: getb(fileno(stdin), &l, sizeof l);
73: cp = ctime(&l);
74: write(fileno(stdout), cp, 26);
75: break;
76: case ASCTIME:
77: getb(fileno(stdin), &tmtmp, sizeof tmtmp);
78: cp = asctime(&tmtmp);
79: write(fileno(stdout), cp, 26);
80: break;
81: case TZSET:
82: (void) tzset();
83: break;
84: case LOCALTIME:
85: l = 0L;
86: getb(fileno(stdin), &l, sizeof l);
87: tp = localtime(&l);
88: write(fileno(stdout), tp, sizeof (*tp));
89: strcpy(junk, tp->tm_zone);
90: junk[24] = '\0';
91: write(fileno(stdout), junk, 24);
92: break;
93: case GMTIME:
94: l = 0L;
95: getb(fileno(stdin), &l, sizeof l);
96: tp = gmtime(&l);
97: write(fileno(stdout), tp, sizeof (*tp));
98: strcpy(junk, tp->tm_zone);
99: junk[24] = '\0';
100: write(fileno(stdout), junk, 24);
101: break;
102: case OFFTIME:
103: getb(fileno(stdin), &l, sizeof l);
104: getb(fileno(stdin), &off, sizeof off);
105: tp = offtime(&l, off);
106: write(fileno(stdout), tp, sizeof (*tp));
107: break;
108: default:
109: abort("switch");
110: }
111: }
112: }
113:
114: getb(f, p, n)
115: int f;
116: register char *p;
117: register int n;
118: {
119: register int i;
120:
121: while (n)
122: {
123: i = read(f, p, n);
124: if (i <= 0)
125: return;
126: p += i;
127: n -= i;
128: }
129: }
130:
131: timeout()
132: {
133:
134: longjmp(env, 1);
135: }
136:
137: checkppid()
138: {
139:
140: if (getppid() == 1)
141: exit(0);
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.