Changeset 109


Ignore:
Timestamp:
Jun 21, 2011, 2:37:59 PM (14 years ago)
Author:
Markus Thielen
Message:

added unaligned buffer option

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lbatest/readsect.c

    r107 r109  
    11/******************************************************************************
    22
    3   readsect.c - simple (dumb) HD sector read program
     3  readsect.c - simple (dumb) HD sector read and test program
    44
    55  Author: Markus Thielen
    66
    77  Compilation (Watcom): wcl386 -bt=os2 readsect.c
     8                        wcl386 -bt=os2 -d3 readsect.c (for debug)
    89
    910  Copyright (c) 2010 by thi.guten Software development, www.thiguten.de
     
    3334#include <os2.h>
    3435#include <stdio.h>
     36#include <io.h>
    3537#include <stddef.h>
    3638#include <stdlib.h>
     
    5759
    5860char *log_fn = NULL;
     61unsigned long buffer_offset = 0;
    5962
    6063
     
    6871  char drv[50];
    6972  char *output;
    70   FILE *fpo; /* output file */
     73  FILE *fpo = NULL; /* output file */
    7174  int ret;
    72   unsigned long sectors_to_read;
    73   unsigned long loop_sectors_start;
     75  unsigned long sectors_to_read = 1024;
    7476  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;
    7680
    7781  if (argc < 4) {
     
    8084  }
    8185
    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    }
    133162  }
    134163
     
    145174  return ret;
    146175
    147 }
     176  }
    148177
    149178/******************************************************************************
     
    163192  unsigned long sectors_read = 0;
    164193
    165   buf = calloc(SECTOR_SIZE, sectors_per_read);
     194  buf = malloc(SECTOR_SIZE * sectors_per_read + buffer_offset);
    166195  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)" : "");
    167198
    168199  /* open drive */
     
    183214    cb_take = SECTOR_SIZE * sectors_take;
    184215
    185     log("\rReading %u sector(s) (%u sectors read)...",
     216    log("\rReading %u sector(s) this run; (%u sectors read so far)...",
    186217           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);
    188219    if (ret != NO_ERROR) {
    189220      fprintf(stderr, "\nFailed to read from disk %s, code %d\n", drv, ret);
     
    202233
    203234    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) {
    205236      perror("Failed to write to output file");
    206237      rc = -1;
     
    209240
    210241  }
     242
     243  log("\n%u sectors read.\n", sectors_read);
    211244
    212245  DosClose(hf_disk);
     
    226259         "Usage:\n\n"
    227260         "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"
    229262         "where:\n"
    230          "drive letter         drive letter of logical drive to read from\n"
    231          "drive number         1-based physical disk number to read from\n"
    232          "number of sectors    number of sectors to read (e.g. 1024)\n"
    233          "outfile              path and filename of output file\n"
    234          "read buffer size     optional 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"
    235268         "                      (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",
    237271         SECTORS_PER_READ);
    238272}
Note: See TracChangeset for help on using the changeset viewer.