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