1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "diff.h" 5 6 static int 7 itemcmp(void const *d1, void const *d2) 8 { 9 return strcmp((char *) d1, (char *)d2); 10 } 11 12 static char ** 13 scandir(char *name) 14 { 15 char **cp; 16 Dir db[32]; 17 int nitems; 18 int fd, n; 19 20 if ((fd = open(name, OREAD)) < 0) 21 panic(2, "can't open %s\n", name); 22 cp = 0; 23 nitems = 0; 24 while((n = dirread(fd, db, sizeof db)) > 0){ 25 n /= sizeof(Dir); 26 while (n--) { 27 cp = REALLOC(cp, char *, (nitems+1)); 28 cp[nitems] = MALLOC(char, strlen(db[n].name)+1); 29 strcpy(cp[nitems], db[n].name); 30 nitems++; 31 } 32 } 33 cp = REALLOC(cp, char*, (nitems+1)); 34 cp[nitems] = 0; 35 close(fd); 36 qsort((char *)cp, nitems, sizeof(char*), itemcmp); 37 return cp; 38 } 39 40 static int 41 isdotordotdot(char *p) 42 { 43 if (*p == '.') { 44 if (!p[1]) 45 return 1; 46 if (p[1] == '.' && !p[2]) 47 return 1; 48 } 49 return 0; 50 } 51 52 void 53 diffdir(char *f, char *t, int level) 54 { 55 char **df, **dt, **dirf, **dirt; 56 char *from, *to; 57 int res; 58 char fb[MAXPATHLEN+1], tb[MAXPATHLEN+1]; 59 60 df = dirf = scandir(f); 61 dt = dirt = scandir(t); 62 while (*df || *dt) { 63 from = *df++; 64 to = *dt++; 65 if (from && isdotordotdot(from)) 66 continue; 67 if (to && isdotordotdot(to)) 68 continue; 69 if (!from) 70 res = 1; 71 else if (!to) 72 res = -1; 73 else 74 res = strcmp(from, to); 75 if (res < 0) { 76 if (mode == 0) 77 Bprint(&stdout, "Only in %s: %s\n", f, from); 78 continue; 79 } 80 if (res > 0) { 81 if (mode == 0) 82 Bprint(&stdout, "Only in %s: %s\n", t, to); 83 continue; 84 } 85 if (mkpathname(fb, f, from)) 86 continue; 87 if (mkpathname(tb, t, to)) 88 continue; 89 diff(fb, tb, level+1); 90 } 91 for (df = dirf; *df; df++) 92 FREE(*df); 93 for (dt = dirt; *dt; dt++) 94 FREE(*dt); 95 FREE(dirf); 96 FREE(dirt); 97 } 98