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

1.1       root        1: #include <stdio.h>
                      2: /*
                      3:  * get date from wwv network clock
                      4:  */
                      5: #include <time.h>
                      6: #include <sys/types.h>
                      7: #include <sys/timeb.h>
                      8: #include <utmp.h>
                      9: #include <signal.h>
                     10: 
                     11: int    uflag;
                     12: int    sflag;
                     13: int    bflag;
                     14: int    fflag;
                     15: char   *timezone();
                     16: static int     dmsize[12] =
                     17: {
                     18:        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
                     19: };
                     20: 
                     21: char   clock[] = "mh/astro/clock";
                     22: 
                     23: struct utmp wtmp[2] = { {"|", "", 0}, {"{", "", 0}};
                     24: 
                     25: char   *ctime();
                     26: char   *asctime();
                     27: struct tm *localtime();
                     28: struct tm *gmtime();
                     29: 
                     30: main(argc, argv)
                     31: char *argv[];
                     32: {
                     33:        int wf, rc;
                     34:        time_t wwvtime, readnet(), labs();
                     35: 
                     36:        rc = 0;
                     37:        for(;;) {
                     38:                switch(getopt(argc, argv, "usbf")) {
                     39: 
                     40:                case 's':
                     41:                        sflag++;
                     42:                        continue;
                     43: 
                     44:                case 'u':
                     45:                        uflag++;
                     46:                        continue;
                     47: 
                     48:                case 'b':
                     49:                        bflag++;
                     50:                        continue;
                     51: 
                     52:                case 'f':
                     53:                        fflag++;
                     54:                        continue;
                     55: 
                     56:                case '?':
                     57:                        exit(1);
                     58: 
                     59:                case EOF:
                     60:                        goto OK;
                     61:                }
                     62:        }
                     63: OK:
                     64:        wwvtime = readnet();
                     65:        if (wwvtime==0)
                     66:                exit(1);
                     67:        if (sflag) {
                     68:                time_t nowtime = time((time_t)0);
                     69:                if (fflag || labs(nowtime-wwvtime) < 20*60) {
                     70:                        wtmp[0].ut_time = nowtime;
                     71:                        wtmp[1].ut_time = wwvtime;
                     72:                        if(stime(&wwvtime) < 0) {
                     73:                                rc++;
                     74:                                printf("wwv: no permission\n");
                     75:                        } else {
                     76:                                if (wwvtime >= nowtime)
                     77:                                        printf("advanced %ld sec\n",
                     78:                                                wwvtime-nowtime);
                     79:                                else
                     80:                                        printf("retarded %ld sec\n",
                     81:                                                nowtime-wwvtime);
                     82:                                if ((wf = open("/usr/adm/wtmp", 1)) >= 0) {
                     83:                                        time(&wtmp[1].ut_time);
                     84:                                        lseek(wf, 0L, 2);
                     85:                                        write(wf, (char *)wtmp, sizeof(wtmp));
                     86:                                        close(wf);
                     87:                                }
                     88:                        }
                     89:                } else {
                     90:                        printf("wwv: >20min difference; force with  wwv -sf\n");
                     91:                        rc = 1;
                     92:                        bflag++;
                     93:                }
                     94:        }
                     95:        if (bflag) {
                     96:                printf("WWV: "); prt(wwvtime);
                     97:                printf("you: "); prt(time((time_t)0));
                     98:        } else
                     99:                prt(wwvtime);
                    100:        exit(rc);
                    101: }
                    102: 
                    103: prt(t)
                    104: time_t t;
                    105: {
                    106:        struct timeb info;
                    107:        char *ap, *tzn;
                    108: 
                    109:        if (uflag) {
                    110:                ap = asctime(gmtime(&t));
                    111:                tzn = "GMT";
                    112:        } else {
                    113:                struct tm *tp;
                    114:                ftime(&info.time);
                    115:                tp = localtime(&t);
                    116:                ap = asctime(tp);
                    117:                tzn = timezone(info.timezone, tp->tm_isdst);
                    118:        }
                    119:        printf("%.20s", ap);
                    120:        if (tzn)
                    121:                printf("%s", tzn);
                    122:        printf("%s", ap+19);
                    123: }
                    124: 
                    125: time_t
                    126: readnet()
                    127: {
                    128:        int i, j, year, mon;
                    129:        int day, hour, mins, secs, tenth;
                    130:        register struct tm *L;
                    131:        char buf[24]; /* HH:MM:SS.S     DD/MM/YY */
                    132:        int f;
                    133:        int alcatch();
                    134:        time_t nowtime, timbuf;
                    135:        extern errno, sys_nerr;
                    136:        extern char *sys_errlist[];
                    137:        extern dkp_ld;
                    138: 
                    139:        signal(SIGALRM, alcatch);
                    140:        alarm(15);
                    141:        f = tdkdial(clock, 2);
                    142:        if (f < 0) {
                    143:                alarm(0);
                    144:                printf("wwv: can't open clock\n");
                    145:                return(0);
                    146:        }
                    147:        if (dkproto(f, dkp_ld) < 0) {
                    148:                alarm(0);
                    149:                printf("wwv: can't turn on DK proto\n");
                    150:                return(0);
                    151:        }
                    152:        do {
                    153:                if ((j = read(f, buf, 1)) <= 0)
                    154:                        goto readerr;
                    155:        } while ((buf[0]&0177) != '\r');
                    156:        for (i=0; i<24; i += j) {
                    157:                if ((j = read(f, buf+i, 24-i)) <= 0)
                    158:                        goto readerr;
                    159:        }
                    160:        alarm(0);
                    161:        for (i=0; i<24; i++)
                    162:                buf[i] &= 0177;
                    163:        /* accept '?' for tenths */
                    164:        if (buf[9]=='?')
                    165:                buf[9] = '0';
                    166:        if (sscanf(buf, "%d:%d:%d.%d    %d/%d/%d\r", &hour, &mins, &secs,
                    167:           &tenth, &mon, &day, &year) != 7)
                    168:                goto formerr;
                    169:        if (year!= 84)
                    170:                goto formerr;
                    171:        if( mon<1 || mon>12 ||
                    172:            day<0 || day>31 ||  /* June 30, 1984 == July 0, 1984 ??!!?? */
                    173:            mins<0 || mins>59 ||
                    174:            secs<0 || secs>59 ||
                    175:            hour<0 || hour>23)
                    176:                goto formerr;
                    177:        time(&nowtime);
                    178:        L = gmtime(&nowtime);
                    179:        timbuf = 0;
                    180:        for(i=70; i<L->tm_year; i++)
                    181:                timbuf += dysize(i);
                    182:        /* always leap year */
                    183:        if (mon >= 3)
                    184:                timbuf++;
                    185:        while(--mon)
                    186:                timbuf += dmsize[mon-1];
                    187:        timbuf += day-1;
                    188:        timbuf = 24*timbuf + hour;
                    189:        timbuf = 60*timbuf + mins;
                    190:        timbuf = 60*timbuf + secs;
                    191:        return(timbuf);
                    192: formerr:
                    193:        printf("wwv: clock format error: %.24s\n", buf);
                    194:        return(0);
                    195: readerr:
                    196:        alarm(0);
                    197:        printf("wwv: clock read ");
                    198:        if (j < 0) {
                    199:                if (errno < sys_nerr)
                    200:                        printf("error: %s\n", sys_errlist[errno]);
                    201:                else
                    202:                        printf("error: %d\n", errno);
                    203:        } else
                    204:                printf("EOF\n");
                    205:        return(0);
                    206: }
                    207: 
                    208: alcatch()
                    209: {
                    210:        return;
                    211: }
                    212: 
                    213: time_t
                    214: labs(t)
                    215: {
                    216:        if (t < 0)
                    217:                return(-t);
                    218:        return(t);
                    219: }

unix.superglobalmegacorp.com

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