Google
 

Trailing-Edge - PDP-10 Archives - BB-F493Z-DD_1986 - 10,7/fildae.mac
There are 7 other files named fildae.mac in the archive. Click here to see a list.
	TITLE	FILDAE - TELL FILSER HIGHEST ACCESS ALLOWED TO A FILE
	SUBTTL	J.M.FLEMMING/JMF/GMU	12-AUG-85
	SEARCH	MACTEN,UUOSYM,SCNMAC
	.REQUEST	REL:SCAN



;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976,1978,1979,1980,1981,1982,1984,1986.
;ALL RIGHTS RESERVED.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.

VFILDAE==4			;VERSION NUMBER
VWHO==0				;WHO EDITED LAST
VMINOR==0			;MINOR VERSION NUMBER
VEDIT==44			;EDIT NUMBER


COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976,1986. ALL RIGHTS RESERVED.
\;END COPYRIGHT MACRO




;
;EDIT 21	6-17-78	ISM	FORCE IN BEHALF OF FILOP TO FAIL,
;EVEN IF JOB IS [1,2] OR JACCT'ED.
;
;EDIT 35	15-JAN-81 RKB  SPR #10-30384
;	DON'T DO THE CORE UUO TO CONTRACT CORE AT FILD10 +2.  IT
;	WASTES MORE RUNTIME THAN IT'S WORTH.
;EDIT 40	9-6-83 SMW
;	A MALICIOUS USER CAN ^C OUT OF FILDAE BY CREATING A LARGE
;	ACCESS.USR. IT TAKES FILDAE A LONG TIME TO READ IT.
;	MAKE THE WINDOW SMALLER BY NOT ALLOWING LARGE ACCESS.USR FILES,
;	THE USER IS OBVIOUSLY TRYING TO BE MALICIOUS.
;EDIT 41	8-NOV-83 ERS
;	MAKE THE OWNER OF AN UFD BE ANY OWNER, NOT JUST THE PPN ITSELF.
;EDIT 42	25-MAR-84 ERS
;	LET ONLY THE /CREATE SWITCH GIVE PERMISSION TO CREATE A FILE.
;EDIT 43	12-AUG-85 LEO
;	MAKE COPYRIGHT CHANGES.
;EDIT 44	24-DEC--85 RCB
;	FIX UP FOR CTXSER--ADD HANDLING FOR PUSH AND POP MESSAGES.
;	BECOME VERSION 4.
;
.JBVER==137

	LOC	.JBVER		;PUT VERSION NUMBER IN .JBVER
	BYTE	(3)VWHO(9)VFILDAE(6)VMINOR(18)VEDIT
	RELOC
	SALL
	SUBTTL	DEFINITIONS

;ACCUMULATOR ASSIGNMENTS
T1=1				;TEMPORARY ACCUMULATORS
T2=2				; ..
T3=3				; ..
T4=4				; ..
P1=5				;PRESERVED ACCUMULATORS
P2=6				; ..
P3=7				; ..
P4=10				; ..
J=11				;JOB NUMBER OF FILE ACCESSOR
D=12				;PPN OF FILE ACCESSOR
C=13				;CODE FROM FILSER INDICATING MESSAGE TYPE
M=16				;ADDRESS OF THE IPCF MESSAGE
P=17				;PUSH DOWN LIST POINTER

;ERROR
DEFINE ERROR	<HALT	.>
;I/O CHANNEL ASSIGNMENTS
DSK==1

;LENGTH OF THE PUSH-DOWN LIST
PDLL==400

;LOCATIONS IN THE IPCF MESSAGE
M.CODE==0			;HIGHEST ACCESS ATTEMPTED,,REASON FILE DAEMON WAS CALLED
M.STR==1			;FILE STR WHERE FILE BEING ACCESSED WAS FOUND
M.FILE==2			;NAME OF THE FILE BEING ACCESSED
M.EXT==3			;EXTENSION OF THE FILE BEING ACCESSED
M.PPN==4			;DIRECTORY OF THE FILE BEING ACCESSED
M.PATH==5			;PATH TO THE FIE WITHIN THE DIRECTORY

;HIGHEST FUNCTION ALLOWED
FNCCPR==15			;CHANGE PROTECTION
FNCCNM==14			;CHANGE NAME
FNCDEL==13			;DELETE
FNCCAT==12			;CHANGE ATTRIBUTES
FNCTRN==11			;TRUNCATE
FNCSUP==10			;SUPERSEDE
FNCCRE==7			;CREATE
FNCUPD==6			;UPDATE
FNCAPP==5			;APPEND
FNCDLL==4			;DEALLOCATE
FNCALL==3			;ALLOCATE
FNCRED==2			;READ
FNCEXE==1			;EXECUTE
FNCNAA==0			;NO ACCESS ALLOWED

;LENGTH OF AN ACCOUNT STRING
ACTLEN==^D8

;DEFINE A DUMMY HELPER SO THAT WE DON'T HAVE TO LOAD WITH IT
.HELPR==:.POPJ##

;INTERNAL CODE (NEGATIVE INDEX INTO ACTION TABLE)
.FLDSC==0		;PROGRAM BEING SAVED(CREATE) AS OPPOSED TO EXECUTED
.FLDSS==-1		;PROGRAM BEING SAVED(SUPERCEDES)

	IFNDEF	BIGSIZ,<BIGSIZ==^D10>	;SIZE OF LARGEST ACCESS.USR ALLOWED
	SUBTTL	SCAN INTERFACE MACROS

DEFINE SWTCHS,<
XLIST
SS RUN,RUNSWT,0			;DON'T ALLOW SCAN'S BUILT IN RUN SWITCH
SS TMPFIL,TMPSWT,0		;  OR SCAN'S TMPFIL SWITCH
SP ACCOUNT,FACCT,ACCTSW,,FS.VRQ	;ALLOW ACCESS ONLY BY SPECIFIED ACCOUNT STRING
SS CREATE,FCREAT,0,FS.NOS	;ALLOW CREATE IN A DIRECTORY PROTECTED AGAINST CREATE
SL LOG,FLOG,LOGS,LOGSAL		;LOG ACCESS TO THE FILE
SS NOLOG,FLOG,0,0		;DON'T LOG ACCESS TO THE FILE (FOR COMPATABILITY)
SS EXIT,FEXIT,0,FS.NOS		;IF LOGGING, LOG EXIT IF A PROGRAM IS BEING RUN
SS CLOSE,FCLOSE,0,FS.NOS	;IF LOGGING, LOG CLOSE OF A FILE
SS ALL,FSWICH,FNCCPR		;ALL ACCESS ALLOWED
SS RENAME,FSWICH,FNCDEL		;RENAME ALLOWED
SS WRITE,FSWICH,FNCSUP		;WRITE (SUPERSEDE) ALLOWED
SS UPDATE,FSWICH,FNCUPD		;UPDATE ALLOWED
SS APPEND,FSWICH,FNCAPP		;APPEND ALLOWED
SS READ,FSWICH,FNCRED		;READ ALLOWED
SS EXECUTE,FSWICH,FNCEXE	;EXECUTION ALLOWED
SP NAME,FNAME,NAMESW,,FS.VRQ	;ALLOW ACCESS ONLY BY SPECIFIED USER NAME
SS NONE,FSWICH,FNCNAA		;NO ACCESS ALLOWED
SS XONLY,FXONLY,0,FS.NOS	;ONLY GRANT PROGRAM ACCESS IF IT IS EXUCUTE ONLY
SP PROGRAM,FPRGM,.SWFIL##,PRO,FS.VRQ
LIST
>

KEYS	(LOGS,<ALL,NONE,SUCCESSES,FAILURES>)

MX.PRO==.FXLEN
PD.PRO==0
DEFINE FNC(TEXT)<
	[ASCIZ	/TEXT/]>

;TABLE OF HIGHEST ACCESS ATTEMPTED BY ACCESSOR
; USED TO LOG HIGHEST ACCESS ATTEMPTED IN ACCESS.LOG
ACCESS:	FNC	<Execute>
	FNC	<Read>
	FNC	<Allocate>
	FNC	<Deallocate>
	FNC	<Append>
	FNC	<Update>
	FNC	<Create>
	FNC	<Supersede>
	FNC	<Truncate>
	FNC	<Change Attributes>
	FNC	<Delete>
	FNC	<Change Name>
	FNC	<Change Protection>
	FNC	<Save(supersede)>
	FNC	<Save(create)>
	0
ACTION:	FNC	<Input Close>
	FNC	<Output Close>
	FNC	<Program Execution Terminated>
	FNC	<Execution>
	0			;DIRECTORY ACCESS ENTRY NOT REFERENCED
	FNC	<Program Suspended>
	FNC	<Program Resumed>


DOSCAN	(S)			;DEFINE SCAN TABLES
	SUBTTL	MAIN LOOP

FILDAE:	RESET			;RESET THE WORLD
	MOVE	P,[-PDLL,,PDL]	;SETUP A PUSH DOWN LIST POINTER
	PUSHJ	P,FDINIT	;INITIALIZE THE FILE DAEMON
	MOVE	T1,.JBFF	;FIRST FREE LOCATION
	MOVEM	T1,SAVFF	;SAVE THAT TO REINITIALIZE SIZE
	MOVX	T1,%LDFFA	;FULL FILE ACCESS PPN
	GETTAB	T1,		;GET THAT
	  ERROR			;MUST BE IMPLEMENTED
	MOVEM	T1,FFAPPN	;SAVE FULL FILE ACCESS PPN
	OUTSTR	[ASCIZ /DETACHING
./]				;TELL THE WORLD
	SETO	T1,		;OUR TTY
	GETLCH	T1		;GET ITS LINE NUMBER
	HRLZS	T1		;LINE NUMBER,,DETACH
	ATTACH	T1,		;DETATCH FROM THE TERMINAL
	  JFCL			;OH WELL
