Bell 32V development
authorTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:50:05 +0000 (19:50 -0500)
committerTom London <tbl@research.uucp>
Mon, 11 Dec 1978 00:50:05 +0000 (19:50 -0500)
Work on file usr/src/cmd/date.c

Co-Authored-By: John Reiser <jfr@research.uucp>
Synthesized-from: 32v

usr/src/cmd/date.c [new file with mode: 0644]

diff --git a/usr/src/cmd/date.c b/usr/src/cmd/date.c
new file mode 100644 (file)
index 0000000..a005765
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * date : print date
+ * date YYMMDDHHMM[.SS] : set date, if allowed
+ * date -u ... : date in GMT
+ */
+#include <time.h>
+#include <sys/types.h>
+#include <sys/timeb.h>
+#include <utmp.h>
+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(sp<ep) {
+               x = *sp;
+               *sp++ = *--ep;
+               *ep = x;
+       }
+       sp=ap;
+       time(&timbuf);
+       L=localtime(&timbuf);
+       secs = gp(-1);
+       if(*sp!='.') {
+               mins=secs;
+               secs=0;
+       } else {sp++;
+               mins = gp(-1);
+       }
+       hour = gp(-1);
+       day = gp(L->tm_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<year; i++)
+               timbuf += dysize(i);
+       /* Leap year */
+       if (dysize(year)==366 && month >= 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);
+}