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
10int 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