Annotation of researchv10no/cmd/settod.c, revision 1.1.1.1

1.1       root        1: #include <fio.h>
                      2: #include <time.h>
                      3: #include <sys/types.h>
                      4: #include <sys/clock.h>
                      5: #include <sys/timeb.h>
                      6: #include <signal.h>
                      7: #include <libc.h>
                      8: 
                      9: #define        NULL    0
                     10: 
                     11: char   *clocks[5] = {
                     12:        "dk!nj/astro/clock",
                     13:        "dk!nj/mhe/mhpbs.clock",
                     14:        NULL
                     15: };
                     16: 
                     17: char telno[] = "913034944774", class[] = "1200";
                     18: 
                     19: #define        UNIXEPOCH       (24*60*60*40587L)       /* MJD of 1 Jan 1970 */
                     20: 
                     21: /* buffer to read time into and print it from */
                     22: #define        ARB     50
                     23: char buf[ARB];
                     24: 
                     25: typedef unsigned long tod_t;
                     26: tod_t utovax();
                     27: 
                     28: time_t readnet(), phonewwv();
                     29: long labs();
                     30: int sflag, vflag, pflag;
                     31: 
                     32: main (argc, argv)
                     33:        int argc;
                     34:        char **argv;
                     35: {
                     36:        time_t wwvtime;
                     37:        struct timeb ourtime;
                     38:        int c;
                     39:        extern char *optarg;
                     40: 
                     41:        while ((c = getopt (argc, argv, "vspc:")) >= 0) {
                     42:                switch (c) {
                     43:                case 's':
                     44:                        sflag++;
                     45:                        break;
                     46:                case 'v':
                     47:                        vflag++;
                     48:                        break;
                     49:                case 'p':
                     50:                        pflag++;
                     51:                        break;
                     52:                case 'c':
                     53:                        clocks[0] = optarg;
                     54:                        clocks[1] = NULL;
                     55:                        break;
                     56: 
                     57:                case '?':
                     58:                        exit(1);
                     59:                }
                     60:        }
                     61:        if (!sflag)
                     62:                vflag++;
                     63:        if ((wwvtime = pflag ? phonewwv() : readnet()) == 0)
                     64:                exit(1);
                     65:        ftime(&ourtime);
                     66:        if (sflag)
                     67:                settime(ourtime, wwvtime);
                     68:        if (vflag)
                     69:                prdiff(ourtime, wwvtime);
                     70:        exit(0);
                     71: }
                     72: 
                     73: /*
                     74:  * try biasclock (new); if can't, use settod (old) instead
                     75:  */
                     76: settime(ourtime, wwvtime)
                     77: struct timeb ourtime;
                     78: time_t wwvtime;
                     79: {
                     80:        tod_t oldtod, newtod;
                     81:        long delta;
                     82: 
                     83:        delta = wwvtime - ourtime.time;
                     84:        if (labs(delta) > 100L*3600L) {         /* time too far off, give up */
                     85:                print("settod: diff %d seconds, too big\n", delta);
                     86:                return;
                     87:        }
                     88:        delta = delta * 1000L - ourtime.millitm;
                     89:        if (delta == 0L)        /* well ... */
                     90:                return;
                     91:        if (biasclock(delta) >= 0)
                     92:                return;
                     93:        print("settod: could not do biasclock\n");
                     94: #if NOTDEF
                     95:        /*
                     96:         * should probably check errno here
                     97:         * someday the rest of this code will vanish
                     98:         */
                     99:        newtod = utovax(wwvtime);
                    100:        if ((oldtod = settod(0L)) == -1) {
                    101:                print("settod: can't read TOY\n");
                    102:                return;
                    103:        }
                    104:        delta = newtod - oldtod;
                    105:        /* If delta is too great, maybe TOY year is wrong */
                    106:        if (labs(delta) > 100L*86400L*10) {
                    107:                time_t tt;
                    108:                time(&tt);
                    109:                stime(&tt);
                    110:                oldtod = settod(0L);
                    111:                delta = newtod - oldtod;
                    112:        }
                    113:        if (labs(delta) > 100L*86400L*10)
                    114:                print("settod: delta %d too big: no settod\n", delta);
                    115:        else if (settod(newtod) == -1)
                    116:                print("settod: could not do settod\n");
                    117: #endif
                    118: }
                    119: 
                    120: prdiff(ourtime, wwvtime)
                    121: struct timeb ourtime;
                    122: time_t wwvtime;
                    123: {
                    124:        float delta;
                    125:        char *ctime();
                    126: 
                    127:        print("%.20s ", ctime(&wwvtime)+4);
                    128:        delta = wwvtime - ourtime.time;
                    129:        delta -= (float)ourtime.millitm/1000;
                    130:        if (delta == 0)
                    131:                print("exact\n");
                    132:        else if (delta > 0)
                    133:                print("advance %.2f\n", delta);
                    134:        else
                    135:                print("retard %.2f\n", -delta);
                    136: }
                    137: 
                    138: /*
                    139:  * turn a unix time to a VAX TODR time
                    140:  */
                    141: 
                    142: tod_t
                    143: utovax(t)
                    144: time_t t;
                    145: {
                    146:        register int i;
                    147: 
                    148:        for (i=1970; ; i++) {
                    149:                long secyr;
                    150:                secyr = SECYR;
                    151:                if (LEAPYEAR(i))
                    152:                        secyr += SECDAY;
                    153:                if (t < secyr)
                    154:                        break;
                    155:                t -= secyr;
                    156:        }
                    157:        return(t * 100 + TODRZERO);
                    158: }
                    159: 
                    160: time_t
                    161: readnet()
                    162: {
                    163:        register int i;
                    164:        int f;
                    165:        int alcatch();
                    166: 
                    167:        signal(SIGALRM, alcatch);
                    168:        alarm(30);
                    169:        for (i=0; clocks[i]; i++) {
                    170:                if ((f = ipcopen(ipcpath(clocks[i], "dk", ""), "light")) >= 0)
                    171:                        break;
                    172:        }
                    173:        if (f < 0) {
                    174:                alarm(0);
                    175:                print("settod: can't open clock\n");
                    176:                return(0);
                    177:        }
                    178:        alarm(15);
                    179:        do {
                    180:                if (read(f, buf, 1) <= 0) {
                    181:                        print("settod: read error\n");
                    182:                        alarm(0);
                    183:                        close(f);
                    184:                        return (0);
                    185:                }
                    186:                buf[0] &= 0177;
                    187:        } while (buf[0]!='\r' && buf[0]!='\n');
                    188:        for (i=0; i < sizeof(buf); i++) {
                    189:                if (read(f, &buf[i], 1) <= 0) {
                    190:                        print("settod: read error\n");
                    191:                        alarm(0);
                    192:                        close(f);
                    193:                        return (0);
                    194:                }
                    195:                buf[i] &= 0177;
                    196:                if (buf[i] == '\n' || buf[i] == '\r') {
                    197:                        if (i)
                    198:                                break;
                    199:                        i--;            /* ignore empty line */
                    200:                }
                    201:        }
                    202:        alarm(0);
                    203:        close(f);
                    204:        if (i < 10 || i == sizeof(buf)) {       /* plausibility check */
                    205:                print("settod: clock format error: %s\n", buf);
                    206:                return (0);
                    207:        }
                    208:        buf[i] = 0;             /* just to make sure */
                    209:        return (atol(buf));
                    210: }
                    211: 
                    212: time_t
                    213: phonewwv()
                    214: {
                    215:        register fd;
                    216:        register char *l;
                    217:        int alcatch();
                    218: 
                    219:        signal(SIGALRM, alcatch);
                    220:        alarm(60);
                    221:        fd = dialout(telno, class);
                    222:        if (fd < 0) {
                    223:                print("settod: dialout(\"%s\", \"%s\") returned %d\n",
                    224:                        telno, class, fd);
                    225:                return 0;
                    226:        }
                    227:        Finit(fd, (char *)0);
                    228:        while (l = Frdline(fd)) {
                    229:                if (vflag > 1)
                    230:                        print("%s\n", l);
                    231:                if (FIOLINELEN(fd) == 51 && strcmp(&l[38], " UTC(NIST) *\r") == 0)
                    232:                        break;
                    233:        }
                    234:        if (l == 0) {
                    235:                print("settod: wwv read error\n");
                    236:                return 0;
                    237:        }
                    238:        alarm(0);
                    239:        return atol(&l[21]) +
                    240:                60*(atol(&l[18]) +
                    241:                        60*(atol(&l[15]) +
                    242:                                24*atol(&l[0])))-UNIXEPOCH;
                    243: }
                    244: 
                    245: alcatch() {}
                    246: 
                    247: long
                    248: labs(n)
                    249:        long n;
                    250: {
                    251:        if (n >= 0)
                    252:                return n;
                    253:        return -n;
                    254: }
                    255: 
                    256: #if NOTDEF
                    257: 
                    258: /*
                    259:  * old heathkit conversion code
                    260:  * not guaranteed even to compile
                    261:  *
                    262:  * heathkit dates look like
                    263:  * HH:MM:SS.S     DD/MM/YY
                    264:  * with several irritating quirks
                    265:  */
                    266: 
                    267: static char    dmsize[12] =
                    268: {
                    269:        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
                    270: };
                    271: 
                    272: tod_t
                    273: hconv()
                    274: {
                    275:        int year, mon;
                    276:        int day, hour, mins, secs, tenth;
                    277:        tod_t timerr;
                    278: 
                    279:        /* accept '?' for tenths */
                    280:        if (buf[9]=='?')
                    281:                buf[9] = '0';
                    282:        if (sscanf(buf, "%d:%d:%d.%d    %d/%d/%d\r", &hour, &mins, &secs,
                    283:           &tenth, &mon, &day, &year) != 7)
                    284:                goto formerr;
                    285:        if( mon<1 || mon>12 ||
                    286:            day<0 || day>31 ||  /* June 30, 1984 == July 0, 1984 !!?? */
                    287:            mins<0 || mins>59 ||
                    288:            secs<0 || secs>59 ||
                    289:            tenth<0 || tenth>9 ||
                    290:            hour<0 || hour>23)
                    291:                goto formerr;
                    292:        /* leap year */
                    293:        timbuf = 0;
                    294:        if (year % 4 == 0 && mon >= 3)
                    295:                timbuf++;
                    296:        while(--mon)
                    297:                timbuf += dmsize[mon-1];
                    298:        timbuf += day-1;
                    299:        timbuf = 24*timbuf + hour;
                    300:        timbuf = 60*timbuf + mins;
                    301:        timbuf = 60*timbuf + secs;
                    302:        timbuf = 10*timbuf + tenth;
                    303:        timbuf = timbuf * 10 + TODRZERO;
                    304:        return timbuf;
                    305: formerr:
                    306:        print("settod: clock format error: %.24s\n", buf);
                    307:        return(0);
                    308: }
                    309: 
                    310: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.