Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site ucbvax.BERKELEY.EDU Path: utzoo!decvax!bellcore!ulysses!ucbvax!SDSC.BITNET!GKN From: GKN@SDSC.BITNET (Gerard K. Newman) Newsgroups: mod.computers.vax Subject: [oops!] more about directory files (with promised code) Message-ID: <8606140657.AA13683@ucbvax.Berkeley.EDU> Date: Sat, 14-Jun-86 02:57:42 EDT Article-I.D.: ucbvax.8606140657.AA13683 Posted: Sat Jun 14 02:57:42 1986 Date-Received: Sat, 14-Jun-86 16:36:39 EDT Sender: daemon@ucbvax.BERKELEY.EDU Organization: The ARPA Internet Lines: 122 Approved: info-vax@sri-kl.arpa [That last one got away from me a little too soon. Let's try again.] From: Ed Subject: how to distinguish/create directory files with RMS ?? Date: 10 Jun 86 14:43:09 EDT (Tuesday) I assume that I am missing something very basic, but after pouring through RMS manuals, I still don't have an answer. Can I determine that a file is a directory file or not simply by looking at some field in the fab/rab/xab/nam structures ?? Conversely, can I create a directory file simply by setting a bit in the same field (as opposed to using LIB$CREATE_DIR) ?? You're not missing anything; the "I am a directory" bit isn't available in any of the standard RMS data structures. I found this out rather rudely here recently when someone (not me) did a Set File/NoDirectory on our main software directory, and then discovered that there is no Set File/Directory command. What you have to do is to issue a read attributes QIO against the file. Take the FID from the NAM block, stick it in a short-form FIB, and request the ATR$C_UCHAR attributes in the attribute control list. Bit FCH$M_DIRECTORY indicates if the file is a directory or not. Here is a simple program which will open a file and say "It is" or "It isn't" a directory. Define the logical name IN_FILE to point to the file you're interested in (it's a quick-and-very-dirty program, but it works). gkn --------------------------------------- Arpa: GKN%SDSC.BITNET@WISCVM.WISC.EDU USPS: Gerard K. Newman San Diego Supercomputer Center P.O. Box 85608 San Diego, CA 92138 AT&T: (619) 455-5076 ------------------------------------cut here------------------------------------ .Title DirTest - See if a file is a directory .Ident /01.000/ .Default Displacement,Word .Library "SYS$LIBRARY:LIB.MLB" ;Get $FCHDEF from here .NoCross $IODEF ;Define I/O function codes $RMSDEF ;Define RMS status codes $SSDEF ;Define system service codes $FIBDEF ;Define File Information Block offsets $FCHDEF ;Define file characteristics bits $ATRDEF ;Define file attributes .Cross .Psect DATA NOEXE,RD,WRT,PIC,NOSHR,PAGE ; FAB to open the file FAB: $FAB FNM=,- ;FAB for the input file FOP=,- ;Just open the file for me. NAM=NAM ;Need a name block NAM: $NAM ;Here it is ; FIB descriptor and FIB FIB_DESC: .Long FIB_END-FIB ;Length of the FIB .Address FIB ;Address of the FIB FIB: .Long 0 ;FIB$L_ACCTL and FIB$B_WSIZE FID: .Blkw 3 ;FIB$W_FID: File ID DID: .Blkw 3 ;FIB$W_DID: Directory ID .Blkl ;FIB$L_WCC: Wildcard context .Word FIB$M_FINDFID ;FIB$W_NMCTL: File name control bits FIB_END: ;Mark the end of the FIB ; Attribute descriptor list ATTR_LIST: .Word ATR$S_UCHAR,ATR$C_UCHAR ;4 byte file characteristics .Address UCHAR ;Put 'em here .Long 0 ;That's all UCHAR: .Blkl ;Will receive the file attributes IOSB: .Blkq ;I/O status for IO$_ACCESS IS: .Ascid "File is a directory file" ISNT: .Ascid "File is not a directory file" .Psect CODE EXE,RD,NOWRT,PIC,SHR,PAGE .Entry START,0 $OPEN FAB=FAB ;Open the file BLBC R0,20$ ;Oh well. ; Copy the FID and DID into the FIB (how's that for alphabet soup?) MOVL NAM+NAM$W_FID,FID ;Copy the MOVW NAM+NAM$W_FID+4,FID+4 ; FID MOVL NAM+NAM$W_DID,DID ;Copy the MOVW NAM+NAM$W_DID+4,DID+4 ; DID MOVAL ATTR_LIST,R1 ;Address the attribute control list $QIOW_S CHAN=FAB+FAB$L_STV,- ;Do some I/O on this channel FUNC=#IO$_ACCESS,- ;Access the file IOSB=IOSB,- ;I/O status here P1=FIB_DESC,- ;Here's the FIB P5=R1 ;Return these attributes MOVZWL IOSB,R0 ;Get the status from the XQP BLBC R0,20$ ;Eeek! MOVAQ ISNT,R0 ;Presume it's not a directory BBC #FCH$V_DIRECTORY,UCHAR,10$ ;Branch if we were correct MOVAQ IS,R0 ;Else it is. 10$: PUSHL R0 ;Stack the message descriptor address CALLS #1,G^LIB$PUT_OUTPUT ;Display a message 20$: RET ;Back to DCL (cleanup done by rundown) .End START