FILDA1:	MOVE	P,[-PDLL,,PDL]	;SCAN DOESN'T ALWAYS RETURN WITH THE STACK RIGHT
	MOVEI	T1,.POPJ##	;SET TO THROW OUTPUT FROM SCAN AWAY
	MOVEM	T1,TYO		;WHERE SCAN GOES TO TYPE OUT CHARACTERS
	PUSHJ	P,FDRECV	;GET AN IPCF MESSAGE FROM FILSER
	MOVEI	T1,.RBAUT	;GET DATA FROM THE RIB THROUGH THE AUTHOR
	MOVEM	T1,LEB.BL	;STORE THAT
	MOVE	T1,[FO.PRV+.FORED(DSK)]
	MOVEM	T1,FOP.BL	;READ INVOKING PRIVILEDGES
	MOVE	T1,M.STR(M)	;FILE STRUCTURE
	MOVEM	T1,FOP.DV	;STORE THAT FOR OPEN PART OF FILOP.
	MOVEM	T1,ACS.WB+.DCNAM	; AND FOR DSKCHR LATER IF NEEDED
	MOVE	T1,[SIXBIT /ACCESS/]
	MOVEM	T1,LEB.FL	;FILE NAME OF THE ACCESS LIST
	MOVSI	T1,(SIXBIT /USR/)
	MOVEM	T1,LEB.XT	;EXTENSION OF THE ACCESS LIST
	SETZM	FOP.BH		;NO BUFFERS ARE NEEDED
	SETZM	FOP.NB		; ..
	SETZM	LEB.AW		;ZERO THE ATTRIBUTES WORD
	MOVEI	T1,LEB.PB	;ADDRESS OF THE PATH BLOCK
	MOVEM	T1,LEB.PT	;STORE THAT
	HLRZ	T2,M.EXT(M)	;FILE OR DIRECTORY EXTENSION
	CAIE	C,.FLDDA	;A DIRECTORY ACCESS?
	MOVEI	T2,0		;NO, TREAT IT AS A FILE EVEN IF THE
				; EXTENSION IS SFD OR UFD
	MOVE	T1,M.PPN(M)	;FILE'S DIRECTORY
	CAIN	T2,'UFD'	;IS THE FILE A DIRECTORY?
	MOVE	T1,M.FILE(M)	;YES, FILE NAME IS PPN
	MOVEM	T1,LEB.PP	;STORE PPN
	MOVEI	T1,M.PATH(M)	;ADDRESS OF THE PATH IN THE MESSAGE
	MOVE	T4,[LEB.SF,,LEB.SF+1]
	SETZB	T3,LEB.SF	;ZERO THE PATH BLOCK
	BLT	T4,LEB.SF+4	; ..
FILDA2:	SKIPN	T4,(T1)		;GET NEXT SFD FROM MESSAGE
	JRST	FILDA3		;THE LAST ONE
	MOVEM	T4,LEB.SF(T3)	;STORE SFD IN LOOKUP BLOCK
	ADDI	T1,1		;POINT AT NEXT SFD
	AOJA	T3,FILDA2	;NEXT PATH ELEMENT
FILDA3:	MOVE	T1,M.FILE(M)	;FILE NAME
	CAIN	T2,'SFD'	;READING AN SFD AS A FILE?
	MOVEM	T1,LEB.SF(T3)	;YES, STORE FILE NAME AS LAST ELEMENT OF THE PATH
	MOVE	T1,[7,,FOP.BL]	;LOOKUP ACCESS.USR AND GET THE ACTUAL PATH
	FILOP.	T1,		; WHERE IT WAS FOUND
	  JRST	[JUMPE T1,FILD30;JUMP IF FILE NOT FOUND
		JRST FILD31]	;ALLOW NO ACCESS TO THE FILE
	MOVE	T1,LEB.SZ	;SIZE OF ACCESS.USR
	CAILE	T1,BIGSIZ*200	;DON'T ALLOW LARGE ACCESS.USR
	JRST	FILD30		;PRETEND THERE WAS NO ACCESS.USR AT ALL
 	MOVE	T2,LEB.PP	;PPN OF THE FILE
	CAMN	T2,LEB.AT	;SAME AS THE AUTHOR?
	  JRST	FILDA4		;YES, SCAN ACCESS.USR
	MOVE	T1,[.ACCPR,,<777>B26+<077>B35] ;NO, THEN SETUP FOR CHKACC
	MOVE	T3,LEB.AT	;AUTHOR OF ACCESS.USR
	MOVEI	T4,T1     	;CHECK TO SEE IF THE AUTHOR OF THE ACCESS.USR
	CHKACC	T4,		;IS THE OWNER OF THE FILE
	  CAIA			;SHOULD NEVER HAPPEN
	CAIE	T4,0		;IS HE?
	  CAMN	T3,FFAPPN	;NO, FULL FILE ACCESS PPN?
	JRST	FILDA4		;YES, SCAN ACCESS.USR
	MOVE	T1,[.DCOWN+1,,ACS.WB]
	DSKCHR	T1,		;GET THE OWNER OF THE FILE STRUCTURE
	  ERROR			;SHOULDN'T HAPPEN
	SKIPN	T1,ACS.WB+.DCOWN;PPN OF THE OWNER OF THE PACK
	JRST	FILD30		;NONE THERE, IGNORE ACCESS.USR
	TLC	T1,-1		;WILD CARD PROJECT NUMBER?
	TLCN	T1,-1
	HLL	T1,LEB.AT	;YES, THIS PROJECT MATCHES
	TRC	T1,-1		;WILD CARD PROGRAMMER NUMBER?
	TRCN	T1,-1
	HRR	T1,LEB.AT	;YES, THIS PROGRAMMER NUMBER MATCHS THAT
	CAME	T1,LEB.AT	;IS AUTHOR THE OWNER OF THE STR?
	JRST	FILD30		;NO, TREAT IT THE SAME AS IF THERE WAS NO ACCESS.USR
FILDA4:	CAIN	C,.FLDDA	;DIRECTORY ACCESS?
	JRST	FILDA5		;YES
	SETOM	IPS.DT+.IPCS1	;MAKE SURE ACCOUNTING LINE IS OUTPUT TO
				; THE LOG FILE IF EXIT OR CLOSE
	CAILE	C,.FLDCA	;FILE ACCESS?
	CAIN	C,.FLDPG	;OR RUNNING A PROGRAM?
FILDA5:	TDZA	T1,T1		;YES, SEE IF ACCESS IS ALLOWED
	JRST	FILD36		;NO, MUST BE CLOSE OR PROGRAM EXECUTION TERMINATED
				; JUST GO MAKE A LOG ENTRY
	SETZB	T2,PATHMM	;ASSUME ACCESS.USR WAS FOUND ON THE SAME
				; PATH AS THE FILE BEING ACCESSED
FILDA6:	MOVE	T3,PTH.PP(T1)	;DIRECTORY COMPONENT ON PATH TO ACCESS.USR
	CAME	T3,LEB.PP(T2)	;SAME AS COMPONENT ON THE PATH TO THE FILE?
	SETOM	PATHMM		;NO, PATH IN ACCESS.USR MUST MATCH PATH TO FILE
	JUMPE	T3,FILDA7	;JUMP IF THE ENTIRE PATH HAS BEEN EXAMINED
	ADDI	T1,1		;POINT AT NEXT DIRECTORY COMPONENT
	AOJA	T2,FILDA6	;AND SEE IF NEXT COMPONENTS MATCH
;HERE TO SCAN ACCESS.USR LOOKING FOR A FILESPEC MATCH
FILDA7:	SETOM	SCNBLK		;INITIALIZE SCAN BLOCK
	MOVE	T1,[SCNBLK,,SCNBLK+1]
	BLT	T1,SCNBLK+SCNBKL-1
	MOVE	T1,PTH.BL	;FILE STRUCTURE NAME
	MOVEM	T1,SCNDEV	;STORE THAT FOR SCAN
	MOVE	T1,[SIXBIT /ACCESS/]
	MOVEM	T1,SCNNAM	;FILE NAME
	MOVSI	T1,(SIXBIT /USR/)
	HLLM	T1,SCNEXT	;FILE EXTENSION
	MOVE	T1,[FX.DIR+FX.PHY]
	MOVEM	T1,SCNMOD	;FORCE A PHYSICAL ONLY OPEN
	MOVEI	T1,PTH.PP	;PATH TO ACCESS.USR
	MOVEI	T2,SCNDIR	;WHERE SCAN WANTS THE PATH FOR AN INDIRECT FILE
	MOVEI	T3,.FXLND	;MAXIMUM LENGTH OF A FULL PATH
FILDA8:	SKIPN	T4,(T1)		;SKIP IF NEXT DIRECTORY COMPONENT WAS SPECIFIED
	JRST	FILDA9		;FULL PATH HAS BEEN COPIED
	MOVEM	T4,(T2)		;STORE DIRECTORY COMPONENT IN SCAN BLOCK
	ADDI	T1,1		;NEXT COMPONENT IN THE PATH
	ADDI	T2,2		;NEXT WORD IN THE SCAN BLOCK
	SOJG	T3,FILDA8	;COPY THE ENTIRE PATH
FILDA9:	SETZM	(T2)		;INDICATE END
	MOVE	T1,[6,,[0
			0
			XWD	0,TYPE
			XWD	SCNBKL,SCNBLK
			XWD	.POPJ##,FILD31
			EXP	FS.IFI]]
	PUSHJ	P,.ISCAN##	;INITIALIZE SCAN
FILD10:	MOVE	T1,SAVFF	;OUR ORIGINAL SIZE
	MOVEM	T1,.JBFF	;RESET WHERE BUFFERS, ETC. GO
	MOVE	T1,[7,,[IOWD	SL,SN
			XWD	SD,SM
			XWD	0,SP
			0
			XWD	CLRALL,CLRFIL
			XWD	ALIN,ALOUT
			XWD	0,APLSTY]]
	PUSHJ	P,.TSCAN##	;SCAN ACCESS.USR
;HERE TO SEE IF THE PPN OF THE ACCESSOR MATCHES PPN'S SPECIFIED IN ACCESS.USR
	MOVE	T1,NINFIL	;NUMBER OF INPUT FILES
	MOVE	P2,T1		;ALSO TO P2
	JUMPE	T1,FILD10	;JUMP IF NO INPUT FILES SPECIFIED
	MOVE	P1,.JBFF	;CURRENT FIRST FREE LOCATION
	IMULI	T1,INLEN	;NUMBER OF INPUT FILES * LENGTH OF INPUT SCAN BLOCK
	SUB	P1,T1		;ADDRESS OF FIRST INPUT SCAN BLOCK
FILD11:	SKIPGE	.FXMOD(P1)	;ILLEGAL IF A DEVICE NAME WAS SPECIFIED
	SKIPE	.FXNAM(P1)	;ILLEGAL IF A FILE NAME WAS SPECIFIED
	JRST	FILD12		;SKIP THIS ILLEGAL SCAN BLOCK
	SKIPN	.FXEXT(P1)	;ILLEGAL IF AN EXTENSION WAS SPECIFIED
	SKIPE	.FXDIR+2(P1)	;ILLEGAL IF SFD'S WERE SPECIFIED
	JRST	FILD12		;SKIP THIS ILLEGAL SCAN BLOCK
	MOVX	T1,FX.DIR	;DIRECTORY WAS SPECIFIED BIT
	TDNN	T1,.FXMOD(P1)	;WAS A DIRECTORY SPECIFIED?
	JRST	FILD12		;NO, SKIP THIS ILLEGAL SCAN BLOCK
	SKIPN	T1,.FXDIR(P1)	;A REAL PPN TYPED?
	SKIPA	T1,M.PPN(M)	;NO, MUST BE [-], USE DEFAULT
	SKIPA	T3,.FXDIM(P1)	;PPN MASK FORM ACCESS.USR
	SETO	T3,		;PPN MASK OF [*,*]
	MOVE	T2,D		;PPN OF ACCESSOR
	PUSHJ	P,MATCHS	;DOES THE PPN FROM ACCESS.USR MATCH THE PPN
				; OF THE ACCESSOR?
	  CAIA			;NO, LOOK AT THE NEXT ENTRY IN ACCESS.USR
	JRST	FILD13		;YES, ALLOW ACCESS AS SPECIFIED BY ACCESS.USR
