*DECK FFSRPDT 
USETEXT TEXTFFS                        # FS SYSTEM TEXT                #
PROC FFSRPDT(TRFRTYPE, RETSTAT, RSPCN); 
*CALL COPYRITE
# TITLE FFSRPDT - PREPROCESS DATA TRANSFER.                            #
  
      BEGIN                            # FFSRPDT                       #
  
# 
**    FFSRPDT - PREPROCESS DATA TRANSFER. 
* 
*     CMP                              02/02/88 
* 
*     PROC FFSRPDT(TRFRTYPE, RETSTAT, RSPCN)
* 
*     ENTRY     (TRFRTYPE) = TRTYPE 
*                              RETR,
*                              STOR,
*                              APPE,
*                              LIST.
*               (RSPCN)    = CONNECTION FOR RESPONSES.
* 
*     EXIT      (RETSTAT) = 0 IF NO ERRORS, 
*                         > 0 IF ERROR ENCOUNTERED. 
*               FILE IS ATTACHED OR PRESENT AS REQUIRED BY THE TYPE 
*               OF TRANSFER.
* 
# 
  
      ITEM TRFRTYPE    S:TRTYPE;       # TRANSFER TYPE SET BY CALLER   #
      ITEM RETSTAT     U;              # STATUS RETURNED               #
      ITEM RSPCN       U;              # RESPONSE CN ENTRY NUMBER      #
  
# 
***   PROC FFSRPDT - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC FFSUCDA;                  # CONVERT DISPLAY MSG TO ASCII88#
        FUNC FFSUPCP B;                # PROCESS COMMAND PARAMETER     #
        PROC ABORT;                    # NOS ABORT MACRO               #
        PROC ATTACH;                   # ATTACH A FILE                 #
        PROC DEFINE;                   # DEFINE A FILE                 #
        PROC FILINFO;                  # NOS FILINFO MACRO CALL        #
        PROC GETPF;                    # GET AN INDIRECT FILE          #
        PROC MESSAGE;                  # NOS MESSAGE MACRO             #
        PROC REPLACE;                  # NOS REPLACE A FILE MACRO      #
        PROC RETERN;                   # RETURN A FILE                 #
        END 
  
# 
***   PROC FFSRPDT - XREF LIST END. 
# 
      DEF  THREBLWDS  #"                              "#; # 3 BLANK WDS#
  
      ITEM I                 U;        # LOOP COUNTER                  #
      ITEM LENCHAR           U;        # BYTES IN CONVERTED MESSAGE    #
      ITEM SENDFLAG          B;        # FLAG FOR ATTACH ROUTINE       #
      ITEM DUMMYBL           B; 
  
      ARRAY BADFIL [00:00] S(4);       # BAD FILE FOR CLIENT           #
        BEGIN 
        ITEM BADFL   C(00,00,31) =
          [" FFSRPDT - BAD FILE FROM CLIENT"];
        ITEM BADZB0  U(03,06,54) = [0]; 
        END 
  
      ARRAY FILNFO [0:0] S(5);         # FOR FILINFO CALL              #
        BEGIN 
        ITEM FILWD0  U(00, 00, 60);    # WORD 0                        #
        ITEM FILLFN  C(00, 00, 07);    # LFN                           #
        ITEM FILLEN  U(00, 42, 06);    # LEN                           #
        ITEM FILDT   U(01, 00, 12);    # DEVICE TYPE                   #
        ITEM FILMS   B(01, 44, 01);    # FILE ON MASS STORAGE          #
        ITEM FILAP   B(01, 50, 01);    # ALTER PERMISSION BIT          #
        ITEM FILEP   B(01, 51, 01);    # EXTEND PERMISSION BIT         #
        ITEM FILRP   B(01, 53, 01);    # READ PERMISSION BIT           #
        ITEM FILFT   U(01, 54, 06);    # FILE TYPE                     #
        END 
  
      ARRAY ERR$MSG [00:00] S(PFMMSG$);   # FILE CREATION NOT VALID    #
        BEGIN 
        ITEM ERR$TXT C(00, 00, 30); 
        ITEM ERR$C   C(00, 00, 28) = ["550 FILE CREATION NOT VALID."];
        ITEM ERR$ZB  U(02, 48, 12) = [0]; 
        END 
  
      ARRAY FNF$MSG [00:00] S(PFMMSG$); 
        BEGIN 
        ITEM FNF$TXT C(00, 00, 30); 
        ITEM FNF$C   C(00, 00, 28) = ["550 'UN' PARAMETER INVALID. "];
        ITEM FNF$ZB  U(02, 48, 12) = [0]; 
        END 
  
      BASED ARRAY TEMPMSG [0:0] S(1); 
        BEGIN 
        ITEM TEMPWORD      U(00, 00, 60); 
        END 
  
      CONTROL EJECT;
  
                                       CONTROL FTNCALL; 
  
