*DECK FCSUVFC 
USETEXT TEXTFCS 
      FUNC FCSUVFC (FILENAME, FILEXFER, FILEREAD, FILEWRITE) B; 
*CALL COPYRITE
# TITLE FCSUVFC - UTILITY TO VALIDATE LOCAL FILE CHARACTERISTICS.      #
  
      BEGIN                            # FCSUVFC                       #
  
# 
**    FCSUVFC - UTILITY TO VALIDATE LOCAL FILE CHARACTERISTICS. 
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE VALIDATES THE CHARACTERISTICS OF A LOCAL FILE. 
* 
*     FUNC FCSUVFC (FILENAME, FILEXFER, FILEREAD, FILEWRITE)
* 
*     ENTRY   FILENAME   = LOCAL FILE NAME (ZERO FILLED). 
*             FILEXFER   = TRUE IF TRANSFERRING OF THE FILE IS REQUIRED.
*             FILEREAD   = TRUE IF READING OF THE FILE IS REQUIRED. 
*             FILEWRITE  = TRUE IF WRITING OF THE FILE IS REQUIRED. 
* 
*     EXIT    FCSUVFC    = TRUE IF VALIDATION IS SUCCESSFUL.
*             FCSUVFC    = FALSE IF VALIDATION IS NOT SUCCESSFUL. 
*             FCSUSERE   = TRUE IF VALIDATION IS NOT SUCCESSFUL.
* 
*     METHOD  VALIDATE THE LOCAL FILE FILE TYPE.
*             IF TRANSFERRING OF THE FILE IS REQUIRED THEN
*               VALIDATE TRANSFER FILE NAME.
*             IF READING OF THE FILE IS REQUIRED THEN 
*               VALIDATE IF READ ACCESS IS PERMITTED. 
*             IF WRITING OF THE FILE IS REQUIRED THEN 
*               VALIDATE IF WRITE ACCESS IS PERMITTED.
* 
# 
  
# 
****  FUNC FCSUVFC - XREF LIST
# 
      XREF
        BEGIN 
        PROC FCSOWOF;                  # WRITE TO OUTPUT FILE          #
        PROC FINFO;                    # GET INFORMATION ABOUT A FILE  #
        PROC NETUCLR;                  # CLEAR AN AREA OF MEMORY       #
        END 
# 
****
# 
      ARRAY FILENAME [00:00] S(1);     # LOCAL FILE NAME               #
        BEGIN 
        ITEM  FILE$LFN   C(00,00,07); 
        ITEM  FILE$LFNU  U(00,00,42); 
        END 
      ITEM FILEXFER      B;            # TRANSFER OF FILE IS REQUIRED  #
      ITEM FILEREAD      B;            # READING OF FILE IS REQUIRED   #
      ITEM FILEWRITE     B;            # WRITING OF FILE IS REQUIRED   #
  
      DEF RPYLEN$        # 5 #;        # REPLY BLOCK LENGTH            #
      DEF TFLOCAL        # 0 #;        # FILE TYPE LOCAL               #
      DEF TFINPUT        # 1 #;        # FILE TYPE INPUT               #
      DEF TFDIRECT       # 4 #;        # FILE TYPE DIRECT ACCESS       #
      DEF FNINPUT        # O"11162025240000" #; 
      DEF FNOUTPUT       # O"17252420252400" #; 
  
  
      ARRAY REPLY [00:00] S(RPYLEN$);  # FILINFO REPLY BLOCK           #
        BEGIN 
        ITEM RPY$LFN     C(00,00,07);  # LOCAL FILE NAME               #
        ITEM RPY$LEN     U(00,42,06);  # LENGTH OF REPLY BLOCK         #
        ITEM RPY$COMP    B(00,59,01);  # COMPLETION BIT                #
        ITEM RPY$DT      U(01,00,12);  # DEVICE TYPE                   #
        ITEM RPY$MS      B(01,44,01);  # FILE ON MASS STORAGE          #
        ITEM RPY$WRITE   B(01,52,01);  # WRITE MODE ACCESS             #
        ITEM RPY$READ    B(01,53,01);  # READ MODE ACCESS              #
        ITEM RPY$FT      U(01,54,06);  # FILE TYPE                     #
        END 
  
      ARRAY BFTMSG [00:00] S(6);
        BEGIN 
        ITEM  BFT$TEXT   C(00,00,57) =
       ["--ERROR--  LOCAL FILE SPECIFIED IS NOT LOCAL OR ATTACHED."]; 
        ITEM  BFT$ZBYTE  U(05,42,18) = [0]; 
        END 
  
      ARRAY BMTMSG [00:00] S(6);
        BEGIN 
        ITEM  BMT$TEXT   C(00,00,55) =
       ["--ERROR--  LOCAL FILE SPECIFIED IS NOT ON MASS STORAGE."]; 
        ITEM  BMT$ZBYTE  U(05,30,30) = [0]; 
        END 
  
      ARRAY BRTMSG [00:00] S(6);
        BEGIN 
        ITEM  BRT$TEXT   C(00,00,58) =
       ["--ERROR--  LOCAL FILE SPECIFIED DOES NOT HAVE READ ACCESS."];
        ITEM  BRT$ZBYTE  U(05,48,12) = [0]; 
        END 
  
      ARRAY BWTMSG [00:00] S(7);
        BEGIN 
        ITEM  BWT$TEXT   C(00,00,60) =
       ["--ERROR--  LOCAL FILE SPECIFIED DOES NOT HAVE WRITE ACCESS. "];
        ITEM  BWT$ZBYTE  U(06,00,60) = [0]; 
        END 
  
      ARRAY BXTMSG [00:00] S(6);
        BEGIN 
        ITEM  BXT$TEXT   C(00,00,54) =
       ["--ERROR--  LOCAL FILE SPECIFIED CANNOT BE TRANSFERRED."];
        ITEM  BXT$ZBYTE  U(05,24,36) = [0]; 
        END 
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      FCSUVFC  = FALSE;                # RETURN FALSE BY DEFAULT       #
  
      NETUCLR (LOC(REPLY[0]),RPYLEN$); # CLEAR REPLY BLOCK             #
      RPY$LEN[0]  = RPYLEN$;           # STORE SIZE OF REPLY BLOCK     #
      RPY$COMP[0] = TRUE;              # SET COMPLETION BIT            #
      RPY$LFN[0]  = FILE$LFN[0];       # STORE LOCAL FILE NAME         #
      FINFO (REPLY);                   # GET FILE INFORMATION          #
