tmove hist - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e3769d22f79c3f33c4b4223a833d087d7620a491
 (DIR) parent 2e3b80968606dfa31a6b8981764e0f79d35068c6
 (HTM) Author: rsc <devnull@localhost>
       Date:   Wed, 13 Jul 2005 14:03:30 +0000
       
       move hist
       
       Diffstat:
         A src/cmd/hist.c                      |     280 +++++++++++++++++++++++++++++++
         D src/cmd/vbackup/hist.c              |     282 -------------------------------
       
       2 files changed, 280 insertions(+), 282 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/hist.c b/src/cmd/hist.c
       t@@ -0,0 +1,280 @@
       +#include        <u.h>
       +#include        <libc.h>
       +#include        <ctype.h>
       +
       +#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; i<argc; i++)
       +                ysearch(argv[i]);
       +        exits(0);
       +        return 0;
       +}
       +
       +int
       +strprefix(char *a, char *aa)
       +{
       +        return memcmp(a, aa, strlen(a)) == 0;
       +}
       +
       +void
       +ysearch(char *file)
       +{
       +        char *ndump;
       +        char fil[400], buf[500], nbuf[100], pair[2][500], *p;
       +        Tm *tm;
       +        Dir *dir, *d;
       +        ulong otime, dt;
       +        int toggle, started, missing;
       +
       +        started = 0;
       +        dir = dirstat(file);
       +        if(dir == nil)
       +                fprint(2, "history: warning: %s does not exist\n", file);
       +        else{
       +                print("%s %s %lld\n", prtime(dir->mtime), 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;
       +}
 (DIR) diff --git a/src/cmd/vbackup/hist.c b/src/cmd/vbackup/hist.c
       t@@ -1,282 +0,0 @@
       -#include        <u.h>
       -#include        <libc.h>
       -#include        <ctype.h>
       -
       -#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; i<argc; i++)
       -                ysearch(argv[i]);
       -        exits(0);
       -        return 0;
       -}
       -
       -int
       -strprefix(char *a, char *aa)
       -{
       -        return memcmp(a, aa, strlen(a)) == 0;
       -}
       -
       -void
       -ysearch(char *file)
       -{
       -        char *ndump;
       -        char fil[400], buf[500], nbuf[100], pair[2][500], *p;
       -        Tm *tm;
       -        Dir *dir, *d;
       -        ulong otime, dt;
       -        int toggle, started, missing;
       -
       -        started = 0;
       -        dir = dirstat(file);
       -        if(dir == nil)
       -                fprint(2, "history: warning: %s does not exist\n", file);
       -        else{
       -                print("%s %s %lld\n", prtime(dir->mtime), 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;
       -}