TITLE REACT - PROGRAM TO MANIPULATE THE ACCOUNTING FILE ;COPYRIGHT (C) 1973,1978,1979,1980,1981,1984,1985,1986,1987,1990 ;BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 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. ; THANKS GIVEN TO C.MORRISON AT THE UNIVERSITY OF TENNESSEE FOR A COPY ; OF HIS EDACT, WHICH PROVIDED INSPIRATION, EXAMPLES. ; VERSION NUMBERS REAVER==33 ;VERSION NUMBER REAMIN==2 ;MINOR VERSION NUMBER REAEDT==246 ;EDIT NUMBER REAWHO==0 ;WHO EDITED LAST %%REAC==: SEARCH ACTPRM,ORNMAC MODULE (REACT) ;THE OBLIGATORY .EXE FILE COPYRIGHT COPYRIGHT (c) 1973,1990 DIGITAL EQUIPMENT CORPORATION. ALL RIGHTS RESERVED. \;END OF COPYRIGHT MACRO ; LOOSE ENDS REPEAT 0,< 1. ASK FOR PSW ON CHANGES BY UNPRIV'ED USERS 2. FIX UP PROCESSING OF DEFAULTED FIELDS. FETCH DEFAULT PROFILE AND CALL A$PDEF. 3. SUPPORT NEW SELECT FUNCTIONS .GE. AND .LE. . 4. TEACH PURGE HOW TO ADD A SELECT BLOCK ON .AEEXP SO THAT WE DON'T GET (SO MANY) UNEXPIRED ENTRIES BACK FROM A$QWLD THAT WE JUST HAVE TO SKIP OVER. 5. ADD A /FAST (AND QUIET) SWITCH TO PURGE AND DELETE THAT WILL PUT THE SELECT AND WILDCARD BLOCKS IN THE UGCUP$ LIST, THUS AVOIDING THE EXTRA IPCF PER DELETE, BUT AT THE EXPENSE OF LONGER ACTDAE PROCESSING TIME AND LESS INDICATION OF WHAT WENT WRONG ON ERRORS. (OPTIONAL) 6. DO PASSWORD DEFAULTING (MUST STUFF DEFAULT PPN [SALT] IN PROFILE). 7. ADD AN UNPRIV'ED TYPEOUT FLAG TO CONTROL WHICH FIELDS GET DISPLAYED FOR UNPRIV'ED USERS. > SUBTTL TABLE OF CONTENTS SUBTTL REVISION HISTORY COMMENT | 200 Rewrite everything. REACT 33(200) and above must be used with version 5 format of SYS:ACCT.SYS, now ACT:ACCT.ACT and ACTDAE version 2(100) and later. /TARL 201 Add support for context and pid quotas. 12-Dec-84 /LWS 202 Add sub command mode for setting/clearing "TYPE of ACCESS". Add LIST command when in one of the sub command modes. Make sure password is set in account if specified by user. 26-Jan-85 /LWS 203 Add "multiple PPN" insert code. Add code to generate random password. 28-Jan-85 /LWS 204 Random bug fixes. Add "acks" when functions complete successfully so user knows what is going on. Start fixing up UPDATE code. 1-Feb-85 /LWS 205 Finish making UPDATE code work. Add LOCK/UNLOCK commands. Remove alot of IFDIEs, more still to go. 13-Feb-85 /LWS 206 Add REQUIRE command. Random bug fixes, more clean up. 7-Mar-85 /LWS 207 Fix device defaulting when specifying "program-to-run". 5-Apr-85 /LWS 210 Insert support for "distribution box" and "personal name". RMS ACCT.ACT changes. /TL 211 Make UPDATE work with RMS. ACCT file is now SYS:ACTDAE.SYS in RMS format. Will we ever make up our minds? /LWS 212 Include password block in UG.ADD message. ACTDAE now knows how to deal with a password block and a profile block. Also, when doing INSERT FOO=BAR, clear .AEFLG, .AEFAI, .AELPC, and .AEPNM in FOO's new profile. 29-Apr-85 /LWS 213 Add new entry to PRTBTS, PRTBTX. If entered at PRTBTX, don't type "-none-" if no bits typed. QAR #868073 30-Apr-85 /LWS 214 Get rid of REEnter routine to set version. ACTRMS just needs to be loaded before REACT. Don't allow non-alpha to be 1st char of username. Allow trailing "]" to be omitted on INSERT command. 13-May-85 /LWS 215 Correct size of FD blocks to be FDXSIZ instead of FDMSIZ. 23-Jul-85 /DPM 216 Fix up SPOOL and WATCH bit comparison routines to use the correct AC when calling GENCMP. 23-Jul-85 /DPM 217 Add new options to allow a site to prohibit a user from changing his password. Note that the system administrator can always change the password. 23-Jul-85 /DPM 220 Allow REACT to be run by anyone with administrative privs (JP.ADM). 24-Jul-85 /DPM 221 Massive cleanup. 10-Aug-85 /DPM 222 Give up on trying to clean the thing up. Rewrite 95% of it. Major changes include: 1. Use of wildcarding facilites in ACTDAE. 2. A little consistancy in the command syntax. 3. Make CHANGE smarter (wildcards, etc.). 4. Add HELP command and internal on-line documentation. 5. Remove PRINT command (see LIST). 6. Give all sub-command modes the same common commands. 7. Do nice things with customer-defined commands and profile entries. 21-Aug-85 /DPM 223 Miscellaneous buggers. UPDATE still doesn't work. 6-Sep-85 /DPM 224 Make UPDATE work. Selective restore isn't implemented yet although the command will accept a wildcarded user-id. Implement suggestion to change name of UPDATE command to VERIFY since the command syntax UPDATE/LIST-ONLY doesn't make a whole lot of sense. 225 Update to know about profile format version 6 and the corresponding changes to UGCUP$. 19-Nov-85 /RCB 226 Fix some bugs in SELECT logic. 24-Nov-85 /RCB 227 Correctly delete extensible blocks rather than truncating them to then to two words. Add the PURGE command that works like the old REACT P command in days of old. Fix off-by-one bug in mail address block length computation. 2-Dec-85 /DPM 230 Correct deficiencies with INSERT and CHANGE having to do with defaulting of profiles and detecting which entries we really did modify. 17-Jan-86 /RCB 231 Fix some bugs with SELECT, wildcard changes, and changes to .AEPCT and .AEPRX. 7-Mar-86 /RCB 232 Fix up VERIFY for debugging. 7-Mar-86 /RCB 233 The special privilege fields (DSKPRI, HPQ, & OPR) could not be modified in isolation, since they didn't SETOM @CHGADR. They do now. 14-Mar-86 /RCB 234 Add routine PROFSP which will correctly detect null filespec blocks. Used by PRGGET routine (program to run). 18-Aug-86 /DPM 235 Fix more SELECT logic for bit-masked fields. If the bit mask shows that no keywords were typed, don't insert the change block. 1-Dec-86 /RCB 236 Fix the automatic generation of passwords to finish the syllable rather than simply truncating at the requested length. This way, maybe we can restore the original goal of a pronouncable password. 1-Dec-86 /RCB 237 Change to use new STOPCD macro rather than old $STOP macro. 2-Dec-86 /RCB 240 Fix bug with VERIFY where an account is missing from the master file at EOF. While both files should probably have had [%,%] records, we still shouldn't loop trying to re-insert the last ppn that was in the file. Besides, we were using signed comparisons on what RMS considers to be unsigned keys, so even if both files had contained [%,%] records, we would only have done stupid things if there was a discrepancy with the last positive ppn. While we're at it, display the right profile when one is missing from the working file, and interpret the "NO" answer to "Preserve changes?" as meaning not to preserve the deletion. 10-Feb-87 /RCB 241 Fix bug where short .AEAUX blocks (not even multiples of .AULEN) stay short ever after, even if we want to modify the bits of the last str. 15-May-87 /RCB 242 Fix bug where a user's expiry date is printed incorrectly when attempting to delete the profile, and the date is non-infinite. 18-Aug-87 /JJF SPR:35717 243 Correct problems with inserting PPNs with 1B18 turned on. 5-Jan-89 /DPM (SPR 10-35597) 244 Do not use %CNDAE for checking the monitor version; that is for use only by DAEMON. Use %CNDVN instead. 29-Nov-89 /DPM 245 Rich tells me that if MX ever gets fixed to handle non-local forwarding via .AEMAI that it will really want to see "user@node" rather than the current "node::user", so fix how handle the entry. "node::user" will be accepted, but converted to "user@node". "user@node" will also be valid for typein. 246 Non-standard profile defaults cannot be assigned to accounts where the project numbers differ (i.e. [10,56] cannot have a profile default of [1,%]). Include CM%WLA in the parse block. 27-Mar-90 /DPM 02-Jan-90 /RCB END REVISION HISTORY | SUBTTL ASSEMBLY PARAMETERS ; ASSEMBLY PARAMETERS XP PDLSIZ,400 ;SIZE OF STACK XP ACTFMT,6 ;ACCOUNTING FILE FORMAT WE KNOW ABOUT XP CATMAX,^D20 ;CATALOG RESPONSE BLOCK LENGTH XP DEFPSZ,^D6 ;NUMBER OF CHARACTERS IN GENERATED PASSWORD XP ZZTIME,^D60 ;MAXIMUM TIME TO WAIT FOR QUEUE. UUO RESPONSE XP DEFPCI,^D365 ;MAXIMUM PASSWORD CHANGE INTERVAL XP PTMHRS,1777B17 ;PRIME TIME HOURS ;WEEKDAYS 08-17 XP NPTHRS,<-1^!PTMHRS> ;NON-PRIME TIME HOURS ;WEEKDAYS 00-07, 18-23; WEEKENDS 00-23 XP ALLPRV,-1 ;DEFAULT PRIV WORD FOR ALL PRIVS XP REMOPR,2 ;REMOTE OPERATOR PROGRAMMER NUMBER XP SYSPRJ,10 ;PROJECT ALLOWED SYSTEM OPR PRIVS XP HSTPRJ,30 ;PROJECT ALLOWED HOST OPR PRIVS XP GLXPRJ,50 ;PROJECT NUMBER FOR GALACTIC WIZARDS XP DEFQTA,^D1000 ;DEFAULT QUOTA XP DEFQTO,DEFQTA ;DEFAULT 'OUT' QUOTA XP STATBT,0 ;DEFAULT STRUCTURE STATUS BITS SUBTTL LOWSEG RELOC 0 PDL: BLOCK PDLSIZ ;STACK UNPRIV::BLOCK 1 ;NON-ZERO FOR UNPRIV'ED USERS MONVER::BLOCK 1 ;MONITOR VERSION OLDMON::BLOCK 1 ;MONVER INDICATES NO QUEUE. UUO TIMEOUT SUPPORT FFAPPN::BLOCK 1 ;[1,2] MYPPN:: BLOCK 1 ;GETPPN RESULT ALTRBK::BLOCK UW$MIN ;ALTERNATE WILDCARD BLOCK ALTRAK::BLOCK .AANLW ;ALTERNATE ACK TEXT ALTRBP::BLOCK 1 ;ALTERNATE BYTE POINTER TO ACK TEXT ALTRPP::BLOCK 2 ;ALTERNATE WILD PPN BASE WILDBK::BLOCK PAGSIZ ;WORKING WILDCARD BLOCK WILDAK::BLOCK .AANLW ;WORKING ACK TEXT SELPTR: BLOCK 1 ;AOBJN POINTER TO SELECTION BLOCK ZBEG:! INSFLG: BLOCK 1 ;NON-ZERO IF DOING INSERT SELFLG: BLOCK 1 ;NON-ZERO IF BUILDING SELECTION CRITERIA SELFNC: BLOCK 1 ;SELECT FUNCTION PARBUF: BLOCK PAGSIZ ;SCRATCH BLOCK FOR PARSER PARBLK: BLOCK PAR.SZ ;PARSER BLOCK HELPBF: BLOCK <^D80/5>+1 ;TEMPORARY STORAGE FOR 80 CHARACTER HELP BANNER LISTFL: BLOCK 1 ;LIST FLAG LSTIFN: BLOCK 1 ;SAVED IFN FOR LIST FILE PROARG: BLOCK 2 ;PROFILE COMMAND TABLE AND PROMPT DEFUSR::BLOCK 5 ;DEFAULT USER-ID STRING DEFTX1::BLOCK 5 ;DEFAULT TEXT STRING #1 DEFTX2::BLOCK 5 ;DEFAULT TEXT STRING #2 DEFTX3::BLOCK 5 ;DEFAULT TEXT STRING #3 PPNTXT: BLOCK 4 ;SCRATCH PAD STORAGE FOR ASCIZ PPN STRNAM: BLOCK 1 ;STRUCTURE NAME FOR CATALOG AUXBLK: BLOCK .AULEN ;AUXACC BLOCK FOR PARSER DEFAULTING AUXPTR: BLOCK 1 ;AOBJN POINTER TO AUXBLK AUXTMP: BLOCK .AUMAX+.AULEN ;[241] AUXACC STORAGE FOR ADD/REMOVE WILDBP::BLOCK 1 ;WORKING BYTE POINTER TO ACK TEXT WILDPP::BLOCK 2 ;WORKING WILD PPN BASE DEFSRC: BLOCK 1 ;NON-ZERO IF DEFAULT PROFILE SEARCHING WANTED DEFPPN: BLOCK 1 ;DEFAULT PPN FOUND FLAG WLDINS: BLOCK 1 ;NON-ZERO IF WILDCARDED INSERT PROFAI: BLOCK 1 ;COUNT OF PROCESSED PROFILE FAILURES PROSUC: BLOCK 1 ;COUNT OF PROCESSED PROFILE SUCCESSES QUEBLK: BLOCK .AEMAX ;GIVE ROOM FOR A PROFILE QUEBLN==.-QUEBLK ;UUO BLOCK LENGTH (FOR QINIT) QUEPTR: BLOCK 1 ;AOBJN POINTER FOR FILLING QUEBLK RSPBLK: BLOCK .AEMAX ;RESPONSE BLOCK CATACK: BLOCK CATMAX ;CATALOG RESPONSE BLOCK PMRINC: BLOCK 1 ;PROGRAMMER NUMBER INCREMENT FOR INSERT PMRCNT: BLOCK 1 ;COUNT OF PPN'S TO GENERATE PMRPRT: BLOCK 1 ;PROMPT FOR USER NAME FLAG ON WILD INSERT PMRPSW: BLOCK 1 ;PROMPT FOR PASSWORD FLAG ON WILD INSERT PMRPWD: BLOCK 1 ;DEFAULT PASSWORD IF NON-ZERO DELASK: BLOCK 1 ;FLAG FOR CONFIRM ON DELETE EXPDTM: BLOCK 1 ;EXPIRATION DATE/TIME FOR PURGE COMMAND FDBLK:: BLOCK FDXSIZ ;RANDOM FD FOR PROFILE ENTRY PROCESSING SWTTAB:! ;SWITCH STORAGE TABLE SWTASK: BLOCK 1 ;/ASK SWTDET: BLOCK 1 ;/DETAIL /FAST SWTCLR: BLOCK 1 ;/CLEAR SWTRPT: BLOCK 1 ;/REPORT SWTUPD: BLOCK 1 ;/UPDATE SWTLEN==.-SWTTAB ;LENGTH OF TABLE FNASIZ==<<<6+1+6+1+3+1+6+1+6>+<5*<6+1>+1>>/5>+1 MASTFN: BLOCK FNASIZ ;MASTER FILE NAME WORKFN: BLOCK FNASIZ ;WORKING FILE NAME TEMPFN: BLOCK FNASIZ ;TEMPORARY FILE NAME MASTFD: BLOCK FDXSIZ ;MASTER FILE NAME WORKFD: BLOCK FDXSIZ ;WORKING FILE NAME TEMPFD: BLOCK FDXSIZ ;TEMPORARY FILE NAME MASTWB: BLOCK UW$MIN ;MASTER WILDCARD BLOCK WORKWB: BLOCK UW$MIN ;WORKING FILE WILDCARD BLOCK TEMPWB: BLOCK UW$MIN ;TEMPORARY FILE WILDCARD BLOCK MASTEF: BLOCK 1 ;MASTER FILE EOF FLAG WORKEF: BLOCK 1 ;WORKING FILE EOF FLAG VERRFB: BLOCK FOB.SZ ;A FOB FOR READING VERWFB: BLOCK FOB.SZ ;A FOB FOR WRITING VERALL: BLOCK 1 ;NON-ZERO IF VERIFYING ALL PROFILES VERDIF: BLOCK 1 ;NON-ZERO IF VERIFY ENCOUNTERED DIFFERENCES VERABO: BLOCK 1 ;NON-ZERO IF VERIFY ABORTED ZEND:! ZSIZ==.-ZBEG CMDPTR: BLOCK 1 ;ADDRESS OF COMMAND TABLE CMDKEY: BLOCK PB%SIZ ;PARSER BLOCK (KEYWORDS) CMDHLP: BLOCK PB%SIZ ;PARSER BLOCK (HELP) ENTKPT::BLOCK 1 ;ADDRESS OF PROFILE ENTRY TABLE ENTHPT::BLOCK 1 ;ADDRESS OF PROFILE HELP TABLE ENTKEY::BLOCK PB%SIZ ;PARSER BLOCK (KEYWORDS) ENTDEF::BLOCK PB%SIZ ;PARSER BLOCK ("DEFAULT") ENTHLP::BLOCK PB%SIZ ;PARSER BLOCK ("HELP") ENTRST::BLOCK PB%SIZ ;PARSER BLOCK ("RESTORE") ENTSLC::BLOCK PB%SIZ ;PARSER BLOCK ("SELECT") CHGCTR::BLOCK 1 ;CHANGE TABLE WORD COUNT CHGPTR::BLOCK 1 ;CHANGE TABLE ADDRESS CHGADR::BLOCK 1 ;CHANGE TABLE INDEX FOR CURRENT PROFILE ENTRY CHGMSK::BLOCK .AEMIN ;BLOCK OF CHANGE FLAGS CHGMS2: BLOCK .AEMIN ;COPY OF CHGMSK DURING PROUPD PRSDFV::BLOCK 1 ;LOCATION TO TWEAK FOR CG.DFL CALLS MAICNT: BLOCK 1 ;MAILING ADDRESS BYTE COUNT MAIPTR: BLOCK 1 ;MAILING ADDRESS BYTE POINTER TEMP: BLOCK .AEMAX ;TEMPORARY PROFILE STORAGE USER: BLOCK .AEMAX ;CURRENT USER'S PROFILE USER2: BLOCK .AEMAX ;DEFAULT USER'S PROFILE USER0: BLOCK .AEMAX ;PROFILE TO SETUP .AEMAP CORRECTLY PASSHD: BLOCK ARG.DA ;PARSER DATA BLOCK HEADER PASSWD: BLOCK .APWLW ;PASSWORD ROOT: BLOCK 1 ;RANDOM NUMBER GENERATOR SEED RESPPN: BLOCK 1 ;RESERVED PROFILE BEING INSERTED DEBUGQ: BLOCK 1 ;DON'T TIME OUT QUEUE. UUOS ACTPID: BLOCK 1 ;PID TO STUFF INTO .QUPID WHEN DEBUGGING QUETMP: BLOCK 2 ;BI-WORD FOR QUECHG TO INSERT MASKED VALUES RELOC ;BACK TO HISEG PDLPTR: IOWD PDLSIZ,PDL ;STACK POINTER IB: $BUILD (IB.SZ) ;SIZE OF INIIALIZATION BLOCK $SET (IB.PRG,,%%.MOD);PROGRAM NAME $SET (IB.OUT,,OUTLST);TERMINAL OUTPUT $SET (IB.FLG,IT.OCT,1);REQUIRE COMMAND TERMINAL $SET (IB.FLG,IB.NPF,1);NO TIMER TRAPS!!! $EOB LST: $BUILD (FOB.SZ) ;SIZE OF FILE OPEN BLOCK $SET (FOB.CW,FB.BSZ,7);BYTE SIZE IS ASCII $EOB ;END OF BLOCK ;FD's for current ACCT file and temp ACCT file for VERIFY command CURFD: $BUILD (FDXSIZ) $SET (.FDLEN,FD.LEN,FDXSIZ) ;SIZE OF FD $SET (.FDLEN,FD.TYP,.FDNAT) ;NATIVE FILESPEC $SET (.FDSTR,,SIXBIT\SYS\) ;"SYS:ACTDAE.SYS" $SET (.FDNAM,,SIXBIT\ACTDAE\) $SET (.FDEXT,,SIXBIT\SYS\) $EOB TMPFD: $BUILD (FDXSIZ) $SET (.FDLEN,FD.LEN,FDXSIZ) ;SIZE OF FD $SET (.FDLEN,FD.TYP,.FDNAT) ;NATIVE FILESPEC $SET (.FDSTR,,SIXBIT\DSK\) ;"DSK:REACT.TMP" $SET (.FDNAM,,SIXBIT\REACT\) $SET (.FDEXT,,SIXBIT\TMP\) $EOB ; USER NAME BREAK MASK NAMBRK: 777777,,777760 ;BREAK ON ALL CONTROL 777554,,001750 ;ALLOW * - ? AND 0-9 400000,,000760 ;ALLOW UC A-Z 400000,,000760 ;ALLOW LC A-Z ; PASSWORD BREAK MASK PSWBRK: 777777,,777760 ;BREAK ON ALL CONTROL 000000,,000000 ;ALLOW ALL PUNCTUATION AND DIGITS 000000,,000000 ;ALLOW UC A-Z 000000,,000000 ;ALLOW LC A-Z ; TEXT BREAK MASK FOR UNQUOTED STRINGS TXTBRK: 777777,,777760 ;BREAK ON ALL CONTROL 777754,,001760 ;ALLOW - AND 0-9 400000,,000760 ;ALLOW UC A-Z 400000,,000760 ;ALLOW LC A-Z ; ARBITRARY NODE NAME BREAK MASK NNMBRK: 777777,,777760 ;BREAK ON ALL CONTROL 777744,,001760 ;ALLOW - AND . AND 0-9 400000,,000760 ;ALLOW UC A-Z 400000,,000760 ;ALLOW LC A-Z ;SET TO DEFINE THE TABLE USED TO QUEUE THE CHANGES FOR ACTDAE DEFINE AE (NAM,LEN,BITS,RTN),,> QUETAB: AEPROF QUETBL==.-QUETAB ;LENGTH OF TABLE PURGE AE ;DUMP THE SYMBOL TABLE SPACE ;Tables describing the format of USER. Byte pointers defined where ;appropriate, offsets defined elsewhere. ; ;The use of these values is entirely voluntary, but highly recommended so ;as to provide a single place to change when fiddling with formats. USRNAM: POINT 8,.AENAM(U) ;INITIAL BPT TO USERNAME USRNM2: POINT 8,.AENAM(X) ;ALTERNATE NAME (USED DURING BACKUP) CORPHY: POINTR .AECOR(U),AE.NPP ;PHYSICAL CORE LIMIT CORVRT: POINTR .AECOR(U),AE.NVP ;VIRTUAL CORE LIMIT IPCFS: POINTR .AEIPC(U),AE.SND ;IPCF SEND QUOTA IPCFR: POINTR .AEIPC(U),AE.RCV ; RECEIVE QUOTA IPCFP: POINTR .AEIPC(U),AE.PID ; MAXIMUM NUMBER OF PIDS CTXCNQ: POINTR .AECTX(U),AE.CNQ ;MAXIMUM NUMBER OF CONTEXTS CTXCPQ: POINTR .AECTX(U),AE.CPQ ;MAXIMUM NUMBER OF IDLE CONTEXT PAGES SCHED: POINTR .AESCD(U),AE.SCD ;SCHEDULAR TYPE NONE7:: ASCIZ /-none-/ NONE8:: BYTE(8) "-","n","o","n","e","-",0 SUBTTL PROGRAM INITIALIZATION LOC 137 EXP <%%REAC==:%%REAC> RELOC REACT: JFCL ;NO CCL RESET ;CLEAR THE WORLD'S STATUS MOVE P,PDLPTR ;GET POINTER TO PUSH DOWN LIST MOVEI S1,IB.SZ ;SIZE OF IB MOVEI S2,IB ;POINTER TO INITIALIZATION BLOCK PUSHJ P,I%INIT## ;INITIALIZE GLXLIB MOVEI S1,'REA' ;REACT PREFIX MOVEI S2,0 ;NO ERROR SUBROUTINE PUSHJ P,A$ERRI## ;INIT ERROR PROCESSOR SETZB S1,S2 ;NO TIMER TRAPS PUSHJ P,P$INIT## ;INITIALIZE PARSER MOVE T1,[%CNDVN] ;GETTAB ARGUMENT GETTAB T1, ;GET MONITOR VERSION SETZ T1, ;ANCIENT MONITOR LDB T1,[POINT 9,T1,11] ;GET MONITOR VERSION MOVEM T1,MONVER ;SAVE MONITOR VERSION CAIGE T1,703 ;IS IT A MONITOR WITH QUEUE. UUO TIMEOUTS? SETOM OLDMON ;NO, FLAG THE DEFICIENCY SETOM UNPRIV ;ASSUME AN UNPRIVILEGED USER MOVE T1,[%LDFFA] ;ARGS GETTAB T1, ;GET FFA PPN MOVE T1,[1,,2] ;DEFAULT MOVEM T1,FFAPPN ;SAVE FOR LATER PRIV TESTS HRROI T2,.GTPPN ;ARGS GETTAB T2, ;GET OUR PPN SETZ T2, ;??? MOVEM T2,MYPPN ;SAVE FOR LATER USE HRROI T3,.GTPRV ;ARGS GETTAB T3, ;GET OUR PRIV WORD SETZ T3, ;??? ; CAME T1,T2 ;FULL FILE ACCESS? TXNE T3,JP.ADM ; OR ADMINISTRATIVE PRIVS? SETZM UNPRIV ;ALLOW ACCESS TO PRIV'ED KEYWORDS PUSHJ P,CMDINI ;INITIALIZE COMMAND TABLE PUSHJ P,ENTINI ;INITIALIZE PROFILE ENTRY TABLE SETZM USER0 ;CLEAR A WORD MOVE S1,[USER0,,USER0+1] ;TRANSFER WORD BLT S1,USER0+.AEMAX-1 ;CLEAR OUT PROTOTYPE PROFILE MOVX S1,FLD(ACTFMT,AE.VRS)!FLD(.AEMIN,AE.LEN) ;GET OVERHEAD WORD MOVEM S1,USER0+.AEVRS ;SET IT UP SETOM USER0+.AEMAP ;START OFF WITH ALL DEFAULTS MOVE S1,[USER0+.AEMAP,,USER0+.AEMAP+1] ;DITTO BLT S1,USER0+.AEMAP+.AMPLW-1 ;SMEAR SOME BITS MOVEI T1,USER0 ;POINT TO PROFILE TO USE MOVEI T2,USER0 ;SOURCE & DESTINATION PUSHJ P,A$PDEF## ;MAKE THE BITS BE CONSISTENT WITH CHGTAB MOVEI S1,SP.ACT ;ACTDAE'S SYSTEM PID INDEX $CALL C%RPRM ;GET ITS PID MOVEM S1,ACTPID ;SAVE FOR .QUPID PUSHJ P,SELINI ;INITIALIZE SELECTION AOBJN POINTER JRST MAIN ;GO ENTER TOP LEVEL COMMAND LOOP CMDINI: PUSHJ P,.SAVE1 ;SAVE P1 HLRZ S1,CMDDEC ;GET COUNT OF DEC-DEFINED COMMANDS HLRZ S2,CMDCUS## ;GET COUNT OF CUSTOMER-DEFINED COMMANDS SKIPN UNPRIV ;UNPRIV'ED USER? JRST CMDIN1 ;NO HLRZ S1,CMDDUP ;GET COUNT OF DEC-DEFINED COMMANDS HLRZ S2,CMDCUP## ;GET COUNT OF CUSTOMER-DEFINED COMMANDS CMDIN1: ADDI S1,1(S2) ;TOTAL THEM UP PUSHJ P,M%GMEM ;GET SOME CORE MOVEM S2,CMDPTR ;SAVE FOR PARSING SUBI S1,1 ;DON'T COUNT THE OVERHEAD WORD MOVEM S1,@CMDPTR ;SAVE WORD COUNT TOO MOVEI P1,CMDDUP ;POINT TO DEC-DEFINED UNPRIV'ED TABLE SKIPN UNPRIV ;TEST MOVEI P1,CMDDEC ;POINT TO DEC-DEFINED PRIV'ED TABLE PUSHJ P,CMDIN2 ;LOAD WORKING COMMAND TABLE MOVEI P1,CMDCUP## ;POINT TO CUSTOMER-DEFINED UNPRIV'ED TABLE SKIPN UNPRIV ;TEST MOVEI P1,CMDCUS## ;POINT TO CUSTOMER-DEFINED TABLE CMDIN2: HLRZ S1,(P1) ;GET NUMBER OF ENTRIES IN TABLE JUMPE S1,.RETT ;RETURN IF TABLE IS EMPTY MOVNS S1 ;NEGATE HRL P1,S1 ;GET -LENGTH HRRI P1,1(P1) ;MAKE AN AOBJN POINTER CMDIN3: MOVE S1,CMDPTR ;POINT TO TABLE HEADER MOVE S2,(P1) ;GET KEYWORD ADDRESS PUSHJ P,S%TBAD ;INSERT INTO TABLE SKIPT ;CHECK FOR ERRORS STOPCD (CIF,HALT,,) AOBJN P1,CMDIN3 ;LOOP MOVE S1,[CMDKBK,,CMDKEY] ;SET UP BLT BLT S1,CMDKEY+PB%SIZ-1 ;COPY MOVE S1,CMDPTR ;GET TABLE ADDRESS MOVEM S1,CMDKEY+1+.CMDAT ;SAVE MOVE S2,[CMDHBK,,CMDHLP] ;SET UP BLT BLT S2,CMDHLP+PB%SIZ-1 ;COPY MOVEM S1,CMDHLP+1+.CMDAT ;UPDATE WITH CORRECT TABLE ADDRESS $RETT ;AND RETURN ; DUMMY PARSER DATA BLOCK FOR COMMANDS CMDKBK: $KEYDSP (.) BLOCK PB%SIZ-<.-CMDKBK> ; DUMMY PARSER DATA BLOCK FOR HELP CMDHBK: $KEY (CONFRM,.,<$ALTER(CONFRM)>) BLOCK PB%SIZ-<.-CMDHBK> SUBTTL COMMAND PROCESSING -- MAIN - TOP LEVEL DISPATCH MAIN: MOVE P,PDLPTR ;GET STACK POINTER SETZM ZBEG ;CLEAR A WORD MOVE S1,[ZBEG,,ZBEG+1] ;XFER VECTOR BLT S1,ZEND-1 ;CLEAR THE ZEROABLE STORAGE MOVEI S1,CMDTAB ;PARSER TABLE MOVEI S2,[ASCIZ \REACT>\] ;PROMPT STRING PUSHJ P,PRSCMD ;PARSE THE COMMAND JUMPF MAIN ;IF FAILS, TRY AGAIN PUSHJ P,P$KEYW## ;GET A KEYWORD JUMPF PRSERR ;COMPLAIN IF PROBLEMS PUSHJ P,(S1) ;DISPATCH JRST MAIN ;AND DO IT AGAIN SUBTTL COMMAND PROCESSING -- CMDDEC - DEC-DEFINED COMMAND TABLES ; PRIVILEGED ADMINISTRATIVE COMMANDS CMDDEC: $STAB DSPTAB ( ,CTRLZ ,\"32,CM%INV) DSPTAB (CHAN00,CHANGE,) DSPTAB (DELE00,DELETE,) DSPTAB (EXIT00,EXIT ,) DSPTAB (HELP00,HELP ,) DSPTAB (INSE00,INSERT,) DSPTAB (LIST00,LIST ,) DSPTAB (LOCK00,LOCK ,) DSPTAB (SELE00,SELECT,,,VERIOX) VEROER: WARN (OER,,,VERIOX) VERUER: WARN (UER,,,VERIOX) VERIOX: SETOM VERABO ;LITE THE ABORT FLAG $RETF ;RETURN ; DUMMY ROUTINES FOR ACTCHG UGAUX%::$RETF SUBTTL PARSING ROUTINES -- PRSCMD - SCAN A COMMAND ;Call ; S1/ Parser table ; S2/ Prompt string ;Return ; RETT - Command parsed ; RETF - Otherwise, error message issued. PRSCMD::MOVEM S1,PARBLK+PAR.TB ;PARSE TABLE ADDRESS MOVEM S2,PARBLK+PAR.PM ;PROMPT STRING ADDRESS PRSCM1: MOVE S1,[PARBUF,,PARBUF+1] ;SET UP BLT SETZM PARBUF ;CLEAR FIRST WORD BLT S1,PARBUF+PAGSIZ-1 ;CLEAR PARSER PAGE MOVEI S1,PARBUF ;SCRATCH AREA FOR PARSING MOVEM S1,PARBLK+PAR.CM MOVEI S2,COM.SZ-1 ;SIZE OF SCRATCH HEADER STORE S2,.MSTYP(S1),MS.CNT ;INITIALIZE SCRATCH BLOCK SETZM PARBLK+PAR.SR ;INPUT COMES FROM TTY MOVEI S1,PAR.SZ ;SIZE OF PARSER BLOCK MOVEI S2,PARBLK ;LOCATION OF PARSER BLOCK PUSHJ P,PARSER## ;PARSE A COMMAND JUMPF PRSCM2 ;ON ERROR, BITCH. MOVEI S1,COM.SZ+PARBUF ;POINT TO TOKENS PUSHJ P,P$SETU## ;SET UP FOR RETRIEVAL $RETIT ;AND RETURN IF ALL IS WELL PRSCM2: WARN (CME,,,PRSCM1) ; HERE ON FATAL ERRORS PRSERR::FATAL (CPF,) SUBTTL PARSING ROUTINES -- PRSSWT - SWITCHES PRSSWT: MOVE S1,[SWTTAB,,SWTTAB+1] ;SET UP BLT SETOM SWTTAB ;INIT FIRST WORD BLT S1,SWTTAB+SWTLEN-1 ;INIT SWITCH STORAGE PRSSWX: PUSHJ P,P$SWIT## ;GET A SWITCH JUMPF P$CFM## ;NOT THERE--TRY FOR EOL AND RETURN HRRZ S2,(S1) ;GET SWITCH STORAGE ADDRESS HLRZ S1,(S1) ;GET VALUE TO STORE MOVEM S1,(S2) ;SAVE IT JRST PRSSWX ;LOOP BACK FOR MORE SUBTTL PARSING ROUTINES -- PRSWLD - USER ID PRSWLD::MOVEI T1,WILDBK ;POINT TO WILDCARD BLOCK MOVE T2,[POINT 8,WILDAK] ;BYTE POINTER TO ACK TEXT MOVEM T2,WILDBP ;SAVE FOR SUMMARY PUSHJ P,A$PWLD## ;PARSE A USER-ID $RETIF ;CHECK FOR ERRORS SETZM PROFAI ;ZERO FAILURE COUNTER SETZM PROSUC ;ZERO SUCCESS COUNTER $RETT ;RETURN PRSALT::MOVEI T1,ALTRBK ;POINT TO WILDCARD BLOCK MOVE T2,[POINT 8,ALTRAK] ;BYTE POINTER TO ACK TEXT MOVEM T2,ALTRBP ;SAVE FOR SUMMARY PUSHJ P,A$PWLD## ;PARSE A USER-ID $RETIF ;CHECK FOR ERRORS $RETT ;RETURN SUBTTL UTILITY ROUTINES -- CVTPPD - CONVERT A PPN FOR DETAILED LISTING ; CALL: MOVE U, PROFILE BLOCK ADDRESS ; PUSHJ P,CVTPPD ; ; ON RETURN, S1 CONTAINS THE ADDRESS OF THE ASCIZ TEXT CVTPPD: PUSHJ P,.SAVE2 ;SAVE P1 AND P2 MOVEI P1,[ITEXT (<^O/S1/>)] MOVEI P2,[ITEXT (<^O/S2/>)] HLRZ S1,.AEPPN(U) ;GET PROJECT NUMBER HRRZ S2,.AEPPN(U) ;AND PROGRAMMER NUMBER CAIN S1,-1 ;DEFAULT PROJECT? MOVEI P1,[ITEXT (<%>)] ;YES CAIN S2,-1 ;DEFAULT PROGRAMMER? MOVEI P2,[ITEXT (<%>)] ;YES CAIN S2,-2 ;WILD PROGRAMMER? MOVEI P2,[ITEXT (<#>)] ;YES $TEXT (<-1,,PPNTXT>,<[^I/(P1)/,^I/(P2)/]^0>) MOVEI S1,PPNTXT ;POINT TO TEXT POPJ P, ;AND RETURN SUBTTL UTILITY ROUTINES -- CVTPPF - CONVERT A PPN FOR FAST LISTING ; CALL: MOVE U, PROFILE BLOCK ADDRESS ; PUSHJ P,CVTPPF ; ; ON RETURN, S1 CONTAINS THE ADDRESS OF THE ASCIZ TEXT CVTPPF: PUSHJ P,.SAVE2 ;SAVE P1 AND P2 MOVEI P1,[ITEXT (<^O6R /S1/>)] MOVEI P2,[ITEXT (<^O6L /S2/>)] HLRZ S1,.AEPPN(U) ;GET PROJECT NUMBER HRRZ S2,.AEPPN(U) ;AND PROGRAMMER NUMBER CAIN S1,-1 ;DEFAULT PROJECT? MOVEI P1,[ITEXT (< %>)] ;YES CAIN S2,-1 ;DEFAULT PROGRAMMER? MOVEI P2,[ITEXT (<% >)] ;YES CAIN S2,-2 ;WILD PROGRAMMER? MOVEI P2,[ITEXT (<# >)] ;YES $TEXT (<-1,,PPNTXT>,<^I/(P1)/,^I/(P2)/^0>) MOVEI S1,PPNTXT ;POINT TO TEXT POPJ P, ;AND RETURN SUBTTL UTILITY ROUTINES -- PRTBTS - BIT TABLE DRIVEN OUTPUT ; PRTBTS - PRINT OUT NAMES OF BITS WHICH ARE ON ; PRTBTX - SAME AS ABOVE, EXCEPT, IF NONE, DON'T TYPE "-NONE-" ; CALL: MOVE S1, IOWD TO TABLE OF BYTE POINTERS,,ASCIZ NAMES PRTBTX::TDZA S2,S2 PRTBTS::SETOM S2 ;INDICATE ENTRY JUMPGE S1,.POPJ ;RETURN IF TABLE IS EMPTY PUSHJ P,.SAVET ;SAVE T ACS SETO T3, ;COUNT ARGS TYPED OUT PRTBT1: HLRZ T1,1(S1) ;GET POINTER TO BYTE POINTER LDB T2,(T1) ;GET BYTE JUMPE T2,PRTBT2 ;NOTHING THERE, IGNORE HRRZ T1,1(S1) ;GET POINTER TO ASCIZ NAME AOSE T3 ;INCREMENT NUMBER OF ARGS TYPED OUT $TEXT (,<, ^A>) ;SEPARATE FROM PREVIOUS ARBUMENT $TEXT (,<^T/(T1)/^A>) ;TYPE IT OUT PRTBT2: AOBJN S1,PRTBT1 ;LOOP SKIPGE T3 ;DID WE TYPE ANYTHING? JUMPE S2,.POPJ ;NO, RETURN IF WE DON'T SAY SO SKIPGE T3 ;TYPE ANYTHING? $TEXT (,<-none-^A>) ;NO, INDICATE THE FACT $TEXT (,<>) ;END IT WITH A CRLF POPJ P, ;RETURN SUBTTL UTILITY ROUTINES -- TYPUSR - DISPLAY A PROFILE ; HERE TO DUMP A PROFILE ON THE TERMINAL OR TO A FILE ; CALL: MOVE U, PROFILE BLOCK ADDRESS ; PUSHJ P,TYPUSR TYPUSR: PUSHJ P,.SAVE2 ;SAVE P1 AND P2 MOVEI S1,ENTDEC ;POINT TO DEC-DEFINED PROFILE ENTRY TABLE PUSHJ P,TYPUS1 ;DISPLAY MOVEI S1,ENTCUS## ;POINT TO CUSTOMER-DEFINED PROFILE ENTRY TABLE TYPUS1: HLRZ P1,(S1) ;GET NUMBER OF ENTRIES IN TABLE MOVNS P1 ;NEGATE HRLZS P1 ;PUT IN LH HRRI P1,1(S1) ;MAKE AOBJN POINTER TO FIRST ENTRY JUMPGE P1,.RETT ;RETURN IF TABLE IS EMPTY TYPUS2: HRRZ P2,(P1) ;GET A PROFILE ENTRY VECTOR ADDRESS MOVE T1,CG.FLG(P2) ;GET FLAGS TXNE T1,FL.NTY ;NO TYPEOUT? JRST TYPUS3 ;SKIP IT MOVEI S1,(P2) ;VECTOR ADDRESS PUSHJ P,PROTTL ;PRINT DATA TYPUS3: MOVX T1,FL.XCR ;BIT TO TEST TDNE T1,CG.FLG(P2) ;WANT AN EXTRA CRLF? $TEXT (,<>) ;YES AOBJN P1,TYPUS2 ;AND LOOP $RETT ;DONE SUBTTL UTILITY ROUTINES -- WLDWCK - CHECK FOR WILDCARDED USER-ID WLDACK: MOVE S1,ALTRBK+UW$WST ;GET WILDCARD SEARCH TYPE MOVE S2,ALTRBK+UW$PPM ;GET POSSIBLE PPN MASK JRST WLDCH1 ;ENTER COMMON CODE WLDWCK: MOVE S1,WILDBK+UW$WST ;GET WILDCARD SEARCH TYPE MOVE S2,WILDBK+UW$PPM ;GET POSSIBLE PPN MASK WLDCH1: CAIN S1,2 ;NON-WILD NAME? $RETF ;YES CAIE S1,1 ;WILD NAME? AOSE S2 ;NO--WILD PPN? $RETT ;WILD $RETF ;NON-WILD SUBTTL UTILITY ROUTINES -- WLDUSR - FETCH A PROFILE ; QUEUE UP A REQUEST TO THE ACCOUNTING DAEMON FOR A PROFILE WLDUSR::HRRZ T1,SELPTR ;GET POINTER TO FIRST FREE SKIPN T1 ;IF NONE, MOVEI T1,WILDBK+UW$MIN ;ASSUME MINIMAL SUBI T1,WILDBK ;COMPUTE WORDS OF SELECTION DATA HRLM T1,WILDBK+UW$TYP ;SAVE MESSAGE LENGTH MOVEI T1,WILDBK ;POINT TO WILDCARD BLOCK MOVEI T2,USER ;POINT TO RESPONSE BLOCK SKIPE T3,DEBUGW ;IF DEBUGGING, MOVSI T3,ACTPID ;TRY TO USE THE ALTERNATE PID SKIPN DEBUGQ ;WANT TIMING? HRRI T3,ZZTIME ;YEP SETCM T4,UNPRIV ;GET PRIV FLAG PJRST A$QWLD## ;RETURN RESULT OF WILDCARD REQUEST ALTUSR::MOVEI T1,UW$MIN ;LENGTH OF BLOCK HRLM T1,ALTRBK+UW$TYP ;SAVE IN MESSAGE MOVEI T1,ALTRBK ;POINT TO WILDCARD BLOCK MOVEI T2,USER ;POINT TO RESPONSE BLOCK SKIPE T3,DEBUGW ;IF DEBUGGING, MOVSI T3,ACTPID ;TRY TO USE THE ALTERNATE PID SKIPN DEBUGQ ;WANT TIMING? HRRI T3,ZZTIME ;YEP SETCM T4,UNPRIV ;GET PRIV FLAG PJRST A$QWLD## ;RETURN RESULT OF WILDCARD REQUEST SUBTTL UTILITY ROUTINES -- WLDSUM - GENERATE A WILDCARD SUMMARY WLDSUM: MOVEI T1,WILDBK ;POINT TO WILDCARD MESSAGE BLOCK MOVE T2,WILDBP ;GET BYTE POINTER TO ACK TEXT MOVE T3,S1 ;GET TEXT HRLZ T4,PROSUC ;GET SUCCESS COUNT HRR T4,PROFAI ;AND FAILURE COUNT PUSHJ P,A$SWLD## ;GENERATE SUMMARY TEXT SKIPT ;AT LEAST ONE PROFILE FOUND? FATAL (NSU,<^T/(S1)/>,,.RETF) $TEXT (,<^M^J ^T/(S1)/>) $RETT ;RETURN SUBTTL PROFILE PROCESSING -- PROFIL - MAIN LOOP PROFIL: DMOVEM S1,PROARG ;SAVE COMMAND TABLE AND PROMPT PROFI1: DMOVE S1,PROARG ;GET COMMAND TABLE AND PROMPT PUSHJ P,PRSCMD ;SCAN THE COMMAND JUMPF PROFI1 ;TRY AGAIN SETZM PRSDFV ;NOT A DEFAULT VALUE YET PUSHJ P,SELCHK ;CHECK FOR SELECTION IN PROGRESS PUSHJ P,P$KEYW## ;GET A KEYWORD JUMPF PROFI1 ;TRY AGAIN CAIG S1,PROLEN ;IS THIS AN ADDRESS OR NUMBER JRST PROFI3 ;GO PROCESS A COMMON COMMAND MOVE P1,S1 ;COPY PROFILE ENTRY VECTOR ADDRESS MOVE S1,CG.IDX(P1) ;GET PROFILE ENTRY INDEX ADD S1,CHGPTR ;INDEX INTO CHANGE TABLE MOVEM S1,CHGADR ;SAVE FOR SUBROUTINE PUSHJ P,@CG.GET(P1) ;CALL PARSE ROUTINE IN ENTRY SKIPE SELFLG ;SELCTION IN PROGRESS? PUSHJ P,@CG.CHG(P1) ;YES--STORE DATA AWAY JRST PROFI1 ;AND ASK FOR ANOTHER KEYWORD PROFI3: PUSHJ P,@PROTAB-1(S1) ;DISPATCH JUMPT PROFI1 ;LOOP BACK $RETF ;GIVE UP ; KEYWORD DISPATCH TABLE PROTAB: IFIW PRODFL ;"DEFAULT" IFIW PRODON ;"DONE" IFIW PROHEL ;"HELP" IFIW PROQUI ;"QUIT" IFIW PRORES ;"RESTORE" IFIW PROSHO ;"SHOW" PROLEN==.-PROTAB ;LENGTH OF TABLE SUBTTL PROFILE PROCESSING -- PRODFL - COMMON TOPLEVEL "DEFAULT" COMMAND PRODFL: PUSHJ P,.SAVE1 ;SAVE P1 PUSHJ P,P$KEYW## ;GET A KEYWORD JUMPF PRSERR ;CHECK FOR ERRORS MOVE P1,S1 ;COPY PROFILE ENTRY VECTOR ADDRESS PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS MOVE S1,CG.IDX(P1) ;GET CHANGE BLOCK INDEX ADD S1,CHGPTR ;INDEX INTO CHANGE TABLE MOVEM S1,CHGADR ;SET FOR ROUTINE PJRST @CG.DFL(P1) ;DEFAULT THE FIELD & RETURN PRODFZ::WARN (MND,,,.RETT) SUBTTL PROFILE PROCESSING -- PRODON - COMMON TOPLEVEL "DONE" COMMAND PRODON: PUSHJ P,P$KEYW## ;SEE IF CONTROL-Z JUMPF PRODO1 ;PERHAPS NOT $TEXT (,<>) ;PUT OUT A BLANK LINE JRST PRODO2 ;AND FINISH UP PRODO1: PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS PRODO2: POP P,(P) ;POP OFF CALLER $RETT ;RETURN TO TOP LEVEL SUBTTL PROFILE PROCESSING -- PROHEL - COMMON TOPLEVEL "HELP" COMMAND PROHEL: PUSHJ P,P$KEYW## ;GET A KEYWORD JUMPF PRSERR ;FAILED CAIG S1,PROLEN ;IS THIS AN ADDRESS OR NUMBER $RETF ;SHOULD NEVER GET HERE PUSH P,S1 ;SAVE PUSHJ P,P$CFM## ;GET EOL POP P,S1 ;RESTORE JUMPF PRSERR ;CHECK FOR ERRORS MOVE S2,CG.HLP(S1) ;GET ADDRESS OF HELP TEXT $TEXT (,<^T/(S2)/>) ;DISPLAY TEXT $RETT ;RETURN SUBTTL PROFILE PROCESSING -- PROQUI - COMMON TOPLEVEL "QUIT" COMMAND PROQUI: PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS SKIPE SELFLG ;SELECTION IN PROGRESS? JRST PROQU1 ;YES PUSHJ P,PRORE1 ;GET ORIGINAL PROFILE (NAME MIGHT HAVE CHANGED) PUSHJ P,CVTPPD ;CONVERT PPN INFO (UPT,) $RETF ;RETURN PROQU1: PUSHJ P,SELINI ;RESET SELECTION STORAGE INFO (SAB,,,.RETF) SUBTTL PROFILE PROCESSING -- PRORES - COMMON TOPLEVEL "RESTORE" COMMAND PRORES: PUSHJ P,.SAVE1 ;SAVE P1 MOVNI P1,1 ;ASSUME NO KEYWORD SPECIFIED PUSHJ P,P$KEYW## ;TRY FOR A KEYWORD SKIPF ;CHECK FOR ERRORS MOVE P1,S1 ;COPY PROFILE ENTRY VECTOR ADDRESS PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS JUMPL P1,PRORE1 ;JUMP IF NO KEYWORD MOVE S1,CG.IDX(P1) ;GET PROFILE ENTRY INDEX ADD S1,CHGPTR ;INDEX INTO CHANGE TABLE MOVEM S1,CHGADR ;SAVE FOR PROFILE SUBROUTINE PUSHJ P,@CG.RES(P1) ;RESTORE DATA $RETT ;AND RETURN PRORE1: MOVSI S1,(X) ;POINT TO OLD PROFILE HRRI S1,(U) ;AND TO WORKING COPY BLT S1,.AEMAX-1(U) ;RESTORE ORIGINAL PUSHJ P,PROZCH ;ZERO CHANGE TABLE FLAGS $RETT ;RETURN SUBTTL PROFILE PROCESSING -- PROSHO - COMMON TOPLEVEL "SHOW" COMMAND PROSHO: PUSHJ P,.SAVE1 ;SAVE P1 MOVNI P1,1 ;ASSUME NO KEYWORD SPECIFIED PUSHJ P,P$KEYW## ;TRY FOR A KEYWORD SKIPF ;GOT ONE MOVE P1,S1 ;COPY PROFILE VECTOR ADDRESS PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS JUMPL P1,ENTSH1 ;JUMP IF NO KEYWORD MOVEI S1,(P1) ;VECTOR ADDRESS PUSHJ P,PROPRT ;PRINT DATA $RETT ;RETURN ENTSH1: PUSHJ P,TYPUSR ;TYPE THE PROFILE $RETT ;RETURN SUBTTL PROFILE PROCESSING -- PROBLK - EXTENSIBLE BLOCKS ; ROUTINE TO TO ADD OR DELETE EXTENSIBLE BLOCKS FROM A ; PROFILE GIVEN A PARSER DATA BLOCK POINTER ; CALL: MOVE S1, PARSER DATA BLOCK ADDRESS ; MOVE S2, PROFILE OFFSET ; PUSHJ P,PROBLK ; ; TRUE RETURN: BLOCK ADDED OR DELETED ; FALSE RETURN: NO ROOM IN PROFILE FOR BLOCK PROBLK::PUSHJ P,.SAVE1 ;SAVE P1 MOVE P1,S1 ;COPY PARSER DATA BLOCK ADDRESS MOVEI T1,(U) ;PROFILE ADDRESS LOAD T2,ARG.HD(P1),AR.LEN ;GET LENGTH SUBI T2,ARG.DA ;ACCOUNT FOR PARSER OVERHEAD WORDS CAIN T2,1 ;DELETING? SKIPE ARG.DA(P1) ;AND IS THERE ANY REAL DATA? SKIPA ;SOMETHING VALID JRST PROBL1 ;YES MOVNS T2 ;NEGATE HRLZS T2 ;PUT IN LH HRRI T2,(S2) ;PROFILE OFFSET MOVEI T3,ARG.DA(P1) ;ADDRESS OF DATA JRST PROBL2 ;ENTER COMMON CODE PROBL1: MOVEI T2,(S2) ;PROFILE OFFSET SETZ T3, ;ZERO ADDRESS TO DELETE PROBL2: MOVEI T4,0 ;CLEAR .AEMAP BIT PJRST A$EBLK## ;ADD/DELETE EXTENSIBLE BLOCK AND RETURN SUBTTL PROFILE PROCESSING -- PROCHG - PERFORM ALL CHANGES PROCHG: PUSHJ P,.SAVE3 ;SAVE SOME ACS MOVE S1,ENTKPT ;POINT TO PROFILE ENTRY TABLE HLRZ P1,(S1) ;GET NUMBER OF ENTRIES IN TABLE MOVNS P1 ;NEGATE HRLZS P1 ;PUT IN LH HRRI P1,1(S1) ;MAKE AOBJN POINTER TO FIRST ENTRY SETZ P3, ;INIT CHANGE COUNTER PUSHJ P,QINIT ;SETUP TO CHANGE A PROFILE PROCH1: HRRZ P2,(P1) ;GET PROFILE ENTRY VECTOR ADDRESS MOVE S1,CG.IDX(P2) ;AND ITS INDEX ADD S1,CHGPTR ;INDEX INTO CHANGE TABLE SKIPN (S1) ;CHANGING THIS PORTION OF THE PROFILE? JRST PROCH3 ;NO PUSHJ P,@CG.CHG(P2) ;EXECUTE THE CHANGE JUMPT PROCH2 ;ONWARD IF NO ERRORS MOVE S1,P3 ;GET NUMBER OF CHANGES $RETF ;AND RETURN PROCH2: AOS P3 ;COUNT THE CHANGE PROCH3: AOBJN P1,PROCH1 ;LOOP SKIPN S1,P3 ;IF NOTHING TO DO, $RETT ;SUCCEED VACUOUSLY PUSHJ P,QUEUUO ;DO THE UUO MOVE S1,P3 ;GET NUMBER OF CHANGES $RET ;PROPAGATE T/F BACK SUBTTL PROFILE PROCESSING -- PROCLR - CLEAR USER SPECIFIC DATA PROCLR: PUSHJ P,.SAVE1 ;SAVE P1 MOVE S1,[XWD PASSWD,PASSWD+1] ;SET UP BLT SETZM PASSWD ;CLEAR FIRST WORD BLT S1,PASSWD+.APWLW-1 ;ZERO PASSWORD BLOCK MOVSI P1,-CLRLEN ;AOBJN POINTER PROCL1: MOVE S1,CLRTAB(P1) ;GET PROFILE OFFSET MOVE S2,CHGTAB##(S1) ;GET FLAGS TXNN S2,PD.EXT ;EXTENSIBLE BLOCK? JRST PROCL2 ;NO MOVEI S2,(S1) ;COPY OFFSET ADDI S2,(U) ;INDEX INTO PROFILE SKIPL (S2) ;DATA AVAILABLE? JRST PROCL3 ;NO MOVEI T1,(U) ;PROFILE ADDRESS MOVE T2,S1 ;PROFILE OFFSET HLL T2,(S2) ;GET -LENGTH MOVEI T3,0 ;ZERO OUT BLOCK ADDRESS MOVEI T4,1 ;SET .AEMAP ENTRY PUSHJ P,A$EBLK## ;DELETE BLOCK AND DEFAULT THE FIELD JRST PROCL3 ;ONWARD PROCL2: ADDI S1,(U) ;INDEX INTO PROFILE LOAD S2,S2,PD.WRD ;GET WORD COUNT SETZM (S1) ;CLEAR A WORD ADDI S1,1 ;ADVANCE POINTER TO NEXT WORD SOJG S2,.-2 ;DO ALL WORDS IN BLOCK PROCL3: AOBJN P1,PROCL1 ;LOOP BACK POPJ P, ;RETURN CLRTAB: EXP .AEFLG ;PROFILE FLAGS EXP .AEFAI ;LAST PSW VALIDATION FAILURE UDT EXP .AELPC ;LAST PSW CHANGE UDT EXP .AEPNM ;PERSONAL NAME CLRLEN==.-CLRTAB ;LENGTH OF TABLE SUBTTL PROFILE PROCESSING -- PRODEF - FETCH DEFAULT PROFILE PRODEF: PUSHJ P,.SAVE1 ;SAVE P1 SKIPN P1,.AEPPN(U) ;SAVE PPN INCASE OF ERROR JRST PRODE1 ;ONLY TRY FOR THE SYSTEM DEFAULT HLLO S1,P1 ;MAKE DEFAULT PPN FOR PROJECT ([10,%]) MOVEI S2,(U) ;POINT TO STORAGE PUSHJ P,QPPNIN ;FETCH IT JUMPT PRODE2 ;GO REPORT FINDINGS PRODE1: MOVNI S1,1 ;GET DEFAULT PPN FOR ALL PROJECTS ([%,%]) MOVEI S2,(U) ;POINT TO STORAGE PUSHJ P,QPPNIN ;FETCH IT JUMPT PRODE2 ;GO REPORT FINDINGS MOVEI S1,(U) ;NOT FOUND, HRLI S1,USER0 ;SO USE AN EMPTY PROFILE BLT S1,.AEMAX-1(U) ;RATHER THAN ACTDAE ERROR MESSAGE HLRZ S2,P1 ;PUT PROJECT NUMBER IN RH MOVEI S1,[ITEXT ()] SKIPN S2 ;HAVE A PROJECT? MOVEI S1,[ITEXT ()] ;NO WARN (NDF,,,PRODE3) PRODE2: PUSHJ P,CVTPPD ;CONVERT PPN INFO (DPL,) PRODE3: PUSHJ P,PROCLR ;CLEAR USER SPECIFIC DATA MOVEM P1,.AEPPN(U) ;REPLACE PPN $RETT ;RETURN SUBTTL PROFILE PROCESSING -- PROFSP - FETCH A FILESPEC PROFSP::PUSHJ P,P$FILE## ;GET FD BLOCK $RETIF ;RETURN ON ERRORS MOVSI S2,'...' ;GET PLACE HOLDER VALUE CAMN S2,.FDSTR(S1) ;DEVICE SPECIFIED? SETZM .FDSTR(S1) ;NO, ZERO DEVICE WORD LOAD S2,.FDLEN(S1),FD.LEN ;GET FD LENGTH SUBI S2,ARG.DA ;ACCOUNT FOR OVERHEAD MOVNS S2 ;NEGATE HRLZS S2 ;PUT IN LH HRRI S2,.FDSTR(S1) ;MAKE AN AOBJN POINTER SKIPN (S2) ;NULL? AOBJN S2,.-1 ;SEARCH ENTIRE FD JUMPL S2,.RETT ;RETURN IF SOMETHING TYPED MOVEI S2,ARG.DA+1 ;OVERHEAD + ZERO WORD STORE S2,.FDLEN(S1),FD.LEN ;CUTE WAY TO SAY BLOCK IS EMPTY $RETT ;RETURN SUBTTL PROFILE PROCESSING -- PRONAM - GENERATE USER NAME BASED ON PPN PRONAM: MOVSI S1,.AENAM(U) ;POINT TO STORAGE HRRI S1,.AENAM+1(U) ;MAKE A BLT POINTER SETZM .AENAM(U) ;CLEAR FIRST WORD BLT S1,.AENAM+.AANLW-1(U) ;CLEAR ENTIRE BLOCK MOVE S1,.AEPPN(U) ;GET PPN WE'RE HACKING PUSHJ P,A$CKPP## ;MAKE A NAME FOR IT SETCAM TF,RESPPN ;PROFILE IS FOR A RESERVED PPN $TEXT (,<^T/(S1)/^0>) POPJ P, ;DONE SUBTTL PROFILE PROCESSING -- PROPSW - DEFAULT A PASSWORD PROPSW: PUSHJ P,.SAVE4 ;SAVE SOME ACS LOAD S1,.AEREQ(X),AE.PWL ;GET MINIMUM PASSWORD LENGTH CAIN S1,0 ;ZERO ? (NONE SPECIFIED) MOVEI S1,DEFPSZ ;USE DEFAULT MOVEI S2,(S1) ;COPY PUSHJ P,GENPSW ;GENERATE A PASSWORD SUBB S2,S1 ;GET COUNT OF CHARACTERS GENERATED IDIVI S2,.APWCW ;GET NUMBER OF WORDS REQUIRED SKIPE T1 ;REMAINDER? ADDI S2,1 ;YES HRL S2,S1 ;MAKE IT #CHRS,,#WORDS MOVEI T1,10 ;8-BIT ASCIZ MOVE S1,[.APWLW+ARG.DA,,.CMFLD] MOVEM S1,PASSHD+ARG.HD ;SAVE PARSER DATA BLOCK HEADER WORD MOVEI S1,PASSHD ;POINT TO BLOCK PUSHJ P,PROSTR ;FIX UP STRING AS NECESSARY $RETT ;AND RETURN ; ROUTINE TO GENERATE A FULL LENGTH PASSWORD CONTAINING THINGS ; THAT LOOK LIKE SYLLABLES. THE PASSWORD WILL CONTAIN ALL ; UPPERCASE CHARACTERS. GENPSW: MOVEI P3,.APWLC ;GET MAX PASSWORD SIZE MOVE P4,[POINT 8,PASSWD] ;GET TARGET POINTER RANPW0: PUSHJ P,RANDOM ;GET A RANDOM NUMBER MOVEI T2,STRL FSC T2,233 FMPR T2,T1 FIX T1,T2 MOVE P1,STRPTR(T1) SETZ P2, RANPW1: PUSHJ P,RANDOM ;GET A RANDOM NUMBER HLRZ T2,(P1) FSC T2,233 FMPR T2,T1 FIX T1,T2 HRRZ T2,(P1) ADD T1,T2 LSH P2,6 ADD P2,(T1) AOBJN P1,RANPW1 MOVE T2,P2 ;GET SIXBIT RESULT GENPS3: LSHC T1,6 ;SHIFT IN A CHARACTER ANDI T1,77 ;MASK OUT JUNK JUMPE T1,GENPS4 ;LEADING BLANKS? ADDI T1,40 ;MAKE ASCII IDPB T1,P4 ;STORE SOJLE P3,.POPJ ;COUNT DOWN SOS S1 ;COUNT DOWN AGAINST USER LIMIT GENPS4: JUMPN T2,GENPS3 ;LOOP BACK IF MORE CHARACTERS SKIPLE S1 ;QUIT IF USER LIMIT FOUND JUMPN P3,RANPW0 ;LOOP BACK IF PASSWORD INCOMPLETE POPJ P, RANDOM: SKIPE T1,ROOT ;HAVE A SEED? JRST RAN1 ;YES TIMER T1, ;GET TIME IN JIFFIES FSC T1,211 MOVEM T1,ROOT RAN1: FMPR T1,ROOT FADRI T1,(47.) FDVR T1,ROOT FSC T1,-1 FSBRM T1,ROOT MOVNS T1,ROOT TLZ T1,777700 FSC T1,203 POPJ P, ; TABLE OF CONSONANTS CON: 'B' 'C' 'D' 'F' 'G' 'H' 'J' 'K' 'L' 'M' 'N' 'P' 'R' 'S' 'T' 'V' 'W' 'X' 'Y' 'Z' CONL==.-CON ; TABLE OF VOWELS VOW: 'A' 'E' 'I' 'O' 'U' VOWL==.-VOW STR45: XWD CONL,CON XWD VOWL,VOW XWD CONL,CON XWD VOWL,VOW XWD CONL,CON STR6: XWD CONL,CON XWD VOWL,VOW XWD CONL,CON XWD CONL,CON XWD VOWL,VOW XWD CONL,CON STRPTR: XWD -4,STR45 XWD -5,STR45 XWD -6,STR6 STRL==.-STRPTR SUBTTL PROFILE PROCESSING -- PROSTR - STRING CHECKING ; ROUTINE TO CHECK STRING LENGTHS AND CLEAN UP POSSIBLE JUNK ; LEFT OVER BY THE PARSER. ; CALL: MOVE S1, PARSER DATA BLOCK ADDRESS ; MOVE S2, MAX # CHRS,,MAX # WORDS ; MOVE T1, BYTE SIZE ; PUSHJ P,PROSTR PROSTR::PUSHJ P,.SAVE2 ;SAVE P1 AND P2 DMOVE P1,S1 ;COPY ARGS MOVEI S1,^D36 ;36-BITS PER WORD IDIVI S1,(T1) ;S2 GETS NUMBER OF JUNK BITS IMULI S1,(P2) ;GET MAX. BYTES IN BLOCK HRLI T1,(S1) ;SAVE MOVSI S1,-1 ;WILL HANDLE UP TO 18 BIT BYTES ROT S1,(S2) ;GET MASK FOR CLEARING JUNK BITS HRRZS S1 ;ISOLATE MASK PUSH P,S1 ;SAVE FOR A SECOND HRRZ S2,P2 ;GET MAXIMUM WORD COUNT LOAD TF,ARG.HD(P1),AR.LEN ;GET BLOCK LENGTH CAILE TF,ARG.DA(S2) ;IMPOSE LENGTH RESTRICTIONS MOVEI TF,ARG.DA(S2) ;MUST REDUCE STORE TF,ARG.HD(P1),AR.LEN ;REDUCE SUBI TF,ARG.DA ;ACCOUNT FOR GALACTIC OVERHEAD MOVEI S1,ARG.DA(P1) ;POINT TO START OF DATA POP P,S2 ;GET MASK BACK ANDCAM S2,(S1) ;CLEAR JUNK BITS ADDI S1,1 ;ADVANCE ADDRESS POINTER SOJG TF,.-2 ;DO ALL WORDS MOVEI S1,ARG.DA(P1) ;POINT TO START OF DATA DPB T1,[POINT 6,S1,11] ;STORE BYTE SIZE IN BYTE POINTER TLO S1,440000 ;FINISH IT HLRZ S2,P2 ;GET BYTE COUNT PROST1: ILDB TF,S1 ;GET A CHARACTER SKIPE TF ;NUL? SOJG S2,PROST1 ;LOOP HLRZ TF,T1 ;GET MAX. BYTE COUNT SUB TF,S2 ;NUMBER REMAINING TO ZERO JUMPE TF,PROST2 ;DON'T PROCEED IF DONE SETZ S2, ;TO CLEAR OUT REMAINDER IDPB S2,S1 ;TERMINATE SOJG TF,.-1 ;CLEAN OUT REMAINDER OF THE BLOCK PROST2: POPJ P, ;RETURN SUBTTL PROFILE PROCESSING -- PROPRT - PRINT PROFILE DATA ; PRINT DATA ABOUT PROFILE ENTRIES ; CALL: MOVE S1, ENTRY VECTOR ADDRESS ; PUSHJ P,PROPRT/PROTTL PROPRT: TDZA S2,S2 ;PRINT DATA PROTTL: MOVEI S2,1 ;PRINT TITLE AND DATA PUSHJ P,.SAVET ;SAVE T1-T4 PUSH P,[EXP 0] ;SAVE A FLAG PUSH P,S2 ;SAVE FLAG MOVEI T1,(U) ;POINT TO PROFILE SKIPGE T2,CG.PFL(S1) ;GET PROFILE OFFSET JRST PROPR1 ;FIELD CANNOT BE DEFAULTED MOVNI T3,1 ;FLAG PUSHJ P,A$BMAP## ;CHECK STATUS JUMPF PROPR1 ;JUMP IF NOT DEFAULTED SETOM -1(P) ;REMEMBER DEFAULTED STATUS SKIPA S2,["*"] ;ASTERISK FOR A DEFAULTED FIELD PROPR1: MOVEI S2," " ;ELSE NON-DEFAULTED FIELD $TEXT (,< ^7/S2/ ^A>) ;DISPLAY FLAG POP P,S2 ;GET TITLE FLAG SKIPE S2 ;WANT TITLE? $TEXT (,<^T/@CG.PRM(S1)/: ^A>) ;YES POP P,S2 ;GET DEFAULTED FLAG JUMPE S2,PROPR2 ;JUMP IF NOT MOVE S2,CG.IDX(S1) ;GET PROFILE ENTRY INDEX ADD S2,CHGPTR ;INDEX INTO CHANGE TABLE MOVE S2,(S2) ;GET CHANGE FLAG FOR THIS ENTRY JUMPE S2,PROPR2 ;JUMP IF IT'S CHANGED $TEXT (,<-unknown->) ;ELSE SAY WE DON'T KNOW $RETT ;RETURN PROPR2: PUSHJ P,@CG.PRT(S1) ;PRINT DATA $RETT ;RETURN SUBTTL PROFILE PROCESSING -- PROUPD - UPDATE A PROFILE FROM A STATIC BLOCK PROUPD: PUSHJ P,.SAVE3 ;SAVE SOME ACS MOVE S1,[CHGMSK,,CHGMS2] ;NEED TO SAVE THIS BECAUSE OF RESTORES BLT S1,CHGMS2+.AEMIN-1 ;SO SAVE IT MOVE S1,ENTKPT ;POINT TO PROFILE ENTRY TABLE HLRZ P1,(S1) ;GET NUMBER OF ENTRIES IN TABLE MOVNS P1 ;NEGATE HRLZS P1 ;PUT IN LH HRRI P1,1(S1) ;MAKE AOBJN POINTER TO FIRST ENTRY SETZ P3, ;INIT CHANGE COUNTER PROUP1: HRRZ P2,(P1) ;GET PROFILE ENTRY VECTOR ADDRESS MOVE S1,CG.IDX(P2) ;AND ITS INDEX ADD S1,CHGPTR ;INDEX INTO CHANGE TABLE SKIPN (S1) ;CHANGING THIS PORTION OF THE PROFILE? JRST PROUP3 ;NO PUSHJ P,@CG.CMP(P2) ;COMPARE INCASE WAS CHANGED BACK TO ORIGINAL JUMPT PROUP3 ;NOTHING REALLY CHANGED PROUP2: PUSHJ P,@CG.RES(P2) ;RESTORE DATA SETOM @CHGADR ;RESTORE FLAG TO "CHANGED" STATE JUMPT PROUP3 ;ONWARD IF NO ERRORS PUSHJ P,PROUP4 ;SETUP RETURN $RETF ;AND RETURN FAILURE PROUP3: AOBJN P1,PROUP1 ;LOOP PROUP4: MOVE S1,[CHGMS2,,CHGMSK] ;BLT VECTOR BLT S1,CHGMSK+.AEMIN-1 ;RESTORE MASKS MOVE S1,P3 ;GET NUMBER OF CHANGES $RETT ;AND RETURN SUBTTL PROFILE PROCESSING -- PROZCH - ZERO PROFILE ENTRY CHANGE TABLE PROZCH: MOVE S1,CHGPTR ;GET ADDRESS OF CHANGE TABLE MOVSI S2,(S1) ;POINT TO START ADDRESS HRRI S2,1(S1) ;MAKE A BLT POINTER SETZM (S1) ;CLEAR FIRST WORD ADD S1,CHGCTR ;COMPUTE END OF BLT BLT S2,-1(S1) ;ZERO TABLE PROZQM: MOVE S1,[CHGMSK,,CHGMSK+1] ;BLT POINTER SETZM CHGMSK ;CLEAR FIRST WORD OF CHANGE MASKS BLT S1,CHGMSK+.AEMIN-1 ;ZERO TABLE POPJ P, ;RETURN SUBTTL PROFILE PROCESSING -- PROZPB - ZERO PROFILE BLOCK PROZPB: MOVSI S1,USER0 ;POINT TO INIT'ED USER BLOCK HRRI S1,(U) ;AND TO CURRENT BLOCK BLT S1,.AEMAX-1(U) ;RE-INIT PROFILE POPJ P, ;RETURN SUBTTL ENTRIES -- TABLE INITIALIZATION ENTINI: PUSHJ P,.SAVE2 ;SAVE P1 AND P2 HLRZ S1,ENTDEC ;GET COUNT OF DEC-DEFINED PROFILE ENTRIES HLRZ S2,ENTCUS## ;GET COUNT OF CUSTOMER-DEFINED PROFILE ENTRIES ADDI S1,1(S2) ;TOTAL THEM UP PUSHJ P,M%GMEM ;GET SOME CORE MOVEM S2,ENTKPT ;SAVE FOR PARSING MOVEI S2,-1(S1) ;GET CORRECTED COUNT MOVEM S2,@ENTKPT ;SAVE WORD COUNT TOO PUSHJ P,M%GMEM ;GET MORE CORE MOVEM S2,ENTHPT ;SAVE FOR HELP SUBI S1,1 ;GET CORRECTED COUNT MOVEM S1,@ENTHPT ;SAVE WORD COUNT TOO PUSHJ P,M%GMEM ;GET MORE CORE MOVEM S1,CHGCTR ;SAVE CHANGE TABLE WORD COUNT MOVEM S2,CHGPTR ;SAVE CHANGE TABLE ADDRESS MOVEI P1,ENTDEC ;POINT TO DEC-DEFINED TABLE PUSHJ P,ENTIN1 ;LOAD WORKING COMMAND TABLE MOVEI P1,ENTCUS## ;POINT TO CUSTOMER-DEFINED TABLE ENTIN1: HLRZ S1,(P1) ;GET NUMBER OF ENTRIES IN TABLE JUMPE S1,.RETT ;RETURN IF TABLE IS EMPTY MOVNS S1 ;NEGATE HRL P1,S1 ;GET -LENGTH HRRI P1,1(P1) ;MAKE AN AOBJN POINTER ENTIN2: HRRZ P2,(P1) ;GET PROFILE ENTRY VECTOR ADDRESS SKIPL S1,CG.PFL(P2) ;AND PROFILE OFFSET SKIPN UNPRIV ;UNPRIV'ED USER? JRST ENTIN3 ;NO MOVE S1,CHGTAB##(S1) ;FLAGS TXNN S1,PD.UNP ;UNPRIV'ED PROFILE DATA? JRST ENTIN4 ;NO--STUFF IN HELP TABLE INSTEAD ENTIN3: MOVE S1,ENTKPT ;POINT TO TABLE HEADER MOVE S2,(P1) ;GET KEYWORD ADDRESS PUSHJ P,S%TBAD ;INSERT INTO TABLE JUMPT ENTIN4 ;CHECK FOR ERRORS CAIN S1,EREIT$ ;ENTRY ALREADY IN TABLE? JRST ENTIN5 ;YES--PROBABLY THE NULL KEYWORD STOPCD (EIF,HALT,,) ENTIN4: HLRZ S2,(P1) ;GET A KEYWORD SKIPE S1,(S2) ;MUST CHECK TLNE S1,(177B6) ;FIRST CHARACTER ZERO AND WORD NO ALL ZERO? TDZA S1,S1 ;NO--MAKE FLAGS ALL ZERO AOS S2 ;ADJUST TEXT POINTER TXNE S1,CM%INV ;TEST FLAGS JRST ENTIN5 ;DON'T INCLUDE MOVE S1,ENTHPT ;POINT TO TABLE HEADER HRLZS S2 ;POSITION KEYWORD HRR S2,(P1) ;INCLUDE DATA PUSHJ P,S%TBAD ;INSERT INTO TABLE JUMPT ENTIN5 ;CHECK FOR ERRORS STOPCD (HIF,HALT,,) ENTIN5: AOBJN P1,ENTIN2 ;LOOP ; PARSING MOVE S1,[ENTKBK,,ENTKEY] ;SET UP BLT BLT S1,ENTKEY+PB%SIZ-1 ;COPY MOVE S1,ENTKPT ;GET TABLE ADDRESS MOVEM S1,ENTKEY+1+.CMDAT ;SAVE ; "DEFAULT" MOVE S1,[ENTDBK,,ENTDEF] ;SET UP BLT BLT S1,ENTDEF+PB%SIZ-1 ;COPY MOVE S1,ENTKPT ;GET TABLE ADDRESS MOVEM S1,ENTDEF+1+.CMDAT ;SAVE ; "HELP" MOVE S1,[ENTHBK,,ENTHLP] ;SET UP BLT BLT S1,ENTHLP+PB%SIZ-1 ;COPY MOVE S1,ENTHPT ;GET TABLE ADDRESS MOVEM S1,ENTHLP+1+.CMDAT ;SAVE ; "RESTORE" MOVE S1,[ENTRBK,,ENTRST] ;SET UP BLT BLT S1,ENTRST+PB%SIZ-1 ;COPY MOVE S1,ENTKPT ;GET TABLE ADDRESS MOVEM S1,ENTRST+1+.CMDAT ;SAVE ; "SELECT" MOVE S1,[ENTSBK,,ENTSLC] ;SET UP BLT BLT S1,ENTSLC+PB%SIZ-1 ;COPY MOVE S1,ENTKPT ;GET TABLE ADDRESS MOVEM S1,ENTSLC+1+.CMDAT ;SAVE $RETT ;RETURN ; PARSER DATA BLOCK FOR PARSING ENTKBK: $KEYDSP (.,<$NEXT(.),$ACTION(ENTAPR),$ALTER(ENT010)>) BLOCK PB%SIZ-<.-ENTKBK> ; PARSER DATA BLOCK FOR "DEFAULT" ENTDBK: $KEY (CONFRM,.,<$ACTION(ENTADF)>) BLOCK PB%SIZ-<.-ENTDBK> ; PARSER DATA BLOCK FOR "HELP" ENTHBK: $KEY (CONFRM,.,<$ACTION(ENTAHL)>) BLOCK PB%SIZ-<.-ENTHBK> ; PARSER DATA BLOCK FOR "SELECT" ENTSBK: $KEY (CONFRM,.,<$ACTION(ENTASL)>) BLOCK PB%SIZ-<.-ENTSBK> ; PARSER DATA BLOCK FOR "RESTORE" ENTRBK: $KEY (CONFRM,.,<$ACTION(ENTARS),$ALTER(CONFRM)>) SUBTTL ENTRIES -- KEYWORD TABLES ENT000: $INIT (ENTKEY) ENT010: $KEYDSP (ENTCOM) ENT020: $KEYDSP (ENTSEL) ; DEC-DEFINED ENTRY TYPES ENTDEC: $STAB KEYTAB (PPX,,CM%NOR) KEYTAB (NAM,) KEYTAB (PDF,) KEYTAB (PNM,) KEYTAB (DST,) KEYTAB (MAI,) KEYTAB (NUL,,CM%NOR!CM%INV) KEYTAB (PSW,) KEYTAB (EXP,) KEYTAB (LTI,) KEYTAB (ACC,) KEYTAB (RQL,) KEYTAB (SCH,) KEYTAB (PRG,) KEYTAB (NUL,,CM%NOR!CM%INV) KEYTAB (CTX,) KEYTAB (COR,) KEYTAB (ENQ,) KEYTAB (IPC,) KEYTAB (PRV,) KEYTAB (SPO,) KEYTAB (WAT,) KEYTAB (NUL,,CM%NOR!CM%INV) KEYTAB (STR,) KEYTAB (NUL,,CM%NOR!CM%INV) KEYTAB (ADM,,CM%NOR) $ETAB ; DEC AND CUSTOMER COMMON KEYWORDS ENTCOM: $STAB DSPTAB ( ,2,\"32,CM%INV) DSPTAB (ENTC10,1,) DSPTAB (CONFRM,2,,CM%NOR) DSPTAB (CONFRM,2,) DSPTAB (ENTC20,3,) DSPTAB (CONFRM,4,,CM%NOR) DSPTAB (CONFRM,4,) DSPTAB (ENTRST,5,) DSPTAB (ENTC30,6,) $ETAB ENTC10: $NOISE (ENTDEF,) ENTC20: $NOISE (ENTHLP,) ENTC30: $CRLF (<$ALTER(ENTHLP)>) ; DEC AND CUSTOMER SELECTION KEYWORDS ENTSEL: $STAB DSPTAB ( ,2,\"32,CM%INV) ; DSPTAB (CONFRM,1,) DSPTAB (CONFRM,2,,CM%NOR) DSPTAB (CONFRM,2,) DSPTAB (ENTC10,3,) DSPTAB (CONFRM,4,,CM%NOR) DSPTAB (CONFRM,4,) ; DSPTAB (ENTRST,5,) DSPTAB (ENTC20,6,) $ETAB ; COMMON ENTRY ACTION ROUTINE TO SET THE NEXT PARSER DATA BLOCK ENTASL:! ENTAPR: HRRZ S1,@CR.RES(S2) ;GET ADDR OF TABLE ENTRY HRRZ S1,CG.PRS(S1) ;GET ADDR OF NEXT PARSE BLOCK PUSH P,S1 ;SAVE FOR A SECOND LOAD S1,CR.PDB(S2),RHMASK ;GET CURRENT PDB PUSHJ P,P$GPDB## ;GET ADDR WORKING COPY POP P,PB%NXT(S1) ;POINT TO NEXT TABLE FOR PARSING $RETT ;AND RETURN ; COMMON ENTRY ACTION ROUTINE FOR "DEFAULT", "HELP", AND "RESTORE" ENTADF:! ENTAHL:! ENTARS: LOAD S1,CR.PDB(S2),RHMASK ;GET CURRENT PDB PUSHJ P,P$GPDB## ;GET ADDR WORKING COPY MOVEI S2,CONFRM ;TERMINATE MOVEM S2,PB%NXT(S1) ; COMMAND $RETT ;AND RETURN SUBTTL ENTRIES -- ACC - ACCESS-TYPES .ENTRY (ACC,.AEACC,) ACCPRS: $NOISE (CONFRM,) ACC000: $INIT (ACC010) ACC010: $KEYDSP (ACC020,<$ALTER(ACC030)>) ACC020: $STAB DSPTAB (ACC010,[AE.ROP],) DSPTAB (ACC010,[AE.BAT],) DSPTAB (ACC010,[AE.DST],) DSPTAB (ACC010,[AE.FIO],) DSPTAB (ACC010,[AE.LOC],) DSPTAB (ACC010,[AE.FAL],) DSPTAB (ACC010,[AE.CDR],) DSPTAB (ACC010,[AE.RMT],) DSPTAB (ACC010,[AE.SBJ],) $ETAB ACC030: $KEYDSP (ACC040,$ALTER(CONFRM)) ACC040: $STAB DSPTAB ( ,2,\"32,CM%INV) DSPTAB (CONFRM,0,) DSPTAB (CONFRM,1,) DSPTAB (CONFRM,2,,CM%NOR) DSPTAB (CONFRM,2,) DSPTAB (CONFRM,3,) DSPTAB (ACC050,4,) DSPTAB (CONFRM,5,) DSPTAB (CONFRM,6,) DSPTAB (CONFRM,7,) $ETAB ACC050: $KEYDSP (ACC020) ; GET ROUTINE ACCGET: PUSHJ P,.SAVE1 ;SAVE P1 ACCGE1: MOVEI S1,ACC000 ;POINT TO SUB-COMMAND TABLES MOVEI S2,[ASCIZ\ACCESS-TYPES>\] PUSHJ P,PRSCMD ;PARSE THE COMMAND JUMPF PRSERR ;CHECK FOR ERRORS SETZ P1, ;CLEAR "NO" FLAG ACCGE2: PUSHJ P,P$CFM## ;CRLF? JUMPT ACCGE1 ;YES PUSHJ P,P$KEYW## ;GET KEYWORD JUMPF PRSERR ;CHECK FOR ERRORS CAIG S1,ACCLEN ;ADDRESS OF BIT? JRST ACCGE3 ;NO--KEYWORD MOVE S2,(S1) ;YES, GET THE BIT IORM S2,.AEACC(U) ;SET IT ALWAYS SKIPE P1 ;SKIP IF SETTING VALUE ANDCAM S2,.AEACC(U) ;ZERO THE BIT SETZ P1, ;CLEAR "NO" FLAG SETOM @CHGADR ;INDICATE CHANGING PROFILE ENTRY IORM S2,CHGMSK+.AEACC ;LIGHT IN THE CHANGE MASK JRST ACCGE2 ;AND LOOP ACCGE3: PUSHJ P,@ACCTAB(S1) ;DISPATCH TO KEYWORD PROCESSOR JRST ACCGE2 ;AND LOOP BACK ; COMPARE ROUTINE ACCCMP: MOVEI S1,.AEACC ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE ACCCHG: MOVEI S1,.AEACC ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE ACCDFL: MOVX S1,DF.ACC ;DEFAULT BIT FOR FIELD IORM S1,DF$ACC(U) ;LIGHT IN BIT MAP SETOM PRSDFV ;REMEMBER WE CARE SETOM @CHGADR ;WE CHANGED THIS ENTRY SETOM CHGMSK+.AEACC ;AND THIS FIELD $RETT ;WIN ; RESTORE ROUTINE ACCRES: MOVE S1,.AEACC(X) ;GET ORIGINAL ACCESS BITS MOVEM S1,.AEACC(U) ;RESTORE MOVX S1,DF.ACC ;GET .AEACC DEFAULT BIT ANDCAM S1,DF$ACC(U) ;CLEAR IN WORKING PROFILE TDNE S1,DF$ACC(X) ;WAS IT SET IN ORIGINAL? IORM S1,DF$ACC(U) ;YES, FIX IT SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AEACC ;IN BOTH PLACES $RETT ;AND RETURN ; PRINT ROUTINE ACCPRT: MOVE S1,[IOWD ACCBEN-ACCBIT,ACCBIT] ;POINTER TO LIST OF BITS PUSHJ P,PRTBTS ;TYPE OUT BITS $RETT ; HELP TEXT ACCHLP: ASCIZ \ ACCESS-TYPES specifies the types of access allowed to the specified user. ACCESS refers to any attempt by a user or in behalf of a user to gain access to the system using a correct combination of user-id and password. \ ; BIT STORAGE/DISPLAY TABLE ACCBIT: XWD [POINTR .AEACC(U),AE.CDR],[ASCIZ \Card reader\] XWD [POINTR .AEACC(U),AE.FAL],[ASCIZ \Network file access\] XWD [POINTR .AEACC(U),AE.LOC],[ASCIZ \Local\] XWD [POINTR .AEACC(U),AE.ROP],[ASCIZ \ANF CTY\] XWD [POINTR .AEACC(U),AE.DST],[ASCIZ \Dataset\] XWD [POINTR .AEACC(U),AE.RMT],[ASCIZ \Remote\] XWD [POINTR .AEACC(U),AE.SBJ],[ASCIZ \Subjob of batch\] XWD [POINTR .AEACC(U),AE.BAT],[ASCIZ \Batch\] XWD [POINTR .AEACC(U),AE.FIO],[ASCIZ \Files only\] ACCBEN:! ; KEYWORD DISPATCH TABLE ACCTAB: IFIW ACCALL ;"ALL" IFIW ACCDEF ;"DEFAULT" IFIW ACCDON ;"DONE" IFIW ACCHLX ;"HELP" IFIW ACCNO ;"NO" IFIW ACCNON ;"NONE" IFIW ACCRES ;"RESTORE" IFIW ACCPRT ;"SHOW" ACCLEN==.-ACCTAB ;LENGTH OF TABLE ; "ALL" KEYWORD PROCESSOR ACCALL: PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS PUSHJ P,P$PREV## ;BACKUP OVER THE CRLF MOVX S1,^-AE.FIO ;ALL ACCESS BITS BUT NOT "FILES ONLY" MOVEM S1,.AEACC(U) ;TURN ON ALL ACCESS METHODS ACCGO: SETOM @CHGADR ;INDICATE CHANGING PROFILE ENTRY SETOM CHGMSK+.AEACC ;BOTH PLACES SETZ P1, ;CLEAR "NO" FLAG $RETT ;AND RETURN ; "DEFAULT" KEYWORD PROCESSOR ACCDEF: PUSHJ P,ACCDFL ;DO DEFAULTING PJRST ACCGO ;FINISH UP ; "DONE" KEYWORD PROCESSOR ACCDON: PUSHJ P,P$KEYW## ;SEE IF CONTROL-Z SKIPT ;IT'S NOT TERMINATED PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS ADJSP P,-1 ;WE WILL RETURN ON BEHALF OF CALLER MOVEI S1,.AEACC ;PROFILE OFFSET WE'RE DOING PJRST CMPVAL ;SET CHANGE FLAGS ACCORDINGLY AND RETURN ; "HELP" KEYWORD PROCESSOR ACCHLX: PUSHJ P,P$CFM ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS PUSHJ P,P$PREV## ;BACKUP OVER THE CRLF MOVEI S1,@ACC+CG.HLP ;POINT TO HELP TEXT $TEXT (,<^T/(S1)/>) ;GIVE HELP SETZ P1, ;CLEAR "NO" FLAG $RETT ;AND RETURN ; "NO" KEYWORD PROCESSOR ACCNO: MOVNI P1,1 ;SET "NO" FLAG $RETT ;RETURN ; "NONE" KEYWORD PROCESSOR ACCNON: PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS PUSHJ P,P$PREV## ;BACKUP OVER THE CRLF MOVX S1,AE.FIO ;NO ACCESS MEANS "FILES ONLY" MOVEM S1,.AEACC(U) ;SAVE BIT PJRST ACCGO ;GO SET THE MASKS SUBTTL ENTRIES -- ADM - ADMINISTRATIVE DATA .ENTRY (ADM,-1,) ADMPRS: $CRLF ; GET ROUTINE ADMGET: $RETT ; COMPARE ROUTINE ADMCMP: $RETT ; CHANGE ROUTINE ADMCHG: $RETF ; DEFAULT ROUTINE ADMDFL: PJRST PRODFZ ;NO CAN DO ; RESTORE ROUTINE ADMRES: $RETF ; PRINT ROUTINE ADMPRT: MOVE S1,.AEPAP(U) ;GET LAST CHANGE PPN MOVE S2,.AETIM(U) ;GET LAST CHANGE DATE/TIME $TEXT (,<^M^J Profile last changed by ^U/S1/ at ^H/S2/>) SKIPE .AEFAI(U) ;ACCOUNT ACCESSED EVER? JRST ADMPR1 ;YES MOVEI T1,[ITEXT(<-never->)] ;NO JRST ADMPR2 ADMPR1: MOVX S1,AE.FAI ;GET ACCESS FAILURE BIT TDNE S1,.AEFLG(U) ;SUCCESS? SKIPA S1,[[ASCIZ\failed\]] ;NOPE MOVEI S1,[ASCIZ\succeeded\] ;YES MOVEI T1,[ITEXT(<^T/(S1)/ on ^H/.AEFAI(U)/>)] ADMPR2: $TEXT (,< Last access ^I/(T1)/>) SKIPN .AELPC(U) ;LAST PASSWORD CHANGE? SKIPA T1,[[ITEXT(<-none->)]] ;NO MOVEI T1,[ITEXT(< at ^H/.AELPC(U)/>)] ;YES $TEXT (,< Last password change ^I/(T1)/>) $RETT ;RETURN ; HELP TEXT ADMHLP: ASCIZ \ ADMINISTRATIVE DATA are those quantities maintained by the accounting system to track profile changes. These values cannot be changed using REACT, nor can they be defaulted. \ SUBTTL ENTRIES -- CTX - CONTEXT-QUOTAS .ENTRY (CTX,.AECTX,) CTXPRS: $NUMBER (CTX010,^D10,,<$PDEFAULT(DEFTX1),$PREFIL(CTXACT)>) CTX010: $NUMBER (CONFRM,^D10,,<$PDEFAULT(DEFTX2)>) CTXACT: MOVE S1,[%CTJCQ] ;GETTAB ARGUMENT GETTAB S1, ;GET DEFAULT CONTEXT QUOTA MOVEI S1,4 ;ANCIENT MONITOR $TEXT (<-1,,DEFTX1>,<^D/S1/^0>) MOVE S1,[%CTJPQ] ;GETTAB ARGUMENT GETTAB S1, ;GET DEFAULT SAVED PAGE QUOTA MOVEI S1,^D1000 ;ANCIENT MONITOR $TEXT (<-1,,DEFTX2>,<^D/S1/^0>) $RETT ;RETURN ; GET ROUTINE CTXGET: PUSHJ P,P$NUM## ;GET NUMBER OF CONTEXTS JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T1,S1 ;COPY MOVEI T1,0 ;CAN'T BE NEGATIVE PUSHJ P,P$NUM## ;GET IDLE CONTEXT PAGE LIMIT JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T2,S1 ;COPY MOVEI T2,0 ;CAN'T BE NEGATIVE PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS SKIPN T1 ;UNLIMITED? WARN (NCL,) MOVEI S1,,35)> ;GET LIMIT CAIG T1,(S1) ;RANGE CHECK JRST CTXGE1 ;REASONABLE NUMBER WARN (RCL,) MOVEI T1,(S1) ;ADJUST CTXGE1: DPB T1,CTXCNQ ;STORE CONTEXT LIMIT SKIPN T2 ;UNLIMITED? WARN (NPL,) DPB T2,CTXCPQ ;STORE PAGE LIMIT MOVEI S1,.AECTX ;OFFSET TO CHECK PJRST CMPVLC ;SET CHANGE FLAGS & RETURN ; COMPARE ROUTINE CTXCMP: MOVEI S1,.AECTX ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE CTXCHG: MOVEI S1,.AECTX ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE CTXDFL: SETOM PRSDFV ;REMEMBER WE CARE MOVX S1,DF.CTX ;DEFAULT BIT FOR FIELD IORM S1,DF$CTX(U) ;LIGHT IN PROFILE SETOM @CHGADR ;CHANGED IT SETOM CHGMSK+.AECTX ;WHOLE WORD $RETT ;WIN ; RESTORE ROUTINE CTXRES: MOVE S1,.AECTX(X) ;GET OLD CTX VALUES MOVEM S1,.AECTX(U) ;RESTORE MOVX S1,DF.CTX ;CTX DEFAULT BIT ANDCAM S1,DF$CTX(U) ;CLEAR IN WORKING COPY TDNE S1,DF$CTX(X) ;WAS IT CLEAR BEFORE? IORM S1,DF$CTX(U) ;NO, FIX IT SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AECTX ;BOTH PLACES $RETT ;AND RETURN ; PRINT ROUTINE CTXPRT: LDB T1,CTXCNQ LDB T2,CTXCPQ $TEXT (,) $RETT ; HELP TEXT CTXHLP: ASCIZ \ CONTEXT-QUOTAS specify the limits governing the use of job contexts. The context quota is the number of contexts a user may have at any one time. Each logged in job has at least one (current) context. The maximum is 511. A quota of zero indicates no limit. The saved page quota is the number of pages of swapping space a user may occupy with idle contexts. A quota of zero indicates no limit. Refer to the description of job contexts in the TOPS-10 Operating System Commands Manual for more information. \ SUBTTL ENTRIES -- COR - CORE-LIMITS .ENTRY (COR,.AECOR,) CORPRS: $NUMBER (COR010,^D10,,<$DEFAULT(<512>)>) COR010: $NUMBER (CONFRM,^D10,,<$DEFAULT(<512>)>) ; GET ROUTINE CORGET: PUSHJ P,P$NUM## ;GET A NUMBER FROM COMMAND BLOCK JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T1,S1 ;COPY MOVEI T1,0 ;CAN'T BE NEGATIVE PUSHJ P,P$NUM## ;GET THE NEXT NUMBER FROM COMMAND BLOCK JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T2,S1 ;COPY MOVEI T2,0 ;CAN'T BE NEGATIVE PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS MOVE S1,T1 ;GET PHYSICAL LIMIT PUSHJ P,CORGE1 ;CHECK IT DPB S1,CORPHY ;STORE NEW PHYSICAL LIMIT MOVE S1,T2 ;GET VIRTUAL LIMIT PUSHJ P,CORGE2 ;CHECK IT DPB S1,CORVRT ;STORE NEW VIRTUAL LIMIT MOVEI S1,.AECOR ;OFFSET TO CHECK PJRST CMPVLC ;SET CHANGE FLAGS & RETURN CORGE1: SKIPA T3,[[ASCIZ /physical/]] CORGE2: SKIPA T3,[[ASCIZ /virtual/]] SKIPA S2,[MASK.(,35)] ;GET PHYSICAL LIMIT MOVEI S2,,35)> ;GET VIRTUAL LIMIT CAIG S1,(S2) ;RANGE CHECK POPJ P, ;REASONABLE NUMBER WARN (RCL,) MOVEI S1,(S2) ;ADJUST POPJ P, ;RETURN ; COMPARE ROUTINE CORCMP: MOVEI S1,.AECOR ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE CORCHG: MOVEI S1,.AECOR ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE CORDFL: SETOM PRSDFV ;REMEMBER WE CARE MOVX S1,DF.COR ;DEFAULT BIT FOR FIELD IORM S1,DF$COR(U) ;LIGHT IN PROFILE SETOM @CHGADR ;CHANGED THE ENTRY SETOM CHGMSK+.AECOR ;BOTH FIELDS $RETT ;WIN ; RESTORE ROUTINE CORRES: MOVE S1,.AECOR(X) ;GET ORIGINAL CORE VALUES MOVEM S1,.AECOR(U) ;RESTORE MOVX S1,DF.COR ;DEFAULT BIT FOR CORE WORD ANDCAM S1,DF$COR(U) ;ASSUME CLEAR IN WORKING COPY TDNE S1,DF$COR(X) ;DOES THIS MATCH THE ORIGINAL? IORM S1,DF$COR(U) ;NO, FIX UP FOR WRONG GUESS SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AECOR ;IN BOTH PLACES $RETT ;AND RETURN ; PRINT ROUTINE CORPRT: LDB T1,CORPHY ;GET PHYSICAL LIMIT LDB T2,CORVRT ;GET VIRTUAL LIMIT $TEXT (,) $RETT ;RETURN ; HELP TEXT CORHLP: ASCIZ \ CORE-LIMITS specifies a decimal value for the physical and virtual page limits. The maximum number of pages is 16,384. \ SUBTTL ENTRIES -- DST - DISTRIBUTION-LOCATION .ENTRY (DST,.AEBOX,) DSTPRS: $QUOTE (CONFRM,,<$PREFI(P$8BIT##),$ALTER(DST010)>) DST010: $FIELD (CONFRM,,<$PREFI(P$8BIT##),$BREAK(TXTBRK),$FLAGS(CM%SDH)>) ; GET ROUTINE DSTGET: PUSHJ P,.SAVE1 ;SAVE P1 PUSHJ P,P$QSTR## ;GET A QUOTED STRING SKIPT ;CHECK FOR ERRORS PUSHJ P,P$FLD## ;MAYBE JUST A FIELD JUMPF PRSERR ;CHECK FOR ERRORS MOVE P1,S1 ;SAVE STRING ADDRESS PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS MOVEI S1,(P1) ;POINT TO PARSER DATA BLOCK MOVE S2,[.ADLLC,,.ADLLW] ;GET LENGTH IN CHARACTERS,,LENGTH IN WORDS MOVEI T1,10 ;8-BIT BYTES PUSHJ P,PROSTR ;CHECK STRING LENGTH AND CONTENT MOVEI S1,(P1) ;PARSER DATA BLOCK ADDRESS MOVE S2,DST+CG.PFL ;PROFILE OFFSET PUSHJ P,PROBLK ;ADD/DELETE EXTENSIBLE BLOCK SKIPT ;CHECK FOR ERRORS WARN (NRM,,,DSTRES) MOVEI S1,.AEBOX ;OFFSET TO CHECK PJRST CMPVLC ;SET CHANGE FLAGS & RETURN ; COMPARE ROUTINE DSTCMP: MOVEI S1,.AEBOX ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE DSTCHG: MOVEI S1,.AEBOX ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE DSTDFL: SETOM PRSDFV ;REMEMBER WE CARE MOVX S1,DF.BOX ;DEFAULT BIT FOR FIELD IORM S1,DF$BOX(U) ;SET IN PROFILE SETOM @CHGADR ;WE CHANGED IT SETOM CHGMSK+.AEBOX ;WHOLE THING $RETT ;WIN ; RESTORE ROUTINE DSTRES: MOVEI T1,(U) ;POINT TO PROFILE HLLZ T2,.AEBOX(X) ;-LENGTH HRRI T2,.AEBOX ;OFFSET SKIPE T3,.AEBOX(X) ;ORIGINAL OFFSET POINTER ADDI T3,(X) ;INDEX INTO PROFILE MOVX T4,DF.BOX ;DEFAULT BIT FOR FIELD TDNN T4,DF$BOX(X) ;WAS IT DEFAULTED BEFORE? TDZA T4,T4 ;NO, CLEAR THE BIT MOVEI T4,1 ;YES, SET THE BIT PUSHJ P,A$EBLK## ;RESTORE ORIGINAL DISTRIBUTION LOCATION SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AEBOX ;IN BOTH PLACES $RETT ;RETURN ; PRINT ROUTINE DSTPRT: SKIPN S1,.AEBOX(U) ;GET AOBJN POINTER SKIPA S1,[NONE8] ;THERE IS NONE ADDI S1,(U) ;INDEX INTO PROFILE HRLI S1,(POINT 8,) ;MAKE A BYTE POINTER $TEXT (,<^Q/S1/>) ;DISPLAY $RETT ; HELP TEXT DSTHLP: ASCIZ \ DISTRIBUTION-LOCATION specifies text to be displayed on the banner page(s) of spooled output. The text indicates where the operator should distribute the user's output. \ SUBTTL ENTRIES -- ENQ - ENQ-DEQ-QUOTA .ENTRY (ENQ,.AEENQ,) ENQPRS: $NUMBER (CONFRM,^D10,,<$PDEFAULT(DEFTX1),$PREFIL(ENQACT)>) ENQACT: MOVE S1,[%EQDEQ] ;GETTAB ARGUMENT GETTAB S1, ;GET DEFAULT ENQ/DEQ QUOTA MOVEI S1,^D511 ;SICK MONITOR $TEXT (<-1,,DEFTX1>,<^D/S1/^0>) $RETT ;RETURN ; GET ROUTINE ENQGET: PUSHJ P,P$NUM## ;GET A NUMBER FROM JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T1,S1 ;COPY MOVEI T1,0 ;CAN'T BE NEGATIVE PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS MOVEI T2,^D511 ;GET LIMIT CAIG T1,(T2) ;TOO BIG? JRST ENQGE1 ;YES WARN (REL,) MOVEI T1,(T2) ;ADJUST ENQGE1: MOVEM T1,.AEENQ(U) ;STORE AS NEW ENQ/DEQ QUOTA MOVEI S1,.AEENQ ;OFFSET TO CHECK PJRST CMPVLC ;SET CHANGE FLAGS & RETURN ; COMPARE ROUTINE ENQCMP: MOVEI S1,.AEENQ ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE ENQCHG: MOVEI S1,.AEENQ ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE ENQDFL: SETOM PRSDFV ;REMEMBER WE CARE MOVX S1,DF.ENQ ;DEFAULT BIT FOR FIELD IORM S1,DF$ENQ(U) ;LIGHT IN PROFILE SETOM @CHGADR ;WE CHANGED THE ENTRY SETOM CHGMSK+.AEENQ ;WHOLE THING $RETT ;WIN ; RESTORE ROUTINE ENQRES: MOVE S1,.AEENQ(X) ;GET ORIGINAL ENQ/DEQ QUOTAS MOVEM S1,.AEENQ(U) ;RESTORE MOVX S1,DF.ENQ ;DEFAULT BIT FOR ENQ/DEQ WORD ANDCAM S1,DF$ENQ(U) ;ASSUME CLEAR IN WORKING COPY TDNE S1,DF$ENQ(X) ;DOES THIS MATCH THE ORIGINAL? IORM S1,DF$ENQ(U) ;NO, FIX UP FOR WRONG GUESS SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AEENQ ;IN BOTH PLACES $RETT ;AND RETURN ; PRINT ROUTINE ENQPRT: MOVE T1,.AEENQ(U) ;GET ENQ/DEQ QUOTAS $TEXT (,<^D/T1/>) ;DISPLAY $RETT ; HELP TEXT ENQHLP: ASCIZ \ ENQ-DEQ-QUOTA specifies a decimal value for the number of outstanding ENQ locks. The maximum number is 511. \ SUBTTL ENTRIES -- EXP - EXPIRATION-DATE .ENTRY (EXP,.AEEXP,) EXPPRS: $KEYDSP (EXP010,<$ALTER(EXP020)>) EXP010: $STAB DSPTAB (CONFRM,0,) DSPTAB (CONFRM,1,) $ETAB EXP020: $TAD (CONFRM) ; GET ROUTINE EXPGET: PUSHJ P,P$TIME## ;GET THE TIME FIELD FROM COMMAND BLOCK JUMPT EXPGE1 ;IF WE GOT IT, O.K. PUSHJ P,P$KEYW## ;FIND OUT IF KEYWORD JUMPF PRSERR ;CHECK FOR ERRORS JUMPE S1,EXPGE1 ;JUMP IF "NEVER" CAIE S1,1 ;ELSE BETTER BE "NOW" JRST PRSERR ;GIVE UP PUSHJ P,I%NOW ;GET CURRENT UDT EXPGE1: MOVE T1,S1 ;COPY RESULT PUSHJ P,P$CFM## ;GET CRLF JUMPF PRSERR ;CHECK FOR ERRORS MOVEM T1,.AEEXP(U) ;SAVE EXPIRATION DATE/TIME IN USER BLOCK MOVEI S1,.AEEXP ;OFFSET TO CHECK PJRST CMPVLC ;SET CHANGE FLAGS & RETURN ; COMPARE ROUTINE EXPCMP: MOVEI S1,.AEEXP ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE EXPCHG: MOVEI S1,.AEEXP ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE EXPDFL: SETOM PRSDFV ;REMEMBER WE CARE MOVX S1,DF.EXP ;DEFAULT BIT FOR FIELD IORM S1,DF$EXP(U) ;LIGHT IN PROFILE SETOM @CHGADR ;WE CHANGED IT SETOM CHGMSK+.AEEXP ;WHOLE THING $RETT ;WIN ; RESTORE ROUTINE EXPRES: MOVE S1,.AEEXP(X) ;GET ORIGINAL EXPIRATION DATE/TIME MOVEM S1,.AEEXP(U) ;RESTORE MOVX S1,DF.EXP ;DEFAULT BIT FOR EXPIRATION WORD ANDCAM S1,DF$EXP(U) ;ASSUME CLEAR IN WORKING COPY TDNE S1,DF$EXP(X) ;DOES THIS MATCH THE ORIGINAL? IORM S1,DF$EXP(U) ;NO, FIX UP FOR WRONG GUESS SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AEEXP ;IN BOTH PLACES $RETT ;AND RETURN ; PRINT ROUTINE EXPPRT: PUSHJ P,I%NOW ;GET CURRENT DATE/TIME MOVE T1,.AEEXP(U) ;GET EXPIRATION DATE MOVEI T2,[ITEXT (<^H/T1/>)] ;ASSUME NORMAL DATE CAMG T1,S1 ;EXPIRED? MOVEI T2,[ITEXT ()] ;YES SKIPG T1 ;NEVER? MOVEI T2,[ITEXT ()] ;YES $TEXT (,<^I/(T2)/>) ;DISPLAY $RETT ;AND RETURN ; HELP TEXT EXPHLP: ASCIZ \ EXPIRATION-DATE specifies the date when LOGINs to this account are no longer allowed. This date is also written into the UFD for all mounted structures for disk maintenance purposes. \ SUBTTL ENTRIES -- IPC - IPCF-QUOTAS .ENTRY (IPC,.AEIPC,) IPCPRS: $NUMBER (IPC010,^D10,,<$PDEFAULT(DEFTX1),$PREFIL(IPCACT)>) IPC010: $NUMBER (IPCF20,^D10,,<$PDEFAULT(DEFTX2)>) IPCF20: $NUMBER (CONFRM,^D10,,<$PDEFAULT(DEFTX3)>) ; ACTION ROUTINE TO GENERATE DEFAULT QUOTA STRINGS IPCACT: MOVE S1,[%IPCDQ] ;GETTAB ARGUMENT GETTAB S1, ;GET DEFAULT SEND/RECEIVE QUOTA MOVEI S1,2005 ;SICK MONITOR LDB S2,[POINT 9,S1,26] ;GET SEND $TEXT (<-1,,DEFTX1>,<^D/S2/^0>) LDB S2,[POINT 9,S1,35] ;GET RECEIVE $TEXT (<-1,,DEFTX2>,<^D/S2/^0>) MOVE S1,[%IPDPQ] ;GETTAB ARGUMENT GETTAB S1, ;GET DEFAULT PID QUOTA MOVEI S1,2 ;ANCIENT MONITOR $TEXT (<-1,,DEFTX3>,<^D/S1/^0>) $RETT ;RETURN ; GET ROUTINE IPCGET: PUSHJ P,P$NUM## ;GET SEND QUOTA JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T1,S1 ;COPY MOVEI T1,0 ;CAN'T BE NEGATIVE PUSHJ P,P$NUM## ;GET THE RECEIVE QUOTA JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T2,S1 ;COPY MOVEI T2,0 ;CAN'T BE NEGATIVE PUSHJ P,P$NUM## ;GET NUMBER OF PIDS JUMPF PRSERR ;CHECK FOR ERRORS SKIPGE T3,S1 ;COPY MOVEI T3,0 ;CAN'T BE NEGATIVE PUSHJ P,P$CFM## ;GET EOL JUMPF PRSERR ;CHECK FOR ERRORS MOVEI S1,(T1) ;GET SEND QUOTA PUSHJ P,IPCGE1 ;CHECK IT DPB S1,IPCFS ;STORE MOVEI S1,(T2) ;GET RECEIVE QUOTA PUSHJ P,IPCGE2 ;CHECK IT DPB S1,IPCFR ;STORE MOVEI S1,(T3) ;GET PID QUOTA PUSHJ P,IPCGE3 ;CHECK IT DPB S1,IPCFP ;STORE MOVEI S1,.AEIPC ;OFFSET TO CHECK PJRST CMPVLC ;SET CHANGE FLAGS & RETURN IPCGE1: MOVEI T4,[ASCIZ /send/] MOVEI S2,,35)> ;GET LIMIT JRST IPCGE4 ;GO COMPARE IPCGE2: MOVEI T4,[ASCIZ /receive/] MOVEI S2,,35)> ;GET LIMIT JRST IPCGE4 ;GO COMPARE IPCGE3: MOVEI T4,[ASCIZ /PID/] MOVEI S2,,35)> ;GET LIMIT IPCGE4: CAIG S1,(S2) ;TOO BIG? POPJ P, ;NO WARN (RIQ,) MOVEI S1,(S2) ;ADJUST POPJ P, ;RETURN ; COMPARE ROUTINE IPCCMP: MOVEI S1,.AEIPC ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE IPCCHG: MOVEI S1,.AEIPC ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE IPCDFL: SETOM PRSDFV ;REMEMBER WE CARE MOVX S1,DF.IPC ;DEFAULT BIT FOR FIELD IORM S1,DF$IPC(U) ;LIGHT IN PROFILE SETOM @CHGADR ;WE CHANGED IT SETOM CHGMSK+.AEIPC ;WHOLE THING $RETT ;WIN ; RESTORE ROUTINE IPCRES: MOVE S1,.AEIPC(X) ;GET ORIGINAL IPCF VALUES MOVEM S1,.AEIPC(U) ;RESTORE MOVX S1,DF.IPC ;DEFAULT BIT FOR IPCF WORD ANDCAM S1,DF$IPC(U) ;ASSUME CLEAR IN WORKING COPY TDNE S1,DF$IPC(X) ;DOES THIS MATCH THE ORIGINAL? IORM S1,DF$IPC(U) ;NO, FIX UP FOR WRONG GUESS SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AEIPC ;IN BOTH PLACES $RETT ;AND RETURN ; PRINT ROUTINE IPCPRT: LDB T1,IPCFS ;SEND QUOTA LDB T2,IPCFR ;RECEIVE QUOTA LDB T3,IPCFP ;PID QUOTA $TEXT (,) $RETT ; HELP TEXT IPCHLP: ASCIZ \ IPCF-QUOTAS specifies a decimal value for the SEND, RECEIVE, and PID quotas. The maximum value for each quota is 511. \ SUBTTL ENTRIES -- LTI - LOGIN-TIMES .ENTRY (LTI,.AELGT,) LTIPRS: $NOISE (CONFRM,) LTI000: $INIT (LTI010) LTI010: $KEYDSP (LTI020,<$ALTER(LTI060)>) LTI020: $STAB DSPTAB (LTI010,-4,,CM%NOR) DSPTAB (LTI010,-4,) DSPTAB (LTI010,-3,) DSPTAB (LTI030,-2,) DSPTAB (LTI030,-1,) $ETAB LTI030: $NUMBER (LTI040,^D10,,<$DEFAULT(<0>)>) LTI040: $TOKEN (LTI050,<:>,<$DEFAULT(<:>)>) LTI050: $NUMBER (LTI010,^D10,,<$DEFAULT(<23>)>) LTI060: $KEYDSP (LTI070,<$ALTER(CONFRM)>) LTI070: $STAB DSPTAB ( ,2,\"32,CM%INV) DSPTAB (CONFRM,0,) DSPTAB (CONFRM,1,) DSPTAB (CONFRM,2,,CM%NOR) DSPTAB (CONFRM,2,) DSPTAB (CONFRM,3,) DSPTAB (LTI080,4,) DSPTAB (CONFRM,5,) DSPTAB (CONFRM,6,) DSPTAB (CONFRM,7,) $ETAB LTI080: $KEYDSP (LTI020) ; GET ROUTINE LTIGET: PUSHJ P,.SAVE1 ;SAVE P1 LTIGE1: MOVEI S1,LTI000 ;POINT TO SUB-COMMAND TABLES MOVEI S2,[ASCIZ \LOGIN-TIMES>\] PUSHJ P,PRSCMD ;PARSE THE COMMAND JUMPF PRSERR ;CHECK FOR ERRORS SETZ P1, ;CLEAR "NO" FLAG LTIGE2: PUSHJ P,P$CFM## ;CRLF? JUMPT LTIGE1 ;YES PUSHJ P,P$KEYW## ;GET KEYWORD JUMPF PRSERR ;CHECK FOR ERRORS CAILE S1,LTILEN ;A COMMON KEYWORD? HRRES S1 ;NO--MAKE A NEGATIVE INDEX PUSHJ P,@LTITAB(S1) ;DISPATCH JRST LTIGE2 ;TRY FOR MORE ; COMPARE ROUTINE LTICMP: MOVEI S1,.AELGT ;PROFILE OFFSET PJRST COMPAR ;GO COMPARE ; CHANGE ROUTINE LTICHG: MOVEI S1,.AELGT ;PROFILE OFFSET PJRST QUECHG ;QUEUE UP THE CHANGE ; DEFAULT ROUTINE LTIDFL: SETOM PRSDFV ;REMEMBER WE CARE MOVX S1,DF.LGT ;DEFAULT BIT FOR FIELD IORM S1,DF$LGT(U) ;LIGHT IN PROFILE SETOM @CHGADR ;WE CHANGED IT SETOM CHGMSK+.AELGT ;WHOLE THING $RETT ;WIN ; RESTORE ROUTINE LTIRES: MOVE S1,.AELGT(X) ;GET ORIGINAL LOGIN TIMES MOVEM S1,.AELGT(U) ;RESTORE MOVX S1,DF.LGT ;DEFAULT BIT FOR TIMES WORD ANDCAM S1,DF$LGT(U) ;ASSUME CLEAR IN WORKING COPY TDNE S1,DF$LGT(X) ;DOES THIS MATCH THE ORIGINAL? IORM S1,DF$LGT(U) ;NO, FIX UP FOR WRONG GUESS SETZM @CHGADR ;INDICATE NOT CHANGING PROFILE ENTRY SETZM CHGMSK+.AELGT ;IN BOTH PLACES $RETT ;AND RETURN ; PRINT ROUTINE LTIPRT: $TEXT (,) LOAD S1,.AELGT(U),AE.WDH ;GET WEEKDAY LOGIN TIMES SKIPN S1 ;ANY TIMES SET? $TEXT (,<-none-