📄 settime.c
字号:
#include <u.h>#include <libc.h>#include <auth.h>#include <fcall.h>#include "../boot/boot.h"static long lusertime(char*);char *timeserver = "#s/boot";voidsettime(int islocal){ int n, f; int timeset; Dir dir; char dirbuf[DIRLEN]; print("time..."); timeset = 0; if(islocal){ /* * set the time from the real time clock */ f = open("#r/rtc", ORDWR); if(f >= 0){ if((n = read(f, dirbuf, sizeof(dirbuf)-1)) > 0){ dirbuf[n] = 0; timeset = 1; } close(f); }else do{ strcpy(dirbuf, "yymmddhhmm[ss]"); outin("\ndate/time ", dirbuf, sizeof(dirbuf)); }while((timeset=lusertime(dirbuf)) <= 0); } if(timeset == 0){ /* * set the time from the access time of the root */ f = open(timeserver, ORDWR); if(f < 0) return; if(mount(f, "/mnt", MREPL, "") < 0){ warning("settime mount"); close(f); return; } close(f); if(stat("/mnt", dirbuf) < 0) fatal("stat"); convM2D(dirbuf, &dir); sprint(dirbuf, "%ld", dir.atime); unmount(0, "/mnt"); } f = open("#c/time", OWRITE); if(write(f, dirbuf, strlen(dirbuf)) < 0) warning("can't set #c/time"); close(f); print("\n");}#define SEC2MIN 60L#define SEC2HOUR (60L*SEC2MIN)#define SEC2DAY (24L*SEC2HOUR)intg2(char **pp){ int v; v = 10*((*pp)[0]-'0') + (*pp)[1]-'0'; *pp += 2; return v;}/* * days per month plus days/year */static int dmsize[] ={ 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};static int ldmsize[] ={ 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};/* * return the days/month for the given year */static int *yrsize(int y){ if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0)) return ldmsize; else return dmsize;}/* * compute seconds since Jan 1 1970 */static longlusertime(char *argbuf){ char *buf; ulong secs; int i, y, m; int *d2m; buf = argbuf; i = strlen(buf); if(i != 10 && i != 12) return -1; secs = 0; y = g2(&buf); m = g2(&buf); if(y < 70) y += 2000; else y += 1900; /* * seconds per year */ for(i = 1970; i < y; i++){ d2m = yrsize(i); secs += d2m[0] * SEC2DAY; } /* * seconds per month */ d2m = yrsize(y); for(i = 1; i < m; i++) secs += d2m[i] * SEC2DAY; secs += (g2(&buf)-1) * SEC2DAY; secs += g2(&buf) * SEC2HOUR; secs += g2(&buf) * SEC2MIN; if(*buf) secs += g2(&buf); sprint(argbuf, "%ld", secs); return secs;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -