mac-rom/OS/HFS/MFSDIR3.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

369 lines
14 KiB
Plaintext

;
; File: MFSDIR3.a
;
; Contains: This file contains routines using file names to specify file.
;
; Copyright: © 1982-1991 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <2> 9/12/91 JSM Add a header.
; <1.1> 11/10/88 CCH Fixed Header.
; <1.0> 11/9/88 CCH Adding to EASE.
; <1.0> 2/11/88 BBM Adding file for the first time into EASEÉ
; 9/24/86 BB Updated to use new MPW equates.
; 11/1/85 PWD Fixed bug in GetCatInfo for MFS volume (MOVE.L vs. MOVE.W)
; 10/20/85 LAK Flush control cache on exit of SetMFlType, SetMFlInfo,
; ChgMFlLock.
; 10/16/85 PWD Fixed SetFilTyp bug (used FilTyp instead of FlTyp).
; 10/1/85 LAK Adjusted for MFS use of TFS cache.
; 9/25/85 PWD Fixed bug in 'GetCatInfo' lookalike code in GetFileInfo (cleared
; 32 bytes)
; 9/6/85 LAK Courtesy clear of IORefNum before calling CkFileBusy for
; GetFileInfo.
; 5/1/85 PWD Changed GetMFlInfo to clear ioDirFlg bit in ioFlAttrib field.
; 3/13/85 PWD Split off from SetFilTyp.
; 2/28/85 PWD Split off from FSDir3, leaving only MFS-specific code.
; 9/1/83 LAK Changed BPL to BCC in file name transfer to support file names >
; 127 chars in GetFileInfo.
; 8/31/83 LAK Changed GetFileInfo to return current file info for opened files
; (from FCB information).
; 6/6/83 LAK Added changes to support ext fs, offline volumes.
; 5/25/83 LAK Adapted FndFilNam to new CmpString interface.
; 1/16/83 LAK Final pass changes . . . added SetFilLock,RstFilLock,SetFilType.
; 12/14/82 LAK Undelete removal changes
; 12/13/82 LAK Reworked all files for new file system data structures.
; 1/12/82 LAK Made string compare proc an OS call; code is in IOCore.
;
;_______________________________________________________________________
;
; External Routines: GetMFSFlInfo,SetMFlInfo
;
; Internal Routines: FindMFSFile
;
;_______________________________________________________________________
;_______________________________________________________________________
;
; Routine: SetMFlType
; Arguments: A0.L (input) -- I/O Parameter block for call
; A1.L (input) -- pointer to vol. buffer(from FndFilNam)
; A2.L (input) -- VCB ptr
; D0.W (output) -- error code
; A5.L (output) -- ptr to dir. entry (from FndFilNam)
; Clobbers:
; Preserves:
; Called By: SetFilType
; Function: SetMflInfo sets the file type for MFS files in the directory
; block pointed to by A1, at the entry pointed to by A5.
;
; Modification history:
; 13-Mar-85 PWD Split off from SetFilTyp.
;_______________________________________________________________________
BLANKS ON
STRING ASIS
SetMFlType MOVE.B IONewType(A0),FlTyp(A5) ; Ring in the new <PWD 16Oct85>
BRA.S SRMFXit1 ; And leave, clearing D0
; (Marks vol. buffer block dirty)
;_______________________________________________________________________
;
; Routine: ChgMFlLock
;
; (c) 1983 Apple Computer, Inc.
;
; Arguments: A0.L (input) -- pointer to I/O parameter block, uses
; IOFileName,IOFileType,IODrvNum
; D0.W (output) -- 0 if file was found and set correctly.
; Calls:
; Called by: SetFilLock/ResFilLock
; Function: Set or reset the file lock bit for MFS files.
;
; Modification History:
; 16 Jan 83 LAK New today.
; 06 Jun 83 LAK Broke out CkFilMod as a subroutine.
; 13 Mar 85 PWD Split off from main entry (Set/Rst FilLock)
;
; Note: if the file is locked after it has already been opened with write
; permission, the lock will not affect that opened file. If the lock bit
; is not changed by this command, the directory buffer is not marked dirty
; (allows quick lock/unlocking of a group of file, regardless of their current
; status).
;_______________________________________________________________________
ChgMFlLock TST.B FLckUnlck
BEQ.S @1 ; br if we want to unlock it
BSET #FlWrtFlag,FlFlags(A5) ; lock it
BNE.S SRMFXit2 ; br if already locked
BRA.S SRMFXit1 ; otherwise, it's been modified
@1 BCLR #FlWrtFlag,FlFlags(A5) ; unlock it
BEQ.S SRMFXit2 ; br if already unlocked
SRMFXit1 MOVE.L A1,A0 ; (also setfilinfo exit) <01Oct85>
JSR MarkBlock ; mark buffer modified <01Oct85>
BSR MFSCtlFlush ; flush control cache if it's too full <20Oct85>
SRMFXit2 MOVEQ #0,D0
SRMFXit3 BRA CmdDone
;_______________________________________________________________________
;
; Routine: SetMFlInfo
;
; (c) 1983 Apple Computer, Inc.
;
; Arguments: A0.L (input) -- pointer to File Info I/O parameter block, uses
; IOFileName,IOFlAttrib,IOFlUsrWds
; D0.W (output) -- 0 if entry was found, error code otherwise
; File's entry is modified to reflect changes
; Calls: FndFilNam
; Function: Sets the user-definable fields in a file's directory entry.
; The caller specifies the filename and type, and the eight
; user-defined words. The file lock bit does not inhibit this
; command.
;
; Modification History:
; 13 Dec 82 LAK Modified for new file system data structures.
; 17 Jan 83 LAK Latest changes: no longer used to change lock, type fields;
; there are now 16 user-defined bytes.
; 06 Jun 83 LAK Adapted to new offline, ext fs problems. Uses CkFilMod
; and SRFLXit1 to save code.
; 09 Jul 84 GSS Patched to write out creation and modification date info
; 13 Mar 85 PWD Separated MFS-specific code out from FSDir3
;_______________________________________________________________________
SetMFlInfo
MOVEM.L IOFlUsrWds(A0),D1-D4 ; get 16 user words
MOVEM.L D1-D4,FlUsrWds(A5) ; transfer 16 user-defined bytes
MOVEM.L IOFlCrDat(A0),D1-D2 ; get IOFlCrDat, IOFlMdDat
MOVEM.L D1-D2,FlCrDat(A5) ; and store in FlCrDat, FlMdDat
BRA.S SRMFXit1 ; exit ok, marking buffer modified
;_______________________________________________________________________
;
; Routine: FndMFSFile,FndMFSFN2
;
; (c) 1983 Apple Computer, Inc.
;
; Arguments: A0.L (input) -- pointer to I/O parameter block, uses:
; IOFileName,IOFileType,IODrvNum
; D0.W (output) -- 0 if file was found, error code otherwise.
; D2.W (output) -- name length excluding any volume prefix
; A1.L (output) -- points to volume buffer (if name found)
; A2.L (output) -- pointer to appropriate VCB
; A4.L (output) -- pointer to input file name. If a volume was
; specified will point to the colon, thereby
; always pointing one byte ahead of the true
; file name.
; A5.L (output) -- pointer to file directory entry in buffer.
; Preserves: D1,D5,A0
; Clobbers: all other registers (D3,D4,D6,D7,A3,A6)
; Note that the routine will return to one level above
; caller during the asynchronous reads.
; FndFN2 entry point for Rename (alternate volume may be used)
; Calls: MyReadDB(via Rd1stDB and RdNxtDB)
; Called By: Create,Delete,FileOpen,Rename,GetFileInfo,SetFileInfo
; Function: Locate a filename within the directory on a diskette
; Search algorithm: if dir blk there, search it first;
; if not found, start from beginning, skipping searched blk.
;
; Modification History:
; 08 Dec 82 LAK Added FndFilNam entry point.
; 13 Dec 82 LAK Rewrote. Removed index search mode.
; 14 Dec 82 LAK Removed check for delete file.
; 17 Jan 83 LAK Changes for last data structure mods: now checks for both
; filename and filetype match.
; 05 Jun 83 LAK Added checks for offline volume, external file system vols
; 28 Sep 84 GSS Inserted patch for setting ReqstVol in ExtOffLinCk
; (from CDHook in MSFileFix)
; 28-Feb-85 PWD Split off from FndFilName to just handle only MFS volumes.
; 20-Sep-85 PWD Added explicit check for zero-length files before launching
; into search (used to be checked by FndFilNam already)
;_______________________________________________________________________
FndMFSFile MOVE.L (SP)+,A3 ; get the caller's addr
TST.B D2 ; Check file name length - <20Sep85>
BNE.S @1 ; If >0, it's OK <20Sep85>
MOVEQ #BdNamErr,D0 ; Otherwise, complain <20Sep85>
BRA.S MFFNExit ; <20Sep85>
@1 MOVE.W VCBNmFls(A2),D7 ; number of files on this volume
BEQ.S MFNFound ; if none, can't find this one.
BSR MFSRd1stDB ; go for the first one <01Oct85>
mfFNLoop BEQ.S scn4MNam ; br if ok
CMP.W #DirFulErr,D0 ; reached end of directory?
BNE.S mfFNExit ; then file not found
mfNFound MOVEQ #FNFErr,D0 ; file not found!
BRA.S mfFNExit
; have a block at (A5) - look for the file in this dir block
scn4MNam MOVEQ #0,D0 ; clear for index
MOVE.L A4,A1 ; requested string
@1 MOVE.W D0,D4 ; save D0
TST.B FlFlags(A5,D4) ; flags=0 means end of entries this blk
BEQ.S @3 ; br if no more entries this block
MOVE.B FlTyp(A5,D4),D6 ; check for type match
CMP.B IOFileType(A0),D6 ;
BNE.S @2 ; br if no match
MOVE.L A0,-(SP) ; preserve A0
LEA FlNam(A5,D4),A0 ; directory string
MOVEQ #0,D0
MOVE.B (A0)+,D0 ; first string length
SWAP D0
MOVE.W D2,D0 ; second string length
_CmpString ; do they match?
MOVE.L (SP)+,A0
BEQ.S @4 ; br if so
@2 SUBQ.W #1,D7 ; decr # files we checked
BEQ.S MFNFound ; exit if we checked them all . . .
MOVE.W D4,D0 ; restore D0
BSR GtNxEntry ; (A5,D0) point to next entry, D6 trashed
BCS.S @1 ; br if not finished with this block
@3 BSR MFSRdNxtDB ; read next directory block <01Oct85>
BRA.S MFFNLoop
; we have our man . . .
@4 MOVE.L A5,A1 ; A1 = buffer pointer
LEA 0(A5,D4),A5 ; A5 = entry ptr, D0 = 0 here
mfFNExit JMP (A3)
;_______________________________________________________________________
;
; Routine: GetMFlInfo
;
; (c) 1983 Apple Computer, Inc.
;
; Arguments: A0.L (input) -- pointer to File Info I/O parameter block, uses
; all fields?
; D0.W (output) -- 0 if info was found, error code otherwise
; Calls: FndFilNam(if searching by name)
; Function: Get information about a specific file from the file directory.
; User can specify search by either filename or by index,
; where the index specifies the file's offset from the beginning
; of the directory.
;
; An index of zero means search by filename and type.
;
; Modification History:
; 10 Dec 82 LAK Modified for new file system data structures.
; 13 Dec 82 LAK Removed delete file support.
; 17 Jan 83 LAK Another passover.
; 06 Jun 83 LAK Added changes to detect offline volumes, ext fs calls.
; 01 Sep 83 LAK Changed BPL to BCC in file name transfer to support file
; names > 127 chars.
; 10 Mar 85 PWD Changed to search catalog for TFS volumes
; 25-Sep-85 PWD Fixed bug in 'GetCatInfo' lookalike code (cleared 32 bytes)
; <27Oct85> PWD Changed to re-join TFS code for FCB scan
; <01Nov85> PWD Fixed bug in GetCatInfo for MFS volume (MOVE.L vs. MOVE.W)
;_______________________________________________________________________
GtMFlIBI CMP.W VCBNmFls(A2),D1 ; requesting an index larger than exists?
BHI.S GMFINFErr ; return file not found error?
; we are searching by index here: it's a bit tricky since we want to try
; to continue where we left off, if possible . . .
MOVE.W VCBBlLn(A2),D5 ; len in blocks of dir
MOVE.W VCBDirSt(A2),D3 ; assume start from the beginning
ADD.W D3,D5 ; max blk num + 1
MOVE.W VCBDirIndex(A2),D7 ; useful file index, blk number pair
BEQ.S @0 ; br if set back to zero
CMP.W D7,D1 ; is our index >= this?
BCS.S @0 ; br if not . . .
MOVE.W VCBDirBlk(A2),D3 ; block number for this index
BRA.S @1
@0 MOVEQ #1,D7 ; index of first file this block
; at this point, D7=index of first file in current block
; D3=current block
; D5=max blk number + 1
; D1=requested index
@1 CMP.W D5,D3 ; have we reached max yet?
BCC.S GMFINFErr ; br if so
MOVE.W D3,VCBDirBlk(A2) ; form index,block pair to help next
MOVE.W D7,VCBDirIndex(A2) ; GetFileInfo indexed search
BSR MFSDirRead ; get the block <01Oct85>
BNE.S GMFINFErr
MOVEQ #0,D0 ; index into block
@2 MOVEQ #0,D6
TST.B FlFlags(A5,D0) ; valid entry?
BEQ.S @3 ; br if no more entries
CMP.W D7,D1 ; is it the requested one?
BEQ.S GotMIndFile
ADDQ.W #1,D7 ; increment file index
BSR GtNxEntry
BCS.S @2 ; br if haven't reached end of block
@3 ADDQ.W #1,D3 ; try next block
BRA.S @1
GMFINFErr MOVEQ #FNFErr,D0 ; file not found . . . hmmmm
GMFIExit BRA CmdDone
GotMIndFile LEA 0(A5,D0),A5 ; get pointer to entry . . .
; searched by index, so return the name . . .
LEA FlNam(A5),A3 ; file entry name ptr
MOVE.L IOFileName(A0),D0 ; parameter block filename ptr
BEQ.S XferMFInfo ; skip it if it's zero
MOVE.L D0,A4
MOVE.B (A3),D0 ; name length
@1 MOVE.B (A3)+,(A4)+ ; name length, then name, byte by byte
SUBQ.B #1,D0
BCC.S @1
; The TFS trap entry point enters here for MFS volumes not searched by directory
; index, immediately following a call to FndFilNam:
GetMFlInfo
XferMFInfo
LEA IOFlAttrib(A0),A4 ; info destination
MOVEQ #(IOFQElSize-IOFlAttrib)/2-1,D0 ; number of words to copy - 1
LEA FlFlags(A5),A3 ; start of regular info to transfer
@1 MOVE.W (A3)+,(A4)+ ; move byte by byte
DBRA D0,@1
; Clear the directory flag for file information:
BCLR #ioDirFlg,ioFlAttrib(A0) ; 0 = file info returned
; Pure hack (=cut for code space):
; Make some of the additional TFS fields non-garbage, even for MFS:
BTST #HFSReq,HFSFlags ; Is this really a _GetCatInfo request?
BEQ.S @3 ; Nah, don't be silly...
MOVE.L #FSRtDirID,ioFlParID(A0) ; 'Parent directory' is root... <01Nov85>
CLR.L ioFlBkDat(A0) ; Never been backed up...
MOVE.L A0,-(SP) ; Create a scratch register
LEA ioFlxFndrInfo(A0),A0 ; Point to finder info <24Sep86>
MOVEQ #3,D0 ; Set up to clear 3+1 longwords <25Sep85>
@2 CLR.L (A0)+ ; Zero finder info bytes
DBRA D0,@2 ;
MOVE.L (SP)+,A0 ; Restore 'scratch' register
@3 BRA CkFilStatus ; Re-join TFS code for FCB scan <27Oct85>