FILD12:	ADDI	P1,INLEN	;NEXT SCAN BLOCK
	SOJG	P2,FILD11	;LOOK AT ALL PPNS ON THE LINE FROM ACCESS.USR
	JRST	FILD10		;READ THE NEXT LINE FROM ACCESS.USR
;HERE WHEN ACCESSOR'S PPN WAS FOUND IN ACCESS.USR.
; NOW SEE IF THE FILE SPEC MATCHES THE LEFT HAND SIDE AND IF SO,
; USE SWITCH VALUE FOR HIGHEST ACCESS ALLOWED TO THE FILE
;
;HERE TO SEE IF THE /NAME SWITCH WAS SPECIFIED

FILD13:	SETCM	T1,I.NAME(P1)	;GET VALUE OF FIRST AND
	SETCM	T2,I.NAME+1(P1)	;  SECOND WORDS OF /NAME
	SKIPN	T1		;IF VALUE NOT
	JUMPE	T2,FILD14	;  SPECIFIED, CONTINUE
	HRLZ	T1,J		;GET JOB NUMBER OF ACCESSOR
	HRRI	T1,.GTNM1	;FIRST HALF OF USER NAME
	GETTAB	T1,		;GET IT
	  ERROR			;CAN'T HAPPEN
	HRLZ	T2,J		;GET JOB NUMBER AGAIN
	HRRI	T2,.GTNM2	;SECOND HALF OF USER NAME
	GETTAB	T2,		;GET IT
	  ERROR			;CAN'T HAPPEN
	CAMN	T1,I.NAME(P1)	;DOES FIRST HALF MATCH?
	CAME	T2,I.NAME+1(P1)	;YES, DOES SECOND HALF MATCH?
	JRST	FILD12		;NO, TRY NEXT ENTRY ON LINE

;HERE TO SEE IF THE /ACCOUNT SWITCH WAS SPECIFIED

FILD14:	SKIPN	I.ACTFL(P1)	;/ACCOUNT SPECIFIED?
	JRST	FILD18		;NO, CONTINUE
	MOVE	T1,[.ACTRD,,T2]	;POINT TO ACCT. BLOCK
	MOVEI	T2,2		;2 WORDS LONG
	MOVEI	T3,(J)		;JOB NUMBER
	MOVEI	T4,ACTBLK	;WHERE TO STORE ACCOUNT STRING
	ACCT.	T1,		;GET USERS ACCOUNT STRING
	  JRST	FILD12		;DISALLOW ACCESS IF FAILED
	MOVEI	T1,ACTLEN*5	;NUMBER CHARACTERS IN ACCOUNT STRING
	MOVE	T2,[POINT 7,ACTBLK] ;BYTE POINTER TO STRING
FILD15:	ILDB	T3,T2		;GET NEXT CHARACTER
	SOS	T1		;DECREMENT COUNT
	JUMPN	T3,FILD15	;FIND END OF STRING
	MOVEI	T3,0		;SETUP TO INSURE THAT STRING IS ZERO FILLED
FILD16:	SKIPLE	T1		;DONE IF COUNT DECREMENTED TO ZERO
	IDPB	T3,T2		;STORE NEXT CHARACTER
	SOJG	T1,FILD16	;LOOP FOR ALL
	MOVSI	T1,-ACTLEN	;BUILD AOBJN POINTER TO BLOCK
FILD17:	MOVEI	T2,(P1)		;GET POINTER TO SCAN BLOCK
	ADDI	T2,(T1)		;OFFSET FOR THIS WORD
	MOVE	T2,I.ACCT(T2)	;GET WORD FROM SCAN BLOCK
	CAMN	T2,ACTBLK(T1)	;MATCH?
	AOBJN	T1,FILD17	;YES, LOOP
	JUMPL	T1,FILD12	;IF NOT FULL MATCH, DISALLOW ACCESS
;HERE TO SEE IF THE /PROGRAM SWITCH WAS SPECIFIED

FILD18:	SKIPN	I.PRGM(P1)	;WAS /PROGRAM SEEN?
	JRST	FILD25		;NO, SEE IF FILE SPEC MATCHES
;HERE WHEN /PROGRAM WAS SPECIFIED IN ACCESS.USR
	SKIPE	I.PRGM+.FXEXT(P1)
	JRST	FILD12		;SKIP THIS ILLEGAL SCAN BLOCK
	MOVE	T1,I.PRGM+.FXNAM(P1)
	HRLZ	T2,J		;JOB NUMBER OF THE ACCESSOR
	HRRI	T2,.GTRFN	;NAME OF THE PROGRAM THAT THE ACCESSOR IS RUNNING
	GETTAB	T2,		;GET THAT
	  ERROR			;SHOULDN'T HAPPEN
	MOVE	T3,I.PRGM+.FXNMM(P1)
	PUSHJ	P,MATCHS	;SEE IF PROGRAM SPECIFIED IN ACCESS.USR
				; MATCHS THE PROGRAM THE ACCESSOR IS RUNNING
	  JRST	FILD12		;IT DOESN'T, LOOK AT THE NEXT ENTRY ON THIS LINE
;HERE WHEN PROGRAM NAMES MATCH
	SKIPGE	I.PRGM+.FXMOD(P1)
	JRST	FILD22		;NO DEVICE WAS SPECIFIED
	HRLZ	P3,J		;JOB NUMBER OF THE ACCESSOR
	HRRI	P3,.GTRDV	;STR WHERE THE ACCESSING PROGRAM CAME FROM
	GETTAB	P3,		;GET THAT
	  ERROR			;SHOULDN'T HAPPEN
	MOVE	T1,I.PRGM+.FXDEV(P1)
	MOVEM	T1,ACS.WB	;STORE DEVICE NAME FROM ACCESS.USR
	MOVE	T1,[3,,ACS.WB]	;ARGUMENT TO PATH.
	PATH.	T1,		;GET INFO ABOUT THE DEVICE
	  JRST	FILD12		;NO SUCH DEVICE, LOOK AT NEXT ENTRY
	MOVX	T1,PT.LIB	;IN CASE WE HAVE A LIB SET AND LIB WAS SPECIFIED
	TDNE	T1,ACS.WB+.PTSWT; IN ACCESS.USR, DON'T ALLOW LIB
	JRST	FILD12		; SINCE IT MAKES NO SENSE
	LDB	T1,[POINTR (ACS.WB+.PTSWT,PT.SLT)]
	MOVX	T2,PT.IPP	;AN IMPLIED PPN?
	TDNN	T2,ACS.WB+.PTSWT;TEST THAT
	JRST	FILD19		;NO, SEE IF ALL OR SYS SEARCH LIST
;HERE IF THE DEVICE FROM ACCESS.USR HAS AN IMPLIED PPN
	SKIPE	I.PRGM+.FXDIR(P1)
	JRST	FILD12		;PPN WAS SPECIFIED, THAT'S ILLEGAL
	MOVE	T2,ACS.WB+.PTPPN;GET THE IMPLIED PPN
	MOVEM	T2,I.PRGM+.FXDIR(P1)
	SETOM	I.PRGM+.FXDIM(P1)
	MOVX	T2,FX.DIR	;DIRECTORY WAS SPECIFIED BIT
	IORM	T2,I.PRGM+.FXMOD(P1);INDICATE THAT
FILD19:	CAXN	T1,.PTSLA	;ALL SEARCH LIST?
	JRST	FILD22		;YES, DEVICES MATCH
	CAXE	T1,.PTSLS	;SYS SEARCH LIST?
	JRST	FILD21		;NO, NEED MORE INFORMATION
;HERE IF THE SEARCH LIST FOR THE DEVICE SPECIFIED IN ACCESS.USR IS
; THE SYS SEARCH LIST
	SETZM	ACS.WB+.DFGJN	;ZERO JOB NUMBER (SYS SEARCH LIST)
	SETZM	ACS.WB+.DFGPP	;AND PPN
	SETOM	ACS.WB+.DFGNM	;GET FIRST FILE STRUCTURE IN SYS SEARCH LIST
FILD20:	MOVE	T1,[3,,ACS.WB]	;ARGUMENT TO GOBSTR
	GOBSTR	T1,		;GET THE NEXT STR FROM THE SYS SEARCH LIST
	  ERROR			;WHAT?
	MOVE	T1,ACS.WB+.DFGNM;FILE STRUCTURE NAME
	JUMPE	T1,FILD12	;JUMP IF ALL STRS IN SYS SEARCH LIST HAVE BEEN CHECKED
	CAMN	T1,P3		;SAME AS THE STR WHERE THE ACCESSING PROGRAM CAME FROM?
	JRST	FILD22		;YES, DEVICE NAMES MATCH
	JRST	FILD20		;NO, LOOK AT NEXT STR IN S.S.L.
;HERE IF THE SEARCH LIST FOR THE DEVICE SPECIFIED IN ACCESS.USR IS
; NOT THE SYS SEARCH LIST
FILD21:	MOVE	T1,[5,,ACS.WB]	;ARGUMENT TO DSKCHR
	DSKCHR	T1,		;GET DSK CHARACTERISTICS
	  JRST	FILD12		;NOT A DSK?
	LDB	T1,[POINTR (T1,DC.TYP)]
XX==.DCTDS			;CREF THE SYMBOL USED IN THE JUMPE
	JUMPE	T1,FILD22	;IF GENERIC, THEN ITS DSK AND DEVICE NAMES MATCH
	CAXE	T1,.DCTFS	;FILE STR NAME?
	JRST	FILD12		;NO, ANYTHING ELSE IS ILLEGAL
	CAME	P3,ACS.WB+.DCSNM;SAME AS THE NAME FROM ACCESS.USR?
	JRST	FILD12		;NO, LOOK ONWARD
;HERE WHEN THE FILE STRUCTURE WHERE THE PROGRAM CAME FROM MATCHES
; THE FILE STRUCTURE SPECIFIED IN ACCESS.USR
FILD22:	HRLZ	T2,J		;JOB NUMBER OF THE ACCESSOR
	HRRI	T2,.GTRDI	;DIRECTORY WHERE THE ACCESSING PROGRAM CAME FROM
	GETTAB	T2,		;GET THAT
	  ERROR			;HUH?
	JUMPE	T2,FILD12	;CAN'T MATCH IF NOT FROM DSK
	MOVX	T1,FX.DIR	;DIRECTORY WAS SPECIFIED BIT
	TDNE	T1,I.PRGM+.FXMOD(P1)
	SKIPN	T1,I.PRGM+.FXDIR(P1)
	SKIPA	T1,M.PPN(M)	;NOT SPECIFIED OR [-], USE DEFAULT OF OWNER'S PPN
	SKIPA	T3,I.PRGM+.FXDIM(P1)
	SETO	T3,		;-1 FOR PPN MASK
	MOVE	T4,IPR.BL+.IPCFC;CAPABILITIES
	SKIPLE	I.XO(P1)	;EXECUTE ONLY PROGRAM REQUIRED?
	TXNE	T4,IP.SXO	;YES, AND IS THE ACCESSING PROGRAM EXECUTE ONLY?
	PUSHJ	P,MATCHS	;DOES DIRECTORY FROM ACCESS.USR MATCH THE
				; DIRECTORY THAT THE ACCESSING PROGRAM CAME FROM?
	  JRST	FILD12		;NO, PRESS ON
