// DATE 210620
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$FIND
       MACRO
       $FIND
.*
.*     5703-XM1 FILE SEARCH CONTROL MODULE
.*
       TEXT
       TITLE 'SFINDF - FILE SEARCH CONTROL MODULE'
***********************************************************************
*  5703-XM1    COPYRIGHT IBM CORP. 1970                               *
*              REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE, 120-2083    *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   * SFINDF IS A CONTROL MODULE USED TO LOCATE A SPECIFIED PASSWORD  *
*     AND/OR FILENAME.                                                *
*   * IF THE FILENAME, PASSWORD, AND VOLUME-ID ARE ALL EXPLICITLY     *
*     SPECIFIED. A CALL IS ISSUED TO SVOLID, SGETDB AND SRCHFN TO     *
*     SEARCH FOR THE REQUIRED FILE IN THE FILE LIBRARY SPECIFIED.     *
*     IF THE PASSWORD OR VOLUME-ID IS NOT EXPLICITLY DEFINED, SFINDF  *
*     WILL DEFAULT TO THE CURRENT USER SPECIFICATIONS, IF THEY EXIST, *
*     FOR THE MISSING PARAMETERS AND THEN ISSUE THE REQUIRED CALLS    *
*     TO SGETDS AND/OR SRCHFN TO LOCATE THE FILE.                     *
*   * IF A ONE OR TWO-STAR FILENAME IS SPECIFIED, THE SPECIFIED DISK, *
*     OR ALL DISKS ON THE SYSTEM WILL BE SEARCHED IN AN ATTEMPT TO    *
*     LOCATE THE FILE. THE CALLER MAY SET AN INDICATOR TO TERMINATE   *
*     THE SEARCH AFTER A GIVEN NUMBER OF DISKS HAVE BEEN SEARCHED.    *
*                                                                     *
*ENTRY POINTS                                                         *
*   THE ENTRY POINT IS SFINDF.                                        *
*   THE CALLING SEQUENCE IS AS FOLLOWS:                               *
*        B     SFINDF                                                 *
*                                                                     *
*INPUT                                                                *
*   * THE FOLLOWING INFORMATION MUST BE SET UP IN TSMLES BEFORE       *
*     CALLING SFINDF.                                                 *
*        * SMPSWD  MUST CONTAIN SPECIFIED PASSWORD                    *
*        * SMVOID  MUST CONTAIN SPECIFIED VOLUME                      *
*        * SMFNAM  MUST CONTAIN SPECIFIED FILENAME                    *
*   * THE FOLLOWING SWITCHES ARE PROVIDED TO HANDLE ONE OR TWO-STAR   *
*     FILES:                                                          *
*        * SFIVOL - IF @NOP IS SET SVOLID WILL NOT BE CALLED. SVOLID  *
*                   IS NOT REUSABLE AND THIS SWITCH MUST BE SET BEFORE*
*                   SFINDF IS CALLED A SECOND TIME.                   *
*        * SFISTR - IF @NOP IS SET ONLY 1 DISK WILL BE SEARCHED       *
*        * SFIFND - IF @NOP SET WITH SFIVOL ONLY THE NUMBER OF DISKS  *
*                   SPECIFIED IN SFINTR WILL BE SEARCHED.             *
*                                                                     *
*OUTPUT                                                               *
*   * THE OUTPUT FROM SFINDF IS SET IN TSMLES, THE POINTERS AND USER  *
*     DIRECTORIES REQUIRED ARE INITALIZED.                            *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*        TSMLES - (SMALES) DATA MANAGEMENT SAVE AREAS AND BUFFERS.    *
*        $VOLID - CORE RESIDENT VOLID TABLE.                          *
*        $USRDR - DISPLACEMENT TO CURRENT USER DIRECTORY.             *
*        $FILIB - CURRENT USER FILE LIBRARY DISK ADDRESS.             *
*        DL2ICS - TWO TRACK LOGICAL IOCS.                             *
*        SRCHFN - SEARCH USER DIRCTY BLOCK.                           *
*        SGETDB - SEARCH PASSWORD DIRCTY.                             *
*        SVOLID - SEARCH VOL-ID TABLE.                                *
*        $CAERR - SAVE AREA FOR SYSTEM ERROR MESSAGT CODE.            *
*                                                                     *
*EXITS, NORMAL                                                        *
*   * NORMAL RETURN IS TO THE CALLER FOLLOWING THE BRANCH TO SFINDF.  *
*                                                                     *
*EXITS, ERROR                                                         *
*   * THE ERROR RETURN IS TO SFIERR WHICH MUST BE DEFINED BY THE      *
*     CALLER.                                                         *
*                                                                     *
*TABLES/WORKAREAS                                                     *
*   * N/A                                                             *
*                                                                     *
*ATTRIBUTES                                                           *
*   * RELOCATABLE                                                     *
*   * RE-USABLE                                                       *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   * THE OPERATION OF THIS MODULE DOES NOT DEPEND UPON A PARTICULAR  *
*     INTERNAL REPRESENTATION OF THE EXTERNAL CHARACTER SET.          *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      IF A FILE-SPEC WAS NOT ENTERED AND A CURRENT USER IS NOT IN    *
*      AFFECT.  THE ERROR EXIT TO SFIERR IS TAKEN.                    *
*                                                                     *
*   REGISTER USAGE                                                    *
*      @BR AND @XR ARE SAVED AND RESTORED. DURING EXECUTION @BR IS    *
*      USED AS A BASE REGISTER AND @XR IS USED TO POINT TO $NUCBS.    *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      NONE                                                           *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      NONE                                                           *
*                                                                     *
*   REQUIRED MODULES                                                  *
*        @SYSEQ - SYSTEM SOFTWARE EQUATES.                            *
*        @FXDEQ - SYSTEM NUCLEUS ADDRESSES AND INDICATOR VALUES.      *
*        TSMLES - DATA MANAGEMENT SAVE AREAS AND BUFFERS.             *
*        $VOLID - SEARCH VOLUME-ID SUBROUTINE.                        *
*        SRCHFN - SEARCH FOR FILENAME SUBROUTINES.                    *
*        SGETDB - SEARCH PASSWORD DIRECTORY SUBROUTINE.               *
*        DL2ICS - TWO TRACK DISK LOGICAL IOCS.                        *
*                                                                     *
*   OTHER                                                             *
*      NONE                                                           *
***********************************************************************
       SPACE 2