#     VALIDATE FET (FFSUPCP DOES THIS)                                 #
  
      IF NOT FFSUPCP
      THEN
        BEGIN                          # FET/PARAMS NOT VALID          #
        RETSTAT = FTE$CDS"FTE$BSYN";   # SET RETURN TRIGGER            #
        RETURN; 
        END 
  
# 
*     GET THE USERS FILE CREATION PERMISSIONS 
*     OVERRIDE FFSUPCP SETTINGS IF NECESSARY... 
# 
  
      P<VAL$BLOCK> = LOC(JOB$VAL);
      P<AACW>      = LOC(VAL$AACW); 
  
      IF    (TRFRTYPE EQ S"STOR") 
         OR (TRFRTYPE EQ S"APPE") 
      THEN
        BEGIN 
        IF     (NOT AAC$CLPF) 
           AND (NOT AAC$CSPF) 
        THEN
          BEGIN                        # NO DIRECT/INDIRECT PERMISSION #
          PFM$TEXT[0] = ERR$TXT[0];    # SET RESPONSE TEXT             #
          RETSTAT = FTE$CDS"FTE$FANT"; # SET RETURN TRIGGER            #
          RETURN;                      # *** EXIT ***                  #
          END 
  
        IF NOT AAC$CLPF 
        THEN
          BEGIN                        # NO DIRECT ACCESS PERMISSION   #
          SITEFT = IA$0;
          END 
  
        IF NOT AAC$CSPF 
        THEN
          BEGIN                        # NO INDIRECT ACCESS PERMISSION #
          SITEFT = DA$0;
          END 
        END                            # APPE/STOR                     #
# 
*     PROCESS APPE/STOR (SERVER) PF PROCESSING. 
# 
      IF     (TRFRTYPE EQ S"APPE")
         OR  (TRFRTYPE EQ S"STOR")
         AND (EPTFLAG EQ FTPS$) 
      THEN
        BEGIN 
        IF SITEFT EQ DA$0 
        THEN
          BEGIN 
# 
*         IF DA FILES ALLOWED, ATTEMPT TO ATTACH FILE,
*         AND IF NOT SUCCESSFUL, AND IA FILES ALLOWED, TRY A GET. 
*         IF NEITHER SUCCESSFUL, ACTION DEPENDS ON SITEFT IE IF SET 
*         TO DA, DEFINE A FILE. IF IA, FILE WILL BE REPLACED AT END.
# 
  
          MBT$ERAD[0] = LOC(PFM$T[0]); # SYSTEM ERROR MESSAGE          #
          SENDFLAG = FALSE; 
          PFM$T[0] = 0; 
          ATTACH(MBT, RETSTAT, PFM$MSG, SENDFLAG);
          IF RETSTAT EQ NEC 
          THEN
            BEGIN                      # FILE FOUND ON ATTACH          #
            SITEFT = DA$0;
            END 
          ELSE
            BEGIN                      # ATTACH FAILED                 #
            IF RETSTAT EQ FNF 
            THEN
              BEGIN                    # FILE NOT FOUND                #
              DUMMYBL = FFSUPCP;       # RESET FET                     #
              IF AAC$CSPF 
              THEN
                BEGIN                  # IA FILES ALLOWED              #
                PFM$T[0] = 0; 
                GETPF(MBT, RETSTAT, PFM$MSG); 
                IF RETSTAT EQ NEC 
                THEN
                  BEGIN                # GET WORKED                    #
                  SITEFT = IA$0;
                  IF MBT$UN[0] NQ 0    # UN SPECIFIED                  #
                  THEN
                    BEGIN 
                    PFM$T[0] = 0; 
                    REPLACE(MBT, RETSTAT,  # REPLACE THE FILE          #
                            PFM$MSG); 
                    IF RETSTAT NQ NEC 
                    THEN
                      BEGIN                # PFM ERROR                 #
                      GOTO FFSRPDTERR;     # SEND 550 AND EXIT         #
                      END 
                    END 
                  END 
                ELSE
                  BEGIN                # GET FAILED                    #
                  IF RETSTAT EQ FNF 
                  THEN
                    BEGIN              # FILE NOT FOUND ON GET         #
                    DUMMYBL = FFSUPCP; # RESET FET                     #
                    IF MBT$UN[0] NQ 0 
                    THEN
                      BEGIN            # UN SPECIFIED, SET RESPONSE MSG#
                      PFM$TEXT[0] = FNF$TXT[0]; 
                      RETSTAT = FTE$CDS"FTE$FANT";
                      RETURN;          # *** EXIT ***                  #
                      END 
  
                    PFM$T[0] = 0; 
                    MBT$UNU = 0;
                    DEFINE(MBT, RETSTAT, PFM$MSG);
                    IF RETSTAT EQ NEC 
                    THEN
                      BEGIN            # FILE DEFINED                  #
                      SITEFT = DA$0;
                      END 
                    ELSE
                      BEGIN            # PFM ERROR - SEND 550          #
                      GOTO FFSRPDTERR;
                      END              # PFM ERROR                     #
                    END                # FILE NOT FOUND ON GET         #
                  ELSE
                    BEGIN              # OTHER PFM ERROR               #
                    GOTO FFSRPDTERR;
                    END                # OTHER PFM ERROR               #
                  END                  # GET FAILED                    #
                END                    # IA FILES ALLOWED              #
