5 #define MINUTE(x) ((long)(x)*60L)
6 #define HOUR(x) (MINUTE(x)*60L)
7 #define YEAR(x) (HOUR(x)*24L*360L)
18 long starttime(char*);
19 void lastbefore(ulong, char*, char*, char*);
23 main(int argc, char *argv[])
28 if(strncmp(sys, "amsterdam", 9) == 0) /* BUG */
56 fprint(2, "usage: hist [-bdfuv] [-s yyyymmdd] files\n");
67 strprefix(char *a, char *aa)
69 return memcmp(a, aa, strlen(a)) == 0;
76 char fil[400], buf[500], nbuf[100], pair[2][500];
80 int toggle, started, missing;
85 fprint(2, "history: warning: %s does not exist\n", file);
87 print("%s %s %lld\n", prtime(dir->mtime), file, dir->length);
89 strcpy(pair[1], file);
94 getwd(strchr(fil, 0), 100);
100 sprint(nbuf, "/dump/%s", sys);
103 tm = localtime(time(0));
104 sprint(buf, "%s/%.4d/", ndump, tm->year+1900);
105 if(access(buf, AREAD) < 0){
106 print("cannot access %s\n", buf);
110 otime = starttime(sflag);
113 lastbefore(otime, fil, buf, ndump);
118 dir = malloc(sizeof(Dir));
120 dir->mtime = otime + 1;
124 while(otime <= dir->mtime){
126 print("backup %ld, %ld\n", dir->mtime, otime-dt);
127 lastbefore(otime-dt, fil, buf, ndump);
133 print("removed %s\n", buf);
141 strcpy(pair[toggle], buf);
144 print("diff %s %s\n", pair[toggle^1], pair[toggle]);
145 switch(rfork(RFFDG|RFPROC)){
147 execlp("diff", "diff", diffb ? "-cb" : "-c", pair[toggle], pair[toggle ^ 1], (char*)0);
148 fprint(2, "can't exec diff: %r\n");
151 fprint(2, "can't fork diff: %r\n");
154 while(waitpid() != -1)
159 print("%s %s %lld\n", prtime(dir->mtime), buf, dir->length);
168 lastbefore(ulong t, char *f, char *b, char *ndump)
177 print("%ld lastbefore %s\n", t0, f);
179 for(try=0; try<10; try++) {
181 sprint(b, "%s/%.4d/%.2d%.2d", ndump,
182 tm->year+1900, tm->mon+1, tm->mday);
188 if(dir==nil || mtime > t0) {
190 print("%ld earlier %s\n", mtime, b);
194 for(vers=0;; vers++) {
195 sprint(b, "%s/%.4d/%.2d%.2d%d", ndump,
196 tm->year+1900, tm->mon+1, tm->mday, vers+1);
202 if(dir==nil || mtime > t0)
205 print("%ld later %s\n", mtime, b);
207 sprint(b, "%s/%.4d/%.2d%.2d%s", ndump,
208 tm->year+1900, tm->mon+1, tm->mday, f);
210 sprint(b, "%s/%.4d/%.2d%.2d%d%s", ndump,
211 tm->year+1900, tm->mon+1, tm->mday, vers, f);
214 strcpy(b, "XXX"); /* error */
220 static char buf[100];
229 memcpy(buf, b+4, 24);
245 if(s[i] < '0' || s[i] > '9') {
246 fprint(2, "bad start time: %s\n", s);
250 yr = (s[0]-'0')*10 + s[1]-'0';
251 mo = (s[2]-'0')*10 + s[3]-'0' - 1;
252 da = (s[4]-'0')*10 + s[5]-'0';
255 }else if(strlen(s)==8){
256 yr = (((s[0]-'0')*10 + s[1]-'0')*10 + s[2]-'0')*10 + s[3]-'0';
258 mo = (s[4]-'0')*10 + s[5]-'0' - 1;
259 da = (s[6]-'0')*10 + s[7]-'0';
261 fprint(2, "bad start time: %s\n", s);
266 for(i=0; i<50; i++) {
267 tm = localtime(t+dt);
269 (yr == tm->year && mo > tm->mon) ||
270 (yr == tm->year && mo == tm->mon) && da > tm->mday) {
278 t += HOUR(12); /* .5 day to get to noon of argument */