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 ;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, ;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,) 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 FNC FNC FNC FNC FNC FNC FNC FNC FNC FNC FNC FNC FNC FNC 0 ACTION: FNC FNC FNC FNC 0 ;DIRECTORY ACCESS ENTRY NOT REFERENCED FNC FNC 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