# 
*     HERE WHEN IA FILES NOT ALLOWED
# 
              ELSE
                BEGIN                  # IA FILES NOT ALLOWED          #
                IF MBT$UN[0] NQ 0 
                THEN
                  BEGIN                # UN SPECIFIED, SET RESPONSE MSG#
                  PFM$TEXT[0] = FNF$TXT[0]; 
                  RETSTAT = FTE$CDS"FTE$FANT";
                  RETURN;              # *** EXIT ***                  #
                  END 
  
                PFM$T[0] = 0; 
                MBT$UNU = 0;
                DEFINE(MBT, RETSTAT, PFM$MSG);
                IF RETSTAT EQ NEC 
                THEN
                  BEGIN                # FILE DEFINED                  #
                  SITEFT = DA$0;
                  END 
                ELSE
                  BEGIN                # PFM ERROR - SEND 550          #
                  GOTO FFSRPDTERR;
                  END                  # PFM ERROR                     #
                END                    # IA FILES NOT ALLOWED          #
              END                      # FILE NOT FOUND ON ATTACH      #
            ELSE
              BEGIN                    # OTHER PFM ERROR ON ATTACH     #
              GOTO FFSRPDTERR;
              END 
            END                        # ATTACH FAILED                 #
          END                          # SITEFT IS DA                  #
# 
*     HERE WHEN SITEFT IS IA. 
# 
        ELSE
          BEGIN                        # SITEFT IS IA                  #
          PFM$T[0] = 0; 
          GETPF(MBT, RETSTAT, PFM$MSG); 
          IF RETSTAT EQ NEC 
          THEN
            BEGIN                      # GET WORKED                    #
            SITEFT = IA$0;
            IF MBT$UN[0] NQ 0          # UN SPECIFIED                  #
            THEN
              BEGIN 
              PFM$T[0] = 0; 
              REPLACE(MBT, RETSTAT,    # REPLACE THE FILE              #
                      PFM$MSG); 
              IF RETSTAT NQ NEC 
              THEN
                BEGIN                  # PFM ERROR                     #
                GOTO FFSRPDTERR;       # SEND 550 AND EXIT             #
                END 
              END 
            END 
          ELSE
            BEGIN                      # GET FAILED                    #
            IF RETSTAT EQ FNF 
            THEN
              BEGIN                    # FILE NOT FOUND ON GET         #
              DUMMYBL = FFSUPCP;       # RESET THE FET                 #
              IF AAC$CLPF 
              THEN
                BEGIN                  # DA FILES ALLOWED              #
                PFM$T[0] = 0; 
                SENDFLAG = FALSE; 
                ATTACH(MBT, RETSTAT, PFM$MSG, SENDFLAG);
                IF RETSTAT EQ NEC 
                THEN
                  BEGIN                # ATTACH WORKED                 #
                  SITEFT = DA$0;
                  END 
                ELSE
                  BEGIN                # ATTACH FAILED                 #
                  IF RETSTAT EQ FNF 
                  THEN
                    BEGIN              # FILE NOT FOUND                #
                    IF MBT$UN[0] NQ 0 
                    THEN
                      BEGIN            # UN SPECIFIED, SET RESPONSE MSG#
                      PFM$TEXT[0] = FNF$TXT[0]; 
                      RETSTAT = FTE$CDS"FTE$FANT";
                      RETURN;          # *** EXIT ***                  #
                      END 
  
                    DUMMYBL = FFSUPCP; # RESET THE FET                 #
                    SITEFT = IA$0;
                    END 
                  ELSE
                    BEGIN              # PFM ERROR                     #
                    GOTO FFSRPDTERR;
                    END 
                  END                  # ATTACH FAILED                 #
                END                    # DA FILES ALLOWED              #
              ELSE
                BEGIN                  # DA FILES NOT ALLOWED          #
                IF MBT$UN[0] NQ 0 
                THEN
                  BEGIN                # UN SPECIFIED, SET RESPONSE MSG#
                  PFM$TEXT[0] = FNF$TXT[0]; 
                  RETSTAT = FTE$CDS"FTE$FANT";
                  RETURN;              # *** EXIT ***                  #
                  END 
  
                SITEFT = IA$0;
                END 
              END                      # FILE NOT FOUND ON GET         #
            ELSE
              BEGIN                    # PFM ERROR ON GET              #
              GOTO FFSRPDTERR;
              END 
            END                        # GET FAILED                    #
          END                          # SITEFT IS IA                  #
        END                            # APPE/STOR (SERVER) COMMAND    #
  