*
*                  EQUATES USED IN THIS SUBROUTINE
*
SFINDF EQU   *                         START OF MODULE
       ST    SFISBR,@BR                SAVE @BR
       LA    SFIBSE,@BR                SET LOCAL BASE
       USING SFIBSE,@BR                *
       ST    SFIEXT(,@BR),@ARR         SAVE RETURN ADDR
       ST    SFISXR(,@BR),@XR          SAVE @XR
       LA    $NUCBS,@XR                SET NUCLEUS BASE
       USING $NUCBS,@XR                *
       CLI   SMPSWD-##LPEN+@B1,@BLANK  WAS A PASSWD SPECIFIED ?
       JE    SFI500                    NO, GO CHECK LOGON STATUS
       CLI   SMVOID-$VOLID+@B1,@BLANK  WAS A VOL-ID SPECIFIED ?
       JE    SFI100                    NO, GO CHECK LOGON STATUS
SFI050 B     SVOLID                    RESOLVE SPECIFIED VOL-ID
SFIVOL EQU   SFI050+@Q                 SET TO A NOP FOR SUCCESSIVE USE
       J     SFI350                    GO TO GET DIRECTORY
*
*                  PASSWORD WAS SPECIFIED, BUT VOL-ID WAS NOT
*
SFI100 CLI   SMPSWD-##LPEN+@B1,SFIAST  IS PASSWORD AN '*' ?
       JNE   SFI320                    NO, GO CHK FOR FILE LIBR DADDR
       MVI   SFICTR(,@BR),@ZERO        YES, INITLZ LOOP CTR TO ZERO
       MVI   SFITTC(,@BR),@ZERO        INITLZ THIS TIME COUNTER
       CLI   $FILIB-@B1(,@XR),@ZERO    CURRENT USER IN FORCE ?
       JNE   SFI340                    YES, GO TRY THAT FIRST
       SBN   SMIND1,SM1PNF             SET PASSWORD NOT FOUND INDR.
