| t@@ -0,0 +1,280 @@
+#include
+#include
+#include
+
+#define MINUTE(x) ((long)(x)*60L)
+#define HOUR(x) (MINUTE(x)*60L)
+#define YEAR(x) (HOUR(x)*24L*360L)
+
+int verb;
+int uflag;
+int force;
+int diff;
+int diffb;
+char* sflag;
+char *sys;
+
+void ysearch(char*);
+long starttime(char*);
+void lastbefore(ulong, char*, char*, char*);
+char* prtime(ulong);
+
+int
+main(int argc, char *argv[])
+{
+ int i;
+
+ sys = sysname();
+ if(strncmp(sys, "amsterdam", 9) == 0) /* BUG */
+ sys = "am";
+
+ ARGBEGIN {
+ default:
+ goto usage;
+ case 'v':
+ verb = 1;
+ break;
+ case 'f':
+ force = 1;
+ break;
+ case 'd':
+ diff = 1;
+ break;
+ case 'b':
+ diffb = 1;
+ break;
+ case 's':
+ sflag = ARGF();
+ break;
+ case 'u':
+ uflag = 1;
+ break;
+ } ARGEND
+
+ if(argc == 0) {
+ usage:
+ fprint(2, "usage: hist [-bdfuv] [-s yyyymmdd] files\n");
+ exits(0);
+ }
+
+ for(i=0; imtime), file, dir->length);
+ started = 1;
+ strcpy(pair[1], file);
+ }
+ free(dir);
+ fil[0] = 0;
+ if(file[0] != '/') {
+ getwd(strchr(fil, 0), 100);
+ strcat(fil, "/");
+ }
+ strcat(fil, file);
+ cleanname(fil);
+
+ sprint(nbuf, "/dump/%s", sys);
+ ndump = nbuf;
+
+ tm = localtime(time(0));
+ sprint(buf, "%s/%.4d/", ndump, tm->year+1900);
+ if(access(buf, AREAD) < 0){
+ print("cannot access %s\n", buf);
+ return;
+ }
+
+ otime = starttime(sflag);
+ toggle = 0;
+ for(;;) {
+ lastbefore(otime, fil, buf, ndump);
+ dir = dirstat(buf);
+ if(dir == nil) {
+ if(!force)
+ return;
+ dir = malloc(sizeof(Dir));
+ nulldir(dir);
+ dir->mtime = otime + 1;
+ }
+ dt = HOUR(12);
+ missing = 0;
+ while(otime <= dir->mtime){
+ if(verb)
+ print("backup %ld, %ld\n", dir->mtime, otime-dt);
+ lastbefore(otime-dt, fil, buf, ndump);
+ d = dirstat(buf);
+ if(d == nil){
+ if(!force)
+ return;
+ if(!missing)
+ print("removed %s\n", buf);
+ missing = 1;
+ }else{
+ free(dir);
+ dir = d;
+ }
+ dt += HOUR(12);
+ }
+ strcpy(pair[toggle], buf);
+ if(diff && started){
+ if(verb)
+ print("diff %s %s\n", pair[toggle^1], pair[toggle]);
+ switch(rfork(RFFDG|RFPROC)){
+ case 0:
+ execlp("diff", "diff", diffb ? "-cb" : "-c", pair[toggle], pair[toggle ^ 1], 0);
+ fprint(2, "can't exec diff: %r\n");
+ exits(0);
+ case -1:
+ fprint(2, "can't fork diff: %r\n");
+ break;
+ default:
+ while(waitpid() != -1)
+ ;
+ break;
+ }
+ }
+ print("%s %s %lld\n", prtime(dir->mtime), buf, dir->length);
+ toggle ^= 1;
+ started = 1;
+ otime = dir->mtime;
+ free(dir);
+ }
+}
+
+void
+lastbefore(ulong t, char *f, char *b, char *ndump)
+{
+ Tm *tm;
+ Dir *dir;
+ int vers, try;
+ ulong t0, mtime;
+
+ t0 = t;
+ if(verb)
+ print("%ld lastbefore %s\n", t0, f);
+ mtime = 0;
+ for(try=0; try<10; try++) {
+ tm = localtime(t);
+ sprint(b, "%s/%.4d/%.2d%.2d", ndump,
+ tm->year+1900, tm->mon+1, tm->mday);
+ dir = dirstat(b);
+ if(dir){
+ mtime = dir->mtime;
+ free(dir);
+ }
+ if(dir==nil || mtime > t0) {
+ if(verb)
+ print("%ld earlier %s\n", mtime, b);
+ t -= HOUR(24);
+ continue;
+ }
+ for(vers=0;; vers++) {
+ sprint(b, "%s/%.4d/%.2d%.2d%d", ndump,
+ tm->year+1900, tm->mon+1, tm->mday, vers+1);
+ dir = dirstat(b);
+ if(dir){
+ mtime = dir->mtime;
+ free(dir);
+ }
+ if(dir==nil || mtime > t0)
+ break;
+ if(verb)
+ print("%ld later %s\n", mtime, b);
+ }
+ sprint(b, "%s/%.4d/%.2d%.2d%s", ndump,
+ tm->year+1900, tm->mon+1, tm->mday, f);
+ if(vers)
+ sprint(b, "%s/%.4d/%.2d%.2d%d%s", ndump,
+ tm->year+1900, tm->mon+1, tm->mday, vers, f);
+ return;
+ }
+ strcpy(b, "XXX"); /* error */
+}
+
+char*
+prtime(ulong t)
+{
+ static char buf[100];
+ char *b;
+ Tm *tm;
+
+ if(uflag)
+ tm = gmtime(t);
+ else
+ tm = localtime(t);
+ b = asctime(tm);
+ memcpy(buf, b+4, 24);
+ buf[24] = 0;
+ return buf;
+}
+
+long
+starttime(char *s)
+{
+ Tm *tm;
+ long t, dt;
+ int i, yr, mo, da;
+
+ t = time(0);
+ if(s == 0)
+ return t;
+ for(i=0; s[i]; i++)
+ if(s[i] < '0' || s[i] > '9') {
+ fprint(2, "bad start time: %s\n", s);
+ return t;
+ }
+ if(strlen(s)==6){
+ yr = (s[0]-'0')*10 + s[1]-'0';
+ mo = (s[2]-'0')*10 + s[3]-'0' - 1;
+ da = (s[4]-'0')*10 + s[5]-'0';
+ if(yr < 70)
+ yr += 100;
+ }else if(strlen(s)==8){
+ yr = (((s[0]-'0')*10 + s[1]-'0')*10 + s[2]-'0')*10 + s[3]-'0';
+ yr -= 1900;
+ mo = (s[4]-'0')*10 + s[5]-'0' - 1;
+ da = (s[6]-'0')*10 + s[7]-'0';
+ }else{
+ fprint(2, "bad start time: %s\n", s);
+ return t;
+ }
+ t = 0;
+ dt = YEAR(10);
+ for(i=0; i<50; i++) {
+ tm = localtime(t+dt);
+ if(yr > tm->year ||
+ (yr == tm->year && mo > tm->mon) ||
+ (yr == tm->year && mo == tm->mon) && da > tm->mday) {
+ t += dt;
+ continue;
+ }
+ dt /= 2;
+ if(dt == 0)
+ break;
+ }
+ t += HOUR(12); /* .5 day to get to noon of argument */
+ return t;
+} |
| t@@ -1,282 +0,0 @@
-#include
-#include
-#include
-
-#define MINUTE(x) ((long)(x)*60L)
-#define HOUR(x) (MINUTE(x)*60L)
-#define YEAR(x) (HOUR(x)*24L*360L)
-
-int verb;
-int uflag;
-int force;
-int diff;
-int diffb;
-char* sflag;
-char *sys;
-
-void ysearch(char*);
-long starttime(char*);
-void lastbefore(ulong, char*, char*, char*);
-char* prtime(ulong);
-
-int
-main(int argc, char *argv[])
-{
- int i;
-
- sys = sysname();
- if(strncmp(sys, "amsterdam", 9) == 0)
- sys = "am";
- else if(strncmp(sys, "toil", 4) == 0)
- sys = "toil";
-
- ARGBEGIN {
- default:
- goto usage;
- case 'v':
- verb = 1;
- break;
- case 'f':
- force = 1;
- break;
- case 'd':
- diff = 1;
- break;
- case 'b':
- diffb = 1;
- break;
- case 's':
- sflag = ARGF();
- break;
- case 'u':
- uflag = 1;
- break;
- } ARGEND
-
- if(argc == 0) {
- usage:
- fprint(2, "usage: hist [-bdfuv] [-s yyyymmdd] files\n");
- exits(0);
- }
-
- for(i=0; imtime), file, dir->length);
- started = 1;
- strcpy(pair[1], file);
- }
- free(dir);
- fil[0] = 0;
- if(file[0] != '/') {
- getwd(strchr(fil, 0), 100);
- strcat(fil, "/");
- }
- strcat(fil, file);
- cleanname(fil);
-
- sprint(nbuf, "/dump/%s", sys);
- ndump = nbuf;
-
- tm = localtime(time(0));
- sprint(buf, "%s/%.4d/", ndump, tm->year+1900);
- if(access(buf, AREAD) < 0){
- print("cannot access %s\n", buf);
- return;
- }
-
- otime = starttime(sflag);
- toggle = 0;
- for(;;) {
- lastbefore(otime, fil, buf, ndump);
- dir = dirstat(buf);
- if(dir == nil) {
- if(!force)
- return;
- dir = malloc(sizeof(Dir));
- nulldir(dir);
- dir->mtime = otime + 1;
- }
- dt = HOUR(12);
- missing = 0;
- while(otime <= dir->mtime){
- if(verb)
- print("backup %ld, %ld\n", dir->mtime, otime-dt);
- lastbefore(otime-dt, fil, buf, ndump);
- d = dirstat(buf);
- if(d == nil){
- if(!force)
- return;
- if(!missing)
- print("removed %s\n", buf);
- missing = 1;
- }else{
- free(dir);
- dir = d;
- }
- dt += HOUR(12);
- }
- strcpy(pair[toggle], buf);
- if(diff && started){
- if(verb)
- print("diff %s %s\n", pair[toggle^1], pair[toggle]);
- switch(rfork(RFFDG|RFPROC)){
- case 0:
- execlp("diff", "diff", diffb ? "-cb" : "-c", pair[toggle], pair[toggle ^ 1], 0);
- fprint(2, "can't exec diff: %r\n");
- exits(0);
- case -1:
- fprint(2, "can't fork diff: %r\n");
- break;
- default:
- while(waitpid() != -1)
- ;
- break;
- }
- }
- print("%s %s %lld\n", prtime(dir->mtime), buf, dir->length);
- toggle ^= 1;
- started = 1;
- otime = dir->mtime;
- free(dir);
- }
-}
-
-void
-lastbefore(ulong t, char *f, char *b, char *ndump)
-{
- Tm *tm;
- Dir *dir;
- int vers, try;
- ulong t0, mtime;
-
- t0 = t;
- if(verb)
- print("%ld lastbefore %s\n", t0, f);
- mtime = 0;
- for(try=0; try<10; try++) {
- tm = localtime(t);
- sprint(b, "%s/%.4d/%.2d%.2d", ndump,
- tm->year+1900, tm->mon+1, tm->mday);
- dir = dirstat(b);
- if(dir){
- mtime = dir->mtime;
- free(dir);
- }
- if(dir==nil || mtime > t0) {
- if(verb)
- print("%ld earlier %s\n", mtime, b);
- t -= HOUR(24);
- continue;
- }
- for(vers=0;; vers++) {
- sprint(b, "%s/%.4d/%.2d%.2d%d", ndump,
- tm->year+1900, tm->mon+1, tm->mday, vers+1);
- dir = dirstat(b);
- if(dir){
- mtime = dir->mtime;
- free(dir);
- }
- if(dir==nil || mtime > t0)
- break;
- if(verb)
- print("%ld later %s\n", mtime, b);
- }
- sprint(b, "%s/%.4d/%.2d%.2d%s", ndump,
- tm->year+1900, tm->mon+1, tm->mday, f);
- if(vers)
- sprint(b, "%s/%.4d/%.2d%.2d%d%s", ndump,
- tm->year+1900, tm->mon+1, tm->mday, vers, f);
- return;
- }
- strcpy(b, "XXX"); /* error */
-}
-
-char*
-prtime(ulong t)
-{
- static char buf[100];
- char *b;
- Tm *tm;
-
- if(uflag)
- tm = gmtime(t);
- else
- tm = localtime(t);
- b = asctime(tm);
- memcpy(buf, b+4, 24);
- buf[24] = 0;
- return buf;
-}
-
-long
-starttime(char *s)
-{
- Tm *tm;
- long t, dt;
- int i, yr, mo, da;
-
- t = time(0);
- if(s == 0)
- return t;
- for(i=0; s[i]; i++)
- if(s[i] < '0' || s[i] > '9') {
- fprint(2, "bad start time: %s\n", s);
- return t;
- }
- if(strlen(s)==6){
- yr = (s[0]-'0')*10 + s[1]-'0';
- mo = (s[2]-'0')*10 + s[3]-'0' - 1;
- da = (s[4]-'0')*10 + s[5]-'0';
- if(yr < 70)
- yr += 100;
- }else if(strlen(s)==8){
- yr = (((s[0]-'0')*10 + s[1]-'0')*10 + s[2]-'0')*10 + s[3]-'0';
- yr -= 1900;
- mo = (s[4]-'0')*10 + s[5]-'0' - 1;
- da = (s[6]-'0')*10 + s[7]-'0';
- }else{
- fprint(2, "bad start time: %s\n", s);
- return t;
- }
- t = 0;
- dt = YEAR(10);
- for(i=0; i<50; i++) {
- tm = localtime(t+dt);
- if(yr > tm->year ||
- (yr == tm->year && mo > tm->mon) ||
- (yr == tm->year && mo == tm->mon) && da > tm->mday) {
- t += dt;
- continue;
- }
- dt /= 2;
- if(dt == 0)
- break;
- }
- t += HOUR(12); /* .5 day to get to noon of argument */
- return t;
-} |