xref: /plan9/sys/src/9/boot/settime.c (revision be6499e306be769f28d0319bbc34fb75904562d7)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <auth.h>
43e12c5d1SDavid du Colombier #include <fcall.h>
53e12c5d1SDavid du Colombier #include "../boot/boot.h"
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier static long lusertime(char*);
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier char *timeserver = "#s/boot";
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier void
settime(int islocal,int afd,char * rp)12d9306527SDavid du Colombier settime(int islocal, int afd, char *rp)
133e12c5d1SDavid du Colombier {
143e12c5d1SDavid du Colombier 	int n, f;
159a747e4fSDavid du Colombier 	Dir dir[2];
169a747e4fSDavid du Colombier 	char timebuf[64];
17*be6499e3SDavid du Colombier 	static int timeset;
183e12c5d1SDavid du Colombier 
19*be6499e3SDavid du Colombier 	if(timeset)
20*be6499e3SDavid du Colombier 		return;
213e12c5d1SDavid du Colombier 	print("time...");
223e12c5d1SDavid du Colombier 	if(islocal){
233e12c5d1SDavid du Colombier 		/*
243e12c5d1SDavid du Colombier 		 *  set the time from the real time clock
253e12c5d1SDavid du Colombier 		 */
263e12c5d1SDavid du Colombier 		f = open("#r/rtc", ORDWR);
273e12c5d1SDavid du Colombier 		if(f >= 0){
289a747e4fSDavid du Colombier 			if((n = read(f, timebuf, sizeof(timebuf)-1)) > 0){
299a747e4fSDavid du Colombier 				timebuf[n] = '\0';
303e12c5d1SDavid du Colombier 				timeset = 1;
313e12c5d1SDavid du Colombier 			}
323e12c5d1SDavid du Colombier 			close(f);
333e12c5d1SDavid du Colombier 		}else do{
349a747e4fSDavid du Colombier 			strcpy(timebuf, "yymmddhhmm[ss]");
359a747e4fSDavid du Colombier 			outin("\ndate/time ", timebuf, sizeof(timebuf));
369a747e4fSDavid du Colombier 		}while((timeset=lusertime(timebuf)) <= 0);
373e12c5d1SDavid du Colombier 	}
383e12c5d1SDavid du Colombier 	if(timeset == 0){
393e12c5d1SDavid du Colombier 		/*
403e12c5d1SDavid du Colombier 		 *  set the time from the access time of the root
413e12c5d1SDavid du Colombier 		 */
423e12c5d1SDavid du Colombier 		f = open(timeserver, ORDWR);
433e12c5d1SDavid du Colombier 		if(f < 0)
443e12c5d1SDavid du Colombier 			return;
45d9306527SDavid du Colombier 		if(mount(f, afd, "/tmp", MREPL, rp) < 0){
46219b2ee8SDavid du Colombier 			warning("settime mount");
473e12c5d1SDavid du Colombier 			close(f);
483e12c5d1SDavid du Colombier 			return;
493e12c5d1SDavid du Colombier 		}
503e12c5d1SDavid du Colombier 		close(f);
519a747e4fSDavid du Colombier 		if(stat("/tmp", statbuf, sizeof statbuf) < 0)
523e12c5d1SDavid du Colombier 			fatal("stat");
539a747e4fSDavid du Colombier 		convM2D(statbuf, sizeof statbuf, &dir[0], (char*)&dir[1]);
549a747e4fSDavid du Colombier 		sprint(timebuf, "%ld", dir[0].atime);
559a747e4fSDavid du Colombier 		unmount(0, "/tmp");
563e12c5d1SDavid du Colombier 	}
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier 	f = open("#c/time", OWRITE);
599a747e4fSDavid du Colombier 	if(write(f, timebuf, strlen(timebuf)) < 0)
603e12c5d1SDavid du Colombier 		warning("can't set #c/time");
613e12c5d1SDavid du Colombier 	close(f);
627dd7cddfSDavid du Colombier 	print("\n");
633e12c5d1SDavid du Colombier }
643e12c5d1SDavid du Colombier 
653e12c5d1SDavid du Colombier #define SEC2MIN 60L
663e12c5d1SDavid du Colombier #define SEC2HOUR (60L*SEC2MIN)
673e12c5d1SDavid du Colombier #define SEC2DAY (24L*SEC2HOUR)
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier int
g2(char ** pp)703e12c5d1SDavid du Colombier g2(char **pp)
713e12c5d1SDavid du Colombier {
723e12c5d1SDavid du Colombier 	int v;
733e12c5d1SDavid du Colombier 
743e12c5d1SDavid du Colombier 	v = 10*((*pp)[0]-'0') + (*pp)[1]-'0';
753e12c5d1SDavid du Colombier 	*pp += 2;
763e12c5d1SDavid du Colombier 	return v;
773e12c5d1SDavid du Colombier }
783e12c5d1SDavid du Colombier 
793e12c5d1SDavid du Colombier /*
803e12c5d1SDavid du Colombier  *  days per month plus days/year
813e12c5d1SDavid du Colombier  */
823e12c5d1SDavid du Colombier static	int	dmsize[] =
833e12c5d1SDavid du Colombier {
843e12c5d1SDavid du Colombier 	365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
853e12c5d1SDavid du Colombier };
863e12c5d1SDavid du Colombier static	int	ldmsize[] =
873e12c5d1SDavid du Colombier {
883e12c5d1SDavid du Colombier 	366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
893e12c5d1SDavid du Colombier };
903e12c5d1SDavid du Colombier 
913e12c5d1SDavid du Colombier /*
923e12c5d1SDavid du Colombier  *  return the days/month for the given year
933e12c5d1SDavid du Colombier  */
943e12c5d1SDavid du Colombier static int *
yrsize(int y)957dd7cddfSDavid du Colombier yrsize(int y)
963e12c5d1SDavid du Colombier {
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier 	if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0))
993e12c5d1SDavid du Colombier 		return ldmsize;
1003e12c5d1SDavid du Colombier 	else
1013e12c5d1SDavid du Colombier 		return dmsize;
1023e12c5d1SDavid du Colombier }
1033e12c5d1SDavid du Colombier 
1043e12c5d1SDavid du Colombier /*
1053e12c5d1SDavid du Colombier  *  compute seconds since Jan 1 1970
1063e12c5d1SDavid du Colombier  */
1073e12c5d1SDavid du Colombier static long
lusertime(char * argbuf)1083e12c5d1SDavid du Colombier lusertime(char *argbuf)
1093e12c5d1SDavid du Colombier {
1103e12c5d1SDavid du Colombier 	char *buf;
1113e12c5d1SDavid du Colombier 	ulong secs;
1123e12c5d1SDavid du Colombier 	int i, y, m;
1133e12c5d1SDavid du Colombier 	int *d2m;
1143e12c5d1SDavid du Colombier 
1153e12c5d1SDavid du Colombier 	buf = argbuf;
1163e12c5d1SDavid du Colombier 	i = strlen(buf);
1173e12c5d1SDavid du Colombier 	if(i != 10 && i != 12)
1183e12c5d1SDavid du Colombier 		return -1;
1193e12c5d1SDavid du Colombier 	secs = 0;
1203e12c5d1SDavid du Colombier 	y = g2(&buf);
1213e12c5d1SDavid du Colombier 	m = g2(&buf);
1223e12c5d1SDavid du Colombier 	if(y < 70)
1233e12c5d1SDavid du Colombier 		y += 2000;
1243e12c5d1SDavid du Colombier 	else
1253e12c5d1SDavid du Colombier 		y += 1900;
1263e12c5d1SDavid du Colombier 
1273e12c5d1SDavid du Colombier 	/*
1283e12c5d1SDavid du Colombier 	 *  seconds per year
1293e12c5d1SDavid du Colombier 	 */
1303e12c5d1SDavid du Colombier 	for(i = 1970; i < y; i++){
1313e12c5d1SDavid du Colombier 		d2m = yrsize(i);
1323e12c5d1SDavid du Colombier 		secs += d2m[0] * SEC2DAY;
1333e12c5d1SDavid du Colombier 	}
1343e12c5d1SDavid du Colombier 
1353e12c5d1SDavid du Colombier 	/*
1363e12c5d1SDavid du Colombier 	 *  seconds per month
1373e12c5d1SDavid du Colombier 	 */
1383e12c5d1SDavid du Colombier 	d2m = yrsize(y);
1393e12c5d1SDavid du Colombier 	for(i = 1; i < m; i++)
1403e12c5d1SDavid du Colombier 		secs += d2m[i] * SEC2DAY;
1413e12c5d1SDavid du Colombier 
1423e12c5d1SDavid du Colombier 	secs += (g2(&buf)-1) * SEC2DAY;
1433e12c5d1SDavid du Colombier 	secs += g2(&buf) * SEC2HOUR;
1443e12c5d1SDavid du Colombier 	secs += g2(&buf) * SEC2MIN;
1453e12c5d1SDavid du Colombier 	if(*buf)
1463e12c5d1SDavid du Colombier 		secs += g2(&buf);
1473e12c5d1SDavid du Colombier 
1483e12c5d1SDavid du Colombier 	sprint(argbuf, "%ld", secs);
1493e12c5d1SDavid du Colombier 	return secs;
1503e12c5d1SDavid du Colombier }
151