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

1.1       root        1: /*
                      2:  * get date from wwv network clock
                      3:  */
                      4: #include <stdio.h>
                      5: #include <time.h>
                      6: #include <sys/types.h>
                      7: #include <sys/timeb.h>
                      8: #include <utmp.h>
                      9: #include <signal.h>
                     10: 
                     11: #define        ARB     50
                     12: char buf[ARB];
                     13: 
                     14: int    uflag;
                     15: int    sflag;
                     16: int    bflag;
                     17: int    fflag;
                     18: char   *timezone();
                     19: 
                     20: char   *clocks[5] = {
                     21:        "dk!nj/mhe/mhpbs.clock",
                     22:        "dk!nj/astro/clock",
                     23:        NULL
                     24: };
                     25: 
                     26: struct utmp wtmp[2] = { {"|", "", 0}, {"{", "", 0}};
                     27: 
                     28: char   *ctime();
                     29: char   *asctime();
                     30: struct tm *localtime();
                     31: struct tm *gmtime();
                     32: long   labs();
                     33: 
                     34: main(argc, argv)
                     35: char *argv[];
                     36: {
                     37:        int rc;
                     38:        time_t wwvtime, readnet();
                     39:        extern char *optarg;
                     40: 
                     41:        rc = 0;
                     42:        for(;;) {
                     43:                switch(getopt(argc, argv, "usbfc:")) {
                     44:                case 's':
                     45:                        sflag++;
                     46:                        continue;
                     47: 
                     48:                case 'u':
                     49:                        uflag++;
                     50:                        continue;
                     51: 
                     52:                case 'b':
                     53:                        bflag++;
                     54:                        continue;
                     55: 
                     56:                case 'f':
                     57:                        fflag++;
                     58:                        continue;
                     59: 
                     60:                case 'c':
                     61:                        clocks[0] = optarg;
                     62:                        clocks[1] = NULL;
                     63:                        continue;
                     64: 
                     65:                case '?':
                     66:                        exit(1);
                     67: 
                     68:                case EOF:
                     69:                        goto OK;
                     70:                }
                     71:        }
                     72: OK:
                     73:        wwvtime = readnet();
                     74:        if (wwvtime==0)
                     75:                exit(1);
                     76:        if (sflag)
                     77:                rc = settime(wwvtime);
                     78:        if (bflag) {
                     79:                printf("WWV: "); prt(wwvtime);
                     80:                printf("you: "); prt(time((time_t)0));
                     81:        } else
                     82:                prt(wwvtime);
                     83:        exit(rc);
                     84: }
                     85: 
                     86: prt(t)
                     87: time_t t;
                     88: {
                     89:        struct timeb info;
                     90:        char *ap, *tzn;
                     91: 
                     92:        if (uflag) {
                     93:                ap = asctime(gmtime(&t));
                     94:                tzn = "GMT";
                     95:        } else {
                     96:                struct tm *tp;
                     97:                ftime(&info.time);
                     98:                tp = localtime(&t);
                     99:                ap = asctime(tp);
                    100:                tzn = timezone(info.timezone, tp->tm_isdst);
                    101:        }
                    102:        printf("%.20s", ap);
                    103:        if (tzn)
                    104:                printf("%s", tzn);
                    105:        printf("%s", ap+19);
                    106: }
                    107: 
                    108: /*
                    109:  * set the time
                    110:  */
                    111: 
                    112: settime(wwvtime)
                    113: time_t wwvtime;
                    114: {
                    115:        time_t nowtime = time((time_t)0);
                    116:        int wf;
                    117: 
                    118:        if (fflag == 0 && labs(nowtime-wwvtime) >= 20*60) {
                    119:                fprintf(stderr, "wwv: >20min difference; force with  wwv -sf\n");
                    120:                bflag++;
                    121:                return (1);
                    122:        }
                    123:        wtmp[0].ut_time = nowtime;
                    124:        if(stime(&wwvtime) < 0) {
                    125:                fprintf(stderr, "wwv: no permission\n");
                    126:                return (1);
                    127:        }
                    128:        if (wwvtime >= nowtime)
                    129:                printf("advanced %ld sec\n", wwvtime-nowtime);
                    130:        else
                    131:                printf("retarded %ld sec\n", nowtime-wwvtime);
                    132:        if ((wf = open("/usr/adm/wtmp", 1)) >= 0) {
                    133:                time(&wtmp[1].ut_time);
                    134:                lseek(wf, 0L, 2);
                    135:                write(wf, (char *)wtmp, sizeof(wtmp));
                    136:                close(wf);
                    137:        }
                    138:        return (0);
                    139: }
                    140: 
                    141: /*
                    142:  * read time from the network
                    143:  * takes only the modern version;
                    144:  * see settod.c if the heath code is ever needed again
                    145:  */
                    146: 
                    147: time_t
                    148: readnet()
                    149: {
                    150:        register int i;
                    151:        int f;
                    152:        int alcatch();
                    153: 
                    154:        signal(SIGALRM, alcatch);
                    155:        alarm(30);
                    156:        for (i=0; clocks[i]; i++) {
                    157:                if ((f = ipcopen(ipcpath(clocks[i], "dk", ""), "light")) >= 0)
                    158:                        break;
                    159:        }
                    160:        if (f < 0) {
                    161:                alarm(0);
                    162:                fprintf(stderr, "wwv: can't open clock\n");
                    163:                return(0);
                    164:        }
                    165:        do {
                    166:                if (read(f, buf, 1) <= 0) {
                    167:                        fprintf(stderr, "wwv: read error\n");
                    168:                        alarm(0);
                    169:                        close(f);
                    170:                        return (0);
                    171:                }
                    172:                buf[0] &= 0177;
                    173:        } while (buf[0]!='\r' && buf[0]!='\n');
                    174:        for (i=0; i < sizeof(buf); i++) {
                    175:                if (read(f, &buf[i], 1) <= 0) {
                    176:                        fprintf(stderr, "wwv: read error\n");
                    177:                        alarm(0);
                    178:                        close(f);
                    179:                        return (0);
                    180:                }
                    181:                buf[i] &= 0177;
                    182:                if (buf[i] == '\n' || buf[i] == '\r') {
                    183:                        if (i)
                    184:                                break;
                    185:                        i--;            /* ignore empty line */
                    186:                }
                    187:        }
                    188:        alarm(0);
                    189:        close(f);
                    190:        if (i < 10 || i == sizeof(buf)) {       /* plausibility check */
                    191:                fprintf(stderr, "wwv: clock format error: %s\n", buf);
                    192:                return (0);
                    193:        }
                    194:        buf[i] = 0;             /* just to make sure */
                    195:        return (atol(buf));
                    196: }
                    197: 
                    198: alcatch() {}
                    199: 
                    200: long
                    201: labs(t)
                    202: long t;
                    203: {
                    204:        if (t < 0)
                    205:                return(-t);
                    206:        return(t);
                    207: }

unix.superglobalmegacorp.com

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