7e4c303fe0
hd would error out on files that were not a multiple of its read
buffer size (4096). For example:
Read error on init.rc, offset 17040 len 4096, No such file or directory
The fix is to stop reading on EOF instead of treating it as an
error.
Signed-off-by: Scott Anderson <saa@google.com>
(cherry picked from commit a9fac4155f
)
Change-Id: Ib2af725fc39e96c2f81559f61979d451604d4817
98 lines
2 KiB
C
98 lines
2 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <sys/ioctl.h>
|
|
#include <errno.h>
|
|
|
|
int hd_main(int argc, char *argv[])
|
|
{
|
|
int c;
|
|
int fd;
|
|
unsigned char buf[4096];
|
|
int res;
|
|
int read_len;
|
|
int rv = 0;
|
|
int i;
|
|
int filepos = 0;
|
|
int sum;
|
|
int lsum;
|
|
|
|
int base = -1;
|
|
int count = 0;
|
|
int repeat = 0;
|
|
|
|
do {
|
|
c = getopt(argc, argv, "b:c:r:");
|
|
if (c == EOF)
|
|
break;
|
|
switch (c) {
|
|
case 'b':
|
|
base = strtol(optarg, NULL, 0);
|
|
break;
|
|
case 'c':
|
|
count = strtol(optarg, NULL, 0);
|
|
break;
|
|
case 'r':
|
|
repeat = strtol(optarg, NULL, 0);
|
|
break;
|
|
case '?':
|
|
fprintf(stderr, "%s: invalid option -%c\n",
|
|
argv[0], optopt);
|
|
exit(1);
|
|
}
|
|
} while (1);
|
|
|
|
if (optind + 1 != argc) {
|
|
fprintf(stderr, "Usage: %s [-b base] [-c count] [-r delay] file\n", argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
fd = open(argv[optind], O_RDONLY);
|
|
if(fd < 0) {
|
|
fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno));
|
|
return 1;
|
|
}
|
|
|
|
do {
|
|
if(base >= 0) {
|
|
lseek(fd, base, SEEK_SET);
|
|
filepos = base;
|
|
}
|
|
sum = 0;
|
|
lsum = 0;
|
|
while(1) {
|
|
read_len = sizeof(buf);
|
|
if(count > 0 && base + count - filepos < read_len)
|
|
read_len = base + count - filepos;
|
|
res = read(fd, &buf, read_len);
|
|
if(res == 0)
|
|
break;
|
|
for(i = 0; i < res; i++) {
|
|
if((i & 15) == 0) {
|
|
printf("%08x: ", filepos + i);
|
|
}
|
|
lsum += buf[i];
|
|
sum += buf[i];
|
|
printf("%02x ", buf[i]);
|
|
if(((i & 15) == 15) || (i == res - 1)) {
|
|
printf("s %x\n", lsum);
|
|
lsum = 0;
|
|
}
|
|
}
|
|
if(res < 0) {
|
|
printf("Read error on %s, offset %d len %d, %s\n", argv[optind], filepos, read_len, strerror(errno));
|
|
return 1;
|
|
}
|
|
filepos += res;
|
|
if(filepos == base + count)
|
|
break;
|
|
}
|
|
printf("sum %x\n", sum);
|
|
if(repeat)
|
|
sleep(repeat);
|
|
} while(repeat);
|
|
return 0;
|
|
}
|