7 itemcmp(const void *v1, const void *v2)
9 char *const*d1 = v1, *const*d2 = v2;
11 return strcmp(*d1, *d2);
22 if ((fd = open(name, OREAD)) < 0){
23 panic(mflag ? 0 : 2, "can't open %s\n", name);
28 if((n = dirreadall(fd, &db)) > 0){
30 cp = REALLOC(cp, char *, (nitems+1));
31 cp[nitems] = MALLOC(char, strlen((db+n)->name)+1);
32 strcpy(cp[nitems], (db+n)->name);
37 cp = REALLOC(cp, char*, (nitems+1));
40 qsort((char *)cp, nitems, sizeof(char*), itemcmp);
45 isdotordotdot(char *p)
50 if (p[1] == '.' && !p[2])
57 diffdir(char *f, char *t, int level)
59 char **df, **dt, **dirf, **dirt;
62 char fb[MAXPATHLEN+1], tb[MAXPATHLEN+1];
68 if(df == nil || dt == nil)
73 if (from && isdotordotdot(from)) {
77 if (to && isdotordotdot(to)) {
86 res = strcmp(from, to);
88 if (mode == 0 || mode == 'n')
89 Bprint(&stdout, "Only in %s: %s\n", f, from);
94 if (mode == 0 || mode == 'n')
95 Bprint(&stdout, "Only in %s: %s\n", t, to);
99 if (mkpathname(fb, f, from))
101 if (mkpathname(tb, t, to))
103 diff(fb, tb, level+1);
107 for (df = dirf; df && *df; df++)
109 for (dt = dirt; dt && *dt; dt++)