home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 May / PCO_5_97.ISO / FilesBBS / OS2 / DSKSL085.ARJ / DSKSL085.ZIP / dsl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-05  |  7.4 KB  |  374 lines

  1. /*
  2.  * $Source: e:/source/driver/sleep/RCS/dsl.c,v $
  3.  * $Revision: 1.2 $
  4.  * $Date: 1997/03/05 21:58:26 $
  5.  * $Author: vitus $
  6.  *
  7.  * Displays and/or modifies device sleeping timers.  Sample
  8.  * application.
  9.  * Compile with...
  10.  * IBM CSet++ 2.1    - icc -Q -W2all -O [-Gd] dsl.c
  11.  * GNU C 2.7.0        - gcc -Wall -O3 [-Zcrtdll] dsl.c
  12.  * WatCom C/C++ 10.5    - wcl386 -zq -bt=os2v2 -3s -wx -oax dsl.c
  13.  *
  14.  * $Log: dsl.c,v $
  15.  * Revision 1.2  1997/03/05 21:58:26  vitus
  16.  * Changed for new timeout in seconds
  17.  * Added mode to display saved messages
  18.  *
  19.  * Revision 1.1  1997/02/06 01:25:42  vitus
  20.  * Initial revision
  21.  *
  22.  */
  23. static char vcid[]="$Id: dsl.c,v 1.2 1997/03/05 21:58:26 vitus Exp $";
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28.  
  29. #define INCL_DOS
  30. #include <os2.h>
  31.  
  32. #include "dskslpub.h"
  33.  
  34.  
  35.  
  36.  
  37. #define DEVICENAME    "dsleeps$"        /* DSKSLEEP.FLT is actual... */
  38.  
  39. #define MODE_DEVICE    1
  40. #define MODE_MESSAGE    2
  41.  
  42.  
  43. /*
  44.  * Global variables
  45.  */
  46. char    szPrgName[_MAX_PATH];
  47. char    fVerbose = 0;
  48. char    fMode = MODE_DEVICE;
  49.  
  50.  
  51. void
  52. usage(void)
  53. {
  54.     printf("usage: %s [-?] {-m | [a1,d1,t1 a2,d2,t2 ...]}\n", szPrgName );
  55. }
  56. void
  57. help(void)
  58. {
  59.     usage();
  60.     printf("\nDisplays and/or changes sleeping times\n"
  61.        " -m\tdisplay saved messages\n"
  62.        " -?\tthis text\n\n"
  63.        " a,d,m\tselects new timeout value ('m' minutes) for device 'd' on adapter 'a'\n");
  64. }
  65.  
  66.  
  67.  
  68.  
  69. /*#
  70.  * NAME
  71.  *    DisplayVersion
  72.  * CALL
  73.  *    DisplayVersion(hd)
  74.  * PARAMETER
  75.  *    hd        handle to open device
  76.  * RETURNS
  77.  *    OS error code
  78.  * GLOBAL
  79.  *    none
  80.  * DESPRIPTION
  81.  *    Displays driver version.
  82.  * REMARKS
  83.  */
  84. int
  85. DisplayVersion(HFILE hd)
  86. {
  87.     APIRET    rc;
  88.     USHORT    version = 0;
  89.     ULONG    datasize = sizeof(version);
  90.  
  91.     /* Issue IOCtl, version will be returned in 16bits */
  92.  
  93.     rc = DosDevIOCtl( hd, IOCTL_DSKSLEEP_CATEGORY, DSKSL_QUERY_VERSION,
  94.              NULL, 0, NULL,
  95.              &version, datasize, &datasize );
  96.  
  97.     if( rc )
  98.     fprintf(stderr,"DSKSL_QUERY_VERSION - error %lu\n",rc);
  99.     else
  100.     printf("Installed: DSKSLEEP.FLT %u.%02u\n",
  101.            HIBYTE(version), LOBYTE(version) );
  102.  
  103.     return (int)rc;
  104. }
  105.  
  106.  
  107.  
  108.  
  109. /*#
  110.  * NAME
  111.  *    DisplayMessages
  112.  * CALL
  113.  *    DisplayMessages(hd)
  114.  * PARAMETER
  115.  *    hd        handle to open device
  116.  * RETURNS
  117.  *    OS error code
  118.  * GLOBAL
  119.  *    none
  120.  * DESPRIPTION
  121.  *    Displays messages saved during driver startup.
  122.  * REMARKS
  123.  */
  124. int
  125. DisplayMessages(HFILE hd)
  126. {
  127.     APIRET    rc;
  128.     ULONG    datasize = FIELDOFFSET(DSKSL_MSGS_DATA,msg) + 10240UL;
  129.     DSKSL_MSGS_DATA * data = malloc(datasize);
  130.  
  131.     if( data == NULL )
  132.     {
  133.     fprintf(stderr,"out of memory\n");
  134.     return -3;
  135.     }
  136.  
  137.     rc = DosDevIOCtl( hd, IOCTL_DSKSLEEP_CATEGORY, DSKSL_READ_MSGS,
  138.              NULL, 0, NULL,
  139.              data, datasize, &datasize );
  140.  
  141.     if( rc )
  142.     fprintf(stderr,"DSKSL_READ_MSGS - error %lu\n",rc);
  143.     else
  144.     {
  145.     unsigned i;
  146.  
  147.     printf("------------------------------"
  148.            "------------------------------\n");
  149.     for( i = 0;
  150.         i < data->cb - FIELDOFFSET(DSKSL_MSGS_DATA,msg);
  151.         i += strlen(&data->msg[i])+1 )
  152.     {
  153.         printf("%s\n", &data->msg[i] );
  154.     }
  155.     printf("------------------------------"
  156.            "------------------------------\n");
  157.     }
  158.  
  159.     free(data);
  160.     return (int)rc;
  161. }
  162.  
  163.  
  164.  
  165.  
  166. /*#
  167.  * NAME
  168.  *    DisplaySettings
  169.  * CALL
  170.  *    DisplaySettings(hd)
  171.  * PARAMETER
  172.  *    hd        handle to open device
  173.  * RETURNS
  174.  *    OS error code
  175.  * GLOBAL
  176.  *    none
  177.  * DESPRIPTION
  178.  *    Displays all devices and timeout values.
  179.  * REMARKS
  180.  */
  181. int
  182. DisplaySettings(HFILE hd)
  183. {
  184.     APIRET        rc;
  185.     ULONG        datasize = 4 + 40 * sizeof(DEVICE_TIMEOUT);
  186.     PDSKSL_QL_DATA  data = malloc( datasize );
  187.     unsigned        i;
  188.  
  189.     if( data == NULL )
  190.     {
  191.     fprintf(stderr,"out of memory\n");
  192.     return -3;
  193.     }
  194.  
  195.     rc = DosDevIOCtl( hd, IOCTL_DSKSLEEP_CATEGORY, DSKSL_QUERY_TIMEOUT,
  196.              NULL, 0, NULL,
  197.              data, datasize, &datasize );
  198.  
  199.     if( rc )
  200.     fprintf(stderr,"DSKSL_QUERY_TIMEOUT - error %lu\n",rc);
  201.     else
  202.     {
  203.     /* Calculate number of entries. */
  204.  
  205.     unsigned cnt = ((data->cb > datasize ?
  206.             datasize : data->cb)
  207.             - FIELDOFFSET(DSKSL_QL_DATA,list))
  208.              / sizeof(data->list[0]);
  209.  
  210.     /* Display nice table */
  211.  
  212.     printf(" Adapter Unit\tMinutes\n");
  213.     for( i = 0; i < cnt; ++i )
  214.         printf(" %3u\t %3u\t %4lu\n",
  215.            data->list[i].adapter, data->list[i].unit,
  216.            data->list[i].seconds / 60UL );
  217.     }
  218.  
  219.     free( data );
  220.     return (int)rc;
  221. }
  222.  
  223.  
  224.          
  225.  
  226. /*#
  227.  * NAME
  228.  *    ChangeSetting
  229.  * CALL
  230.  *    ChangeSetting(hd,a,d,m)
  231.  * PARAMETER
  232.  *    a        adapter index
  233.  *    d        unit index
  234.  *    m        minutes before sleep (0: never)
  235.  * RETURNS
  236.  *    OS error code
  237.  * GLOBAL
  238.  *    none
  239.  * DESPRIPTION
  240.  *    Changes the timeout value for a single device.
  241.  * REMARKS
  242.  */
  243. int
  244. ChangeSetting(HFILE hd,UCHAR a,UCHAR d,ULONG m)
  245. {
  246.     APIRET        rc;
  247.     ULONG        parmsize = sizeof(DSKSL_SETTO_PARM);
  248.     DSKSL_SETTO_PARM    parm;
  249.  
  250.     if( fVerbose )
  251.     printf("--- new: %u %u %lu\n",a,d,m);
  252.  
  253.     parm.cb = (USHORT)parmsize;
  254.     parm.reserved[0] = parm.reserved[1] = 0;
  255.     parm.list[0].adapter = a;
  256.     parm.list[0].unit = d;
  257.     parm.list[0].seconds = m * 60UL;
  258.     parm.list[0].reserved[0] = parm.list[0].reserved[1] = 0;
  259.  
  260.     rc = DosDevIOCtl( hd, IOCTL_DSKSLEEP_CATEGORY, DSKSL_SET_TIMEOUT,
  261.              &parm, parmsize, &parmsize,
  262.              NULL, 0, NULL );
  263.     if( rc )
  264.     fprintf(stderr,"DSKSL_SET_TIMEOUT - error %lu\n",rc);
  265.     return (int)rc;
  266. }
  267.  
  268.  
  269.  
  270.  
  271. /*#
  272.  * NAME
  273.  *    main
  274.  * CALL
  275.  *    main(argc,argv)
  276.  * PARAMETER
  277.  *    argc,argv    as usual
  278.  * RETURNS
  279.  *    0        OK
  280.  *    /0        some error
  281.  * GLOBAL
  282.  *    szPrgName, fVerbose
  283.  * DESPRIPTION
  284.  *    Main routine, parses parameter and calls requested
  285.  *    subfunctions.
  286.  * REMARKS
  287.  */
  288. int
  289. main(int argc,char *argv[])
  290. {
  291.     HFILE    hd = 0;
  292.     ULONG    action_taken;
  293.     APIRET    rc;
  294.     int        result;
  295.  
  296.     strcpy( szPrgName, argv[0] );
  297.     while( argc > 1  &&  argv[1][0] == '-' )
  298.     {
  299.     switch( argv[1][1] )
  300.     {
  301.       case '?':
  302.         help();
  303.         return 0;
  304.  
  305.       case 'v':
  306.         fVerbose = 1;
  307.         break;
  308.  
  309.       case 'm':
  310.         fMode = MODE_MESSAGE;
  311.         break;
  312.  
  313.       default:
  314.         printf("%s: unknown arg \"%s\"\n", szPrgName, argv[1] );
  315.         return -1;
  316.     }
  317.     --argc;
  318.     ++argv;
  319.     }
  320.  
  321.     /* Open device driver, no special settings.  Use DENYNONE
  322.      * so other processes (daemon?) may open concurrently. */
  323.  
  324.     rc = DosOpen( DEVICENAME, &hd, &action_taken,
  325.          0, 0,
  326.          OPEN_ACTION_FAIL_IF_NEW|OPEN_ACTION_OPEN_IF_EXISTS,
  327.          OPEN_SHARE_DENYNONE|OPEN_ACCESS_READWRITE,
  328.          NULL );
  329.     if( rc )
  330.     {
  331.     fprintf(stderr,"DosOpen(%s) - error %lu\n",DEVICENAME,rc);
  332.     return (int)rc;
  333.     }
  334.  
  335.     DisplayVersion( hd );            /* always display version */
  336.     switch( fMode )
  337.     {
  338.       case MODE_MESSAGE:
  339.     result = DisplayMessages( hd );
  340.     break;
  341.  
  342.       case MODE_DEVICE:
  343.     printf("Current settings:\n");
  344.     result = DisplaySettings( hd );
  345.     if( result != 0 )
  346.         break;                /* don't change */
  347.     if( argc > 1 )                /* at least one triple */
  348.     {
  349.         for(; argc > 1; --argc,++argv )
  350.         {
  351.         unsigned a = 0xFF, d = 0xFF;    /* dsksleep won't find them... */
  352.         ULONG     m = 0;
  353.  
  354.         /* Parse argument (spaces important!) and
  355.          * call ChangeSetting(). */
  356.  
  357.         sscanf( argv[1], "%u ,%u ,%lu", &a, &d, &m );
  358.         result = ChangeSetting( hd, (UCHAR)a, (UCHAR)d, m );
  359.         }
  360.         printf("After changing:\n");
  361.         DisplaySettings( hd );        /* ignore errors */
  362.     }
  363.     break;
  364.  
  365.       default:
  366.     result = -1;
  367.     break;
  368.     }
  369.  
  370.     DosClose( hd );                /* be a nice guy */
  371.  
  372.     return result;
  373. }
  374.