home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1993 #2 / Image.iso / clipper / nettos11.zip / MISC / REQUEST.PRG < prev    next >
Text File  |  1993-02-23  |  3KB  |  98 lines

  1. /*
  2.  * File......: REQUEST.PRG
  3.  * Author....: API Group
  4.  * CIS ID....: 71620,1521
  5.  * Date......: $Date$
  6.  * Revision..: $Revision$
  7.  * Log file..: $Logfile$
  8.  * 
  9.  * This is an original work by various Netware API group participants
  10.  * and is placed in the public domain.
  11.  *
  12.  * Modification history:
  13.  * ---------------------
  14.  *
  15.  * $Log$
  16.  *
  17.  */
  18.  
  19.  
  20.  
  21. #include "ftint86.ch"
  22. #include "netto.ch"
  23.  
  24.  
  25. /*  $DOC$
  26.  *  $FUNCNAME$
  27.  *     _fnReq()
  28.  *  $CATEGORY$
  29.  *     Miscellaneous
  30.  *  $ONELINER$
  31.  *     General purpose packet request function for Netware APIs
  32.  *  $SYNTAX$
  33.  *
  34.  *     _fnReq( nService, cRequest, @cReply ) -> nRetVal
  35.  *
  36.  *  $ARGUMENTS$
  37.  *
  38.  *     <nService> - the Netware API service number, in decimal (not hex!)
  39.  *     <cRequest> - the request packet, without length word
  40.  *     <cReply>   - the reply packet, without length word
  41.  *                  (MUST BE PASSED BY REFERENCE!)
  42.  *
  43.  *     Most request and reply packets must have a length word prepended
  44.  *     to the packet.   FN_REQ() supplies these length words!  Do not
  45.  *     put your own length word on the front of either packet or the 
  46.  *     call will fail miserably.
  47.  *
  48.  *  $RETURNS$
  49.  *
  50.  *     <cReply> will be filled in with the reply packet if the call 
  51.  *     succeeds.  The length word (the first two bytes of the string)
  52.  *     will be removed.
  53.  *
  54.  *     <nRetVal> will be the value of register AH, which in most cases
  55.  *     holds a return code that you can use to check whether or not your
  56.  *     call succeeded.
  57.  *
  58.  *     This function calls interrupt 21 using the Nanforum Toolkit's
  59.  *     ft_int86().  If the call to ft_int86() fails, fn_error() is
  60.  *     set with the EINT86 error code.  If the ft_int86() succeeds,
  61.  *     fn_error() is set to the value of register AL, which is often
  62.  *     a completion code for Netware APIs.
  63.  *
  64.  *  $DESCRIPTION$
  65.  *
  66.  *  $EXAMPLES$
  67.  *
  68.  *  $SEEALSO$
  69.  *
  70.  *  $END$
  71.  */
  72.  
  73.  
  74.  
  75. function _fnReq( nService, cRequest, cReply )
  76.     local   aRegs[ INT86_MAX_REGS ],    ;
  77.             nRetVal,;
  78.             cSend, cRecv
  79.     
  80.   cSend := i2bin( len( cRequest ) ) + cRequest
  81.   cRecv := I2bin( len( cReply   ) ) + cReply
  82.  
  83.   aRegs[ AX ] := makeHI( nService )   // AH
  84.   aRegs[ DS ] := cSend
  85.   aRegs[ SI ] := REG_DS
  86.   aRegs[ ES ] := cRecv
  87.   aRegs[ DI ] := REG_ES
  88.  
  89.   if ft_int86( INT21, aRegs )
  90.      _fnSetErr( UNSIGNED( lowbyte( aRegs[ AX ] ) ) )
  91.   else
  92.      _fnSetErr( EINT86 )
  93.   endif
  94.  
  95.   cReply := substr( aRegs[ ES ], 3 )
  96.  
  97.   return UNSIGNED( lowbyte( aRegs[ AX ] ) )
  98.