*DECK CTRLNDT 
USETEXT COMCBEG 
USETEXT COMRAPL 
USETEXT COMRNET 
USETEXT COMRQUE 
USETEXT COMRRTN 
USETEXT COMRSFC 
PROC CTRLNDT; 
# TITLE CTRLNDT - PROCESS CTRL/INFO REQUEST FOR NETWORK DESC. TABLE. #
  
      BEGIN  # CTRLNDT #
  
# 
**    CTRLNDT - PROCESS CTRL/INFO REQUEST FOR NETWORK DESC. TABLE.
* 
*     PROCESS CTRL/INFO REQUEST FOR NETWORK DESCRIPTION TABLE BY
*     COPYING NETWORK DESCRIPTION TABLE TO REQUESTOR. 
* 
*     PROC CTRLNDT. 
* 
*     ENTRY   -  QU$ADDRESS IS BASED ARRAY CONTAINING CTRL/INFO REQUEST.
*                REQUESTOR HAS BEEN VALIDATED.
*                APL$HEADER IS BASED ARRAY CONTAINING APPLICATION TABLE.
* 
*     EXIT    -  REQUEST HAS BEEN PROCESSED.
*                QUEUE ENTRY HAS BEEN DISPOSED OF PROPERLY. 
* 
*     PROCESS -  BUILD SSF CALL TO WRITE NDT
*                IF REQUESTORS BUFFER LENGTH IS LESS THAN NDT LENGTH
*                THEN:  
*                  USE REQUESTORS BUFFER LENGTH.
*                ELSE:  
*                  WRITE ALL OF NDT.
*                INITIATE SSF CALL
*                IF RETURN CODE IS UCP SWAPPED
*                THEN 
*                  INITIATE UCP SWAP IN.
*                ELSE 
*                  IF SSF ERROR 
*                  THEN:  
*                    CALL SSF ERROR PROCESSOR.
*                    FREE QUEUE ENTRY.
*                  ELSE:  "SUCCESSFUL WRITE " 
*                    INITIATE NSUP REPLY
*                RETURN.
* 
* 
****  PROC CTRLNDT - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC FREE;                   # RELEASE QUEUE ENTRY #
        PROC RTNNSUP;                # INITIATE NSUP REPLY #
        PROC SSFREQ;                 # INITIATE SSF CALL #
        PROC SSFERRP;                # SSF ERROR PROCESSOR #
        PROC UCPSWPI;                # INITIATE SWAPIN OF UCP # 
        END 
  
# 
****  PROC CTRLNDT - XREF LIST END. 
# 
  
  
      CONTROL IFEQ OS$NOS;
      ITEM ERROR      B;             # ERROR FLAG FOR SF$XWRT # 
      CONTROL ENDIF;
  
      ITEM MSG$BADADR C(35) = "BUFFER ADDRESS ERROR IN CTRL/INFO/R";
  
CONTROL EJECT;
  
      SFC$WD1   = 0;
      CONTROL IFEQ OS$NOSBE;
      SFC$FC1   = SF$WRIT;
      SFC$SCPA1 = P<NDT$HEADER>;
      SFC$UCPA1 = QU$CTRNBFA; 
      CONTROL ENDIF;
      CONTROL IFEQ OS$NOS;
      SFC$FC1 = SF$XWRT;
      SFC$WD2 = 0;
      SFC$ESCPA1 = P<NDT$HEADER>; 
      SFC$EUCPA1 = QU$CTRNBFA;
      CONTROL ENDIF;
  
      IF QU$CTRNBFL LE NDT$LENGTH 
      THEN
        BEGIN  # WRITE ONLY LENGTH OF NDT SPECIFIED BY REQUESTOR #
        SFC$FP1 = QU$CTRNBFL; 
        END 
  
      ELSE
        BEGIN  # WRITE ALL OF NETWORK DESC. TABLE # 
        SFC$FP1 = NDT$LENGTH + 1; 
        END 
  
      SFC$JOBID = APL$JOBID;
  
      CONTROL IFEQ OS$NOS;
      ERROR = FALSE;
      ASLONGAS (SFC$FP1 NE 0) AND (NOT ERROR) 
      DO
        BEGIN 
        ERROR = TRUE; 
      CONTROL ENDIF;
  
      SSFREQ;                        # ATTEMPT WRITE #
  
      IF SFC$RC1 EQ SFRC$SWAP 
      THEN
        BEGIN  # UCP SWAPPED OUT #
        UCPSWPI(APL$JOBID); 
        END 
  
      ELSE
        BEGIN  # NOT RETURN CODE OF SWAPPED # 
  
        IF SFC$RC1 NE 0 
        THEN
          BEGIN  # SSF ERROR ENCOUNTERED #
          SSFERRP(QU$UCPA); 
          FREE; 
          END 
  
        ELSE
          BEGIN  # SUCCESSFUL WRITE # 
        CONTROL IFEQ OS$NOS;
          IF SFC$FP1 NE 0 
          THEN
            BEGIN 
            ERROR = FALSE;
            SFC$FC1CB = FALSE;
            END 
  
          ELSE
            BEGIN 
          CONTROL ENDIF;
  
          QU$CHARGE = 1;
          RTNNSUP;
  
        CONTROL IFEQ OS$NOS;
            END 
          CONTROL ENDIF;
  
          END 
  
        END 
  
      CONTROL IFEQ OS$NOS;
        END 
      CONTROL ENDIF;
  
      RETURN; 
      END  # CTRLNDT #
  
      TERM
