#include "/h/net/openparms.h" char *hosts[] { /* list of hosts to be probed */ "isia", "isib", "isic", "isid", "isie", "sri-kl", "sri-ka", "bbn", "bbna", "bbnb", "bbnc", "bbnd", "bbne", 0 }; struct months { int adjust; /* one less than the number of days prior to this month in a leap year */ char mo[3]; /* first three characters of month-name */ } months[12] { -1, 'ja', 'n', 30, 'fe', 'b', 59, 'ma', 'r', 90, 'ap', 'r', 120, 'ma', 'y', 151, 'ju', 'n', 181, 'ju', 'l', 212, 'au', 'g', 243, 'se', 'p', 273, 'oc', 't', 304, 'no', 'v', 334, 'de', 'c' }; /**/ main(argc, argv) int argc; char **argv; { register char **p; register struct months *q; register a0; int a1, a2, day, year, hour, min, sec; long tyme; for(;;) for(p = hosts; *p; p++) if(get_date(*p)) { /* We've retrieved a date from some host; now parse it */ while(get_char() != ' '); /* skip past day-of-week */ day = get_num(0); /* reads number and delimiter */ a0 = get_char(); a1 = get_char(); a2 = get_char(); for(q = months; q < &months[12]; q++) if(q->mo[0] == a0 && q->mo[1] == a1 && q->mo[2] == a2) { day =+ q->adjust; goto more; } continue; /* Couldn't crack it -- try another host */ /* day now contains the zero-relative day in a leap year */ more: while(get_char() != ' '); /* skip rest of month */ year = get_num(0) - 70; /* read year and delimiter */ if(day > 59 && (year+2)&3)day--; /* adjust for non-leap year */ hour = get_num(2); min = get_num(2); sec = get_num(2); if(get_char() != '-') continue; /* Must be hyphen before zone */ switch(get_char()) { /* Convert hour to GMT */ case 'p': hour =+ 8; break; /* Pacific */ case 'm': hour =+ 7; break; /* Mountain */ case 'c': hour =+ 6; break; /* Central */ case 'e': hour =+ 5; break; /* Eastern */ case 'a': hour =+ 4; break; /* Atlantic */ case 'y': hour =+ 9; break; /* Yukon */ case 'h': hour =+ 10; break; /* Hawaiian */ default: continue; } if(get_char() == 'd') hour--; /* Daylight savings */ /* Calculate the number of seconds since the Epoch */ tyme = year*365 + (year+1)/4 + day; tyme = tyme*24 + hour; tyme = tyme*60 + min; tyme = tyme*60 + sec; stime(&tyme); printf("***** Time set from host %s to %s", *p, ctime(&tyme)); return; /* That's all! */ } } char hostname[50] {"/dev/net/\0\0\0"}; char buf[50]; /* space in which to accumulate text of date */ int len, indx; get_date(host) char *host; { register char *p, *q; register i; struct openparms parms; int fi; p = &hostname[9]; q = host; while(*p++ = *q++); parms.o_type =o_init | o_duplex; parms.o_id = 0; parms.o_lskt = 0; parms.o_fskt[0] = 0; parms.o_fskt[1] = 015; parms.o_frnhost = 0; parms.o_bsize = 8; parms.o_nomall = 50; parms.o_timeo = 20; parms.o_relid = 0; if((fi = open(hostname, &parms)) < 0) return 0; len = 0; while((i = read(fi, &buf[len], sizeof buf - len)) > 0) len =+ i; close(fi); if(i<0) perror(host); if(buf[len-1] != '\n' || buf[len-2] != '\r' || buf[len-3] != 'T') return 0; indx = 0; return 1; } char get_char() { register t; if(indx >= len) return 0; if((t = buf[indx++]) >= 'A' && t <= 'Z') t =+ 'a' - 'A'; return t; } get_num(max) int max; { register val, t; while((val = get_char() - '0') < 0 || val > 9); while(--max) { if((t = get_char() - '0') < 0 || t > 9) break; val = val*10 + t; } return val; }