/*-------- From: Doug Kingston To: Bruce Duncan cc: info-iris@sumex-aim.arpa Subject: Re: time servers Message-ID: <8610091913.aa04372@SEM.BRL.ARPA> --------*/ /* $Header$ */ /* * ndate.c - Get date from another network host * variation on a theme by rsm@brl * * Author: Christopher A. Kent * Dept. of Computer Sciences * Purdue University * Date: Thu Jun 23 1983 * Copyright (c) 1983 Christopher A. Kent */ /* $Log$ */ static char rcs_ident[] = "$Header$"; #include #include #include #include #include #include #include #define WTMP "/usr/adm/wtmp" struct utmp wtmp[2] = { {"|", "", 0}, {"{", "", 0}}; char *std_hostv[] = { "saturn", "sri-nic", "bbng", "usc-isib", "mit-devmultics", 0, }; char **hosts; char *u_hostv[128]; char u_hosts[256]; char aflag; /* all hosts */ char sflag; /* set time from first host */ char uflag; /* report time in GMT */ struct sockaddr_in sin = { AF_INET }; char *asctime(); char *ctime(); struct tm *localtime(); char *timezone(); main(argc, argv) char **argv; { register char *hostname; register struct hostent *host; register int s; struct timeval ntv, tv; struct timezone tz; char *tzn; char *ap; int wf; int success = 0; procargs(argc, argv); if(aflag && sflag){ fprintf(stderr, "%s: -a and -s mutually exclusive\n", argv[0]); exit(-1); } gettimeofday(&tv, &tz); sin.sin_port = htons(IPPORT_TIMESERVER); while(hostname = *hosts++){ /* pick a host and connect */ host = gethostbyname(hostname); if(host){ sin.sin_family = host->h_addrtype; bcopy(host->h_addr, (caddr_t)&sin.sin_addr, host->h_length); hostname = host->h_name; }else{ sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(argv[1]); if(sin.sin_addr.s_addr == -1){ printf("%s: unknown host\n", hostname); continue; } } s = socket(AF_INET, SOCK_STREAM, 0); if(s < 0){ perror("ndate: socket"); continue; } if(connect(s, (caddr_t)&sin, sizeof(sin)) < 0){ extern int errno, sys_nerr; extern char *sys_errlist[]; register char *c; fprintf(stderr, "ndate: Can't connect to %s: ", hostname); c = "Unknown error"; if(errno < sys_nerr) c = sys_errlist[errno]; fprintf(stderr, "%s\n", c); continue; } printf("%s: ", hostname); if(read(s, &ntv.tv_sec, sizeof(ntv.tv_sec)) < 0){ perror("ndate: read"); continue; } close(s); success++; tv.tv_sec = ntohl(ntv.tv_sec); tv.tv_sec -= 2208988800; /* from Jan 1 1900 */ tv.tv_usec = 0; /* time is now Unix normal form (GMT) */ tzn = NULL; if(uflag){ ap = asctime(gmtime(&tv.tv_sec)); tzn = "GMT"; }else{ struct tm *tp; tp = localtime(&tv.tv_sec); ap = asctime(tp); tzn = timezone(tz.tz_minuteswest, tp->tm_isdst); } printf("%.20s", ap); if(tzn != NULL) printf("%s", tzn); printf("%s", ap+19); if(aflag == 0) break; } if(sflag == 0) exit(success == 0); wtmp[0].ut_time = tv.tv_sec; if (settimeofday(&tv, (struct timezone *)0) < 0) { success = 0; perror("Failed to set date"); } else if ((wf = open(WTMP, 1)) >= 0) { time(&wtmp[1].ut_time); lseek(wf, 0L, 2); write(wf, (char *)wtmp, sizeof(wtmp)); close(wf); } exit(success == 0); } /* * procargs - unified argument processing procedure * * This procedure contains the logic for converting the UNIX argument * list into global variables */ procargs(argc, argv) int argc; char *argv[]; { int arg, skip, unswitched, more; char *swptr; hosts = std_hostv; uflag = 0; aflag = 0; sflag = 0; unswitched = 0; skip = 1; for ( arg=1 ; arg