;HERE TO SEE IF PATH TO PROGRAM MATCHES PATH FROM ACCESS.USR
	HRLZ	T1,J		;JOB NUMBER OF ACCESSOR
	HRRI	T1,.GTRS0-1	;GETTAB TABLE FOR FIRST SFD IN PATH TO PROGRAM
	PUSH	P,T1		;SAVE GETTAB NUMBER
	MOVEI	P3,I.PRGM+.FXDIR+2(P1)
	MOVEI	P4,.FXLND-1	;MAXIMUM NUMBER OF SFD'S
FILD23:	AOS	T4,(P)		;NEXT SFD
	GETTAB	T4,		;GET IT
	  SETZ	T4,		;NOT IMPLEMENTED, MUST NOT BE IN ACCESS.USR
	MOVE	T1,(P3)		;USER SUPPLIED SFD NAME
	MOVE	T2,T4		;SFD PROGRAM CAME FROM
	MOVE	T3,1(P3)	;MASK
	PUSHJ	P,MATCHS	;SEE IF SFD'S MATCH
	  JRST	[POP P,(P)	;NO MATCH
		JRST FILD12]	;NEXT SPEC
	JUMPE	T4,FILD24	;JUMPE IF END OF PATH
	ADDI	P3,2		;NEXT SFD
	SOJG	P4,FILD23	;GET NEXT IF ALL HAVEN'T BEEN LOOKED AT
;HERE TO SEE IF STR WHERE FILE IS BEING ACCESSED MATCHES STR FROM ACCESS.USR
FILD24:	POP	P,(P)		;RESTORE STACK
FILD25:	SKIPE	PPRGM		;/PROGRAM SPECIFIED IN OUTPUT FILE SPEC?
	JRST	FILD10		;YES, ERROR, LOOK AT NEXT LINE IN ACCESS.USR
	SKIPGE	OUTBLK+.FXMOD	;WAS A DEVICE SPECIFIED?
	JRST	FILD26		;NO
	MOVE	T1,OUTBLK+.FXDEV;DEVICE NAME SPECIFIED IN ACCESS.USR
	CAME	T1,M.STR(M)	;DOES IT MATCH STR NAME WHERE THE FILE IS BEING ACCESSED?
	JRST	FILD10		;NO, READ THE NEXT LINE FROM ACCESS.USR
;HERE TO SEE IF FILE NAMES MATCH
FILD26:	SKIPN	T1,OUTBLK+.FXNAM;FILE NAME FROM ACCESS.USR
	JRST	FILD27		;NONE SPECIFIED, FILE NAMES MATCH
	MOVE	T2,M.FILE(M)	;FILE NAME OF FILE BEING ACCESSED
	MOVE	T3,OUTBLK+.FXNMM;FILE NAME MASK FROM ACCESS.USR
	PUSHJ	P,MATCHS	;DO THE FILE NAMES MATCH?
	  JRST	FILD10		;NO, LOOK AT THE NEXT LINE IN ACCESS.USR
;HERE TO SEE IF FILE EXTENSIONS MATCH
FILD27:	HLLZ	T1,OUTBLK+.FXEXT;EXTENSION FROM ACCESS.USR
	HLLZ	T2,M.EXT(M)	;EXTENSION OF THE FILE BEING ACCESSED
	HRLZ	T3,OUTBLK+.FXEXT;EXTENSION MASK FROM ACCESS.USR
	PUSHJ	P,MATCHS	;DO THE EXTENSIONS MATCH?
	  JRST	FILD10		;NO, LOOK AT THE NEXT LINE IN ACCESS.USR
;HERE TO SEE IF PATHS MATCH. THEY MUST IF PATHMM.NE.0 OR A PATH WAS
; SPECIFIED IN ACCESS.USR
	MOVX	T1,FX.DIR	;DIRECTORY WAS SPECIFIED BIT
	TDNE	T1,OUTBLK+.FXMOD;WAS A DIRECTORY SPECIFIED IN ACCESS.USR?
	SKIPE	T1,OUTBLK+.FXDIR;YES, WAS IT [,]?
	JRST	FILD28		;NO
	MOVE	T1,M.PPN(M)	;YES, FILL IN DEFAULT DIRECTORY
	MOVEM	T1,OUTBLK+.FXDIR; IN THE SCAN BLOCK
	SETOM	OUTBLK+.FXDIM	;AND THE DEFAULT MASK
FILD28:	SKIPN	PATHMM		;MUST PATH IN ACCESS.USR MATCH PATH TO THE FILE?
	SKIPE	OUTBLK+.FXDIR	;NO, WAS A DIRECTORY SPECIFIED IN ACCESS.USR
	SKIPA	T2,LEB.PP	;YES, DIRECTORIES MUST MATCH
	JRST	FILD32		;NO, FILE SPECS MATCH
	MOVE	T3,OUTBLK+.FXDIM;DIRECTORY WILD CARD MASK
	PUSHJ	P,MATCHS	;SEE IF DIRECTORIES MATCH
	  JRST	FILD10		;NO MATCH, READ NEXT LINE IN ACCESS.USR
	MOVEI	P2,OUTBLK+.FXDIR+2;ADDRESS OF THE PATH IN THE SCAN BLOCK
	MOVEI	P3,M.PATH(M)	;ADDRESS OF THE PATH TO THE FILE BEING ACCESSED
	MOVEI	P4,.FXLND	;MAXIMUM LENGTH OF A PATH
FILD29:	MOVE	T1,(P2)		;DIRECTORY COMPONENT FROM THE SCAN BLOCK
	SKIPN	T2,(P3)		;COMPONENT FROM THE MONITOR
	JUMPE	T1,FILD32	;JUMP IF DIRECTORIES MATCH
	MOVE	T3,1(P2)	;DIRECTORY MASK FROM THE SCAN BLOCK
	PUSHJ	P,MATCHS	;SEE IF DIRECTORY COMPONENTS MATCH
	  JRST	FILD10		;THEY DON'T, LOOK AT THE NEXT LINE IN ACCESS.USR
	ADDI	P2,2		;NEXT ENTRY IN THE SCAN BLOCK
	ADDI	P3,1		;NEXT ELEMENT OF THE PATH
	SOJG	P4,FILD29	;LOOP OVER ALL ELEMENTS OF THE DIRECTORY SPEC
	JRST	FILD32		;TELL FILSER THE ANSWER
;HERE WHEN ACCESS.USR WASN'T FOUND. RETURN DEFAULT VALUE (FNCNAA) AS HIGHEST ACCESS
; ALLOWED TO THE FILE OR (FNCCPR) IF FULL FILE ACCESS PROGRAM
FILD30:	MOVEI	T1,.GTPPN	;PICK UP PPN OF
	HRL	T1,J		;...REQUESTING JOB
	GETTAB	T1,		;...
	  JRST	FILD31		;NO ACCESS IF NO PPN
	JUMPE	T1,FILD31	;...
	MOVE	T2,IPR.BL+.IPCFC;ACCESSOR'S CAPABILITIES
	CAMN	T1,D		;IN YOU BEHALF FILOP?
	TXNN	T2,IP.JAC	;NO, JACCT?
	CAMN	D,FFAPPN	;OR [1,2]
	SKIPA	T1,[FNCCPR]	;YES, ALLOW ALL ACCESS
;HERE IF NO ACCESS IS TO BE ALLOWED TO THE FILE
FILD31:	MOVEI	T1,FNCNAA	;NO ACCESS ALLOWED
	SETZM	PLOG		;DON'T LOG ACCESS
	MOVEI	P1,PLOG-I.LOG	;USE STICKY LOG SWITCH
	JRST	FILD33		;TELL FILSER THE ANSWER
;HERE WHEN FILE BEING ACCESSED MATCHES FILE SPEC FOUND IN ACCESS.USR
FILD32:	SKIPGE	T1,I.SWCH(P1)	;HIGHEST ACCESS ALLOWED TO THE FILE
	MOVEI	T1,FNCNAA	;IF NONE SPECIFIED, ALLOW NO ACCESS
;HERE TO SEE IF THE ACCESSOR IS ATTEMPTING TO CREATE THE FILE
	HLRZ	T2,M.CODE(M)	;ACCESS BEING ATTEMPTED
	CAIE	T2,FNCCRE	;CREATE?
	JRST	FILD33		;NO, ALLOW ONLY ACCESS SPECIFIED IN ACCESS.USR
	SKIPG	I.CRE(P1)	;CREATE ALLOWED?
	JRST	FILD31		;NO, ALLOW NO ACCESS TO THE FILE
	MOVEI	T1,FNCCRE	;YES, ALLOW THE CREATE
;HERE TO SEE IF A PROTECTION CODE WAS SPECIFIED IN ACCESS.USR
; IF SO, TELL FILSER TO CREATE THE FILE WITH THIS PROTECTION CODE
	MOVX	T2,FX.PRO	;PROTECTION MASK
	TDNN	T2,OUTBLK+.FXMOM;A PROTECTION CODE SPECIFIED?
	JRST	FILD33		;NO
	LDB	T2,[POINTR (OUTBLK+.FXMOD,FX.PRO)] ;YES
	DPB	T2,[POINTR (T1,FL.DPT)]
	TXO	T1,FL.DSP	;TELL FILSER THAT USER SPECIFIED CREATE PROTECTION
;HERE TO SEND HIGHEST ACCESS ALLOWED TO THE FILE BY THIS ACCESSOR
; TO FILSER
FILD33:	TXO	T1,FL.DAA	;ASK US ON EVERY REFERENCE TO THE FILE
	MOVEM	T1,IPS.DT+.IPCS1;STORE HIGHEST ACCESS ALLOWED
	HLRZ	T2,M.CODE(M)	;ACCESS BEING ATTEMPTED
	MOVEI	P2,[ASCIZ / failed
/]				;ASSUME ACCESS WILL NOT BE ALLOWED
	CAIE	C,.FLDPG	;A PROGRAM BEING RUN?
	JRST	FILD34		;NO
	HRRZS	T1		;TYPE OF ACCESS BEING ATTEMPTED
	CAIN	T1,FNCEXE	;EXECUTE ONLY FILE?
	CAILE	T1,FNCRED	;AND TRYING TO READ IT?
