*DECK SSIAASH 
USETEXT TEXTATS 
USETEXT TEXTIPL 
USETEXT TEXTRPC 
      PROC SSIAASH; 
*CALL COPYRITE
# TITLE SSIAASH - ACTIVATE ATS SERVER HANDLE.                          #
  
      BEGIN                            # SSIAASH                       #
# 
****  SSIAASH - ACTIVATE ATS SERVER HANDLE. 
* 
*     THIS PROCEDURE INITIATES THE OPENING OF THE ATS SERVER SOCKET 
*     AND THE CREATION OF THE SERVER HANDLE.
* 
*     ENTRY 
* 
*     EXIT     SRVR$HANDLE = HANDLE NUMBER
*              SRVR$SOCKET = SOCKET NUMBER
* 
*     METHOD   ISSUE A DAYFILE STATING THAT THE ATS SERVER HANDLE IS
*              BEING INITIALIZED.  *PMPUNSET* IS CALLED TO REMOVE ANY 
*              POSSIBLE PORTMAP ENTRY FOR THIS PROGRAM.  *RPCSUDP*
*              IS USED TO CREATE THE SERVER HANDLE.  WHEN THE HANDLE
*              IS SUCCESSFULLY CREATED, THE ATS PROGRAM IS REGISTERED 
*              WITH PORTMAPPER.  THE PROCEDURE WILL LOOP UNTIL
*              SUCCESSFULL.   *RPCSUDP* IS PASSED A SOCKET NUMBER OF
*              ZERO, SO IT WILL ALSO OPEN THE REQUIRED SOCKET.
# 
  
# 
****  PROC SSIAASH - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC IPPGETI;    # GET SOCKET INFORMATION                      #
        PROC IPUWAIT;    # SUSPEND APPLICATION PROCESSING              #
        PROC MESSAGE;    # ISSUE DAYFILE MESSAGE                       #
        PROC PMPSET;     # ADD MAPPING TO PORTMAP DATABASE             #
        PROC PMPUNSET;   # DELETE MAPPING TO PORTMAP DATABASE          #
        PROC RPCSDES;    # DELETE UDP SERVER HANDLE                    #
        PROC RPCSUDP;    # CREATE UDP SERVER HANDLE                    #
        PROC SSIICRH;    # INITIALIZE CSI REQUEST HEADER               #
        END 
  
# 
**
# 
  
      ITEM LOOP                I;      # LOOP COUNTER                  #
      ITEM RPCSTATUS   S:RPCSTAT;      # RPC STATUS                    #
      ITEM PORT                I;      # SERVER PORT NUMBER            #
      ITEM SOCKSTATUS S:SOCKSTAT;      # SOCKET STATUS                 #
  
  
# 
****  THIS ARRAY DEFINES THE MESSAGE FOR INITIALIZING SERVER HANDLE.
# 
      ARRAY ASHMSG [00:00] S(4);
        BEGIN 
        ITEM ASH$TEXT    C(00,00,31) = [
          "ATF-INITIALIZING SERVER HANDLE."]; 
        ITEM ASH$ZBYTE   U(03,06,54) = [0]; 
        END 
CONTROL EJECT;
  
# 
****  START MAIN PROCEDURE
# 
  
      MESSAGE (ASHMSG, 0);             # ISSUE I'M HERE DAYFILE MESSAGE#
      PMPUNSET (ATSPROGRAM$, ATSVERSION$, RPCSTATUS); 
  
      FOR LOOP = 0
      DO
        BEGIN 
        SRVR$SOCKET = 0;
        RPCSUDP (SRVR$HANDLE, SRVR$SOCKET, RPCSTATUS);
  
        IF RPCSTATUS EQ S"OK" 
        THEN
          BEGIN 
          IPPGETI (SRVR$SOCKET, SRVR$ADDRESS, SOCKSTATUS);
          IF SOCKSTATUS EQ S"OK"
          THEN
            BEGIN 
            P<IP$ADDR$REC> = LOC (SRVR$ADDRESS);
            PORT = IP$PORT [0]; 
  
            PMPSET (ATSPROGRAM$, ATSVERSION$, IPPROTO$UDP, PORT,
                    RPCSTATUS); 
            IF RPCSTATUS EQ S"OK" 
            THEN
              BEGIN                    # SUCCESSFUL INIT OF SERVER     #
  
              P<IP$ADDR$REC> = LOC (SRVR$ADDRESS);
              IF IP$IPNET [0] LQ X"0FF" 
              THEN                       # CLASS A                     #
                SRV$WORD [0] = IP$IPNET [0] * X"10000000000" +
                               IP$IPHOST [0] * X"10000" + IP$PORT [0];
              ELSE IF IP$IPNET [0] LQ X"0FFFF"
              THEN                       # CLASS B                     #
                SRV$WORD [0] = IP$IPNET [0] * X"100000000" +
                               IP$IPHOST [0] * X"10000" + IP$PORT [0];
              ELSE                       # CLASS C                     #
                SRV$WORD [0] = IP$IPNET [0] * X"1000000" +
                               IP$IPHOST [0] * X"10000" + IP$PORT [0];
              SSIICRH;                 # INITIALIZE CSI HEADER         #
              RETURN; 
              END                      # SUCCESSFUL INIT OF SERVER     #
            END 
  
          RPCSDES (SRVR$HANDLE);
          END 
  
        IPUWAIT ((WAITTIME$));         # WAIT TWO MINUTES              #
        END 
  
      END                              # SSIAASH                       #
  
      TERM
