*DECK PMPREQT 
USETEXT TEXTIPL 
USETEXT TEXTRPC 
USETEXT TEXTXDR 
      PROC PMPREQT (ADDRESS, PROGNUM, VERSION, PROTOCOL, PORTNUM, 
        RPCSTATUS); 
*CALL COPYRITE
# TITLE PMPREQT - REQUEST PORT FOR REMOTE PROCEDURE                    #
  
      BEGIN                            # PMPREQT                       #
# 
****  PMPREQT  REQUEST PORT FOR REMOTE PROCEDURE
* 
*     THIS PROCEDURE REQUESTS THE PORT REGISTERED FOR THE SPECIFIED 
*     PROGRAM, VERSION AND PROTOCOL FROM THE PORTMAPPER ON THE REMOTE 
*     SYSTEM SPECIFIED BY THE ADDRESS PARAMETER.
* 
*     PROC PMPREQT
* 
*     ENTRY    ADDRESS    = ADDRESS OF THE REMOTE SYSTEM TO QUERY 
*              PROGNUM    = PORTMAPPER PROGRAM NUMBER 
*              VERSION    = PROTOCOL VERSION
*              PROTOCOL   = PROTOCOL (IPPROTO$XXX)
* 
*     EXIT     PORTNUM    = PORT NUMBER 
*              RPCSTATUS  = STATUS OF THE REQUEST 
* 
*     METHOD   A "GETPORT" RPC REQUEST IS FORMATTED AND SENT TO THE 
*              PORTMAPPER ON THE REMOTE SYSTEM SPECIFIED BY ADDRESS.
*              THE REQUEST IS SENT BY THE RPCCCAL PROCEDURE USING THE 
*              PORTMAPPER RPC HANDLE. 
# 
  
# 
*     PROC PMPREQT - XREF LIST
# 
      XREF
        BEGIN 
        PROC RPCCCAL;    # ISSUE AN RPC CALL TO A SERVER               #
        PROC XDRINT;     # CONVERT INTEGERS TO XDR FORMAT              #
        END 
# 
**
# 
      ARRAY ADDRESS [00:00] S(1);;     # ADDRESS OF REMOTE SYSTEM      #
      ITEM PROGNUM             U;      # PORTMAPPER PROGRAM NUMBER     #
      ITEM VERSION             U;      # PROTOCOL VERSION              #
      ITEM PROTOCOL            U;      # PROTOCOL (IPPROTO$XXX)        #
      ITEM PORTNUM             U;      # PORT NUMBER                   #
      ITEM RPCSTATUS S:RPCSTAT;      # STATUS OF THE REQUEST         #
# 
**
# 
      ITEM BUFPOS             U;       # POSITION IN RPCBUF            #
      ITEM BUFLEN             U;       # BUFFER LENGTH                 #
      ARRAY PMAPREQ [00:00] S(4);      # PORTMAPPER STRUCT MAPPING     #
        BEGIN 
        ITEM PROG      U(0,0,60);      # PROGRAM NUMBER                #
        ITEM VERS      U(1,0,60);      # VERSION NUMBER                #
        ITEM PROT      U(2,0,60);      # PROTOCOL NUMBER               #
        ITEM PORT      U(3,0,60);      # PORT NUMBER                   #
        END 
      BASED ARRAY PORTVAL [0:0] S(1);; # PORT NUMBER                   #
      ARRAY RPCBUF  [00:08] S(1);      # BUFFER FOR RPC CALL           #
        ITEM RPC$WORD  U(0,0,60); 
      ITEM SERVNET             U;      # NETWORK ADDRESS OF SERVER     #
      ITEM SERVHOST            U;      # HOST ADDRESS OF SERVER        #
      CONTROL EJECT;
# 
****  START MAIN PROCEDURE
* 
****  BUILD PORTMAP MAPPING STRUCTURE AND CONVERT TO XDR. 
# 
      PROG [0] = PROGNUM; 
      VERS [0] = VERSION; 
      PROT [0] = PROTOCOL;
      PORT [0] = 0; 
      BUFPOS = 0; 
      XDRINT (RPCBUF, BUFPOS, PMAPREQ, 4, XDROPER"WRITE");
# 
****  SET UP SERVER ADDRESS FOR PORTMAPPER CLIENT HANDLE. 
# 
      P<IP$ADDR$REC> = LOC (ADDRESS); 
      SERVNET = IP$IPNET; 
      SERVHOST = IP$IPHOST; 
      P<IP$ADDR$REC> = LOC (RP$ADDRESS [PMAP$CLIENT]);
      IP$IPNET = SERVNET; 
      IP$IPHOST = SERVHOST; 
# 
****  CALL REMOTE PORTMAPPER TO GET PORT NUMBER.
# 
      RPCCCAL (PMAP$CLIENT, PMAPPROC"GETPORT", RPCBUF, BUFPOS,
        RPCBUF, BUFPOS, BUFLEN, RPCSTATUS); 
      IF RPCSTATUS NQ S"OK" 
      THEN
        BEGIN 
        PORTNUM = 0;
        RETURN; 
        END 
# 
****  RETURN THE REMOTE PORT NUMBER. ZERO MEANS "NOT REGISTERED"
# 
      P<PORTVAL> = LOC (PORTNUM); 
      XDRINT (RPCBUF, BUFPOS, PORTVAL, 1, XDROPER"READ"); 
      IF PORTNUM EQ 0 
      THEN
        RPCSTATUS = S"NOTREGISTRD"; 
      ELSE
        RPCSTATUS = S"OK";
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # PMPREQT                       #
  
      TERM
