|  | /* | 
|  | * 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); | 
|  | } | 
|  | } |