mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-01 01:19:17 +00:00
1238 lines
46 KiB
Plaintext
1238 lines
46 KiB
Plaintext
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
|