jkf's fix for group ownership
[unix-history] / usr / src / bin / date / date.c
CommitLineData
0698cf89
BJ
1static char *sccsid = "@(#)date.c 4.1 (Berkeley) %G%";
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>
12long timbuf;
13char *ap, *ep, *sp;
14int uflag;
15
16char *timezone();
17static 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
33struct utmp wtmp[2] = { {"|", "", 0}, {"{", "", 0}};
34
35char *ctime();
36char *asctime();
37struct tm *localtime();
38struct tm *gmtime();
39
40main(argc, argv)
41char *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
98gtime()
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
156gp(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}