plan 9 kernel history: overview | file list | diff list

2002/0115/boot/settime.c (diff list | history)

boot/settime.c on 1992/0318
1992/0318    
#include <u.h> 
#include <libc.h> 
1993/0330    
#include <auth.h> 
1992/0318    
#include <fcall.h> 
#include "../boot/boot.h" 
 
1992/0611    
static long lusertime(char*); 
 
1992/0909    
char *timeserver = "#s/boot"; 
 
1992/0318    
void 
2001/0819    
settime(int islocal, int afd) 
1992/0318    
{ 
	int n, f; 
	int timeset; 
2001/0527    
	Dir dir[2]; 
	char timebuf[64]; 
1992/0318    
 
	print("time..."); 
	timeset = 0; 
	if(islocal){ 
		/* 
		 *  set the time from the real time clock 
		 */ 
		f = open("#r/rtc", ORDWR); 
		if(f >= 0){ 
2001/0527    
			if((n = read(f, timebuf, sizeof(timebuf)-1)) > 0){ 
				timebuf[n] = '\0'; 
1992/0318    
				timeset = 1; 
			} 
			close(f); 
1992/0611    
		}else do{ 
2001/0527    
			strcpy(timebuf, "yymmddhhmm[ss]"); 
			outin("\ndate/time ", timebuf, sizeof(timebuf)); 
		}while((timeset=lusertime(timebuf)) <= 0); 
1992/0318    
	} 
	if(timeset == 0){ 
		/* 
		 *  set the time from the access time of the root 
		 */ 
1992/0909    
		f = open(timeserver, ORDWR); 
1992/0318    
		if(f < 0) 
			return; 
2001/0819    
		if(mount(f, afd, "/tmp", MREPL, "") < 0){ 
1993/0501    
			warning("settime mount"); 
1993/0330    
			close(f); 
			return; 
		} 
1992/0318    
		close(f); 
2001/0819    
		if(stat("/tmp", statbuf, sizeof statbuf) < 0) 
1992/0318    
			fatal("stat"); 
2001/0527    
		convM2D(statbuf, sizeof statbuf, &dir[0], (char*)&dir[1]); 
		sprint(timebuf, "%ld", dir[0].atime); 
2001/0819    
		unmount(0, "/tmp"); 
1992/0318    
	} 
 
	f = open("#c/time", OWRITE); 
2001/0527    
	if(write(f, timebuf, strlen(timebuf)) < 0) 
1992/0611    
		warning("can't set #c/time"); 
1992/0318    
	close(f); 
1993/0501    
	print("\n"); 
1992/0611    
} 
 
#define SEC2MIN 60L 
#define SEC2HOUR (60L*SEC2MIN) 
#define SEC2DAY (24L*SEC2HOUR) 
 
int 
g2(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 * 
1999/0113    
yrsize(int y) 
1992/0611    
{ 
1999/0113    
 
	if((y%4) == 0 && ((y%100) != 0 || (y%400) == 0)) 
1992/0611    
		return ldmsize; 
	else 
		return dmsize; 
} 
 
/* 
 *  compute seconds since Jan 1 1970 
 */ 
static long 
lusertime(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; 
1992/0318    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)