|
|
1.1 ! root 1: static char *sccsid = "@(#)date.c 4.1 (Berkeley) 10/1/80"; ! 2: #include <stdio.h> ! 3: /* ! 4: * date : print date ! 5: * date YYMMDDHHMM[.SS] : set date, if allowed ! 6: * date -u ... : date in GMT ! 7: */ ! 8: #include <time.h> ! 9: #include <sys/types.h> ! 10: #include <sys/timeb.h> ! 11: #include <utmp.h> ! 12: long timbuf; ! 13: char *ap, *ep, *sp; ! 14: int uflag; ! 15: ! 16: char *timezone(); ! 17: static int dmsize[12] = ! 18: { ! 19: 31, ! 20: 28, ! 21: 31, ! 22: 30, ! 23: 31, ! 24: 30, ! 25: 31, ! 26: 31, ! 27: 30, ! 28: 31, ! 29: 30, ! 30: 31 ! 31: }; ! 32: ! 33: struct utmp wtmp[2] = { {"|", "", 0}, {"{", "", 0}}; ! 34: ! 35: char *ctime(); ! 36: char *asctime(); ! 37: struct tm *localtime(); ! 38: struct tm *gmtime(); ! 39: ! 40: main(argc, argv) ! 41: char *argv[]; ! 42: { ! 43: register char *tzn; ! 44: struct timeb info; ! 45: int wf, rc; ! 46: extern char _sobuf[]; ! 47: ! 48: setbuf(stdout, _sobuf); ! 49: rc = 0; ! 50: ftime(&info); ! 51: if (argc>1 && argv[1][0]=='-' && argv[1][1]=='u') { ! 52: argc--; ! 53: argv++; ! 54: uflag++; ! 55: } ! 56: if(argc > 1) { ! 57: ap = argv[1]; ! 58: if (gtime()) { ! 59: printf("date: bad conversion\n"); ! 60: exit(1); ! 61: } ! 62: /* convert to GMT assuming local time */ ! 63: if (uflag==0) { ! 64: timbuf += (long)info.timezone*60; ! 65: /* now fix up local daylight time */ ! 66: if(localtime(&timbuf)->tm_isdst) ! 67: timbuf -= 60*60; ! 68: } ! 69: time(&wtmp[0].ut_time); ! 70: if(stime(&timbuf) < 0) { ! 71: rc++; ! 72: printf("date: no permission\n"); ! 73: } else if ((wf = open("/usr/adm/wtmp", 1)) >= 0) { ! 74: time(&wtmp[1].ut_time); ! 75: lseek(wf, 0L, 2); ! 76: write(wf, (char *)wtmp, sizeof(wtmp)); ! 77: close(wf); ! 78: } ! 79: } ! 80: if (rc==0) ! 81: time(&timbuf); ! 82: if(uflag) { ! 83: ap = asctime(gmtime(&timbuf)); ! 84: tzn = "GMT"; ! 85: } else { ! 86: struct tm *tp; ! 87: tp = localtime(&timbuf); ! 88: ap = asctime(tp); ! 89: tzn = timezone(info.timezone, tp->tm_isdst); ! 90: } ! 91: printf("%.20s", ap); ! 92: if (tzn) ! 93: printf("%s", tzn); ! 94: printf("%s", ap+19); ! 95: exit(rc); ! 96: } ! 97: ! 98: gtime() ! 99: { ! 100: register int i, year, month; ! 101: int day, hour, mins, secs; ! 102: struct tm *L; ! 103: char x; ! 104: ! 105: ep=ap; ! 106: while(*ep) ep++; ! 107: sp=ap; ! 108: while(sp<ep) { ! 109: x = *sp; ! 110: *sp++ = *--ep; ! 111: *ep = x; ! 112: } ! 113: sp=ap; ! 114: time(&timbuf); ! 115: L=localtime(&timbuf); ! 116: secs = gp(-1); ! 117: if(*sp!='.') { ! 118: mins=secs; ! 119: secs=0; ! 120: } else {sp++; ! 121: mins = gp(-1); ! 122: } ! 123: hour = gp(-1); ! 124: day = gp(L->tm_mday); ! 125: month = gp(L->tm_mon+1); ! 126: year = gp(L->tm_year); ! 127: if(*sp) ! 128: return(1); ! 129: if( month<1 || month>12 || ! 130: day<1 || day>31 || ! 131: mins<0 || mins>59 || ! 132: secs<0 || secs>59) ! 133: return(1); ! 134: if (hour==24) { ! 135: hour=0; day++; ! 136: } ! 137: if (hour<0 || hour>23) ! 138: return(1); ! 139: timbuf = 0; ! 140: year += 1900; ! 141: for(i=1970; i<year; i++) ! 142: timbuf += dysize(i); ! 143: /* Leap year */ ! 144: if (dysize(year)==366 && month >= 3) ! 145: timbuf++; ! 146: while(--month) ! 147: timbuf += dmsize[month-1]; ! 148: timbuf += day-1; ! 149: timbuf = 24*timbuf + hour; ! 150: timbuf = 60*timbuf + mins; ! 151: timbuf = 60*timbuf + secs; ! 152: return(0); ! 153: ! 154: } ! 155: ! 156: gp(dfault) ! 157: { ! 158: register int c, d; ! 159: ! 160: if(*sp==0) ! 161: return(dfault); ! 162: c = (*sp++)-'0'; ! 163: d = (*sp ? (*sp++)-'0' : 0); ! 164: if(c<0 || c>9 || d<0 || d>9) ! 165: return(-1); ! 166: return(c+10*d); ! 167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.