home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / os2 / mode / dmode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-25  |  11.5 KB  |  482 lines

  1. static char CRevInfo[] = 
  2. "@(#) $Header: c:/digi/xall/RCS/dmode.c 1.10 1993/03/25 10:46:51 dave Exp $";
  3. #ifdef COPYRIGHT_NOTICE
  4.  
  5.   (c) Copyright 1990-1993 Digi International Inc. ALl Rights Reserved.
  6.  
  7.   This software contains proprietary and confidential information of Digi
  8.   International, Inc.  By accepting transfer of this copy, recipient agrees
  9.   to retain this software in confidence, to prevent disclosure to others,
  10.   and to make no use of this software other than that for which it was
  11.   delivered.  This is an unpublished copyrighted work of Digi International
  12.   Inc.  Except as permitted by  federal law, 17 USC 117, copying is strictly
  13.   prohibited.
  14.  
  15.   Use, duplication, or disclosure by the Government is subject to restrictions
  16.   set forth in sub-paragraph (c)(1)(ii) of the Rights in Technical Data
  17.   and Computer Software clause of FDARS 52.227-7013.  
  18.   Digi International Inc. 6400 Flying Cloud Dr. Eden Prairie, MN 55344 
  19.  
  20. #endif
  21. /*
  22.  * DMODE.C
  23.  * A 'mode' that is more forgiving about device names but otherwise 
  24.  * compatible with the standard OS/2 utility.
  25.  *
  26.  * assume MSC6.0; simply 'cl /Lp dmode.c'
  27.  */
  28. #define VERSION "V1.4.0"
  29. #define INCL_BASE
  30. #define INCL_DOSDEVICES 1
  31. #include <os2def.h>
  32. #include <bsedos.h>
  33. #include <bsedev.h>
  34. #include <stdio.h>
  35.  
  36. #include <string.h>
  37. #include <ctype.h>
  38.  
  39. #define    NDCBS    7
  40. #define    NBAUDS    20
  41. #define DAW_CHR         0x8000   /* 1=char, 0=block                      */
  42. #define DAW_GIO         0x0040   /* 1=generic IOCtl supported            */
  43.  
  44. #define IOCTL_CATEGORY_DIGI    0xd1
  45.  
  46. #define DIGI_ALTPIN            0x07
  47. #define ALTPIN_DUMMY        0x00
  48. #define ALTPIN_ENABLE        0x01
  49. #define ALTPIN_DISABLE        0x02
  50. unsigned  Alt;
  51.  
  52. #define SPACE    ' '
  53. #define COLON    ':'
  54. #define COMMA    ','
  55. #define EQUAL    '='
  56.  
  57. #define ERR_DEVICE_NAME    1
  58. #define ERR_SYNTAX    2
  59.  
  60. DCBINFO         DCB_in, DCB_out;
  61. LINECONTROL     LCNTL_in, LCNTL_out;
  62. long             Baud_in, Baud_out, New_settings;
  63. char            Name[9], Argbuff[128];
  64. char            *Dcbs[] = {
  65.     "TO=OFF",    "TO=ON",                //0,1
  66.     "XON=OFF",    "XON=ON",                //2,3
  67.     "IDSR=OFF",    "IDSR=ON",                //4,5
  68.     "ODSR=OFF",    "ODSR=ON",                //6,7
  69.     "OCTS=OFF",    "OCTS=ON",                //8,9
  70.     "RTS=OFF",    "RTS=ON",    "RTS=HS", "RTS=TOG",    //10,11,12,13
  71.     "DTS=OFF",    "DTS=ON",    "DTS=HS",    //14,15,16
  72.     "ALT=ON",    "ALT=OFF"                //17,18
  73.     };
  74. struct {
  75.     char         *str;
  76.     long        val;
  77. }DBauds[] = {
  78.     { "00", 0L },
  79.     { "50", 50L },
  80.     { "75", 75L },
  81.     { "11", 110L },
  82.     { "13", 134L },
  83.     { "15", 150L },
  84.     { "20", 200L },
  85.     { "30", 300L },
  86.     { "60", 600L },
  87.     { "12", 1200L },
  88.     { "18", 1800L },
  89.     { "24", 2400L },
  90.     { "48", 4800L },
  91.     { "96", 9600L },
  92.     { "19", 19200L },
  93.     { "38", 38400L },
  94.     { "00", 0 },
  95.     { "57", 57600L },
  96.      { "76", 76800L },
  97.      { "115", 115200L }
  98. };
  99. char    *Stops[]={"1", "1.5", "2" };
  100. char    *Datas[]={"5","6","7","8" };
  101. char    *Parities[] = { "N", "O","E","M","S" };
  102. char    Stuff[] = "NOEMS0123456789TXIORDA";    // start letter of some arg.
  103.  
  104. main ( argc, argv )
  105. int argc;
  106. char *argv[];
  107. {
  108. int    err, i, j, k;
  109.  
  110. /***
  111. If No arguments or '?', just give a USAGE message
  112. ***/
  113.     if ((argc == 1 ) || (*argv[1] == '?'))
  114.     {
  115.         help (0);
  116.         exit (0);
  117.     }
  118. /***
  119. Copy the args to a local buffer; force to upper case
  120. ***/
  121.     for ( i = 0, j = 1; j <= argc ; j++ )
  122.     {
  123.         for ( k=0 ; (Argbuff[i] = toupper (*(argv[j] + k))); k++,i++ );
  124.         Argbuff[i++] = ' ';        /* make sure args remain separated */
  125.     }
  126. /***
  127. Parses args, verifies device-name, fills in DCB_in,_out,Bauddata stuff _in,_out
  128. ***/
  129.     if ( err = parse () )
  130.     {
  131.         help ( err );
  132.         exit (1);
  133.     }
  134. /***
  135. If no args beyond the device name, simply show current settings.
  136. ***/
  137.     if ( New_settings )
  138.         if ( set_mode () )
  139.             exit (1); 
  140.         else
  141.             printf ("Async. Communications Mode Set.\n"); 
  142.     show_device ();
  143.     exit (0);
  144.     
  145. }
  146.  
  147. parse ( )
  148. {
  149. char    *parg, thisone[15] ;
  150. int        i, parsed ;
  151.  
  152. // First argument MUST be valid dev. name, ending with either SPACE,COLON,NULL
  153.     for (     i = 0, parg = Argbuff;
  154.         (*parg != SPACE && *parg != COLON && *parg ); 
  155.         Name[i++] = *parg++ 
  156.     );
  157.     Name[i] = '\0';
  158.  
  159. // Verify openability, and that it is a device, not a disk file
  160.     if ( chk_name ()  < 0 )
  161.         return ( ERR_DEVICE_NAME );
  162.  
  163. // parse out any remaining arguments.
  164.  
  165.     for ( strpbrk(parg,Stuff); parg; parg=strpbrk(++parg," ,") )
  166.     {
  167.         if (sscanf(parg, "%s", thisone)==0 || strpbrk(thisone,Stuff)==NULL)
  168.             break;
  169.         parsed = 0;
  170. // Baudrate
  171.         for (i=0; i < NBAUDS; i++)
  172.             if (! strncmp (thisone, DBauds[i].str, 2) )
  173.             {
  174.                 Baud_out = DBauds[i].val;
  175.                 parsed = New_settings = 1;
  176.                 break;
  177.             }
  178.         if (parsed)
  179.             continue;
  180.  
  181. // Parity
  182.         for (i=0; i < 5; i++)
  183.             if (! strcmp (thisone, Parities[i]) )
  184.             {
  185.                 LCNTL_out.bParity = i;
  186.                 parsed = New_settings = 1;
  187.                 break;
  188.             }
  189.         if (parsed)
  190.             continue;
  191. // Databits
  192.         for (i=0; i < 5; i++)
  193.             if (! strcmp (thisone, Datas[i]) )
  194.             {
  195.                 LCNTL_out.bDataBits = i+5;
  196.                 parsed = New_settings = 1;
  197.                 break;
  198.             }
  199.         if (parsed)
  200.             continue;
  201. // Stopbit
  202.         for (i=0; i < 3; i++)
  203.             if (! strcmp (thisone, Stops[i]) )
  204.             {
  205.                 LCNTL_out.bStopBits = i;
  206.                 parsed = New_settings = 1;
  207.                 break;
  208.             }
  209.         if (parsed)
  210.             continue;
  211. // the verbose text
  212.         for (i=0; i < 19; i++)
  213.             if (! strcmp (thisone, Dcbs[i]) )
  214.                 break;
  215.         if ( i > 18 )
  216.         {
  217.             printf ("unkown argument <%s>\n", parg );
  218.             return (-1);
  219.         }
  220.         parsed = New_settings = 1;
  221.         switch ( i )
  222.         {
  223.             case 0 :
  224.                 DCB_out.fbTimeout &= ~MODE_NO_WRITE_TIMEOUT;
  225.                 break;
  226.             case 1 :
  227.                 DCB_out.fbTimeout |= MODE_NO_WRITE_TIMEOUT;
  228.                 break;
  229.             case 2 :
  230.                 DCB_out.fbFlowReplace &= ~MODE_AUTO_TRANSMIT;
  231.                 break;
  232.             case 3 :
  233.                 DCB_out.fbFlowReplace |= MODE_AUTO_TRANSMIT;
  234.                 break;
  235.             case 4 :
  236.                 DCB_out.fbCtlHndShake &= ~MODE_DSR_SENSITIVITY;
  237.                 break;
  238.             case 5 :
  239.                 DCB_out.fbCtlHndShake |= MODE_DSR_SENSITIVITY;
  240.                 break;
  241.             case 6 :
  242.                 DCB_out.fbCtlHndShake &= ~MODE_DSR_HANDSHAKE;
  243.                 break;
  244.             case 7 :
  245.                 DCB_out.fbCtlHndShake |= MODE_DSR_HANDSHAKE;
  246.                 break;
  247.             case 8 :
  248.                 DCB_out.fbCtlHndShake &= ~MODE_CTS_HANDSHAKE;
  249.                 break;
  250.             case 9 :
  251.                 DCB_out.fbCtlHndShake |= MODE_CTS_HANDSHAKE;
  252.                 break;
  253.             case 10 :
  254.                 DCB_out.fbFlowReplace &= ~MODE_TRANSMIT_TOGGLE;
  255.                 break;
  256.             case 11 :
  257.                 DCB_out.fbFlowReplace &= ~MODE_TRANSMIT_TOGGLE;
  258.                 DCB_out.fbFlowReplace |= MODE_RTS_CONTROL;
  259.                 break;
  260.             case 12 :
  261.                 DCB_out.fbFlowReplace &= ~MODE_TRANSMIT_TOGGLE;
  262.                 DCB_out.fbFlowReplace |= MODE_RTS_HANDSHAKE;
  263.                 break;
  264.             case 13 :
  265.                 DCB_out.fbFlowReplace |= MODE_TRANSMIT_TOGGLE;
  266.                 break;
  267.             case 14 :
  268.                 DCB_out.fbCtlHndShake &= ~(MODE_DTR_CONTROL|MODE_DTR_HANDSHAKE);
  269.                 break;
  270.             case 15 :
  271.                 DCB_out.fbCtlHndShake &= ~(MODE_DTR_CONTROL|MODE_DTR_HANDSHAKE);
  272.                 DCB_out.fbCtlHndShake |= MODE_DTR_CONTROL;
  273.                 break;
  274.             case 16 :
  275.                 DCB_out.fbCtlHndShake &= ~(MODE_DTR_CONTROL|MODE_DTR_HANDSHAKE);
  276.                 DCB_out.fbCtlHndShake |= MODE_DTR_HANDSHAKE;
  277.                 break;
  278.             case 17 :
  279.                 Alt = (Alt & 0x10) | 0x01;
  280.                 break;
  281.             case 18 :
  282.                 Alt = (Alt & 0x10) | 0x02;
  283.                 break;
  284.             default:
  285.                 parsed = 0;
  286.                 printf ("unkown argument <%s>\n", parg );
  287.                 return (-1);
  288.         }
  289.     }
  290.     return (0);
  291. }
  292.  
  293.  
  294. /*
  295.  * CHK_NAME
  296.  * Verify device name.  In so doing, get the DCB_in and all other _in values.
  297.  * Return:
  298.  *        0 if IS device, and IS openable for R/W and allows IOCTL
  299.  *        -1 otherwise.
  300.  */
  301. chk_name ( )
  302. {
  303. HFILE         handle;
  304. USHORT        result, type, attrib;
  305.  
  306.     if ( DosOpen (     Name,
  307.             &handle,
  308.             &result,
  309.             100L,
  310.             FILE_NORMAL,
  311.             FILE_OPEN,
  312.             (OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE), 
  313.             0L ) )
  314.     {
  315.         printf ("Failed to open Device <%s>\n", Name);
  316.         return -1;
  317.     }
  318.     if ( DosQHandType (handle, &type, &attrib ) )
  319.     {
  320.         printf ("System call <DosQHandType> failed on device <%s>!\n", Name);
  321.         return -1;
  322.     }
  323.     if ( (type & HANDTYPE_DEVICE) == 0 )    /** verify non-file device **/
  324.     {
  325.         printf ("<%s> is not a DEVICE!\n", Name);
  326.         return -1;
  327.     }
  328.     if ( ( attrib & DAW_CHR ) == 0 )    /** verify CHARACTER device **/
  329.     {
  330.         printf ("<%s> is not a CHARACTER DEVICE!\n", Name);
  331.         return -1;
  332.     }
  333.     if ( ( attrib & DAW_GIO ) == 0 )    /** verify Generic IOCTL Ok **/
  334.     {
  335.         printf ("<%s> does not accept GENERIC IOCtl DEVICE calls !\n", Name);
  336.         return -1;
  337.     }
  338.  
  339.     if (DosDevIOCtl2(&Baud_in,4,0L,0,ASYNC_GETBAUDRATE,IOCTL_ASYNC,handle))
  340.     {
  341.         printf ("<%s> failed IOCtl <ASYNC_GETBAUDRATE>\n", Name);
  342.         return -1;
  343.     }
  344.     Baud_out = Baud_in;
  345.     if ( DosDevIOCtl (&DCB_in,0L,ASYNC_GETDCBINFO,IOCTL_ASYNC,handle ) )
  346.     {
  347.         printf ("<%s> failed IOCtl <ASYNC_GETDCBINFO>\n", Name);
  348.         return -1;
  349.     }
  350.     DCB_out = DCB_in;
  351.     if ( DosDevIOCtl (&LCNTL_in,0L,ASYNC_GETLINECTRL,IOCTL_ASYNC,handle ) )
  352.     {
  353.         printf ("<%s> failed IOCtl <ASYNC_GETLINECTRL>\n", Name);
  354.         return -1;
  355.     }
  356.     LCNTL_out = LCNTL_in;
  357.  
  358.     Alt = 0;
  359.     if  (DosDevIOCtl(&Alt,&Alt,DIGI_ALTPIN,IOCTL_CATEGORY_DIGI,handle))
  360.         Alt = 0;
  361.  
  362.     DosClose ( handle );
  363.  
  364.     return 0;
  365. }
  366.  
  367. help (flag)
  368. {
  369.     printf (
  370. "DMODE %s.  DigiBoard OS/2 asynchronous serial device configuration utility.\n\n", 
  371.     VERSION);
  372.     printf ("Usage:\n\
  373. DMODE devname[:]baud[,parity,databits,stopbits][,TO=state][,XON=state]\n\
  374.          [,IDSR=state][,ODSR=state][,OCTS=state][,DTR=dtrstate][,RTS=rtsstate]\
  375.      \n");
  376.     printf ("Aditional DigiCHANNEL options: ..[,ALT=state]\n\n");
  377. }
  378.  
  379. show_device()
  380. {
  381. char    string[128];
  382.  
  383.     sprintf ( string, "%s %ld %s,%d,%s ", Name, Baud_out, 
  384.         Parities [LCNTL_out.bParity],
  385.         LCNTL_out.bDataBits, 
  386.         Stops[LCNTL_out.bStopBits] );
  387.  
  388.     if ( DCB_out.fbTimeout & MODE_NO_WRITE_TIMEOUT )
  389.         strcat (string, "TO=ON," );
  390.     else
  391.         strcat (string, "TO=OFF," );
  392.  
  393.     if ( DCB_out.fbFlowReplace & MODE_AUTO_TRANSMIT )
  394.         strcat (string, "XON=ON," );
  395.     else
  396.         strcat (string, "XON=OFF," );
  397.  
  398.     if ( DCB_out.fbCtlHndShake & MODE_DSR_SENSITIVITY )
  399.         strcat (string, "IDSR=ON," );
  400.     else
  401.         strcat (string, "IDSR=OFF," );
  402.  
  403.     if ( DCB_out.fbCtlHndShake & MODE_DSR_HANDSHAKE )
  404.         strcat (string, "ODSR=ON," );
  405.     else
  406.         strcat (string, "ODSR=OFF," );
  407.  
  408.     if ( DCB_out.fbCtlHndShake & MODE_CTS_HANDSHAKE )
  409.         strcat (string, "OCTS=ON," );
  410.     else
  411.         strcat (string, "OCTS=OFF," );
  412.  
  413.     if ((DCB_out.fbFlowReplace & MODE_TRANSMIT_TOGGLE) == MODE_TRANSMIT_TOGGLE)
  414.         strcat (string, "RTS=TOG," );
  415.     else if ((DCB_out.fbFlowReplace&MODE_TRANSMIT_TOGGLE) == MODE_RTS_HANDSHAKE)
  416.         strcat (string, "RTS=HS," );
  417.     else if ((DCB_out.fbFlowReplace&MODE_TRANSMIT_TOGGLE) == MODE_RTS_CONTROL)
  418.         strcat (string, "RTS=ON," );
  419.     else
  420.         strcat (string, "RTS=OFF," );
  421.  
  422.     if ( DCB_out.fbCtlHndShake & MODE_DTR_CONTROL )
  423.         strcat (string, "DTR=ON" );
  424.     else if ( DCB_out.fbCtlHndShake & MODE_DTR_HANDSHAKE )
  425.         strcat (string, "DTR=HS" );
  426.     else
  427.         strcat (string, "DTR=OFF" );
  428.  
  429.     if ( Alt )
  430.         if ( Alt & 0x1 )
  431.             strcat (string, ", ALT=ON" );
  432.         else
  433.             strcat (string, ", ALT=OFF" );
  434.  
  435.     printf ("%s\n", string);
  436.     return 0;
  437.  
  438. }
  439.  
  440.  
  441. set_mode ()
  442. {
  443. HFILE     handle;
  444. USHORT     result, type, attrib;
  445.  
  446.     if ( DosOpen (     Name,
  447.             &handle,
  448.             &result,
  449.             100L,
  450.             FILE_NORMAL,
  451.             FILE_OPEN,
  452.             (OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE), 
  453.             0L ) )
  454.         return -1;
  455.  
  456.     if (DosDevIOCtl2(0L,0,&Baud_out,4,ASYNC_SETBAUDRATE,IOCTL_ASYNC,handle))
  457.     {
  458.         printf ("Failed to <ASYNC_SETBAUDRATE>\n");
  459.         return -1;
  460.     }
  461.     if ( DosDevIOCtl (0L,&LCNTL_out,ASYNC_SETLINECTRL,IOCTL_ASYNC,handle ) )
  462.     {
  463.         printf ("Failed to <ASYNC_SETLINECTRL>\n");
  464.         return -1;
  465.     }
  466.     if ( DosDevIOCtl (0L,&DCB_out,ASYNC_SETDCBINFO,IOCTL_ASYNC,handle ) )
  467.     {
  468.         printf ("Failed to <ASYNC_SETDCBINFO>\n");
  469.         return -1;
  470.     }
  471.     if ( Alt )
  472.         if  (DosDevIOCtl(&Alt,&Alt,DIGI_ALTPIN,IOCTL_CATEGORY_DIGI,handle))
  473.     {
  474.         printf ("Failed to <DIGI_ALTPIN>\n");
  475.         return -1;
  476.     }
  477.  
  478.     DosClose ( handle );
  479.  
  480.     return 0;
  481. }
  482.