1 /*
2     This progam will compare two crc lists and report the differences.
3 
4     Copyright 1989 Jon Zeeff (zeeff@b-tech.ann-arbor.mi.us)
5 
6     Permission is granted to use this in any manner provided that
7     1) the copyright notice is left intact,
8     2) you don't hold me responsible for any bugs and
9     3) you mail me any improvements that you make.
10 
11 
12     report:
13          corrupt	-	crc changed w/o date change
14          replaced	-	crc + date changed
15          perm		-	permissions changed
16          own/grp	-	owner or group changed
17 	 removed	-
18 	 added		-
19 
20 Print the info for the new file except for deleted.
21 
22 Use:
23 
24 find / -print | sort | xargs crc -v > crc_file
25 
26 to generate a crc list (crc.c should accompany this source).
27 
28 Assume that no files have tabs or spaces in the name.
29 
30 */
31 
32 /*
33  sequent stuff -- may or may not need it?  Worked fine without it
34 on a sequent I had, but others claim they need it.  Go figure.
35 
36 #ifdef sequent
37 #define strrchr(s, c)	rindex(s,c)
38 #endif
39 
40 */
41 
42 /* max size of line */
43 
44 #define BUF_SIZE 1124
45 
46 #include <stdio.h>
47 
48 char	*strrchr();
49 void    exit();
50 
51 char	new_line[BUF_SIZE];
52 char	old_line[BUF_SIZE];
53 
54 FILE *new_file;
55 FILE *old_file;
56 
main(argc,argv)57 main(argc, argv)
58 int	argc;
59 char	**argv;
60 {
61    /*
62 
63            If line =, read new line from each file
64            else
65            If date/perm/crc change, report and read new line from each file
66            else
67            If old_line < new_line, report file removed, read old line
68            else
69               report new line as added
70               read new_line
71         loop
72 */
73 
74    char	*new_ptr;
75    char	*old_ptr;
76 
77    if (argc != 3) {
78       (void) printf("wrong number of arguments\n");
79       (void) printf("crc_check old_crc_file new_crc_file\n");
80       exit(1);
81    }
82    new_file = fopen(argv[2], "r");
83    old_file = fopen(argv[1], "r");
84 
85    if (new_file == NULL || old_file == NULL) {
86       (void) printf("can't open input files\n");
87       (void) printf("crc_check old_crc_file new_crc_file\n");
88       exit(1);
89    }
90 
91    get_line(new_line);
92    get_line(old_line);
93 
94    for (; ; ) {
95 
96       check_eof();
97 
98       /* If equal, print nothing and get new lines */
99 
100       if (strcmp(old_line, new_line) == 0) {
101          get_line(new_line);
102          get_line(old_line);
103          continue;
104       }
105 
106       /* Compare just the file names */
107 
108       new_ptr = strrchr(new_line, ' ');
109       old_ptr = strrchr(old_line, ' ');
110 
111       if (new_ptr == NULL || old_ptr == NULL) {
112          (void) printf("Error in input data\n");
113          exit(1);
114       }
115 
116       if (strcmp(old_ptr, new_ptr) == 0) {
117 
118          new_ptr = strrchr(new_line, '\t');
119          old_ptr = strrchr(old_line, '\t');
120 
121          if (new_ptr == NULL || old_ptr == NULL) {
122             (void) printf("Error in input data\n");
123             exit(1);
124          }
125 
126          /* check crc change */
127 
128          if (strncmp(new_line, old_line, 4) != 0)
129             if (strcmp(new_ptr, old_ptr) == 0)
130                (void) printf("corrupt  %s", new_line + 5);
131             else
132                (void) printf("replaced %s", new_line + 5);
133 
134 
135          /* check permission chenage */
136 
137          if (strncmp(new_line + 5, old_line + 5, 11) != 0)
138             (void) printf("permiss  %s", new_line + 5);
139 
140          /* check  owner/group */
141 
142          if (strncmp(new_line+16, old_line+16, new_ptr - new_line - 15) != 0)
143             (void) printf("own/grp  %s", new_line + 5);
144 
145          get_line(new_line);
146          get_line(old_line);
147          continue;
148       }
149 
150 
151       if (strcmp(old_ptr, new_ptr) < 0) {
152          (void) printf("removed  %s", old_line + 5);
153          get_line(old_line);
154          continue;
155       }
156 
157       (void) printf("added    %s", new_line + 5);
158       get_line(new_line);
159 
160    }
161 
162 }
163 
164 
get_line(string)165 get_line(string)
166 char	*string;
167 {
168    if (string == new_line)
169       (void) fgets(string, BUF_SIZE, new_file);
170    else
171       (void) fgets(string, BUF_SIZE, old_file);
172 
173 }
174 
175 
check_eof()176 check_eof()
177 {
178 
179    if (feof(new_file)) {
180 
181       while (!feof(old_file)) {
182          (void) printf("removed  %s", old_line + 5);
183          (void) fgets(old_line, BUF_SIZE, old_file);
184       }
185       exit(0);
186    } else if (feof(old_file)) {
187       while (!feof(new_file)) {
188          (void) printf("added    %s", new_line + 5);
189          (void) fgets(new_line, BUF_SIZE, new_file);
190       }
191       exit(0);
192    }
193 
194 }
195 
196 
197 
198