|
|
1.1 root 1: #include <stdio.h>
2: #include <time.h>
3: #include <errno.h>
4: #include <sys/types.h>
5: #include <sys/timeb.h>
6: #include <sys/clock.h>
7: #include <utmp.h>
8: #include <signal.h>
9:
10: #define CLOCK "mh/astro/clock"
11: /* buffer to read time into and print it from */
12: char buf[24]; /* HH:MM:SS.S DD/MM/YY */
13:
14: typedef unsigned long tod_t;
15:
16: tod_t settod(), readnet();
17: long labs();
18: int sflag, vflag;
19:
20: static char dmsize[12] =
21: {
22: 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
23: };
24:
25: main (argc, argv)
26: int argc;
27: char **argv;
28: {
29: tod_t ourtime, wwvtime;
30: long delta;
31: int c;
32:
33: while ((c = getopt (argc, argv, "vs")) != EOF) {
34: switch (c) {
35: case 's':
36: sflag++;
37: break;
38: case 'v':
39: vflag++;
40: break;
41: case '?':
42: return 1;
43: }
44: }
45:
46: if (!sflag)
47: vflag++;
48:
49: wwvtime = readnet();
50: if (wwvtime) {
51: ourtime = settod(0L);
52: delta = wwvtime - ourtime;
53:
54: if (sflag) {
55: if (settod (wwvtime) == -1)
56: printf ("not super-user, hence not set\n");
57: }
58:
59: if (vflag) {
60: printf("%.23s ", buf);
61: if (delta == 0)
62: printf ("exact\n");
63: else
64: printf ("%s %ld.%.2ld\n",
65: delta < 0? "retard": "advance",
66: labs (delta) / 100, labs (delta) % 100);
67: }
68: }
69: return 0;
70:
71: }
72:
73: tod_t
74: readnet()
75: {
76: int i, j, year, mon;
77: int day, hour, mins, secs, tenth;
78: int f;
79: int alcatch();
80: tod_t timbuf;
81: extern errno, sys_nerr;
82: extern char *sys_errlist[];
83: extern dkp_ld;
84: int retry = 30; /* max number of retries */
85:
86: do {
87: int err;
88: signal(SIGALRM, alcatch);
89: alarm(15);
90: f = tdkdial(CLOCK, 2);
91: if (f < 0) {
92: alarm(0);
93: printf("settod: can't open clock\n");
94: return(0);
95: }
96: if (dkproto(f, dkp_ld) < 0) {
97: alarm(0);
98: printf("settod: can't turn on DK proto\n");
99: return(0);
100: }
101: do {
102: if ((j = read(f, buf, 1)) <= 0)
103: goto readerr;
104: } while ((buf[0]&0177) != '\r');
105: for (i=0; i<24; i += j) {
106: if ((j = read(f, buf+i, 24-i)) <= 0)
107: goto readerr;
108: }
109: alarm(0);
110: for (i=0; i<24; i++)
111: buf[i] &= 0177;
112: /* accept '?' for tenths */
113: if (buf[9]=='?')
114: buf[9] = '0';
115: if (sscanf(buf, "%d:%d:%d.%d %d/%d/%d\r", &hour, &mins, &secs,
116: &tenth, &mon, &day, &year) != 7)
117: goto formerr;
118: if( mon<1 || mon>12 ||
119: day<0 || day>31 || /* June 30, 1984 == July 0, 1984 !!?? */
120: mins<0 || mins>59 ||
121: secs<0 || secs>59 ||
122: tenth<0 || tenth>9 ||
123: hour<0 || hour>23)
124: goto formerr;
125: /* leap year */
126: timbuf = 0;
127: if (year % 4 == 0 && mon >= 3)
128: timbuf++;
129: while(--mon)
130: timbuf += dmsize[mon-1];
131: timbuf += day-1;
132: timbuf = 24*timbuf + hour;
133: timbuf = 60*timbuf + mins;
134: timbuf = 60*timbuf + secs;
135: timbuf = 10*timbuf + tenth;
136: timbuf = timbuf * 10 + TODRZERO;
137: return timbuf;
138: formerr:
139: printf("settod: clock format error: %.24s\n", buf);
140: return(0);
141: readerr:
142: err = errno;
143: close(f);
144: alarm(0);
145: if (j < 0) {
146: printf("settod: clock read ");
147:
148: if (err == EINTR) {
149: printf ("timeout\n");
150: return 0;
151: } else if (err < sys_nerr)
152: printf("error: %s\n", sys_errlist[err]);
153: else
154: printf("error: %d\n", err);
155: }
156: sleep (1 + (int)((getpid() + time ((time_t) 0)) % 7));
157: } while (--retry >= 0);
158: return 0;
159: }
160:
161: alcatch() {}
162:
163: long
164: labs (n)
165: long n;
166: {
167: if (n >= 0)
168: return n;
169: return -n;
170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.