| /* | 
 |  * Clumsy hack to take snapshots and dumps. | 
 |  */ | 
 | #include <u.h> | 
 | #include <libc.h> | 
 |  | 
 | void | 
 | usage(void) | 
 | { | 
 | 	fprint(2, "usage: fossil/dump [-i snap-interval] [-n name] fscons /n/fossil\n"); | 
 | 	exits("usage"); | 
 | } | 
 |  | 
 | char* | 
 | snapnow(void) | 
 | { | 
 | 	Tm t; | 
 | 	static char buf[100]; | 
 |  | 
 | 	t = *localtime(time(0)-5*60*60);	/* take dumps at 5:00 am */ | 
 |  | 
 | 	sprint(buf, "archive/%d/%02d%02d", t.year+1900, t.mon+1, t.mday); | 
 | 	return buf; | 
 | } | 
 |  | 
 | void | 
 | main(int argc, char **argv) | 
 | { | 
 | 	int onlyarchive, cons, s; | 
 | 	ulong t, i; | 
 | 	char *name; | 
 |  | 
 | 	name = "main"; | 
 | 	s = 0; | 
 | 	onlyarchive = 0; | 
 | 	i = 60*60;		/* one hour */ | 
 | 	ARGBEGIN{ | 
 | 	case 'i': | 
 | 		i = atoi(EARGF(usage())); | 
 | 		if(i == 0){ | 
 | 			onlyarchive = 1; | 
 | 			i = 60*60; | 
 | 		} | 
 | 		break; | 
 | 	case 'n': | 
 | 		name = EARGF(usage()); | 
 | 		break; | 
 | 	case 's': | 
 | 		s = atoi(EARGF(usage())); | 
 | 		break; | 
 | 	}ARGEND | 
 |  | 
 | 	if(argc != 2) | 
 | 		usage(); | 
 |  | 
 | 	if((cons = open(argv[0], OWRITE)) < 0) | 
 | 		sysfatal("open %s: %r", argv[0]); | 
 |  | 
 | 	if(chdir(argv[1]) < 0) | 
 | 		sysfatal("chdir %s: %r", argv[1]); | 
 |  | 
 | 	rfork(RFNOTEG); | 
 | 	switch(fork()){ | 
 | 	case -1: | 
 | 		sysfatal("fork: %r"); | 
 | 	case 0: | 
 | 		break; | 
 | 	default: | 
 | 		exits(0); | 
 | 	} | 
 |  | 
 | 	/* | 
 | 	 * pause at boot time to let clock stabilize. | 
 | 	 */ | 
 | 	if(s) | 
 | 		sleep(s*1000); | 
 |  | 
 | 	for(;;){ | 
 | 		if(access(snapnow(), AEXIST) < 0) | 
 | 			fprint(cons, "\nfsys %s snap -a\n", name); | 
 | 		t = time(0); | 
 | 		sleep((i - t%i)*1000+200); | 
 | 		if(!onlyarchive) | 
 | 			fprint(cons, "\nfsys %s snap\n", name); | 
 | 	} | 
 | } |