*
*                  THE FOLLOWING ROUTINE WILL SEARCH ALL DISKS ON THE
*                  SYSTEM FOR THE SPECIFIED ONE OR TWO STAR FILE
*
SFI200 CLI   SFICTR(,@BR),@B1          CHECK THE DISK POINTER
       JL    SFI220                    GO CHECK F1
       JE    SFI230                    GO CHECK F2
       CLI   SFICTR(,@BR),SFIE03
       JL    SFI240                    GO CHECK R1
*
SFI210 CLI   $VOLR2+SFIE06(,@XR),@ZERO  DOES R2 CONTAIN A FILE LIBR
       JE    SFI545                    NO, NO MORE TO CHK, GO RETURN
       MVC   SMBFDA(@DADDR),$VOLR2+SFIE07(,@XR)  SET LIBR DADDR FOR
       MVI   SFICTR(,@BR),SFIEFE       * SEARCH AND INCR DISK POINTER
       J     SFI350                    GO TO SEARCH
*
SFI220 CLI   $VOLF1+SFIE06(,@XR),@ZERO  DOES F1 CONTAIN A FILE LIBR
       JE    SFI230                    NO, GO CHECK F2
       MVC   SMBFDA,$VOLF1+SFIE07(@DADDR,@XR) SET LIBR DADDR FOR SEWN
       MVI   SFICTR(,@BR),@B1         INCR DISK POINTER
       J     SFI350                    SO TO SEARCH
*
SFI230 CLI   $VOLF2+SFIE06(,@XR),@ZERO  DOES F2 CONTAIN A FILE LIBR
       JE    SFI240                    NO, SO CHECK R1
       MVC   SMBFDA,$VOLF2+SFIE07(@DADDR,@XR)  SET LIBR DADDR FOR SEACH
       MVI   SFICTR(,@BR),SFIE02      INCR DISK POINTER
       J     SFI350                    GO TO SEARCH
*
SFI240 CLI   $VOLR1+SFIE06(,@XR),@ZERO  DOES R1 CONTAIN A FILE LIBR
       BE    SFI210(,@BR)              NO, GO CHECK R2
       MVC   SMBFDA,$VOLR1+SFIE07(@DADDR,@XR)  SET LIB DADDR FOR SEARCH
       MVI   SFICTR(,@BR),SFIE03       INCR DISK POINTER
       J     SFI350                    GO TO SEARCH
*
*                  PASSWORD SPECIFIED, BUT VOLUME ID WAS NOT.
*                  CHECK FOR CURRENT USER
*
SFI320 CLI   $FILIB-@B1(,@XR),@ZERO    CURRENT USER SPEC IN FORCE
       JE    SFI505                    NO, GO TO ERR ROUTINE
SFI340 MVC   SMBFDA(@DADDR),$FILIB(,@XR)  YES, SET TO USER LIBR
*
*                  SO SEARCH FOR SPECIFIED PASSWORD
*
SFI350 B     SGETDB                    SEARCH FOR PASSWORD
       TBN   SMIND1,SM1PNF             WAS PASSWORD FOUND
       JT    SFI540                    NO, GO TEST STAR COUNTER
       TBN   SMIND1,SM1PDS             PASSWORD DIRCTY ONLY REQ'SED
       JT    SFI550                    YES, GO RETURN TO USER
       J     SFI520                    NO, GO SEARCH FOR FILENAME
*
*                  ONLY FILENAME SPECIFIED, CHECK FOR CURRENT USER
*
SFI500 CLI   $FILIB-@B1(,@XR),@ZERO    CURRENT USER SPEC IN FORCE
       JNE   SFI510                    YES, BYPASS ERROR MESSAGE
SFI505 MVI   $CAERR(,@XR),@@E200        SET NO CURRENT USER ERROR CODE
       B     SFIERR                    GO TO ERROR RETURN
*
*                  GET FIRST USER DIRECTORY BLOCK
*
SFI510 MVC   DL2RAD,$FILIB(@DADDR,@XR)  SET DL2ICS BASE DADDR
       MVC   SMBFDA,$FILIB(@DADDR,@XR)  SET LIBR DADDR TO COMMON AREA
       MVC   SFIRDA(,@BR),$USRDR(@DADDR,@XR)  SET DL2ICS RELATIVE DADDR
       B     DL2ICS                    GO READ USER DIRECTORY BLOCK
       DC    AL2(SFIDPL)               * CADDR OF DPL
       MVC   SMFUDA,$USRDR(@DADDR,@XR) PRESERVE 1ST BLOCK REL. DADDR
