1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdint.h>
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include <sys/ioctl.h>
8 #include <errno.h>
9
cmp_main(int argc,char * argv[])10 int cmp_main(int argc, char *argv[])
11 {
12 int c;
13 int fd1, fd2;
14 char buf1[4096], buf2[4096];
15 int res, res1, res2;
16 int rv = 0;
17 int i;
18 int filepos = 0;
19
20 int show_byte = 0;
21 int show_all = 0;
22 int limit = 0;
23
24 do {
25 c = getopt(argc, argv, "bln:");
26 if (c == EOF)
27 break;
28 switch (c) {
29 case 'b':
30 show_byte = 1;
31 break;
32 case 'l':
33 show_all = 1;
34 break;
35 case 'n':
36 limit = atoi(optarg);
37 break;
38 case '?':
39 fprintf(stderr, "%s: invalid option -%c\n",
40 argv[0], optopt);
41 exit(1);
42 }
43 } while (1);
44
45 if (optind + 2 != argc) {
46 fprintf(stderr, "Usage: %s [-b] [-l] [-n count] file1 file2\n", argv[0]);
47 exit(1);
48 }
49
50 fd1 = open(argv[optind], O_RDONLY);
51 if(fd1 < 0) {
52 fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno));
53 return 1;
54 }
55
56 fd2 = open(argv[optind+1], O_RDONLY);
57 if(fd2 < 0) {
58 fprintf(stderr, "could not open %s, %s\n", argv[optind+1], strerror(errno));
59 return 1;
60 }
61
62 while(1) {
63 res1 = read(fd1, &buf1, sizeof(buf1));
64 res2 = read(fd2, &buf2, sizeof(buf2));
65 res = res1 < res2 ? res1 : res2;
66 if(res1 == 0 && res2 == 0) {
67 return rv;
68 }
69 for(i = 0; i < res; i++) {
70 if(buf1[i] != buf2[i]) {
71 printf("%s %s differ byte %d", argv[optind], argv[optind+1], filepos + i);
72 if(show_byte)
73 printf(" 0x%02x 0x%02x", buf1[i], buf2[i]);
74 printf("\n");
75 if(!show_all)
76 return 1;
77 rv = 1;
78 }
79 if(limit) {
80 limit--;
81 if(limit == 0)
82 return rv;
83 }
84 }
85 if(res1 != res2 || res < 0) {
86 printf("%s on %s\n", res < 0 ? "Read error" : "EOF", res1 < res2 ? argv[optind] : argv[optind+1]);
87 return 1;
88 }
89 filepos += res;
90 }
91 }
92