FILD34:	CAIG	T2,(T1)		;ACCESS REQUESTED LESS THAN ACCESS ALLOWED?
	MOVEI	P2,[ASCIZ / succeeded
/]				;YES, THE ACCESS WILL BE ALLOWED
	MOVE	T1,[1,,[.FOCLS(DSK)]]
	FILOP.	T1,		;CLOSE ACCESS.USR
	  JFCL			;SHOULDN'T HAPPEN
	SKIPLE	T1,I.LOG(P1)	;ACCESS LOGGING REQUESTED?
	CAIN	T1,LOGSNO	;OR LOG:NONE SPECIFIED?
	JRST	FILD46		;NO, SEND THE MESSAGE TO FILSER AND START OVER
	CAIN	T1,LOGSAL	;/LOG:ALL?
	JRST	FILD35		;YES, GO LOG IT
	CAIN	T1,LOGSFA	;LOG FAILURES?
	MOVEI	T2,[ASCIZ / failed
/]				;YES
	CAIN	T1,LOGSSU	;LOG SUCCESSES?
	MOVEI	T2,[ASCIZ / succeeded
/]				;YES

	CAIE	T2,(P2)		;SUCCESS OR FAILURE?
	JRST	FILD46		;NO, NO LOGGING
FILD35:	MOVE	T1,IPS.DT+.IPCS1;WORD RETURNED TO MONITOR
	SKIPLE	I.CLOS(P1)	;YES, A CLOSE SWITCH SEEN?
	TXO	T1,FL.DCL	;YES, CALL THE FILE DAEMON ON CLOSE
	CAIN	C,.FLDPG	;PROGRAM BEING RUN?
	SKIPG	I.EXIT(P1)	;AND WAS AN EXIT SWITCH SEEN?
	CAIA			;NO
	TXO	T1,FL.DXT	;YES, CALL THE FILE DAEMON ON PROGRAM EXIT
	MOVEM	T1,IPS.DT+.IPCS1;STORE CLOSE AND EXIT BITS
;HERE TO LOG ACCESS TO THE FILE
FILD36:	MOVEI	T1,.RBPRV	;4 WORD LOOKUP SO IT WILL BE FASTER IF
	MOVEM	T1,LEB.BL	; IF FILSER KNOWS ABOUT THE FILE
	MOVE	T1,[FO.PRV+.FOAPP(DSK)]
	MOVEM	T1,FOP.BL	;APPEND TO THE FILE ENVOKING PRIVS
	MOVSI	T1,(SIXBIT /LOG/)
	MOVEM	T1,LEB.XT	;EXTENSION
	MOVSI	T1,OBUF		;OUTPUT BUFFER HEADER
	MOVEM	T1,FOP.BH	;STORE THAT
	MOVSI	T1,1		;ONE INPUT BUFFER
	MOVEM	T1,FOP.NB	;STORE THAT
	HRLOI	T1,777		;ZERO ALL OF THE ATTRIBUTES WORD
	ANDCAM	T1,LEB.AW	;EXCEPT THE PROTECTION FIELD
	MOVEI	T1,PTH.BL	;ADDRESS OF THE PATH BLOCK
	MOVEM	T1,LEB.PT	;STORE THAT
	MOVEI	T1,.PTSCN	;DON'T SCAN
	MOVEM	T1,PTH.AW	;STORE THAT
	MOVE	T1,[6,,FOP.BL]	;FILOP ARGUMENT LIST
	FILOP.	T1,		;APPEND OR CREATE ON SAME PATH AS ACCESS.USR
	  JRST	FILD45		;THE ONLY REASON THIS SHOULD HAPPEN IS A RIB ERROR
	MOVEI	T1,PUTCHR	;HAVE SCAN CALL PUTCHR
	MOVEM	T1,TYO		; TO OUTPUT TO THE LOG FILE
	PUSHJ	P,.GTNOW##	;GET CURRENT DATE/TIME
	PUSHJ	P,.TDTTM##	;PRINT DATE AND TIME
	MOVEI	T1,[ASCIZ /
	Job /]
	PUSHJ	P,.TSTRG##	;OUTPUT THE STRING
	MOVE	T1,J		;JOB NUMBER OF ACCESSOR
	PUSHJ	P,.TDECW##	;PRINT THAT
	PUSHJ	P,.TSPAC##	;PRINT A SPACE
	HRLZ	P3,J		;JOB NUMBER OF THE ACCESSOR
	HRRI	P3,.GTNM1	;FIRST PART OF THE USER'S NAME
	GETTAB	P3,		;GET THAT
	  ERROR			;SHOULDN'T HAPPEN
	HRLZ	P4,J		;JOB NUMBER
	HRRI	P4,.GTNM2	;SECOND HALF OF USER'S NAME
	GETTAB	P4,		;GET THAT
	  ERROR			;SHOULDN'T HAPPEN
	MOVE	P1,[POINT 6,P3]	;BYTE POINTER TO NAME STRING
FILD37:	SKIPN	P3		;FIRST HALF OF NAME ZERO OR BEEN ZEROED?
	JUMPE	P4,FILD38	;JUMP IF SECOND HALF HAS BEEN PRINTED
	ILDB	T1,P1		;NEXT CHARACTER OF NAME STRING
	MOVEI	T2,0		;ZERO CHARACTER POSITION
	DPB	T2,P1		; FOR END TEST
	ADDI	T1," "		;MAKE IT ASCII
	PUSHJ	P,.TCHAR##	;PUT IT IN THE OUTPUT
	JRST	FILD37		;NEXT CHARACTER IF THERE IS ONE
FILD38:	PUSHJ	P,.TSPAC##	;PRINT A SPACE
	MOVE	T1,D		;PPN OF THE ACCESSOR
	PUSHJ	P,.TPPNW##	;PRINT THAT
	MOVE	T1,J		;GET JOB NUMBER
	TRMNO.	T1,		;GET TTY NUMBER
	  JRST	[MOVEI T1,[ASCIZ/ Detached/] ;MUST BE
		 PUSHJ P,.TSTRG##	;  DETACHED
		 JRST  FILD40]	; AND CONTINUE
	PUSH	P,T1		;SAVE LINE NUMBER
	MOVEI	T1,[ASCIZ/ from TTY/]
	PUSHJ	P,.TSTRG##	;START WITH TTY PREFIX
	MOVE	T1,0(P)		;GET UDX BACK
	TRZ	T1,.UXTRM	;CLEAR UNIVERSAL BIT
	PUSHJ	P,.TOCTW##	;PRINT IT
	POP	P,T1		;RESTORE UDX
	GTNTN.	T1,		;MAP TO NODE,,LINE ON NODE
	  JRST	FILD40		;SHOULDN'T HAPPEN
	PUSH	P,T1		;SAVE THAT
	HLRZ	T2,T1		;MOVE NODE NUMBER TO T2
	MOVEI	T1,2		;NUMBER OF ARGS IS 2
	MOVE	T3,[.NDRNN,,T1]	;SETUP FOR NODE. UUO
	NODE.	T3,		;GET THE CORRESPONDING NAME
	  JRST	FILD39		;SHOULDN'T HAPPEN
	MOVEI	T1,[ASCIZ/, node /]
	PUSHJ	P,.TSTRG##	;TYPE SEPARATOR
	MOVE	T1,T3		;MOVE NODE NAME
	PUSHJ	P,.TSIXN##	;  IS A NODE SPEC
	MOVEI	T1,[ASCIZ/ line /]
	PUSHJ	P,.TSTRG##	;TYPE SEPARATOR
	HRRZ	T1,0(P)		;GET LINE ON NODE BACK
	PUSHJ	P,.TOCTW##	;TYPE IT
FILD39:	POP	P,0(P)		;BRING STACK INTO PHASE
FILD40:	CAIN	C,.FLDPG	;A PROGRAM BEING RUN?
	JRST	FILD43		;YES
	HRLZ	T1,J		;JOB NUMBER OF ACCESSOR
	HRRI	T1,.GTRDV	;GET THE DEVICE WHERE
	GETTAB	T1,		; ACCESSING PROGRAM CAME FROM
	  ERROR			;SHOULDN'T HAPPEN
	JUMPE	T1,FILD43	;IF NONE, PROBABLY A SAVE IN PROGRESS
	PUSH	P,T1		;SAVE PROGRAM NAME
	MOVEI	T1,[ASCIZ/,
	Running /]
	PUSHJ	P,.TSTRG##	;Type start of program spec
	POP	P,T1		;RESTORE PROGRAM NAME
	PUSHJ	P,.TSIXN##	;PRINT THE PROGRAM NAME
	PUSHJ	P,.TCOLN##	;PRINT A COLON
	HRLZ	T1,J		;JOB NUMBER
	HRRI	T1,.GTRFN	;GET THE NAME OF THE ACCESSING PROGRAM
	GETTAB	T1,		; ..
	  ERROR			;SHOULDN'T FAIL
	PUSHJ	P,.TSIXN##	;PRINT THAT
	HRLZ	T1,J		;JOB NUMBER
	HRRI	T1,.GTRDI	;GET THE DIRECTORY THAT
	GETTAB	T1,		; THE ACCESSING PROGRAM CAME FROM
	  ERROR			;SHOULDN'T HAPPEN
	JUMPE	T1,FILD43	;JUMP IF DIRECTORY UNKNOWN
	PUSH	P,T1		;SAVE PPN
	MOVEI	T1,"["		;PRINT A LEFT BRACKET
	PUSHJ	P,.TCHAR##	; ..
	POP	P,T1		;PRINT P,PN
	PUSHJ	P,.TXWDW##	; ..
	HRLZ	P1,J		;JOB NUMBER OF THE ACCESSOR
	HRRI	P1,.GTRS0	;FIRST SFD IN PATH TO ACCESSING PROGRAM
	MOVEI	P3,.FXLND-1	;MAXIMUM NUMBER OF SFD'S
FILD41:	MOVE	T1,P1		;NEXT SFD
	GETTAB	T1,		;GET IT
	  SETZ	T1,		;GETTAB NOT IMPLEMENTED, IGNORE SFD'S
	JUMPE	T1,FILD42	;JUMP IF LAST SFD IN PATH
	PUSH	P,T1		;SAVE SFD NAME
	MOVEI	T1,","		;PRINT A COMMA
	PUSHJ	P,.TCHAR##	; ..
	POP	P,T1		;RESTORE SFD NAME
	PUSHJ	P,.TSIXN##	;AND PRINT IT
	ADDI	P1,1		;NEXT SFD
	SOJG	P3,FILD41	;LOOP OVER ALL POSSIBLE SFD'S
