*DECK RPCSREP 
USETEXT TEXTIPL 
USETEXT TEXTRPC 
USETEXT TEXTXDR 
      PROC RPCSREP (HANDLE, RESPONSE, OUTBUFFER, OUTBUFLEN, RPCSTATUS); 
*CALL COPYRITE
# TITLE RPCSREP - SEND SERVER REPLY                                    #
  
      BEGIN                            # RPCSREP                       #
# 
****  RPCSREP  SEND SERVER REPLY
* 
*     THIS PROCEDURE SENDS A REPLY TO A SERVER REQUEST RECEIVED ON
*     "HANDLE". 
* 
*     PROC RPCSREP
* 
*     ENTRY    HANDLE     = RPC HANDLE
*              RESPONSE   = RPC RESPONSE CODE 
*              OUTBUFFER  = ADDRESS OF (XDR) OUTPUT DATA
*              OUTBUFLEN  = LENGTH OF OUTBUFFER IN BYTES
*              RPCSTATUS  = COMPLETION STATUS 
* 
*     METHOD   THE RPC HEADER IS BUILT WITH THE XDR ROUTINES AND THE
*              MESSAGE IS SENT TO THE CLIENT. THE TRANSACTION ID AND
*              ADDRESS FOR THE LAST CLIENT REQUEST RECEIVED ON THE
*              HANDLE IS USED IN THE REPLY. 
# 
  
# 
****  PROC RPCSREP - XREF LIST
# 
      XREF
        BEGIN 
        PROC IPPSEND;    # SEND DATA ON A SOCKET                       #
        PROC XDRINT;     # CONVERT INTEGERS TO XDR FORMAT              #
        END 
# 
**
# 
      ITEM HANDLE              U;      # RPC HANDLE                    #
      ITEM RESPONSE S:ACCEPTSTAT;      # RPC RESPONSE CODE             #
      ARRAY OUTBUFFER [0:15] S(1);;    # OUTPUT BUFFER                 #
      ITEM OUTBUFLEN           U;      # OUTPUT DATA LENGTH            #
      ITEM RPCSTATUS   S:RPCSTAT;      # RETURN STATUS                 #
# 
**
# 
      ARRAY RPCBUFFER [0:15] S(1);;    # BUFFER FOR RPC HEADER         #
      ITEM RPCBUFPOS            U;     # RPC BUFFER POSITION           #
      ARRAY RESPHEADER [0:7] S(1);     # RPC MESSAGE HEADER            #
        ITEM RESPITM    U(0,0,60);
      ITEM SOCKSTATUS  S:SOCKSTAT;     # SOCKET STATUS                 #
      CONTROL EJECT;
# 
****  START MAIN PROCEDURE
* 
****  VERIFY HANDLE ENTRY 
# 
      IF NOT RP$ACTIVE [HANDLE] THEN
        BEGIN 
        RPCSTATUS = S"HANDLEINACT"; 
        RETURN; 
        END 
# 
****  GENERATE RPC HEADER.
# 
      RESPITM [0] = RP$XID [HANDLE];   # SET MESSAGE ID                #
      RESPITM [1] = RPCMSG"REPLY";     # MSG_TYPE = REPLY              #
      RESPITM [2] = REPLYSTAT"ACCEPTED";# REQUEST ACCEPTED             #
      RESPITM [3] = 0;                 # RPC VERIFICATION (NONE)       #
      RESPITM [4] = 0;
      RESPITM [5] = RESPONSE;          # RESPONSE CODE                 #
  
      RPCBUFPOS = 0;                   # INITIALIZE BUFFER POSITION    #
      XDRINT (RPCBUFFER, RPCBUFPOS, RESPHEADER, 6, XDROPER"WRITE"); 
# 
****  SEND REPLY TO RPC CLIENT. 
# 
      IPPSEND (RP$SOCKID [HANDLE], RPCBUFFER, RPCBUFPOS, OUTBUFFER, 
        OUTBUFLEN, RP$ADDRESS [HANDLE], SOCKSTATUS);
      IF SOCKSTATUS NQ S"OK"           # SEND FAILED                   #
      THEN
        RPCSTATUS = S"SOCKFAIL";
      ELSE                             # SEND OK                       #
        RPCSTATUS = S"OK";
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # RPCSREP                       #
  
      TERM
