|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <stdint.h> | 
|  | #include <fcntl.h> | 
|  | #include <sys/ioctl.h> | 
|  | #include <errno.h> | 
|  |  | 
|  | int cmp_main(int argc, char *argv[]) | 
|  | { | 
|  | int c; | 
|  | int fd1, fd2; | 
|  | char buf1[4096], buf2[4096]; | 
|  | int res, res1, res2; | 
|  | int rv = 0; | 
|  | int i; | 
|  | int filepos = 0; | 
|  |  | 
|  | int show_byte = 0; | 
|  | int show_all = 0; | 
|  | int limit = 0; | 
|  |  | 
|  | do { | 
|  | c = getopt(argc, argv, "bln:"); | 
|  | if (c == EOF) | 
|  | break; | 
|  | switch (c) { | 
|  | case 'b': | 
|  | show_byte = 1; | 
|  | break; | 
|  | case 'l': | 
|  | show_all = 1; | 
|  | break; | 
|  | case 'n': | 
|  | limit = atoi(optarg); | 
|  | break; | 
|  | case '?': | 
|  | fprintf(stderr, "%s: invalid option -%c\n", | 
|  | argv[0], optopt); | 
|  | exit(1); | 
|  | } | 
|  | } while (1); | 
|  |  | 
|  | if (optind + 2 != argc) { | 
|  | fprintf(stderr, "Usage: %s [-b] [-l] [-n count] file1 file2\n", argv[0]); | 
|  | exit(1); | 
|  | } | 
|  |  | 
|  | fd1 = open(argv[optind], O_RDONLY); | 
|  | if(fd1 < 0) { | 
|  | fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno)); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | fd2 = open(argv[optind+1], O_RDONLY); | 
|  | if(fd2 < 0) { | 
|  | fprintf(stderr, "could not open %s, %s\n", argv[optind+1], strerror(errno)); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | while(1) { | 
|  | res1 = read(fd1, &buf1, sizeof(buf1)); | 
|  | res2 = read(fd2, &buf2, sizeof(buf2)); | 
|  | res = res1 < res2 ? res1 : res2; | 
|  | if(res1 == 0 && res2 == 0) { | 
|  | return rv; | 
|  | } | 
|  | for(i = 0; i < res; i++) { | 
|  | if(buf1[i] != buf2[i]) { | 
|  | printf("%s %s differ byte %d", argv[optind], argv[optind+1], filepos + i); | 
|  | if(show_byte) | 
|  | printf(" 0x%02x 0x%02x", buf1[i], buf2[i]); | 
|  | printf("\n"); | 
|  | if(!show_all) | 
|  | return 1; | 
|  | rv = 1; | 
|  | } | 
|  | if(limit) { | 
|  | limit--; | 
|  | if(limit == 0) | 
|  | return rv; | 
|  | } | 
|  | } | 
|  | if(res1 != res2 || res < 0) { | 
|  | printf("%s on %s\n", res < 0 ? "Read error" : "EOF", res1 < res2 ? argv[optind] : argv[optind+1]); | 
|  | return 1; | 
|  | } | 
|  | filepos += res; | 
|  | } | 
|  | } |