Changeset 109
- Timestamp:
- Jun 21, 2011, 2:37:59 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lbatest/readsect.c
r107 r109 1 1 /****************************************************************************** 2 2 3 readsect.c - simple (dumb) HD sector read program3 readsect.c - simple (dumb) HD sector read and test program 4 4 5 5 Author: Markus Thielen 6 6 7 7 Compilation (Watcom): wcl386 -bt=os2 readsect.c 8 wcl386 -bt=os2 -d3 readsect.c (for debug) 8 9 9 10 Copyright (c) 2010 by thi.guten Software development, www.thiguten.de … … 33 34 #include <os2.h> 34 35 #include <stdio.h> 36 #include <io.h> 35 37 #include <stddef.h> 36 38 #include <stdlib.h> … … 57 59 58 60 char *log_fn = NULL; 61 unsigned long buffer_offset = 0; 59 62 60 63 … … 68 71 char drv[50]; 69 72 char *output; 70 FILE *fpo ; /* output file */73 FILE *fpo = NULL; /* output file */ 71 74 int ret; 72 unsigned long sectors_to_read; 73 unsigned long loop_sectors_start; 75 unsigned long sectors_to_read = 1024; 74 76 unsigned long i; 75 unsigned long sectors_per_read = 1; 77 unsigned long sectors_per_read = SECTORS_PER_READ; 78 unsigned long loop_sectors_start = sectors_per_read; 79 int a; 76 80 77 81 if (argc < 4) { … … 80 84 } 81 85 82 if (isalpha(argv[1][0])) { 83 sprintf(drv, "\\\\.\\%c", toupper(argv[1][0])); 84 } else if (isdigit(argv[1][0])) { 85 sprintf(drv, "\\\\.\\Physical_Disk%c", argv[1][0]); 86 } else { 87 usage(); 88 return -1; 89 } 90 91 /* get sectors to read */ 92 sectors_to_read = strtoul(argv[2], NULL, 10); 93 94 /* get output file */ 95 output = argv[3]; 96 if (*output == '-' && output[1] == 0) { 97 /* use stdout */ 98 fpo = stdout; 99 } else { 100 fpo = fopen(output, "wb"); 101 if (!fpo) { 102 perror("Failed to open output file"); 103 return(-1); 104 } 105 } 106 107 if (argc > 4) { 108 if (*argv[4] == '-') { 109 /* use a loop from 1 sectors to number specfied */ 110 loop_sectors_start = 1; 111 sectors_per_read = (unsigned long) atoi(argv[4] + 1); 112 log("Looping sector count from 1 to %u; not using output file\n", 113 sectors_per_read); 114 if (fpo && fpo != stdin) { 115 fclose(fpo); 116 fpo = NULL; 117 } 118 119 } else { 120 /* just one run */ 121 sectors_per_read = (unsigned long) atoi(argv[4]); 122 loop_sectors_start = sectors_per_read; 123 } 124 if (sectors_per_read == 0) { 125 sectors_per_read = SECTORS_PER_READ; 126 } 127 } 128 129 if (argc > 5) { 130 /* optional log file name */ 131 log_fn = argv[5]; 132 unlink(log_fn); 86 /* parse args */ 87 for (a = 1; a < argc; a++) { 88 89 if (argv[a][0] != '-' && argv[a][0] != '/') { 90 fprintf(stderr, "unknown argument %s - aborting\n", argv[a]); 91 return (-1); 92 } 93 94 switch (tolower(argv[a][1])) { 95 96 case 'd': 97 /* drive spec */ 98 if (isalpha(argv[++a][0])) { 99 sprintf(drv, "\\\\.\\%c", toupper(argv[a][0])); 100 } else if (isdigit(argv[a][0])) { 101 sprintf(drv, "\\\\.\\Physical_Disk%c", argv[a][0]); 102 } else { 103 usage(); 104 return -1; 105 } 106 break; 107 108 case 's': 109 /* get sectors to read */ 110 sectors_to_read = strtoul(argv[++a], NULL, 10); 111 break; 112 113 case 'o': 114 /* get output file */ 115 output = argv[++a]; 116 if (*output == '-' && output[1] == 0) { 117 /* use stdout */ 118 fpo = stdout; 119 } else { 120 fpo = fopen(output, "wb"); 121 if (!fpo) { 122 perror("Failed to open output file"); 123 return(-1); 124 } 125 } 126 break; 127 128 case 'b': 129 /* optional buffer size */ 130 if (*argv[++a] == '-') { 131 /* use a loop from 1 sectors to number specfied */ 132 loop_sectors_start = 1; 133 sectors_per_read = (unsigned long) atoi(argv[a] + 1); 134 log("Looping sector count from 1 to %u; not using output file\n", 135 sectors_per_read); 136 if (fpo && fpo != stdin) { 137 fclose(fpo); 138 fpo = NULL; 139 } 140 141 } else { 142 /* just one run */ 143 sectors_per_read = (unsigned long) atoi(argv[a]); 144 loop_sectors_start = sectors_per_read; 145 } 146 if (sectors_per_read == 0) { 147 sectors_per_read = SECTORS_PER_READ; 148 } 149 break; 150 151 case 'l': 152 /* optional log file name */ 153 log_fn = argv[++a]; 154 unlink(log_fn); 155 break; 156 157 case 'u': 158 /* use unaligned read buffer */ 159 buffer_offset = 1; 160 break; 161 } 133 162 } 134 163 … … 145 174 return ret; 146 175 147 }176 } 148 177 149 178 /****************************************************************************** … … 163 192 unsigned long sectors_read = 0; 164 193 165 buf = calloc(SECTOR_SIZE, sectors_per_read);194 buf = malloc(SECTOR_SIZE * sectors_per_read + buffer_offset); 166 195 log("\nusing %u sectors per read\n", sectors_per_read); 196 log("read buffer address: 0x%u %s\n", buf + buffer_offset, 197 buffer_offset ? "(unaligned)" : ""); 167 198 168 199 /* open drive */ … … 183 214 cb_take = SECTOR_SIZE * sectors_take; 184 215 185 log("\rReading %u sector(s) (%u sectors read)...",216 log("\rReading %u sector(s) this run; (%u sectors read so far)...", 186 217 sectors_take, sectors_read); 187 ret = DosRead(hf_disk, buf , cb_take, &cb_read);218 ret = DosRead(hf_disk, buf + buffer_offset, cb_take, &cb_read); 188 219 if (ret != NO_ERROR) { 189 220 fprintf(stderr, "\nFailed to read from disk %s, code %d\n", drv, ret); … … 202 233 203 234 sectors_read += cb_read / SECTOR_SIZE; 204 if (fpo && fwrite(buf , 1, cb_read, fpo) != cb_read) {235 if (fpo && fwrite(buf + buffer_offset, 1, cb_read, fpo) != cb_read) { 205 236 perror("Failed to write to output file"); 206 237 rc = -1; … … 209 240 210 241 } 242 243 log("\n%u sectors read.\n", sectors_read); 211 244 212 245 DosClose(hf_disk); … … 226 259 "Usage:\n\n" 227 260 "readsect <drive letter|number> <number of sectors> <outfile>\n" 228 " [ read buffer size] [log file]\n"261 " [<read buffer size>] [-lf <log file>] [-unaligned]\n" 229 262 "where:\n" 230 " drive letterdrive letter of logical drive to read from\n"231 " drive number1-based physical disk number to read from\n"232 " number of sectorsnumber of sectors to read (e.g. 1024)\n"233 " outfilepath and filename of output file\n"234 " read buffer sizeoptional buffer size in number of sectors (512 byte)\n"263 "-d drive letter drive letter of logical drive to read from\n" 264 " drive number 1-based physical disk number to read from\n" 265 "-s number of sectors number of sectors to read (e.g. 1024)\n" 266 "-o outfile path and filename of output file\n" 267 "-b read buffer size optional buffer size in number of sectors (512 byte)\n" 235 268 " (default is %d sectors)\n" 236 "log file optional log file name\n", 269 "-l log file optional log file name\n" 270 "-u use unaligned buffer\n", 237 271 SECTORS_PER_READ); 238 272 }
Note:
See TracChangeset
for help on using the changeset viewer.