hd.c revision 4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <stdint.h>
5#include <fcntl.h>
6#include <sys/ioctl.h>
7#include <errno.h>
8
9int hd_main(int argc, char *argv[])
10{
11    int c;
12    int fd;
13	unsigned char buf[4096];
14    int res;
15	int read_len;
16	int rv = 0;
17	int i;
18	int filepos = 0;
19	int sum;
20	int lsum;
21
22	int base = -1;
23	int count = 0;
24	int repeat = 0;
25
26    do {
27        c = getopt(argc, argv, "b:c:r:");
28        if (c == EOF)
29            break;
30        switch (c) {
31        case 'b':
32            base = strtol(optarg, NULL, 0);
33            break;
34        case 'c':
35            count = strtol(optarg, NULL, 0);
36            break;
37		case 'r':
38			repeat = strtol(optarg, NULL, 0);
39			break;
40        case '?':
41            fprintf(stderr, "%s: invalid option -%c\n",
42                argv[0], optopt);
43            exit(1);
44        }
45    } while (1);
46
47    if (optind + 1 != argc) {
48        fprintf(stderr, "Usage: %s [-b base] [-c count] [-r delay] file\n", argv[0]);
49        exit(1);
50    }
51
52    fd = open(argv[optind], O_RDONLY);
53    if(fd < 0) {
54        fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno));
55        return 1;
56    }
57
58	do {
59		if(base >= 0) {
60			lseek(fd, base, SEEK_SET);
61			filepos = base;
62		}
63		sum = 0;
64		lsum = 0;
65	    while(1) {
66			read_len = sizeof(buf);
67			if(count > 0 && base + count - filepos < read_len)
68				read_len = base + count - filepos;
69	        res = read(fd, &buf, read_len);
70			for(i = 0; i < res; i++) {
71				if((i & 15) == 0) {
72					printf("%08x: ", filepos + i);
73				}
74				lsum += buf[i];
75				sum += buf[i];
76				printf("%02x ", buf[i]);
77				if(((i & 15) == 15) || (i == res - 1)) {
78					printf("s %x\n", lsum);
79					lsum = 0;
80				}
81			}
82			if(res <= 0) {
83				printf("Read error on %s, offset %d len %d, %s\n", argv[optind], filepos, read_len, strerror(errno));
84				return 1;
85			}
86			filepos += res;
87			if(filepos == base + count)
88				break;
89	    }
90		printf("sum %x\n", sum);
91		if(repeat)
92			sleep(repeat);
93	} while(repeat);
94	return 0;
95}
96