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