*DECK PMPOPEN 
USETEXT TEXTIPL 
USETEXT TEXTRPC 
      PROC PMPOPEN (RPCSTATUS); 
*CALL COPYRITE
# TITLE PMPOPEN - OPEN THE PORTMAPPER PORT                             #
  
      BEGIN                            # PMPOPEN                       #
# 
****  PMPOPEN  OPEN THE PORTMAPPER PORT 
* 
*     THIS PROCEDURE OPENS THE PORTMAPPER PORT. 
* 
*     PROC PMPOPEN
* 
*     EXIT     RPCSTATUS = STATUS OF THE REQUEST
* 
*     METHOD   THE RPC HANDLE DATABASE IS INITIALIZED,
*              THE SERVER SOCKET IS OPENED, 
*              THE PORT IS BOUND TO THE DEDICATED PORT NUMBER, AND
*              THE PORTMAPPER SERVER AND CLIENT HANDLES ARE RESERVED. 
*              THE PORTMAPPER INITIALIZES THE PORTMAPPER DATABASE.
*              AND DEFINES ITSELF.
# 
# 
*     PROC PMPOPEN - XREF LIST
# 
      XREF
        BEGIN 
        PROC IPPABOS;    # ABORT A SOCKET                              #
        PROC IPPBINS;    # BIND A UDP SOCKET                           #
        PROC IPPOPES;    # OPEN A UDP SOCKET                           #
        PROC RPCSDES;    # CLOSE AN RPC SERVER HANDLE                  #
        PROC RPCCUDP;    # OPEN AN RPC CLIENT HANDLE                   #
        PROC RPCSUDP;    # OPEN AN RPC SERVER HANDLE                   #
        PROC PMPSET;     # REGISTER RPC SERVER WITH PORTMAPPER         #
        END 
# 
**
# 
      ITEM RPCSTATUS S:RPCSTAT;        # STATUS OF THE REQUEST         #
      ITEM SOCKET              U;      # SOCKET NUMBER                 #
# 
**
# 
      ARRAY DUMMY$ADDR [0:0] S(ADDSIZE$);;# DUMMY SERVER ADDRESS       #
      ITEM IGNORE               U;     # IGNORE RETURN STATUS          #
      ITEM INDEX                U;     # LOOP INDEX                    #
      ITEM SOCKSTATUS  S:SOCKSTAT;     # SOCKET STATUS                 #
      CONTROL EJECT;
# 
****  START MAIN PROCEDURE
* 
****  INITIALIZE RPC HANDLE DATABASE
*     NOTE THAT ENTRY ZERO IS NOT USED ... ZERO IS AN INVALID HANDLE
*     VALUE. THE ENTRY IS INITIALIZED TO INACTIVE HERE TO AVOID ERRORS. 
# 
      FOR INDEX = 0 STEP 1 UNTIL MAXHANDLE$ DO
        RP$ACTIVE [INDEX] = FALSE;
# 
****  OPEN PORTMAPPER SERVER SOCKET USING PORT 111. 
# 
      IPPOPES (PMAP$SOCKET, (PTYPE"SOCKETUDP"), SOCKSTATUS);
      IF SOCKSTATUS EQ S"OK"
      THEN
        BEGIN 
        IPPBINS (PMAP$SOCKET, PMAP$PORT, SOCKSTATUS); 
        IF (SOCKSTATUS EQ S"REQFAIL") 
        OR (SOCKSTATUS EQ S"ABORT") 
        THEN                           # BIND FAILED - CLOSE SOCKET    #
          IPPABOS (PMAP$SOCKET, IGNORE);
        END 
  
      IF SOCKSTATUS NQ S"OK"
      THEN
        BEGIN                          # RETURN IF ERROR ON SOCKET     #
        RPCSTATUS = S"SOCKFAIL";
        RETURN; 
        END 
  
      RPCSUDP (PMAP$SERVER, PMAP$SOCKET, RPCSTATUS);
      IF RPCSTATUS NQ S"OK"            # FAILED - DELETE REGISTRATION  #
      THEN
        BEGIN 
        IPPABOS (PMAP$SOCKET, IGNORE);
        RETURN; 
        END 
# 
****  PUT PORTMAPPER PORT NUMBER INTO SERVER ADDRESS. 
*     THE REST OF THE ADDRESS WILL BE SET WHEN AN RPC REQUEST IS MADE 
# 
      P<IP$ADDR$REC> = LOC (DUMMY$ADDR);
      IP$PORT = PMAP$PORT;
      IP$PIU = TRUE;
      IP$IPFIU = IP$FIU"BOTH";
# 
****  OPEN PORTMAPPER CLIENT HANDLE AND SOCKET
# 
      SOCKET = 0;                      # CLIENT SOCKET NOT RESERVED    #
      RPCCUDP (PMAP$CLIENT, DUMMY$ADDR, PMAP$PROG, PMAP$VERSION,
        60, SOCKET, RPCSTATUS); 
      IF RPCSTATUS NQ S"OK" 
      THEN                             # FAILED - DELETE SERVER        #
        BEGIN 
        IPPABOS (PMAP$SOCKET, IGNORE);
        RPCSDES (PMAP$SERVER);
        RETURN; 
        END 
# 
****  INITIALIZE PORTMAPPER REGISTRATION TABLE
# 
      FOR INDEX = 0 STEP 1 UNTIL MAXREG$ DO 
        PM$PROGNUM [INDEX] = 0; 
# 
****  REGISTER PORTMAPPER. THIS REQUEST IS GUARANTEED TO SUCCEED SINCE
*     THE DATABASE WAS JUST INITIALIZED.
# 
      PMPSET (PMAP$PROG, PMAP$VERSION, IPPROTO$UDP, PMAP$PORT,
        RPCSTATUS); 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # PMPOPEN                       #
  
      TERM
