From a394cbfd2a6445034207b2631e5398176a65b7bf Mon Sep 17 00:00:00 2001 From: Dennis Ritchie Date: Wed, 10 Jan 1979 15:01:27 -0500 Subject: [PATCH] Research V7 development Work on file usr/src/cmd/date.c Synthesized-from: v7 --- usr/src/cmd/date.c | 163 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 usr/src/cmd/date.c diff --git a/usr/src/cmd/date.c b/usr/src/cmd/date.c new file mode 100644 index 0000000000..a0057654a7 --- /dev/null +++ b/usr/src/cmd/date.c @@ -0,0 +1,163 @@ +/* + * date : print date + * date YYMMDDHHMM[.SS] : set date, if allowed + * date -u ... : date in GMT + */ +#include +#include +#include +#include +long timbuf; +char *ap, *ep, *sp; +int uflag; + +char *timezone(); +static int dmsize[12] = +{ + 31, + 28, + 31, + 30, + 31, + 30, + 31, + 31, + 30, + 31, + 30, + 31 +}; + +struct utmp wtmp[2] = { {"|", "", 0}, {"{", "", 0}}; + +char *ctime(); +char *asctime(); +struct tm *localtime(); +struct tm *gmtime(); + +main(argc, argv) +char *argv[]; +{ + register char *tzn; + struct timeb info; + int wf, rc; + + rc = 0; + ftime(&info); + if (argc>1 && argv[1][0]=='-' && argv[1][1]=='u') { + argc--; + argv++; + uflag++; + } + if(argc > 1) { + ap = argv[1]; + if (gtime()) { + printf("date: bad conversion\n"); + exit(1); + } + /* convert to GMT assuming local time */ + if (uflag==0) { + timbuf += (long)info.timezone*60; + /* now fix up local daylight time */ + if(localtime(&timbuf)->tm_isdst) + timbuf -= 60*60; + } + time(&wtmp[0].ut_time); + if(stime(&timbuf) < 0) { + rc++; + printf("date: no permission\n"); + } else if ((wf = open("/usr/adm/wtmp", 1)) >= 0) { + time(&wtmp[1].ut_time); + lseek(wf, 0L, 2); + write(wf, (char *)wtmp, sizeof(wtmp)); + close(wf); + } + } + if (rc==0) + time(&timbuf); + if(uflag) { + ap = asctime(gmtime(&timbuf)); + tzn = "GMT"; + } else { + struct tm *tp; + tp = localtime(&timbuf); + ap = asctime(tp); + tzn = timezone(info.timezone, tp->tm_isdst); + } + printf("%.20s", ap); + if (tzn) + printf("%s", tzn); + printf("%s", ap+19); + exit(rc); +} + +gtime() +{ + register int i, year, month; + int day, hour, mins, secs; + struct tm *L; + char x; + + ep=ap; + while(*ep) ep++; + sp=ap; + while(sptm_mday); + month = gp(L->tm_mon+1); + year = gp(L->tm_year); + if(*sp) + return(1); + if( month<1 || month>12 || + day<1 || day>31 || + mins<0 || mins>59 || + secs<0 || secs>59) + return(1); + if (hour==24) { + hour=0; day++; + } + if (hour<0 || hour>23) + return(1); + timbuf = 0; + year += 1900; + for(i=1970; i= 3) + timbuf++; + while(--month) + timbuf += dmsize[month-1]; + timbuf += day-1; + timbuf = 24*timbuf + hour; + timbuf = 60*timbuf + mins; + timbuf = 60*timbuf + secs; + return(0); + +} + +gp(dfault) +{ + register int c, d; + + if(*sp==0) + return(dfault); + c = (*sp++)-'0'; + d = (*sp ? (*sp++)-'0' : 0); + if(c<0 || c>9 || d<0 || d>9) + return(-1); + return(c+10*d); +} -- 2.20.1