home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 4 Drivers / 04-Drivers.zip / scsiopt2.zip / scsiopt.c < prev    next >
C/C++ Source or Header  |  1998-02-15  |  5KB  |  286 lines

  1. /*
  2.  * $Source: d:/source/driver/perf/RCS/scsiopt.c,v $
  3.  * $Revision: 1.3 $
  4.  * $Date: 1998/02/15 13:29:55 $
  5.  * $Locker:  $
  6.  *
  7.  * Displays messages from SCSIOpt.flt.
  8.  *
  9.  * Compile with...
  10.  * IBM CSet++ 2.1    - icc -Q -W2all -O [-Gd] dperf.c
  11.  * IBM VAC++ 3.00    - icc -Q -W2all -O [-Gd] dperf.c
  12.  * GNU C 2.7.*        - gcc -Wall -O3 [-Zcrtdll] dperf.c
  13.  * WatCom C/C++ 10.5    - wcl386 -zq -bt=os2v2 -3s -wx -oax dperf.c
  14.  *
  15.  * $Log: scsiopt.c,v $
  16.  * Revision 1.3  1998/02/15 13:29:55  vitus
  17.  * - corrected name of filter driver
  18.  *
  19.  * Revision 1.2  1997/12/16 02:49:46  vitus
  20.  * - renamed source files
  21.  * - renamed driver
  22.  *
  23.  * Revision 1.1  1997/12/11 01:55:35  vitus
  24.  * Initial revision
  25.  *
  26.  */
  27. static char const id[]="$Id: scsiopt.c,v 1.3 1998/02/15 13:29:55 vitus Exp $";
  28.  
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <stdlib.h>
  32.  
  33. #define INCL_DOS
  34. #include <os2.h>
  35.  
  36. #include "scsioptpub.h"
  37.  
  38.  
  39.  
  40.  
  41. #define DEVICENAME    "SCSIOPT$"        /* SCSIOpt.flt is actual... */
  42.  
  43. #define MODE_MESSAGE    2
  44.  
  45.  
  46. /*
  47.  * Global variables
  48.  */
  49. char    szPrgName[_MAX_PATH];
  50. char    fVerbose = 0;
  51. char    fMode = MODE_MESSAGE;
  52.  
  53.  
  54.  
  55. void
  56. usage(void)
  57. {
  58.     printf("usage: %s [-?]\n", szPrgName);
  59. }
  60. void
  61. help(void)
  62. {
  63.     usage();
  64.     printf("\nDisplays messages generated by SCSIOpt.flt\n");
  65. }
  66.  
  67.  
  68.  
  69.  
  70. void
  71. DumpBuffer(PUCHAR buf,size_t siz)
  72. {
  73.     for(; siz; --siz, ++buf )
  74.     printf(" %02x", *buf);
  75. }
  76.  
  77.  
  78.  
  79.  
  80. /*#
  81.  * NAME
  82.  *    DisplayVersion
  83.  * CALL
  84.  *    DisplayVersion(hd)
  85.  * PARAMETER
  86.  *    hd        handle to open device
  87.  * RETURNS
  88.  *    OS error code
  89.  * GLOBAL
  90.  *    none
  91.  * DESPRIPTION
  92.  *    Displays driver version.
  93.  * REMARKS
  94.  */
  95. int
  96. DisplayVersion(HFILE hd)
  97. {
  98.     APIRET        rc;
  99.     DSKPF_VER_DATA    data;
  100.     ULONG        datasize;
  101.  
  102.     do
  103.     {
  104.     datasize = sizeof(data);
  105.     rc = DosDevIOCtl(hd, IOCTL_DSKPERF_CATEGORY, DSKPF_QUERY_VERSION,
  106.              NULL, 0, NULL, &data, datasize, &datasize);
  107.     if( rc )
  108.     {
  109.         fprintf(stderr, "DSKPF_QUERY_VERSION - error %lu\n", rc);
  110.         break;
  111.     }
  112.  
  113.     printf("Installed: SCSIOPT.FLT %u.%02u\n",
  114.            HIBYTE(data.version), LOBYTE(data.version));
  115.     }
  116.     while( 0 );
  117.  
  118.     return (int)rc;
  119. }
  120.  
  121.  
  122.  
  123.  
  124. /*#
  125.  * NAME
  126.  *    DisplayMessages
  127.  * CALL
  128.  *    DisplayMessages(hd)
  129.  * PARAMETER
  130.  *    hd        handle to open device
  131.  * RETURNS
  132.  *    OS error code
  133.  * GLOBAL
  134.  *    none
  135.  * DESPRIPTION
  136.  *    Displays messages saved during driver startup.
  137.  * REMARKS
  138.  */
  139. int
  140. DisplayMessages(HFILE hd)
  141. {
  142.     APIRET    rc;
  143.     USHORT    cb = 0;                /* keep compiler happy */
  144.     unsigned    i;
  145.     ULONG    datasize;
  146.     DSKPF_MSGS_DATA * data = NULL;
  147.  
  148.     do
  149.     {
  150.     /* First: read size of stored messages */
  151.  
  152.     datasize = sizeof(cb);
  153.     rc = DosDevIOCtl(hd, IOCTL_DSKPERF_CATEGORY, DSKPF_READ_MSGS,
  154.              NULL, 0, NULL, &cb, datasize, &datasize);
  155.     if( rc )
  156.     {
  157.         fprintf(stderr, "DSKPF_READ_MSGS - error %lu\n", rc);
  158.         break;
  159.     }
  160.  
  161.     /* Second: allocate buffer big enough to hold
  162.      * those messages (but not a single byte more) */
  163.  
  164.     datasize = FIELDOFFSET(DSKPF_MSGS_DATA,msg) + (ULONG)cb;
  165.     data = malloc(datasize);
  166.     if( data == NULL )
  167.     {
  168.         fprintf(stderr, "out of memory\n");
  169.         rc = (APIRET)-3;
  170.         break;
  171.     }
  172.  
  173.     /* Third: read and display messages */
  174.  
  175.     rc = DosDevIOCtl(hd, IOCTL_DSKPERF_CATEGORY, DSKPF_READ_MSGS,
  176.              NULL, 0, NULL, data, datasize, &datasize);
  177.     if( rc )
  178.     {
  179.         fprintf(stderr, "DSKPF_READ_MSGS - error %lu\n", rc);
  180.         break;
  181.     }
  182.  
  183.     printf("------------------------------"
  184.            "------------------------------\n");
  185.     for( i = 0;
  186.         i < data->cb - FIELDOFFSET(DSKPF_MSGS_DATA,msg);
  187.         i += strlen(&data->msg[i])+1 )
  188.     {
  189.         printf("%s\n", &data->msg[i]);
  190.     }
  191.     printf("------------------------------"
  192.            "------------------------------\n");
  193.     }
  194.     while( 0 );
  195.  
  196.     if( data != NULL )
  197.     free(data);
  198.     return (int)rc;
  199. }
  200.  
  201.  
  202.  
  203.  
  204. /*#
  205.  * NAME
  206.  *    main
  207.  * CALL
  208.  *    main(argc,argv)
  209.  * PARAMETER
  210.  *    argc,argv    as usual
  211.  * RETURNS
  212.  *    0        OK
  213.  *    /0        some error
  214.  * GLOBAL
  215.  *    szPrgName, fVerbose
  216.  * DESPRIPTION
  217.  *    Main routine, parses parameter and calls requested
  218.  *    subfunctions.
  219.  * REMARKS
  220.  */
  221. int
  222. main(int argc,char *argv[])
  223. {
  224.     HFILE    hd = 0;
  225.     ULONG    action_taken;
  226.     APIRET    rc;
  227.     int        result;
  228.  
  229.     strcpy(szPrgName, argv[0]);
  230.     while( argc > 1  &&  argv[1][0] == '-' )
  231.     {
  232.     switch( argv[1][1] )
  233.     {
  234.       case '?':
  235.         help();
  236.         return 0;
  237.  
  238.       case 'v':
  239.         fVerbose = 1;
  240.         break;
  241.  
  242.       default:
  243.         fprintf(stderr, "%s: unknown arg \"%s\"\n", szPrgName, argv[1]);
  244.         return -1;
  245.     }
  246.     --argc;
  247.     ++argv;
  248.     }
  249.  
  250.     /* Open device driver, no special settings.  Use DENYNONE
  251.      * so other processes (daemon?) may open concurrently. */
  252.  
  253.     rc = DosOpen(DEVICENAME, &hd, &action_taken,
  254.          0, 0,
  255.          OPEN_ACTION_FAIL_IF_NEW|OPEN_ACTION_OPEN_IF_EXISTS,
  256.          OPEN_SHARE_DENYNONE|OPEN_ACCESS_READWRITE,
  257.          NULL);
  258.     if( rc )
  259.     {
  260.     fprintf(stderr, "DosOpen(%s) - error %lu\n", DEVICENAME, rc);
  261.     return (int)rc;
  262.     }
  263.  
  264.     DisplayVersion(hd);                /* always display version */
  265.     switch( fMode )
  266.     {
  267.       case MODE_MESSAGE:
  268.     if( argc != 1 )
  269.     {
  270.         fprintf(stderr, "argument count error\n");
  271.         result = -1;
  272.     }
  273.     else
  274.         result = DisplayMessages(hd);
  275.     break;
  276.  
  277.       default:
  278.     result = -1;
  279.     break;
  280.     }
  281.  
  282.     DosClose(hd);                /* be a nice guy */
  283.  
  284.     return result;
  285. }
  286.