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

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: }

unix.superglobalmegacorp.com

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