home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 14 / CDACTUAL.iso / cdactual / demobin / share / program / asm / SCSIDRV.ZIP / SREMAP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-06  |  2.6 KB  |  130 lines

  1. /*
  2. ** SCSI Disk Block Reassign
  3. **
  4. ** usage: sremap drive:
  5. **
  6. ** Revision History:
  7. **
  8. ** Version 1.0  10/17/90 Initial Release
  9. */
  10. #include <stdio.h>
  11. #include <dos.h>
  12. #include "ioctl.h"
  13.  
  14. #define TRUE (1)
  15. #define FALSE (0)
  16. #define VERSION "sremap Version 1.0 BWA"
  17.  
  18. extern int _doserrno;
  19.  
  20. struct cmd ioctl_data;
  21. struct remaps remap_list;
  22. union REGS inregs, outregs;
  23. struct SREGS segregs;
  24. unsigned char drive;
  25. char far *cp;
  26.  
  27. main(argc, argv)
  28. int argc;
  29. char *argv[];
  30. {
  31.     long block;
  32.     short remap_count = 0;
  33.     char answer[BUFSIZ];
  34.  
  35.     /*
  36.     ** say hello
  37.     */
  38.     puts(VERSION);
  39.     if (argc != 2) usage();
  40.  
  41.     /*
  42.     ** figure out who to format
  43.     */
  44.     if (argv[1][1] != ':') usage();
  45.     drive = argv[1][0];
  46.     drive = toupper(drive);
  47.     drive -= '@';
  48.  
  49.     /*
  50.     ** ask for remap list
  51.     */
  52.     puts("Input your remap list, <enter> to terminate.");
  53.     while (remap_count < MAX_DEFECTS)
  54.     {
  55.         printf("Logical Block Address: ");
  56.         fflush(stdout);
  57.         fgets(answer, BUFSIZ, stdin);
  58.         if ( answer[0] == '\n' ) break;
  59.         sscanf(answer, "%lx", &block);
  60.         remap_list.list[remap_count].remap_lba3 = (block >> 24) & 0x00FF;
  61.         remap_list.list[remap_count].remap_lba2 = (block >> 16) & 0x00FF;
  62.         remap_list.list[remap_count].remap_lba1 = (block >> 8) & 0x00FF;
  63.         remap_list.list[remap_count].remap_lba0 = block & 0x00FF;
  64.         remap_count++;
  65.     }
  66.  
  67.     /*
  68.     ** adjust to length of list in bytes
  69.     */
  70.     remap_count *= sizeof(struct remap_entry);
  71.  
  72.     /*
  73.     ** verify that this is what the user really wants to do
  74.     */
  75.     printf("Do you really wish to remap blocks on the SCSI\n");
  76.     printf("device that contains drive %c: (y,n)? ", argv[1][0]);
  77.     fflush(stdout);
  78.     if ( getchar() != 'y' )
  79.     {
  80.         puts("Aborting reassign ....");
  81.         exit(1);
  82.     }
  83.  
  84.     /*
  85.     ** build the remap list header
  86.     */
  87.     remap_list.header.reserved = 0;
  88.     remap_list.header.reserved2 = 0;
  89.     remap_list.header.rll_msb = (remap_count >> 8) & 0x00FF;
  90.     remap_list.header.rll_lsb = remap_count & 0x00FF;
  91.  
  92.     /*
  93.     ** put together the command
  94.     */
  95.     inregs.h.ah = 0x44;            /* ioctl */
  96.     inregs.h.al = 0x05;            /* write */
  97.     inregs.h.bl = drive;        /* unit */
  98.     inregs.x.cx = sizeof(struct cmd);
  99.     cp = (char *) &ioctl_data;
  100.     inregs.x.dx = FP_OFF(cp);
  101.     segregs.ds = FP_SEG(cp);
  102.     ioctl_data.command = I_REASSIGN;
  103.     cp = (char *) &remap_list;
  104.     ioctl_data.buf_ofs = FP_OFF(cp);
  105.     ioctl_data.buf_seg = FP_SEG(cp);
  106.     ioctl_data.buf_len = sizeof(struct remap_header) + remap_count;
  107.  
  108.     /*
  109.     ** start the remap
  110.     */
  111.     puts("Now reassigning ....");
  112.     puts("Please wait ....");
  113.     intdosx(&inregs, &outregs, &segregs);
  114.  
  115.     /*
  116.     ** see what happened
  117.     */
  118.     if ( outregs.x.cflag )
  119.         printf("DOS error %d occured during reassign.\n", _doserrno);
  120.     else
  121.         puts("Reassigning complete.");
  122.     exit(0);
  123. }
  124.  
  125. usage()
  126. {
  127.     puts("usage: sremap drive:");
  128.     exit(1);
  129. }
  130.