home *** CD-ROM | disk | FTP | other *** search
/ Network Support Encyclopedia 96-1 / novell-nsepro-1996-1-cd2.iso / download / netware / sapex3.exe / SAPQOS2.CPP < prev    next >
Text File  |  1995-09-14  |  8KB  |  284 lines

  1. /****************************************************************************
  2. **    File:    QUERYSAP.CPP
  3. **
  4. **    Desc:    Sample General Service Query Program
  5. **
  6. **        Run QUERYSAP command line. This program sends out
  7. **        a general service query (or nearest service query) for some file
  8. **        type, then prints the response packet.
  9. **
  10. **
  11. **
  12. **
  13. **
  14. **        DISCLAIMER
  15. **
  16. **    Novell, Inc. makes no representations or warranties with respect to
  17. **    any NetWare software, and specifically disclaims any express or
  18. **    implied warranties of merchantability, title, or fitness for a
  19. **    particular purpose.
  20. **
  21. **    Distribution of any NetWare software is forbidden without the
  22. **    express written consent of Novell, Inc.  Further, Novell reserves
  23. **    the right to discontinue distribution of any NetWare software.
  24. **
  25. **    Novell is not responsible for lost profits or revenue, loss of use
  26. **    of the software, loss of data, costs of re-creating lost data, the
  27. **    cost of any substitute equipment or program, or claims by any party
  28. **    other than you.  Novell strongly recommends a backup be made before
  29. **    any software is installed.   Technical support for this software
  30. **    may be provided at the discretion of Novell.
  31. **
  32. **    Programmers:
  33. **
  34. **        Ini    Who                        Firm
  35. **        -----------------------------------------------------------------------
  36. **        KLB    Karl Bunnell                Novell Developer Support
  37. **              DRS    Dan Stratton                Novell Developer Support
  38. **
  39. **    History:
  40. **
  41. **        When    Who    What
  42. **        -----------------------------------------------------------------------
  43. **        08-08-94    klb       First code.
  44. **        02-06-95    DRS      Modified for OS/2.
  45. **             09-14-95    DRS      Modified serverType to be consistent with DOS QueryServices.
  46. */
  47.  
  48. #define NWOS2
  49. #define IS32BIT
  50.  
  51. /* For now, just allow to run with either Borland or IBM */
  52.  
  53. #if defined    (__BORLANDC__)
  54.     #define BCPP
  55.         #include <mem.h>
  56.  
  57. #elif (defined (__IBMC__) || defined(__IBMCPP__))
  58.     #define CSET2
  59.         #include <memory.h>
  60. #endif
  61.  
  62.  
  63. #include <os2.h>
  64. #include <stdio.h>
  65. #include <conio.h>
  66. #include <stdlib.h>
  67.  
  68.  
  69. #ifdef __cplusplus
  70.   extern "C"{
  71. #endif
  72.  
  73. #include <nwcalls.h>
  74. #include <ipxcalls.h>
  75.  
  76. #ifdef __cplusplus
  77.   }
  78. #endif
  79.  
  80.  
  81.  
  82. /****************************************************************************
  83. **    Global Structure Definitions
  84. */
  85.  
  86.  
  87. typedef struct
  88. {
  89.   WORD            responseType;
  90.   WORD            serverType;
  91.   BYTE            serverName[48];
  92.   BYTE            network[4];
  93.   BYTE            node[6];
  94.   WORD            sock;
  95.   WORD            intNetworks;
  96. } SAP_RECORD;
  97.  
  98.  
  99. typedef struct
  100. {
  101.   WORD            queryType;
  102.   WORD            serverType;
  103. } QUERY_PACKET;
  104.  
  105. /* **********************************************************************
  106.     Function Prototypes
  107.    ********************************************************************** */
  108.  
  109. int QueryServices(WORD queryType, WORD serverType, WORD returnSize, SAP_RECORD *serviceBuffer);
  110.  
  111.  
  112.  
  113. /* ***********************************************************************
  114.     QueryServices
  115.  
  116.     This call will query the net for servers of a specific type.
  117.     It will do general service queries or nearest service queries.
  118.     NOTE:  The parameters are the same as DOS, but we're not doing
  119.     anything with returnSize right now.  QueryServices is just returning
  120.     a single response.  This is basic functionality.  You really should
  121.     modify it for your own needs.
  122.  
  123.    *********************************************************************** */
  124.  
  125.  
  126. int QueryServices(WORD queryType, WORD serverType, WORD returnSize, SAP_RECORD *serviceBuffer)
  127. {
  128.  
  129.     int               ccode, i;
  130.     IPX_HEADER    sHeader;
  131.     IPX_ECB        sECB;
  132.     IPX_ECB        rECB;
  133.     IPX_HEADER    rHeader;
  134.     USHORT         Socket=0x0000;
  135.     SAP_RECORD    sapInfo;
  136.     QUERY_PACKET    qPacket;
  137.     int         timeOut = 1000;  /* 1 second timeout for response */
  138.                      /* Pick a good value, it's up to you. */
  139.     BOOL        fatalError = FALSE;
  140.  
  141.  
  142.  
  143.     ccode = IpxOpenSocket((USHORT NWPTR)&Socket);
  144.     if(ccode)
  145.     {
  146.       printf("Error: IpxOpenSocket returned %04X",ccode);
  147.       return (1);
  148.     }
  149.  
  150.     /*------------------------------------------------------------------------
  151.     **    Initialize fields for Receive IPX Header and Receive ECB
  152.     */
  153.  
  154.     rHeader.packetType = (char)4;
  155.     rHeader.packetLen = NWWordSwap(sizeof(IPX_HEADER));
  156.  
  157.     rECB.fragCount = 2;
  158.     rECB.fragList[0].fragAddress = &rHeader;
  159.     rECB.fragList[0].fragSize = sizeof(IPX_HEADER);
  160.     rECB.fragList[1].fragAddress = &sapInfo;
  161.     rECB.fragList[1].fragSize = sizeof(sapInfo);
  162.  
  163.     sHeader.destNet=0x00;       /* send to the local net */
  164.     for (i=0; i<6; ++i)
  165.     sHeader.destNode[i] = (BYTE)0xFF;
  166.     sHeader.destSocket= NWWordSwap(0x0452);
  167.  
  168.  
  169.     /*------------------------------------------------------------------------
  170.     **    Query Services Packet
  171.     */
  172.  
  173.     if(queryType == 0x01)
  174.       qPacket.queryType = NWWordSwap(0x01);          // General Service Query
  175.     else if(queryType == 0x03)
  176.       qPacket.queryType = NWWordSwap(0x03);          // Nearest Service Query
  177.     else
  178.     {
  179.       printf("Invalid queryType\n");
  180.       return (1);
  181.     }
  182.  
  183.     qPacket.serverType = NWWordSwap(serverType);
  184.     sHeader.packetLen = NWWordSwap(sizeof(IPX_HEADER));
  185.     sHeader.packetType = 4;
  186.  
  187.     sECB.fragCount = 2;
  188.     for (i=0; i<6; ++i)
  189.         sECB.immediateAddress[i] = 0xFF;
  190.  
  191.     sECB.fragList[0].fragAddress = (&sHeader);
  192.     sECB.fragList[0].fragSize = sizeof(IPX_HEADER);
  193.     sECB.fragList[1].fragAddress = (&qPacket);
  194.     sECB.fragList[1].fragSize = sizeof(QUERY_PACKET);
  195.  
  196.     /*------------------------------------------------------------------------
  197.     **    Send out the Query Packet!
  198.     */
  199.  
  200.     ccode = IpxSend(Socket,&sECB);
  201.     if(ccode)
  202.     {
  203.       printf("Error sending query, IpxSend returned %04X\n",ccode);
  204.       return 1;
  205.     }
  206.  
  207.     ccode=IpxReceive(Socket,timeOut,&rECB);
  208.     switch(ccode)
  209.     {
  210.         case 0x0000:  memcpy(serviceBuffer, &sapInfo, sizeof(SAP_RECORD));
  211.                   fatalError = FALSE;
  212.                   break;
  213.  
  214.         case 0x9001:  printf("QueryServices timed out\n");
  215.                   fatalError = TRUE;
  216.                   break;
  217.  
  218.         case 0x8007:  fatalError = TRUE;
  219.                   break;
  220.  
  221.         case 0x8002:  printf("\nError: Bad Packet Received\n");
  222.                   fatalError = TRUE;
  223.                   break;
  224.         case 0x8006:  printf("\nError: Receive Overflow, buffer too small.\n");
  225.                   memcpy(serviceBuffer, &sapInfo, sizeof(SAP_RECORD));
  226.                   fatalError = FALSE;
  227.                   break;
  228.         case 0x9004:  printf("Error: Socket not open.\n");
  229.                   fatalError = TRUE;
  230.                   break;
  231.         default:      printf("Unknown error during IPXReceive. 04X",ccode);
  232.                   fatalError = TRUE;
  233.                   break;    }
  234.        IpxCloseSocket(Socket);
  235.        if(fatalError)
  236.      return 1;
  237.        else
  238.      return 0;
  239. }
  240.  
  241.  
  242.  
  243.  
  244. /****************************************************************************
  245. **    This function is the entire program, as it is very simple.
  246. **
  247. */
  248.  
  249. void main(void)
  250. {
  251.     int        ccode;
  252.  
  253.  
  254.     WORD        queryType;
  255.     WORD        serverType;
  256.     SAP_RECORD    serviceBuffer;
  257.  
  258.     queryType = 0x03;  /* NSQ, queryType of 0x01 would be GSQ */
  259.     serverType = 0x0ABC;  /* Type of server you are looking for */
  260.  
  261.  
  262.     ccode = QueryServices(queryType, serverType, sizeof(serviceBuffer), &serviceBuffer);
  263.     if(ccode ==0)
  264.     {
  265.       printf("\n");
  266.       printf("   Server : %-47.47s", serviceBuffer.serverName);
  267.       printf("   Type.. : %04X\n", NWWordSwap(serviceBuffer.serverType));
  268.       printf("   Address: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X:%04X",
  269.         serviceBuffer.network[0],
  270.         serviceBuffer.network[1],
  271.         serviceBuffer.network[2],
  272.         serviceBuffer.network[3],
  273.         serviceBuffer.node[0],
  274.         serviceBuffer.node[1],
  275.         serviceBuffer.node[2],
  276.         serviceBuffer.node[3],
  277.         serviceBuffer.node[4],
  278.         serviceBuffer.node[5],
  279.         NWWordSwap(serviceBuffer.sock));
  280.         printf("   Hops: %d\n", NWWordSwap(serviceBuffer.intNetworks));
  281.     }
  282. }
  283.  
  284.