# 
*     PROCESS RETR (SERVER) PF PROCESSING 
# 
  
      IF     (TRFRTYPE EQ S"RETR")
         AND (EPTFLAG EQ FTPS$) 
      THEN
        BEGIN                          # RETR (SERVER) COMMAND         #
        MBT$ERAD[0] = LOC(PFM$T[0]);   # SYSTEM ERROR MESSAGE          #
        SENDFLAG = TRUE;
        PFM$T[0] = 0; 
        ATTACH(MBT, RETSTAT, PFM$MSG, SENDFLAG);
        IF RETSTAT EQ NEC 
        THEN
          BEGIN                        # FILE FOUND ON ATTACH          #
          SITEFT = DA$0;
          END 
        ELSE
          BEGIN                        # ATTACH FAILED                 #
          IF RETSTAT EQ FNF 
          THEN
            BEGIN                      # FILE NOT FOUND ON ATTACH      #
            PFM$T[0] = 0; 
            GETPF(MBT, RETSTAT, PFM$MSG); 
            IF RETSTAT EQ NEC 
            THEN
              BEGIN                    # GET WORKED                    #
              SITEFT = IA$0;
              END 
            ELSE
              BEGIN                    # GET FAILED                    #
              GOTO FFSRPDTERR;
              END 
            END 
          ELSE
            BEGIN                      # PFM ERROR ON ATTACH           #
            GOTO FFSRPDTERR;
            END 
          END                          # ATTACH FAILED                 #
        END                            # RETR (SERVER)                 #
  
# 
*     IF CLIENT MODE OF OPERATION, CHECK FILE IS SWAPPED TO US... 
# 
  
      IF EPTFLAG EQ FTPC$ 
      THEN
        BEGIN                          # IF CLIENT                     #
        MBT$STAT = 1;                  # SET FET COMPLETE              #
        FILWD0    = 1;
        FILLFN    = MBT$LFN;           # SET LFN                       #
        FILLEN    = 5;
                                         CONTROL FTNCALL; 
        FILINFO(FILNFO);
        IF    (NOT FILMS) 
           OR ((TRFRTYPE EQ S"RETR") AND (NOT FILRP)) 
           OR ((TRFRTYPE NQ S"RETR") AND (NOT FILEP)) 
           OR ((FILFT NQ 0) AND (FILFT NQ 4)) 
        THEN
          BEGIN                        # FILE NOT LOCAL OR BAD PERMISN #
          MESSAGE(BADFIL, 0); 
          ABORT;
          END 
        END 
  
      RETSTAT = 0;
      RETURN; 
  
FFSRPDTERR: 
# 
*     IF IN SERVER MODE:  
*       RETURN FILE.
# 
  
      IF EPTFLAG EQ FTPS$ 
      THEN
        BEGIN 
        RETERN(MBT);
        END 
  
      RETSTAT = FTE$CDS"FTE$FANT";       # SET RETURN TRIGGER TO NOOP  #
  
      RETURN; 
  
      END                                # FFSRPDT                     #
  
      TERM
