Blame


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