FILD42:	PUSHJ	P,.TRBRK##	;PRINT RIGHT BRACKET
FILD43:	PUSHJ	P,.TCRLF##	;CARRIAGE RETURN, LINE FEED
	PUSHJ	P,.TTABC##	;PRINT A TAB
	HLRZ	T1,M.CODE(M)	;TYPE OF ACCESS BEING ATTEMPTED
	CAIE	C,.FLDDA	;DIRECTORY ACCESS?
	CAIN	C,.FLDCA	;REGULAR FILE ACCESS?
	SKIPA	T1,ACCESS-1(T1)	;ADDRESS OF ACCESS TEXT
	MOVE	T1,ACTION-.FLDCA-1(C)
	PUSHJ	P,.TSTRG##	;PRINT TYPE OF ACCESS
	CAIN	C,.FLDXT	;PROGRAM EXECUTION TERMINATED?
	JRST	FILD44		;YES, NOTHING MORE TO PRINT
	CAIE	C,.FLDPS	;PROGRAM SUSPENSION?
	CAIN	C,.FLDPR	;OR PROGRAM RESUMED?
	JRST	FILD44		;YES, TREAT LIKE EXIT MESSAGE
	MOVEI	T1,[ASCIZ / of /]
	PUSHJ	P,.TSTRG##	;PRINT THE STRING
	MOVE	T1,M.STR(M)	;STRUCTURE NAME WHERE FILE BEING ACCESSED CAME FROM
	PUSHJ	P,.TSIXN##	;PRINT THAT
	PUSHJ	P,.TCOLN##	;PRINT A COLON
	MOVE	T1,M.FILE(M)	;ACCESSED FILE'S FILE NAME
	HLRZ	P1,M.EXT(M)	;EXTENSION
	CAIN	P1,'UFD'	;A UFD?
	PUSHJ	P,.TPPNW##	;YES, PRINT IN PPN FORMAT
	CAIE	P1,'UFD'	;A UFD
	PUSHJ	P,.TSIXN##	;NO, PRINT FILE NAME
	MOVEI	T1,"."		;PRINT A DOT
	PUSHJ	P,.TCHAR##	; ..
	HLLZ	T1,M.EXT(M)	;ACCESSED FILE'S EXTENSION
	PUSHJ	P,.TSIXN##	;PRINT THAT
	MOVEI	T1,M.PPN(M)	;ADDRESS OF FULL PATH
	TLO	T1,TS.DRP	;SO SCAN PRINTS IN PROPER FORMAT
	PUSHJ	P,.TDIRB##	;PRINT THE FULL PATH TO THE FILE
	CAIE	C,.FLDIC	;INPUT CLOSE?
	CAIN	C,.FLDOC	;OR OUTPUT CLOSE?
