*DECK SSIRPSR 
USETEXT TEXTATS 
USETEXT TEXTIPL 
USETEXT TEXTRPC 
      PROC SSIRPSR (CODE);
*CALL COPYRITE
# TITLE SSIRPSR - RECEIVE PORTMAPPER SERVER REQUEST.                   #
  
      BEGIN                            # SSIRPSR                       #
# 
****  SSIRPSR - RECEIVE PORTMAPPER SERVER REQUEST.
* 
*     THIS PROCEDURE DETERMINES IF ANY REQUESTS ARE QUEUED TO THE 
*     PORTMAPPER SERVER AND PROCESSES THEM. 
* 
*     PROC SSIRPSR
* 
*     ENTRY 
* 
*     EXIT     CODE    = COMPLETION STATUS OF ROUTINE 
* 
*     METHOD   CALL *IPPSTAS* TO DETERMINE IF ANY MESSAGES ARE QUEUED.
*              IF A MESSAGE IS QUEUED USE THE RPC ROUTINES TO OBTAIN THE
*              REQUEST OFF THE QUEUE AND TO THEN REPLY TO THE REQUEST.
*              PROCEDURE *PMPPROC* IS USED TO DECODE THE MESSAGE. THE 
*              PROCEDURE WILL LOOP UNTIL ALL REQUESTS ARE PROCESSED.
* 
# 
  
# 
****  PROC SSIRPSR - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC IPPSTAS;    # IP STATUS SOCKET REQUEST                    #
        PROC PMPPROC;    # PROCESS PORTMAPPER REMOTE PROCEDURE REQUEST #
        PROC RPCSREP;    # SEND RPC SERVER REPLY                       #
        PROC RPCSREQ;    # GET RPC SERVER REQUEST                      #
        END 
  
# 
**
# 
  
      ITEM CODE                I;      # ERROR STATUS                  #
  
      ITEM INLENGTH            I;      # PORTMAPPER REQUEST LENGTH     #
      ITEM INPOSITION          I;      # PORTMAPPER REQUEST BUFFER POS #
      ITEM LOOP                I;      # LOOP COUNTER                  #
      ITEM OUTLEN              I;      # PORTMAPPER REPLY LENGTH       #
      ITEM PROCNUM             B;      # IPPRPC PROCEDURE NUMBER       #
      ITEM READ                B;      # IPPSTAS, DATA AVAILABLE       #
      ITEM RESPONSE S:ACCEPTSTAT;      # RPC RESPONSE CODE             #
      ITEM RPCSTATUS   S:RPCSTAT;      # RPC STATUS                    #
      ITEM SOCKSTATUS S:SOCKSTAT;      # SOCKET CALL STATUS            #
      ITEM STATE  S:CONNECTSTATE;      # IPPSTAS, SOCKET STATE         #
      ITEM WRITE               B;      # IPPSTAS, DATA CAN BE WRITTEN  #
CONTROL EJECT;
  
# 
****  START MAIN PROCEDURE
# 
  
      CODE = NOERROR$;
  
      FOR LOOP = 0
      DO
        BEGIN                          # PROCESS REQUESTS              #
        IPPSTAS (PMAP$SOCKET, STATE, READ, WRITE, SOCKSTATUS);
        IF (SOCKSTATUS EQ S"OK") AND
           (READ) 
        THEN
          BEGIN                        # REQUEST AVAILABLE             #
          RPCSREQ (PMAP$SERVER, PROCNUM, INDATABUF [0], INPOSITION, 
                   INLENGTH, RPCSTATUS);
          IF RPCSTATUS EQ S"OK" 
          THEN
            BEGIN 
            PMPPROC (PROCNUM, INDATABUF [0], INPOSITION, INLENGTH,
                     RESPONSE, OUTDATABUF [0], OUTLEN); 
            RPCSREP (PMAP$SERVER, RESPONSE, OUTDATABUF [0], 
                     OUTLEN, RPCSTATUS);
            END 
          END                          # REQUEST AVAILABLE             #
        ELSE
          BEGIN                        # NO REQUEST AVAILABLE          #
          IF SOCKSTATUS NQ S"OK"
          THEN
            CODE = PSOCKFAIL$;
  
          RETURN; 
          END                          # NO REQUEST AVAILABLE          #
  
        IF RPCSTATUS NQ S"OK" 
        THEN
          BEGIN 
          CODE = RPC$ERR [RPCSTATUS]; 
          RETURN; 
          END 
  
        END                            # PROCESS REQUESTS              #
  
      END                              # SSIRPSR                       #
  
      TERM
