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