|
|
1.1 ! root 1: #include <u.h> ! 2: #include <libc.h> ! 3: #include <auth.h> ! 4: #include <fcall.h> ! 5: #include "../boot/boot.h" ! 6: ! 7: static long lusertime(char*); ! 8: ! 9: char *timeserver = "#s/boot"; ! 10: ! 11: void ! 12: settime(int islocal) ! 13: { ! 14: int n, f; ! 15: int timeset; ! 16: Dir dir; ! 17: char dirbuf[DIRLEN]; ! 18: ! 19: print("time..."); ! 20: timeset = 0; ! 21: if(islocal){ ! 22: /* ! 23: * set the time from the real time clock ! 24: */ ! 25: f = open("#r/rtc", ORDWR); ! 26: if(f >= 0){ ! 27: if((n = read(f, dirbuf, sizeof(dirbuf)-1)) > 0){ ! 28: dirbuf[n] = 0; ! 29: timeset = 1; ! 30: } ! 31: close(f); ! 32: }else do{ ! 33: strcpy(dirbuf, "yymmddhhmm[ss]"); ! 34: outin(cpuflag, "\ndate/time ", dirbuf, sizeof(dirbuf)); ! 35: }while((timeset=lusertime(dirbuf)) <= 0); ! 36: } ! 37: if(timeset == 0){ ! 38: /* ! 39: * set the time from the access time of the root ! 40: */ ! 41: f = open(timeserver, ORDWR); ! 42: if(f < 0) ! 43: return; ! 44: if(mount(f, "/n/boot", MREPL, "") < 0){ ! 45: warning("settime mount"); ! 46: close(f); ! 47: return; ! 48: } ! 49: close(f); ! 50: if(stat("/n/boot", dirbuf) < 0) ! 51: fatal("stat"); ! 52: convM2D(dirbuf, &dir); ! 53: sprint(dirbuf, "%ld", dir.atime); ! 54: unmount(0, "/n/boot"); ! 55: /* ! 56: * set real time clock if there is one ! 57: */ ! 58: f = open("#r/rtc", ORDWR); ! 59: if(f > 0){ ! 60: write(f, dirbuf, strlen(dirbuf)); ! 61: close(f); ! 62: } ! 63: } ! 64: ! 65: f = open("#c/time", OWRITE); ! 66: if(write(f, dirbuf, strlen(dirbuf)) < 0) ! 67: warning("can't set #c/time"); ! 68: close(f); ! 69: } ! 70: ! 71: #define SEC2MIN 60L ! 72: #define SEC2HOUR (60L*SEC2MIN) ! 73: #define SEC2DAY (24L*SEC2HOUR) ! 74: ! 75: int ! 76: g2(char **pp) ! 77: { ! 78: int v; ! 79: ! 80: v = 10*((*pp)[0]-'0') + (*pp)[1]-'0'; ! 81: *pp += 2; ! 82: return v; ! 83: } ! 84: ! 85: /* ! 86: * days per month plus days/year ! 87: */ ! 88: static int dmsize[] = ! 89: { ! 90: 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ! 91: }; ! 92: static int ldmsize[] = ! 93: { ! 94: 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ! 95: }; ! 96: ! 97: /* ! 98: * return the days/month for the given year ! 99: */ ! 100: static int * ! 101: yrsize(int yr) ! 102: { ! 103: if((yr % 4) == 0) ! 104: return ldmsize; ! 105: else ! 106: return dmsize; ! 107: } ! 108: ! 109: /* ! 110: * compute seconds since Jan 1 1970 ! 111: */ ! 112: static long ! 113: lusertime(char *argbuf) ! 114: { ! 115: char *buf; ! 116: ulong secs; ! 117: int i, y, m; ! 118: int *d2m; ! 119: ! 120: buf = argbuf; ! 121: i = strlen(buf); ! 122: if(i != 10 && i != 12) ! 123: return -1; ! 124: secs = 0; ! 125: y = g2(&buf); ! 126: m = g2(&buf); ! 127: if(y < 70) ! 128: y += 2000; ! 129: else ! 130: y += 1900; ! 131: ! 132: /* ! 133: * seconds per year ! 134: */ ! 135: for(i = 1970; i < y; i++){ ! 136: d2m = yrsize(i); ! 137: secs += d2m[0] * SEC2DAY; ! 138: } ! 139: ! 140: /* ! 141: * seconds per month ! 142: */ ! 143: d2m = yrsize(y); ! 144: for(i = 1; i < m; i++) ! 145: secs += d2m[i] * SEC2DAY; ! 146: ! 147: secs += (g2(&buf)-1) * SEC2DAY; ! 148: secs += g2(&buf) * SEC2HOUR; ! 149: secs += g2(&buf) * SEC2MIN; ! 150: if(*buf) ! 151: secs += g2(&buf); ! 152: ! 153: sprint(argbuf, "%ld", secs); ! 154: return secs; ! 155: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.