# 
*     SET READ AND WRITE ACCESS FOR DEVICE TYPE OF 0. 
# 
      IF RPY$DT EQ 0
      THEN
        BEGIN                          # DEVICE TYPE IS 0              #
        RPY$MS[0]    = TRUE;           # FILE RESIDES ON MASS STORAGE  #
        RPY$READ[0]  = TRUE;           # SET READ ACCESS               #
        RPY$WRITE[0] = TRUE;           # SET READ ACCESS               #
        END 
# 
*     VALIDATE FILE TYPE. 
# 
      IF (RPY$FT[0] NQ TFLOCAL) AND 
         (RPY$FT[0] NQ TFINPUT) AND 
         (RPY$FT[0] NQ TFDIRECT)
      THEN
        BEGIN                          # FILE TYPE NOT LOCAL OR DIRECT #
        FCSOWOF (BFTMSG[0], INTERNAL$);# WRITE MESSAGE TO OUTPUT FILE  #
        FTPUSERE = TRUE;               # SET USER ERROR FLAG           #
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END 
# 
*     VALIDATE TRANSFER FILE RESIDENCY AND FILE NAME. 
# 
      IF FILEXFER 
      THEN
        BEGIN                          # TRANSFER OF FILE REQUIRED     #
        IF NOT RPY$MS[0]
        THEN
          BEGIN                        # FILE NOT ON MASS STORAGE      #
          FCSOWOF (BMTMSG[0], 
                   INTERNAL$);         # WRITE MESSAGE TO OUTPUT FILE  #
          FTPUSERE = TRUE;             # SET USER ERROR FLAG           #
          RETURN;                      # GET OUT OF HERE QUICKLY       #
          END 
  
        IF (FILE$LFN[0] EQ XFERLFN[0]) OR 
           (FILE$LFN[0] EQ "ZZZZZDN") OR
           (FILE$LFN[0] EQ "ZZZZZSN") OR
           (FILE$LFN[0] EQ "ZZZZZN1") OR
           (FILE$LFN[0] EQ "ZZZZZN2") OR
           (FILE$LFNU[0] EQ FNINPUT) OR 
           (FILE$LFNU[0] EQ FNOUTPUT) 
        THEN
          BEGIN                        # INVALID TRANSFER FILE NAME    #
          FCSOWOF (BXTMSG[0], 
                   INTERNAL$);         # WRITE MESSAGE TO OUTPUT FILE  #
          FTPUSERE = TRUE;             # SET USER ERROR FLAG           #
          RETURN;                      # GET OUT OF HERE QUICKLY       #
          END 
        END 
# 
*     VALIDATE READ ACCESS. 
# 
      IF (FILEREAD) AND 
         (NOT RPY$READ[0])
      THEN
        BEGIN                          # READ REQUIRED + NOT PERMITTED #
        FCSOWOF (BRTMSG[0], INTERNAL$);# WRITE MESSAGE TO OUTPUT FILE  #
        FTPUSERE = TRUE;               # SET USER ERROR FLAG           #
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END 
# 
*     VALIDATE WRITE ACCESS.
# 
      IF (FILEWRITE) AND
         (NOT RPY$WRITE[0]) 
      THEN
        BEGIN                          # WRITE REQUIRED + NOT PERMITTED#
        FCSOWOF (BWTMSG[0], INTERNAL$);# WRITE MESSAGE TO OUTPUT FILE  #
        FTPUSERE = TRUE;               # SET USER ERROR FLAG           #
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END 
  
      FCSUVFC = TRUE;                  # RETURN TRUE TO CALLER         #
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSUVFC                       #
  
      TERM