FILD44:	SKIPA	T1,[[ASCIZ /
/]]				;CRLF
	MOVE	T1,P2		;SUCCEEDED OR FAILED
	PUSHJ	P,.TSTRG##	;PRINT THAT
	MOVE	T1,IPS.DT+.IPCS1;FLAG BITS RETURNED TO THE MONITOR
	TXNN	T1,FL.DCL!FL.DXT;EXIT, CLOSE, OR WILL LOG EXIT OR CLOSE?
	JRST	FILD45		;NO, ALL DONE
	MOVEI	T1,[ASCIZ /	Current Runtime:/]
	PUSHJ	P,.TSTRG##	;PRINT THE STRING
	MOVE	T1,J		;JOB NUMBER OF ACCESSOR
	RUNTIM	T1,		;GET JOB'S CURRENT RUN TIME
	PUSHJ	P,.TTIME##	;PRINT THAT
	MOVEI	T1,[ASCIZ /, KCT:/]
	PUSHJ	P,.TSTRG##	;PRINT THE STRING
	HRLZ	T1,J		;JOB NUMBER
	HRRI	T1,.GTKCT	;GET CURRENT KCT
	GETTAB	T1,		; ..
	  ERROR			;SHOULDN'T HAPPEN
	PUSHJ	P,.TDECW##	;PRINT THAT
	MOVEI	T1,[ASCIZ /, Disk Reads:/]
	PUSHJ	P,.TSTRG##	;PRINT THE STRING
	HRLZ	T1,J		;JOB NUMBER
	HRRI	T1,.GTRCT	;GET JOB'S CURRENT DISK READS
	GETTAB	T1,		; ..
	  ERROR			;SHOULDN'T HAPPEN
	TXZ	T1,RC.INC	;CLEAR INCREMENTAL READS
	PUSHJ	P,.TDECW##	;PRINT CURRENT DISK READS
	MOVEI	T1,[ASCIZ /, Writes:/]
	PUSHJ	P,.TSTRG##	;PRINT THE STRING
	HRLZ	T1,J		;JOB NUMBER OF ACCESSOR
	HRRI	T1,.GTWCT	;GET THE JOB'S CURRENT DISK WRITES
	GETTAB	T1,		; ..
	  ERROR			;SHOULDN'T HAPPEN
	TXZ	T1,WC.INC	;CLEAR INCREMENTAL WRITES
	PUSHJ	P,.TDECW##	;PRINT CURRENT DISK WRITES
	PUSHJ	P,.TCRLF##	;CARRIAGE RETURN, LINE FEED
	MOVE	T1,[.ACTRD,,T2]	;POINT TO ACCT. BLOCK
	MOVEI	T2,2		;2 WORDS LONG
	MOVEI	T3,(J)		;GET JOB NUMBER OF ACCESSOR
	MOVEI	T4,ACTBLK	;POINT TO WHERE TO STORE STRING
	ACCT.	T1,		;GET ACCOUNT STRING
	  JRST	FILD45		;FAILED, GIVE UP
	LDB	T1,[POINT 7,ACTBLK,6] ;GET FIRST CHARACTER OF STRING
	JUMPE	T1,FILD45	;GO IF NULL
	MOVEI	T1,[ASCIZ/	Account string:"/]
	PUSHJ	P,.TSTRG##	;TELL WHAT THIS IS
	MOVEI	T1,ACTBLK	;POINT AT IT
	PUSHJ	P,.TSTRG##	;TYPE IT
	MOVEI	T1,[ASCIZ/"
/]
	PUSHJ	P,.TSTRG##	;END THE LINE
FILD45:	MOVE	T1,[1,,[.FOCLS(DSK)]]
	FILOP.	T1,		;CLOSE ACCESS.LOG
	  JFCL			;IGNORE ERROR
FILD46:	MOVE	T1,IPR.BL+.IPCFS;PID OF [SYSTEM]GOPHER
	MOVEM	T1,IPS.BL+.IPCFR;STORE THAT AS THE RECEIVER'S PID
	SETZM	IPS.BL+.IPCFL	;ZERO THE FLAGS
	HRL	J,M.EXT(M)	;GET SEQUENCE NUMBER FOR RESPONSE
	MOVEM	J,IPS.DT+.IPCS0	;JOB NUMBER OF THE ACCESSOR
	PUSHJ	P,FDSEND	;SEND THE RESPONSE TO [SYSTEM]GOPHER
	JRST	FILDA1		;RETURN TO THE TOP OF THE LOOP
	SUBTTL	SCAN INTERFACE

;HERE TO INITIALIZE THE WORLD
CLRALL:	SETZM	NINFIL		;ZERO NUMBER OF INPUT FILES
	SETOM	PEXIT		;STICKY EXIT SWITCH
	SETOM	PCLOSE		;STICKY CLOSE SWITCH
	SETOM	PSWICH		;INITIALIZE STICKY SWITCH
	SETOM	PLOG		; AND STICKY LOG SWITCH
	SETZM	FPRGM		;INITIALIZE PROGRAM SWITCH
	SETOM	PCREAT		;INITIALIZE STICKY CREATE SWITCH
	SETOM	PXONLY		;INITIALIZE STICKY XONLY SWITCH
	SETOM	PNAME		;INITIALIZE STICKY NAME SWITCH
	SETOM	PNAME+1		;  (BOTH WORDS)
	STORE	T1,PACCT,PACTFL,0 ;INITIALIZE STICKY ACCOUNT SWITCH
	POPJ	P,		;RETURN TO SCAN

;HERE TO INITIALIZE THE PER-FILE SWITCH AREA
CLRFIL:	SETZM	FPRGM		;INITIALIZE PROGRAM SWITCH
	SETOM	FEXIT		;LOCAL EXIT SWITCH
	SETOM	FCLOSE		;LOCAL CLOSE SWITCH
	SETOM	FSWICH		;INITIALIZE THE SWITCH
	SETOM	FLOG		;LOCAL LOG SWITCH
	SETOM	FCREAT		;LOCAL CREATE SWITCH
	SETOM	FXONLY		;LOCAL XONLY SWITCH
	SETOM	FNAME		;LOCAL NAME SWITCH
	SETOM	FNAME+1		;  (BOTH WORDS)
	STORE	T1,FACCT,FACTFL,0 ;LOCAL ACCOUNT SWITCH
	POPJ	P,		;AND RETURN
;HERE TO ALLOCATE AN INPUT FILESPEC AREA
ALIN:	MOVE	T1,.JBFF	;GET ADDRESS OF NEXT AREA
	MOVEI	T2,INLEN(T1)	;GET ADDRESS OF NEXT AREA
	MOVEM	T2,.JBFF	;SAVE IT
	CAMG	T2,.JBREL	;NEED MORE CORE?
	JRST	ALIN1		;NO
	CORE	T2,		;AND GET THE CORE
	  ERROR			;WHOOPS
ALIN1:	MOVEI	T2,INLEN	;LOAD THE LENGTH
	MOVEI	T3,1(T1)	;GET THE ADR+1
	HRLI	T3,-1(T3)	;ADR,,ADR+1
	SETZM	0(T1)		;CLEAR THE FIRST WORD
	BLT	T3,INLEN-1(T1)	;AND BLT THE BLOCK
	MOVSI	T3,FPRGM	;ADDRESS OF THE PROGRAM BLOCK
	HRRI	T3,I.PRGM(T1)	;WHERE IT IS IN THE SCAN BLOCK
	BLT	T3,INLEN-1(T1)	;BLT THE BLOCK
	MOVE	T3,FSWICH	;GET SWITCH
	MOVEM	T3,I.SWCH(T1)	;STORE IT
	MOVE	T3,FLOG		;VALUE OF THE LOG SWITCH
	MOVEM	T3,I.LOG(T1)	;STORE THAT IN THE SCAN BLOCK
	MOVE	T3,FEXIT	;VALUE OF THE EXIT SWITCH
	MOVEM	T3,I.EXIT(T1)	;STORE THAT IN THE SCAN BLOCK
	MOVE	T3,FCLOSE	;VALUE OF THE CLOSE SWITCH
	MOVEM	T3,I.CLOS(T1)	;STORE THAT
	MOVE	T3,FCREAT	;VALUE OF THE CREATE SWITCH
	MOVEM	T3,I.CRE(T1)	;STORE THAT IN THE SCAN BLOCK
	MOVE	T3,FXONLY	;VALUE OF THE XONLY SWITCH
	MOVEM	T3,I.XO(T1)	;STORE THAT
	MOVE	T3,FNAME	;VALUE OF FIRST WORD OF NAME SWITCH
	MOVEM	T3,I.NAME(T1)	;STORE THAT
	MOVE	T3,FNAME+1	;VALUE OF SECOND WORD OF NAME SWITCH
	MOVEM	T3,I.NAME+1(T1)	;STORE THAT
	MOVEI	T3,I.ACCT(T1)	;POINT TO WHERE TO STORE ACCOUNT STRING
	HRLI	T3,FACCT	;  AND WHERE TO GET IT FROM
	BLT	T3,I.ACTFL(T1)	;MOVE IT ALL
	AOS	NINFIL		;INCREMENT FILE COUNTER
	POPJ	P,		;AND RETURN
;HERE TO ALLOCATE AN OUTPUT FILESPEC BLOCK
ALOUT:	MOVE	T1,[OUTBLK,,OUTBLK+1]
	SETZM	OUTBLK		;ZERO THE OUTPUT SCAN BLOCK
	BLT	T1,OUTBLK+OUTLEN-1
	MOVE	T1,FSWICH	;VALUE OF STICKY SWITCH
	MOVEM	T1,PSWICH	;STORE THAT
	MOVE	T1,FLOG		;VALUE OF STICKY LOG SWITCH
	MOVEM	T1,PLOG		;STORE THAT
	MOVE	T1,FPRGM	;VALUE OF STICKY PROGRAM SWITCH
	MOVEM	T1,PPRGM	;STORE THAT
	MOVE	T1,FEXIT	;VALUE OF STICKY EXIT SWITCH
	MOVEM	T1,PEXIT	;STORE THAT
	MOVE	T1,FCLOSE	;VALUE OF STICKY CLOSE SWITCH
	MOVEM	T1,PCLOSE	;STORE THAT
	MOVE	T1,FCREAT	;VALUE OF STICKY CREATE SWITCH
	MOVEM	T1,PCREAT	;STORE THAT
	MOVE	T1,FXONLY	;VALUE OF STICKY XONLY SWITCH
	MOVEM	T1,PXONLY	;STORE THAT
	MOVE	T1,FNAME	;VALUE OF STICKY NAME SWITCH (1ST WORD)
	MOVEM	T1,PNAME	;STORE THAT
	MOVE	T1,FNAME+1	;VALUE OF STICKY NAME SWITCH (2ND WORD)
	MOVEM	T1,PNAME+1	;STORE THAT
	MOVE	T1,[FACCT,,PACCT] ;BLT POINTER TO MOVE ACCT STRING
	BLT	T1,PACTFL	;MOVE IT ALL
	MOVEI	T1,OUTBLK	;ADDRESS OF OUTPUT FILE SPEC SCAN BLOCK
	MOVEI	T2,OUTLEN	;LENGTH, RETURNED TO SCAN
	POPJ	P,		;AND RETURN TO SCAN
;HERE TO APPLY STICKY SWITCHES
APLSTY:	MOVE	T1,PSWICH	;LOAD THE GLOBAL SWITCH
	SKIPGE	FSWICH		;WAS A LOCAL SWITCH SPECIFIED?
	MOVEM	T1,FSWICH	;NO, USE THE  GLOBAL SWITCH
	MOVE	T1,PLOG		;GLOBAL LOG SWITCH
	SKIPGE	FLOG		;LOCAL SPECIFIED?
	MOVEM	T1,FLOG		;NO, USE GLOBAL VALUE
	MOVE	T1,PEXIT	;GLOBAL EXIT SWITCH
	SKIPGE	FEXIT		;LOCAL SPECIFIED?
	MOVEM	T1,FEXIT	;NO, USE GLOBAL VALUE
	MOVE	T1,PCLOSE	;GLOBAL CLOSE SWITCH
	SKIPGE	FCLOSE		;LOCAL SPECIFIED?
	MOVEM	T1,FCLOSE	;NO, USE GLOBAL VALUE
	MOVE	T1,PCREAT	;GLOBAL CREATE SWITCH
	SKIPGE	FCREAT		;LOCAL SPECIFIED?
	MOVEM	T1,FCREAT	;NO, USE GLOBAL VALUE
	MOVE	T1,PXONLY	;GLOBAL XONLY SWITCH
	SKIPGE	FXONLY		;LOCAL SPECIFIED?
	MOVEM	T1,FXONLY	;NO, USE GLOBAL VALUE
	SETCM	T1,FNAME	;GET LOCAL VALUE OF NAME SWITCH
	SETCM	T2,FNAME+1	;DITTO FOR 2ND WORD
	SKIPN	T1		;LOCAL
	SKIPE	T2		;  SPECIFIED?
	JRST	APLST1		;YES, DON'T DEFAULT
	MOVE	T1,PNAME	;GET STICKY VALUE
	MOVEM	T1,FNAME	;STORE THAT
	MOVE	T1,PNAME+1	;GET 2ND WORD
	MOVEM	T1,FNAME+1	;STORE THAT
APLST1:	SKIPE	FACTFL		;LOCAL ACCOUNT SWITCH SPECIFIED?
	POPJ	P,		;YES, RETURN
	MOVE	T1,[PACCT,,FACCT] ;SETUP BLT POINTER
	BLT	T1,FACTFL	;MOVE IT
	POPJ	P,		;RETURN
;HERE TO OUTPUT CHARACTERS FROM SCAN (NORMALLY THROW AWAY OUTPUT UNLESS LOGGING)
TYPE:	JRST	@TYO		;CPOPJ OR PUTCHR

;SUBROUTINE TO SEE IF COMPONENTS OF A FILE SPEC MATCH
;CALLING SEQUENCE:
;	MOVE	T1,USER SUPPLIED COMPONENT
;	MOVE	T2,COMPONENT TO MATCH AGAINST
;	MOVE	T3,MASK
;	PUSHJ	P,MATCHS
;RETURNS CPOPJ IF COMPONENTS DON'T MATCH, CPOPJ1 IF THEY DO

MATCHS:	XOR	T2,T1		;XOR (ACCESS.USR) WITH FILE SPEC
	AND	T2,T3		;APPLY WILD CARD MASK
	JUMPE	T2,.POPJ1##	;JUMP IF MATCH
	POPJ	P,		;NO MATCH

;HERE TO OUTPUT DATA TO ACCESS.LOG IGNORING I/O ERRORS

PUTCHR:	SOSGE	OBUF+2		;BUFFER FULL?
	JRST	[OUTPUT DSK,	;YES, OUTPUT IT
		JRST PUTCHR]	;AND STORE CHARACTER IN THE NEW BUFFER
	IDPB	T1,OBUF+1	;STORE THE CHARACTER
	POPJ	P,		;AND RETURN TO SCAN

;SUBROUTINE TO PROCESS THE /NAME SWITCH
;CALLING SEQUENCE:
;	PUSHJ	P,NAMESW
;ALWAYS RETURNS CPOPJ1 TO AVOID SCAN STORING A VALUE

NAMESW:	PUSHJ	P,.SIXQW##	;READ THE NAME
	MOVE	T1,.NMUL##	;GET FIRST 2 WORDS OF NAME
	MOVE	T2,.NMUL##+1	;  FROM WHERE SCAN STORES THEM
	MOVEM	T1,FNAME	;AND STORE THEM
	MOVEM	T2,FNAME+1	;  WHERE WE WANT THEM
	JRST	.POPJ1##	;SKIP RETURN TO BYPASS STORE


;SUBROUTINE TO PROCESS THE /ACCOUNT SWITCH
;CALLING SEQUENCE:
;	PUSHJ	P,ACCTSW
;ALWAYS RETURNS CPOPJ1 TO AVOID SCAN STORING A VALUE

ACCTSW:	PUSHJ	P,.ASCQW##	;READ THE STRING
	MOVE	T1,[.NMUL##,,FACCT] ;SETUP TO BLT IT TO OUR AREA
	BLT	T1,FACCT+ACTLEN-1 ;MOVE IT ALL
	SETOM	FACTFL		;INDICATE WE HAVE ONE
	JRST	.POPJ1##	;GIVE SKIP RETURN
	SUBTTL	INITIALIZATION

FDINIT:	MOVX	T1,%IPCML	;MAXIMUM LENGTH OF AN IPCF MESSAGE
	GETTAB	T1,		;GET THAT
	  ERROR			;IPCF MUST BE IMPLEMENTED
	MOVE	T2,.JBFF	;FIRST FREE LOCATION IN CORE IMAGE
	HRLM	T1,IPCSDT	;MAX LENGTH IF MESSAGE
	HRRM	T2,IPCSDT	;START OF MESSAGE (WHERE IT WILL BE RECEIVED)
	ADDI	T1,1(T2)	;LAST WORD IN RECEIVE BLOCK
	MOVEM	T1,.JBFF	;STORE THAT AS NEW FIRST FREE LOCATION
	CAMG	T1,.JBREL	;ALREADY HAVE ENOUGH CORE FOR MESSAGE?
	JRST	FDINI1		;YES
	CORE	T1,		;NO, GET ENOUGH CORE
	  ERROR			;WHOOPS
FDINI1:	MOVX	T1,%SIIPC	;PID OF [SYSTEM]IPCC
	GETTAB	T1,		;GET THAT
	  ERROR			;SHOULDN'T HAPPEN
	MOVEM	T1,IPCPID	;SAVE IT
	MOVX	T1,%SIFDA	;OUR PID
	GETTAB	T1,		;GET THAT
	  ERROR			;MUST BE IMPLEMENTED
	MOVEM	T1,OURPID	;SAVE THAT
	JUMPN	T1,.POPJ##	;INITIALIZATION IS COMPLETE IF PID EXISTS
	MOVX	T1,IP.CFP	;PRIVILEGED
	MOVEM	T1,IPS.BL+.IPCFL; SEND
	MOVE	T1,IPCPID	; TO [SYSTEM]IPCC
	MOVEM	T1,IPS.BL+.IPCFR; ..
	MOVX	T1,.IPCSC	;CREATE A PID
	MOVEM	T1,IPS.DT+.IPCS0; ..
	PJOB	T1,		;GET OUR JOB NUMBER
	MOVEM	T1,IPS.DT+.IPCS1;WHO TO CREATE A PID FOR
	PUSHJ	P,FDSEND	;SEND THE REQUEST TO [SYSTEM]IPCC
	PUSHJ	P,FDRECV	;WAIT FOR A RESPONSE
	MOVE	T1,.IPCS2(M)	;PID WHICH WAS CREATED FOR US
	MOVEM	T1,OURPID	;REMEMBER THAT
	MOVX	T1,.IPCSQ	;SET QUOTA
	MOVEM	T1,IPS.DT+.IPCS0; ..
	MOVE	T1,OURPID	;FROM US
	MOVEM	T1,IPS.DT+.IPCS1; ..
	MOVEI	T1,-1		;SET SEND AND RECEIVE QUOTAS TO 777
	MOVEM	T1,IPS.DT+.IPCS2; ..
	PUSHJ	P,FDSEND	;SEND REQUEST TO [SYSTEM]IPCC
	PUSHJ	P,FDRECV	;WAIT FOR A RESPONSE
	MOVX	T1,.IPCWP	;ADD AN ENTRY TO THE SYSTEM PID TABLE
	MOVEM	T1,IPS.DT+.IPCS0; ..
	MOVX	T1,.IPCPF	;WHERE TO ADD IT
	MOVEM	T1,IPS.DT+.IPCS1; ..
	MOVE	T1,OURPID	;PUT OUR PID IN .GTSID
	MOVEM	T1,IPS.DT+.IPCS2; ..
	PUSHJ	P,FDSEND	;ESTABLISH OURSELVES AS [SYSTEM]FILE DAEMON
;	PJRST	FDRECV		;WAIT FOR A RESPONSE
	SUBTTL	IPCF INTERFACE

FDRECV:	MOVX	T1,IP.CFT	;BLOCKING RECEIVE, TRUNCATE IF TOO LONG
	MOVEM	T1,IPR.BL+.IPCFL;STORE FLAGS
	MOVE	T1,IPCSDT	;LENGTH,,ADDRESS OF DATA
	MOVEM	T1,IPR.BL+.IPCFP;STORE THAT IN DESCRIPTOR BLOCK
	MOVE	T1,[6,,IPR.BL]	;IPCF RECEIVE ARGUMENT LIST
	IPCFR.	T1,		;RECEIVE A PACKET
	  CAIA			;ERROR
	JRST	FDREC1		;RECEIVE OK
	CAIE	T1,IPCPR%	;IS IT A PAGE?
	ERROR			;NO, WHOOPS
	MOVX	T1,IP.CFT+IP.CFV;TRUNCATE MESSAGE TO ZERO LENGTH
	MOVEM	T1,IPR.BL+.IPCFL;STORE THAT
	HRRZS	IPR.BL+.IPCFP	;RECIEVE ZERO WORDS
	MOVE	T1,[6,,IPR.BL]	;IPCF RECEIVE ARGUMENT LIST
	IPCFR.	T1,		;PITCH THE PAGE
	  ERROR			;SHOULDN'T HAPPEN
	JRST	FDRECV		;RECEIVE ANOTHER PACKET
FDREC1:	MOVE	T1,IPR.BL+.IPCFL;FLAGS
	TXNE	T1,IP.CFC	;WEED OUT JUNK MAIL (FROM THE SYSTEM)?
	TXNE	T1,IP.CFP+IP.CFT;NO, PRIVILEGED OR TRUNCATED?
	JRST	FDRECV		;YES, PITCH IT
	ANDX	T1,IP.CFM	;ISOLATE TURNED AROUND MESSAGE FIELD
	CAIN	T1,.IPCFN	;A TURNED AROUND MESSAGE?
	JRST	FDRECV		;YES, PITCH IT
	MOVE	T1,IPR.BL+.IPCFL;GET FLAGS AGAIN
	ANDX	T1,IP.CFE	;ISOLATE ERROR FIELD
	JUMPN	T1,FDRECV	;PITCH IT IF NON-ZERO ERROR FIELD
	MOVE	J,IPR.BL+.IPCFC	;FIELD CONTAINING SENDING JOB'S JOB NUMBER
	ANDX	J,IP.SJN	;ISOLATE JOB NUMBER OF SENDER
	HRRZ	M,IPCSDT	;ADDRESS OF THE DATA PORTION OF THE PACKET
	HLL	M,IPR.BL+.IPCFP	;LENGTH OF DATA
	MOVE	D,IPR.BL+.IPCFU	;PPN OF SENDER
	HRRZ	C,M.CODE(M)	;REASON WE WERE CALLED
	CAIE	C,.FLDPG	;SOME FLAVOR OF PROGRAM?
	POPJ	P,		;RETURN TO CALLER
	HLRZ	T1,M.CODE(M)	;YES, TYPE OF ACCESS
	CAIN	T1,FNCCRE	;CREATE?
	MOVX	C,.FLDSC	;YES, SAVE CREATING THE FILE
	CAIN	T1,FNCSUP	;SUPERSEDE?
	MOVX	C,.FLDSS	;YES, SAVE SUPERCEDING AN EXISTING FILE
	HRRM	C,M.CODE(M)	;STORE INTERNALLY GENERATED CODE
	POPJ	P,		;AND RETURN
FDSEND:	MOVE	T1,OURPID	;OUR PID
	MOVEM	T1,IPS.BL+.IPCFS;STORE AS SENDER'S PID
FDSEN1:	MOVE	T1,[4,,IPS.BL]	;IPCF SEND ARGUMENT LIST
	IPCFS.	T1,		;SEND THE MESSAGE
	  CAIA			;ERROR RETURN (ONLY IF NO MONITOR FREE CORE)
	POPJ	P,		;ALL IS WELL, RETURN
	CAXE	T1,IPCRY%	;NO ROOM ERROR?
	ERROR			;NO, WHAT NOW?
	MOVEI	T1,1		;SLEEP ONE SECOND
	SLEEP	T1,		; ..
	JRST	FDSEN1		;AND TRY AGAIN
	SUBTTL	STORAGE

PDL:	BLOCK	PDLL		;PUSH DOWN LIST
NINFIL:	BLOCK	1		;NUMBER OF INPUT FILES
IPCSEQ:	BLOCK	1		;IPCF SEQUENCE NUMBER
SAVFF:	BLOCK	1		;SAVE INITIAL VALUE OF .JBFF
FFAPPN:	BLOCK	1		;FULL FILE ACCESS PPN
IPCSDT:	BLOCK	1		;LENGTH,,ADDRESS OF IPCF RECEIVE DATA
IPCPID:	BLOCK	1		;PID OF [SYSTEM]IPCC
OURPID:	BLOCK	1		;PID OF THE FILE DAEMON
PATHMM:	BLOCK	1		;FLAG SAYING PATHS MUST MATCH
TYO:	BLOCK	1		;OUTPUT ROUTINE'S ADDRESS (CPOPJ OR PUTCHR)
IBUF:	BLOCK	3		;INPUT BUFFER HEADER
OBUF:	BLOCK	3		;OUTPUT BUFFER HEADER
ACTBLK:	BLOCK	ACTLEN		;ACCOUNT STRING READ HERE
OUTBLK:	BLOCK	.FXBFR		;SCAN BLOCK FOR OUTPUT FILE SPEC
	OUTLEN==.FXBFR		;LENGTH OF SCAN BLOCK

	PHASE	0
INBLK:	BLOCK	.FXLEN		;PROTOTYPE INPUT FILE SPEC SCAN BLOCK
I.SWCH:	BLOCK	1		;VALUE OF ACCESS SWITCH
I.LOG:	BLOCK	1		;VALUE OF LOG SWITCH
I.EXIT:	BLOCK	1		;VALUE OF EXIT SWITCH
I.CLOS:	BLOCK	1		;VALUE OF CLOSE SWITCH
I.CRE:	BLOCK	1		;VALUE OF CREATE SWITCH
I.XO:	BLOCK	1		;VALUE OF XONLY SWITCH
I.PRGM:	BLOCK	.FXLEN		;VALUE OF PROGRAM SWITCH
I.NAME:	BLOCK	2		;VALUE OF NAME SWITCH
I.ACCT:	BLOCK	ACTLEN		;VALUE OF ACCOUNT SWITCH
I.ACTFL:BLOCK	1		;ACCOUNT SWITCH SEEN
	INLEN==.-INBLK		;LENGTH OF SCAN BLOCK
	DEPHASE
FPRGM:	BLOCK	.FXLEN		;SCAN BLOCK FOR FILE SPEC FROM PROGRAM SWITCH

SCNBLK:				;SCAN BLOCK USED FOR READING ACCESS.USR
				; AS AN INDIRECT FILE
SCNDEV:	BLOCK	1		;DEVICE
SCNNAM:	BLOCK	2		;SIXBIT /ACCESS/
SCNEXT:	BLOCK	1		;SIXBIT /USR/
SCNMOD:	BLOCK	2		;MODIFIERS
SCNDIR:	BLOCK	2*.FXLND	;PATH TO ACCESS.USR
SCNBKL==.-SCNBLK		;LENGTH OF SCAN BLOCK
	0			;ALWAYS TERMINATE WITH A ZERO
RUNSWT:	BLOCK	1		;SWITCH TO DEFEAT SCAN'S /RUN SWITCH
TMPSWT:	BLOCK	1		;SWITCH TO DEFEAT SCAN'S /TMPFIL SWITCH
FCREAT:	BLOCK	1		;CREATE SWITCH
PCREAT:	BLOCK	1		;STICKY CREATE SWITCH
FSWICH:	BLOCK	1		;FILE SWITCH
PSWICH:	BLOCK	1		;STICKY SWITCH
FLOG:	BLOCK	1		;LOG SWITCH
PLOG:	BLOCK	1		;STICKY LOG SWITCH
PPRGM:	BLOCK	1		;STICKY PROGRAM SWITCH
FEXIT:	BLOCK	1		;EXIT SWITCH
PEXIT:	BLOCK	1		;STICKY EXIT SWITCH
FCLOSE:	BLOCK	1		;CLOSE SWITCH
PCLOSE:	BLOCK	1		;STICKY CLOSE SWITCH
FXONLY:	BLOCK	1		;XONLY SWITCH
PXONLY:	BLOCK	1		;STICKY XONLY SWITCH
FNAME:	BLOCK	2		;NAME SWITCH
PNAME:	BLOCK	2		;STICKY NAME SWITCH
FACCT:	BLOCK	ACTLEN		;LOCAL ACCOUNT SWITCH
FACTFL:	BLOCK	1		;LOCAL ACCOUNT SWITCH SEEN
PACCT:	BLOCK	ACTLEN		;STICKY ACCOUNT SWITCH
PACTFL:	BLOCK	1		;STICKY ACCOUNT SWITCH SEEN
IPS.BL:	BLOCK	3		;IPCF SEND BLOCK
	3,,IPS.DT		;LENGTH,,ADDRESS OF DATA
IPS.DT:	BLOCK	3		;IPCF SEND DATA
IPR.BL:	BLOCK	6		;IPCF RECEIVE BLOCK

FOP.BL:	BLOCK	1		;FILOP BLOCK
FOP.MD:	UU.PHS+.IOASC		;PHYSICAL ONLY, ASCII MODE
FOP.DV:	0			;DEVICE
FOP.BH:	0			;BUFFER HEADERS
FOP.NB:	0			;NUMBER OF BUFFERS
FOP.LB:	LEB.BL			;LOOKUP/ENTER BLOCK ADDRESS
FOP.PB:	10,,PTH.BL		;WHERE TO RETURN PATH TO THE FILE
LEB.BL:	.RBAUT			;EXTENDED LOOKUP/ENTER BLOCK
LEB.PT:	LEB.PB			;ADDRESS OF PATH
LEB.FL:	0			;FILE NAME
LEB.XT:	0			;EXTENSION
LEB.AW:	0			;ATTRIBUTES WORD
LEB.SZ:	0			;SIZE
	BLOCK	.RBAUT-.RBSIZ-1	;UNINTERESTING ARGUMENTS RETURNED FROM EXTENDED LOOKUP
LEB.AT:	0			;AUTHOR OF ACCESS.USR
LEB.PB:	0			;PATH
LEB.SS:	.PTSCY			;SCAN SWITCH
LEB.PP:	0			;PPN
LEB.SF:	BLOCK	5		;SFD'S
	0			;ALWAYS TERMINATE WITH A ZERO
PTH.BL:	0			;PATH BLOCK
PTH.AW:	0			;ATTRIBUTES WORD
PTH.PP:	0			;PPN
PTH.SF:	BLOCK	5		;SFD'S
	0			;ALWAYS TERMINATE WITHA ZERO

ACS.WB:	BLOCK	.DCOWN+1	;WORKING STORAGE FOR PATH AND DSKCHR UUOS


	END	FILDAE