Home | History | Annotate | Download | only in toolbox
      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 
     10 int hd_main(int argc, char *argv[])
     11 {
     12     int c;
     13     int fd;
     14 	unsigned char buf[4096];
     15     int res;
     16 	int read_len;
     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 			if(res == 0)
     71 				break;
     72 			for(i = 0; i < res; i++) {
     73 				if((i & 15) == 0) {
     74 					printf("%08x: ", filepos + i);
     75 				}
     76 				lsum += buf[i];
     77 				sum += buf[i];
     78 				printf("%02x ", buf[i]);
     79 				if(((i & 15) == 15) || (i == res - 1)) {
     80 					printf("s %x\n", lsum);
     81 					lsum = 0;
     82 				}
     83 			}
     84 			if(res < 0) {
     85 				printf("Read error on %s, offset %d len %d, %s\n", argv[optind], filepos, read_len, strerror(errno));
     86 				return 1;
     87 			}
     88 			filepos += res;
     89 			if(filepos == base + count)
     90 				break;
     91 	    }
     92 		printf("sum %x\n", sum);
     93 		if(repeat)
     94 			sleep(repeat);
     95 	} while(repeat);
     96 	return 0;
     97 }
     98