*
*                  SEARCH USER DIRECTORY BLOCK FOR FILENAME
*
SFI520 B     SRCHFN                     GO TO SEARCH ROUTINE
       TBN   SMIND1,SM1FNE              WAS NAME FOUND
       JT    SFI550                     YES, SO RETURN
*
*                  PASSWORD OR FILENAME NOT FOUND
*
SFI540 CLI   SFICTR(,@BR),SFIEFE       ONE OR TWO STAR FILE WITH MORE
       JH    SFI550                    * DISKS TO SEARCH ? NO, GET OUT
SFI542 BC    SFI200(,@BR),@BL          * YES, GO SEARCH
SFISTR EQU   SFI542+@Q                 * NOP FOR 1ST * OR ** SEARCHED
SFI543 JC    SFI545,@UCB               BYPASS TRY CONTROL UNLESS
SFIFND EQU   SFI543+@Q                 * Q-CODE CHANGED TO A NOP
       CLI   SFINTR(,@BR),SFIETD       IS TRY COUNTER AT MAX ?
       JNL   SFI545                    YES, SO SET ERROR CODE
       ALC   SFITTC(,@BR),SFIONE(,@BR)   INCR THIS TRY COUNTER
       CLC   SFITTC(,@BR),SFINTR(1,@BR)  THIS TRY = TRYS REQUIRED ?
       BNE   SFI200(,@BR)              NO, GO TRY THE NEXT DISK
SFI545 MVI   $CAERR(,@XR),@@E213       SET * OR ** NOT FOUND CODE
       SBN   SMIND1,SM1FNE             SET ON FILE NOT FOUND INDR.
*
*                  RETURN TO USER
*
SFI550 LA    *-*,@XR                   RELOAD @XR
SFISXR EQU   SFI550+@OP1               *
SFI560 LA    *-*,@BR                   RELOAD @BR
SFISBR EQU   SFI560+@OP1               *
SFI570 B     *-*                       RETURN TO THE USER
SFIEXT EQU   SFI570+@OP1               *
*
*                  CONSTANTS AND SAVE AREAS
*
SFICTR DS    XL1                       COUNTER USED TO CONTROL THE
       ORG   *-1                       * SEARCH FOR A STAR FILE
       DC    AL1(SFIEFF)               INITLZ'D FOR NO SEARCH
SFIDPL DC    AL1(@DGET)                DPL TO READ USER DIRCTY BLOCK 1
SFIRDA DS    XL2                       * RELATIVE DISK ADDRESS
       DC    XL1'02'                   * SECTOR COUNT
       DC    AL2(SMUDB1)               * CORE BUFFER ADDRESS
SFITTC DS    CL1                       THIS TRY COUNTER
SFINTR DS    CL1                       NUMBER OF TRYS REQUIRED COUNTER
       ORG   SFINTR                    INITLZ NUMBER CF TRYS REQUIRED
       DC    XL1'0'                    * COUNTER TO ZERO
SFIONE DC    XL1'1'                    COUNTER INCREMENT
*
*                  EQUATES
*
SVOERR EQU   SFIERR                    SVOLID ERROR RETURN ADDRESS
SFIAST EQU   C'*'                      STAR LIBR TEST CHARACTER
SFIE02 EQU   X'02'                     STAR COUNTER TEST R1 CODE
SFIE03 EQU   X'03'                     STAR COUNTER TEST R2 CODE
SFIEFE EQU   X'FE'                     STAR COUNTER COMPLETE CODE
SFIEFF EQU   X'FF'                     NOT A * OR ** FILE COUNTER CODE
SFIE06 EQU   X'06'                     DISP TO LIBR DADDR BYTE 0
SFIE07 EQU   X'07'                     DISP TO LIBR DADDR BYTE 1
SFIBSE EQU   SFI200                    LOCAL BASE ADDRESS
SFIEND EQU   *-1                       LAST BYTE OF SFINDF
SFIETD EQU   6                         MAX TRY REQUIRED COUNTER VALUE
       DROP  @BR
       DROP  @XR
***                       END OF SFINDF                            ***
       MEND
// CEND
// END
*
// READER CONSOLE
