home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 165 / ST0102.ZIP / MT.C < prev    next >
C/C++ Source or Header  |  1991-11-18  |  3KB  |  157 lines

  1. /*
  2. ** SCSI Tape Control (Low Level)
  3. **
  4. ** usage: mt bsf|bsr|eod|fsf|fsr|offline|online|eof|weof|erase|rewind [count]
  5. **
  6. ** Revision History:
  7. **
  8. ** Version 1.0  09/09/90 Initial Release
  9. **
  10. ** Version 1.1  09/29/90 Use keywords instead of minus style options.
  11. **                       This makes us a little more like the
  12. **                       bezerkley 'mt' command.
  13. **
  14. ** Version 1.2  10/04/90 Update the i/o packet structure.
  15. **
  16. */
  17. #include <stdio.h>
  18. #include <fcntl.h>
  19. #include <string.h>
  20. #include <dos.h>
  21. #include "ioctl.h"
  22.  
  23. #define TRUE (1)
  24. #define FALSE (0)
  25. #define VERSION "mt Version 1.2 BWA"
  26.  
  27. extern int _doserrno;
  28.  
  29. struct cmd ioctl_data;
  30. union REGS inregs, outregs;
  31. struct SREGS segregs;
  32. int fd;
  33. char *device = "SCSITAPE";
  34. char far *cp;
  35.  
  36. main(argc, argv)
  37. int argc;
  38. char *argv[];
  39. {
  40.     /*
  41.     ** say hello
  42.     */
  43.     if (argc < 2 || argc > 3) usage();
  44.     if ( !strcmp(argv[1], "bsf") )            /* space by filemark */
  45.     {
  46.         ioctl_data.command = 'S';
  47.         if (argc == 3)
  48.             ioctl_data.arg1 = -atoi(argv[2]);
  49.         else
  50.             ioctl_data.arg1 = -1;
  51.         ioctl_data.arg2 = 1;
  52.     }
  53.     else if ( !strcmp(argv[1], "bsr") )        /* space by block */
  54.     {
  55.         ioctl_data.command = 'S';
  56.         if (argc == 3)
  57.             ioctl_data.arg1 = -atoi(argv[2]);
  58.         else
  59.             ioctl_data.arg1 = -1;
  60.         ioctl_data.arg2 = 0;
  61.     }
  62.     else if ( !strcmp(argv[1], "eod") )        /* space to eod */
  63.     {
  64.         if (argc == 3) usage();
  65.         ioctl_data.command = 'S';
  66.         ioctl_data.arg1 = 1;
  67.         ioctl_data.arg2 = 3;
  68.     }
  69.     else if ( !strcmp(argv[1], "fsf") )        /* space by filemark */
  70.     {
  71.         ioctl_data.command = 'S';
  72.         if (argc == 3)
  73.             ioctl_data.arg1 = atoi(argv[2]);
  74.         else
  75.             ioctl_data.arg1 = 1;
  76.         ioctl_data.arg2 = 1;
  77.     }
  78.     else if ( !strcmp(argv[1], "fsr") )        /* space by block */
  79.     {
  80.         ioctl_data.command = 'S';
  81.         if (argc == 3)
  82.             ioctl_data.arg1 = atoi(argv[2]);
  83.         else
  84.             ioctl_data.arg1 = 1;
  85.         ioctl_data.arg2 = 0;
  86.     }
  87.     else if ( !strcmp(argv[1], "online") )
  88.     {
  89.         if (argc == 3) usage();
  90.         ioctl_data.command = 'N';
  91.     }
  92.     else if ( !strcmp(argv[1], "offline") )
  93.     {
  94.         if (argc == 3) usage();
  95.         ioctl_data.command = 'L';
  96.     }
  97.     else if ( !strcmp(argv[1], "eof") || !strcmp(argv[1], "weof") )
  98.     {
  99.         ioctl_data.command = 'M';
  100.         if (argc == 3)
  101.             ioctl_data.arg1 = atoi(argv[2]);
  102.         else
  103.             ioctl_data.arg1 = 1;
  104.     }
  105.     else if ( !strcmp(argv[1], "erase") )
  106.     {
  107.         if (argc == 3) usage();
  108.         ioctl_data.command = 'E';
  109.     }
  110.     else if ( !strcmp(argv[1], "rewind") )
  111.     {
  112.         if (argc == 3) usage();
  113.         ioctl_data.command = 'R';
  114.     }
  115.     else
  116.     {
  117.         usage();
  118.     }
  119.  
  120.     /*
  121.     ** put together the command
  122.     */
  123.     fd = open(device, O_WRONLY);
  124.     if ( fd < 0 )
  125.     {
  126.         perror(device);
  127.         exit(1);
  128.     }
  129.     inregs.h.ah = 0x44;            /* ioctl */
  130.     inregs.h.al = 0x03;            /* write */
  131.     inregs.x.bx = fd;            /* unit */
  132.     inregs.x.cx = sizeof(struct cmd);
  133.     cp = (char *) &ioctl_data;
  134.     inregs.x.dx = FP_OFF(cp);
  135.     segregs.ds = FP_SEG(cp);
  136.  
  137.     /*
  138.     ** start the command
  139.     */
  140.     intdosx(&inregs, &outregs, &segregs);
  141.  
  142.     /*
  143.     ** see what happened
  144.     */
  145.     if ( outregs.x.cflag )
  146.         printf("mt: %s: error %d.\n", device, _doserrno);
  147.     close(fd);
  148.     exit(0);
  149. }
  150.  
  151. usage()
  152. {
  153.     puts(VERSION);
  154.     puts("usage: mt bsf|bsr|eod|fsf|fsr|offline|online|eof|weof|erase|rewind [count]");
  155.     exit(1);
  156. }
  157.