Trailing-Edge
-
PDP-10 Archives
-
BB-JR93N-BB_1990
-
10,7/login/login.mac
There are 15 other files named login.mac in the archive. Click here to see a list.
TITLE LOGIN - Program to access the DECsystem-10
SUBTTL DLC/TW/DJB/DAL/RCC/JSL/DAL/LC/HRB/BAH/WCL/KPY/MSL/WSM/DPM/Tarl
; COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
;1969,1974,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990.
; 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.
LGNVER==65
LGNMIN==0
LGNEDT==3016
LGNWHO==0
SEARCH UUOSYM,MACTEN,SCNMAC,ACTSYM,UFDPRM
.REQUEST REL:SCAN,REL:WILD,REL:HELPER,REL:UFDSET
SALL
.DIRECT FLBLST
TWOSEG
LOC 137
EXP <%%LGN==<BYTE(3)LGNWHO(9)LGNVER(6)LGNMIN(18)LGNEDT>>
RELOC 400000
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1969,1990. ALL RIGHTS RESERVED.
\;END COPYRIGHT MACRO
; TABLE OF CONTENTS FOR LOGIN
;
;
; SECTION PAGE
; 1. Table of contents......................................... 2
; 2. Edit history.............................................. 3
; 3. Debugging patch for the monitor........................... 19
; 4. Definitions
; 4.1 Assembly parameters............................... 20
; 4.2 AC assignments.................................... 21
; 4.3 Flags in AC F..................................... 22
; 4.4 Command bits and offsets.......................... 23
; 4.5 Message macros.................................... 24
; 5. Program initialization.................................... 25
; 6. Command processing
; 6.1 Initialization and dispatch....................... 30
; 6.2 ATTACH - ATTACH command........................... 31
; 6.3 KJOB - KJOB command............................... 32
; 6.4 DOLOG - LOGIN command............................. 33
; 6.5 REATTA - REATTACH command......................... 35
; 6.6 SESSIO - SESSION command.......................... 36
; 6.7 SETPSW - SET PASSWORD command..................... 37
; 6.8 PASSWO - PASSWORD command......................... 38
; 6.9 TRANSL - TRANSL command........................... 39
; 7. EXIT routines
; 7.1 FLUSH - Special error processing.................. 41
; 8. Exit routines
; 8.1 MONRET - Exit program............................. 42
; 8.2 RICC - Control-C trapping......................... 43
; 8.3 SUMARY - Print KJOB summary....................... 44
; 8.4 XITMON - Code to exit to the monitor.............. 48
; 8.5 XITRUN - Code to do a RUN UUO..................... 49
; 8.6 DAYMES - Print daily messages..................... 50
; 9. Accounting routines
; 9.1 ACCCHK - Check for a previous valid LOGIN......... 51
; 9.2 ACTCHK - Check for [SYSTEM]ACCOUNTING............. 52
; 9.3 CHGNAM - Change name.............................. 53
; 9.4 CHGPSW - Change password.......................... 54
; 9.5 LOKCHK/LOKWRN - Check for locked files............ 55
; 9.6 PFLCHK - Profile check............................ 56
; 9.7 PSWCHK - Check for a legal password............... 57
; 9.8 PPNEXP - Check for PPN/PSW expiration............. 58
; 9.9 SETTNL - Set up terminal designator for USAGE..... 59
; 9.10 STACCT - Read a user profiles..................... 60
; 9.11 TIMCHK - Check for access times................... 64
; 10. KJOB routines
; 10.1 CHKQTA - Main quota checking loop................. 65
; 10.2 INIQTA - Initialize the list of structures........ 66
; 10.3 NXTQTA - Get next structure in search list........ 67
; 10.4 RESQTA - Restore this job's search list........... 68
; 10.5 LGTBAT - Batch deletion algorithm................. 69
; 10.6 STEP1 - Delete files that are too large........... 70
; 10.7 STEP2 - Delete FIRST files........................ 71
; 10.8 STEP3 - Get all other unIMPORTant files........... 72
; 10.9 STEP4 - Delete rest of FIRST files................ 73
; 10.10 STEP5 - Delete unprotected IMPORTant files........ 74
; 10.11 STEP6 - Delete rest of unIMPORTant files.......... 75
; 10.12 STEP7 - Delete the rest of the files.............. 76
; 10.13 BATLKP - Routine to LOOKUP a file................. 77
; 10.14 BATDEL - Routine to DELETE a file................. 78
; 10.15 BATALL - Setup to LOOKUP STR:[,,**]............... 81
; 10.16 BATEXT - Setup to read *.EXT[*,*,*,*,*]........... 82
; 10.17 BATNXT - Routine to call .LKWLD................... 83
; 11. File I/O
; 11.1 DELFIL - Delete a single file..................... 84
; 11.2 INIFIL - Initialize I/O data storage.............. 86
; 11.3 NEWFIL - Check file creation time................. 87
; 11.4 NOTE - Print file(s) specified by /NOTE switch.... 88
; 11.5 NOTICE - Print NOTICE.TXT......................... 89
; 11.6 STRMES - Print STR.TXT............................ 90
; 11.7 LGNMES - Print LOGIN.TXT.......................... 91
; 11.8 TYPE - Print a file on the terminal............... 92
; 12. Command dispatch tables................................... 93
; 13. Command scanning routines
; 13.1 ERRUKK/ERREXA/ERRILC - Error messages............. 94
; 13.2 GETUSR - Read PPN/path/user name.................. 95
; 13.3 PSCAN - Init scanning of switches................. 100
; 13.4 PXSCAN - Init scanning one argument............... 101
; 13.5 SCMPMT - SCAN prompt.............................. 102
; 13.6 SWTSCN - Parse switches........................... 103
; 14. Prompt for additional data
; 14.1 ASKACT - Read account string...................... 104
; 14.2 ASKATT - Read detached job# for ATTACH............ 105
; 14.3 ASKLOG - Read detached job# for LOGIN............. 106
; 14.4 ASKNAM - Read user name........................... 107
; 14.5 ASKPSW - Read password(s)......................... 108
; 14.6 ASKRMK - Read remark string....................... 111
; 15. SCAN argument blocks
; 15.1 .ISCAN............................................ 112
; 15.2 .OSCAN............................................ 113
; 15.3 .PSCAN............................................ 114
; 16. SCAN switch tables
; 16.1 ATTACH command.................................... 115
; 16.2 KJOB command...................................... 117
; 16.3 LOGIN command..................................... 119
; 16.4 [SET] PASSWORD COMMAND............................ 121
; 16.5 REATTA command.................................... 123
; 16.6 SESSION command................................... 125
; 16.7 TRANLS command.................................... 127
; 16.8 /BATCH switch..................................... 129
; 16.9 /DEFAULT switch................................... 131
; 16.10 /TERMINAL switch.................................. 133
; 17. SCAN switch processing
; 17.1 ACCTSW - /ACCOUNT................................. 135
; 17.2 ASGNSW - /ASSIGN.................................. 136
; 17.3 BATCSW - /BATCH................................... 137
; 17.4 BATNAM - /BATCH:NAME.............................. 138
; 17.5 DEFASW - /DEFAULT................................. 139
; 17.6 DSKPSW - /DSKPRIORITY............................. 140
; 17.7 QUOTSW - /QUOTA................................... 141
; 17.8 RMRKSW - /REMARK.................................. 142
; 17.9 TERMSW - /TERMINAL................................ 143
; 17.10 HELPTB - Keyword help typeout..................... 144
; 17.11 KEYWRD - Complex switch argument parsing.......... 145
; 17.12 SWITCH - Read SWITCH.INI.......................... 147
; 18. SCAN switch defaulting
; 18.1 TTYDEF - Terminal parameters...................... 148
; 19. Set routines
; 19.1 ASNDEV - Assign devices........................... 149
; 19.2 CRESFD - Create SFDs.............................. 150
; 19.3 PRETMS/POSTMS - Set terminal parameters........... 151
; 19.4 PRVSET - Set all privileged parameters............ 152
; 19.5 USRSET - Set all unprivileged parameters.......... 153
; 19.6 SETACT - Set account string....................... 154
; 19.7 SETCOR - Set core limits.......................... 155
; 19.8 SETCTX - Set context quotas....................... 156
; 19.9 SETDEF - Set DEFAULT.............................. 157
; 19.10 SETDSF - Set DSKFUL............................... 158
; 19.11 SETDSP - Set DSKPRIORITY.......................... 159
; 19.12 SETENQ - Set ENQ/DEQ parameters................... 160
; 19.13 SETGLX - Set GALAXY batch parameters.............. 161
; 19.14 SETIPC - Set IPCF quotas.......................... 162
; 19.15 SETLOC - Set job's location for spooling.......... 163
; 19.16 SETPTH - Set PATH................................. 164
; 19.17 SETSCD - Set scheduler parameters................. 165
; 19.18 SETSPL - Set spooling parameters.................. 166
; 19.19 SETVMX - Set current virtual and physical limits.. 167
; 19.20 SETWAT - Set watch bits........................... 168
; 19.21 SETXXX - Do a SETUUO.............................. 169
; 19.22 TRMOP - TRMOP. UUO loop processor................. 170
; 20. Structure routines
; 20.1 BLDJSL - Build job S/L............................ 172
; 20.2 MNTSTR - Mount structures (set RIPLOG)............ 173
; 20.3 SSLCOP - Copy the system search list.............. 174
; 20.4 ENTPTH - Create a path............................ 175
; 20.5 STRCHK - Check recomp, empty S/L, etc............. 176
; 20.6 STRPUT - Store structure name..................... 177
; 20.7 STRNXT - Return next structure.................... 178
; 20.8 STRQTA - Check for /QUOTA on structure............ 179
; 21. TTY I/O
; 21.1 TTYPMT - Prompt................................... 180
; 21.2 TTYGET - Read a character......................... 181
; 21.3 TTYPUT - Write a character........................ 182
; 22. PSI routines
; 22.1 PSINIT - Initialization........................... 183
; 22.2 PSIDET - Handle ATTACH/DETACH conditions.......... 184
; 23. UFD setup
; 23.1 UFDSET - Call .UFD to mount/setup STR/UFD......... 185
; 23.2 UFDRCP - Recompute disk usage on random structures 186
; 23.3 UFDDMO - Dismount a structure..................... 187
; 23.4 UFDTYO - Handle typeout of errors from .UFD....... 188
; 23.5 UFDINI - Initialize block......................... 189
; 23.6 ADDSTR - Add a structure to search list........... 190
; 23.7 GETLOK - Get UFD interlock........................ 191
; 23.8 CLRLOK - Clear the UFD interlock.................. 192
; 24. Usage entry creation
; 24.1 USGATT - Attach................................... 193
; 24.2 USGLOG - Login.................................... 194
; 24.3 USGQUE - Set up QUEUE. UUO blocks................. 195
; 24.4 USGSES - Session.................................. 196
; 24.5 USGVAL - Validate an account string............... 197
; 25. WTO routines
; 25.1 WTOINI - Initialize WTO message................... 198
; 25.2 WTOSND - Send a WTO to OPR........................ 199
; 25.3 WTOCTY - Send text to the CTY if OPR not available 200
; 26. Miscellaneous routines
; 26.1 ACCLOG - Perform LOGMAX and BATMAX checking....... 201
; 26.2 ATTJOB - ATTACH the job........................... 202
; 26.3 ATTLGL - Check for a legal ATTACH................. 203
; 26.4 AVLCHK - Check system availability................ 204
; 26.5 BANNER - Print LOGIN banner....................... 205
; 26.6 CHRTRN - Translate 8-bit ASCII strings............ 206
; 26.7 CTXINI/CTXUUO - Execute context UUOs.............. 209
; 26.8 CTYCHK - Check CTY status......................... 210
; 26.9 DAYTIM - Print time, date, and weekday............ 211
; 26.10 TRMCLS - Clear screen function.................... 212
; 26.11 DELTMP - Delete TMP files......................... 215
; 26.12 DETJOB - Report detached jobs..................... 217
; 26.13 DETSTS - Print detached job status................ 218
; 26.14 ERRMSG - Error message handler.................... 219
; 26.15 FAILUR - Check for access failures................ 222
; 26.16 GENTIM - Generate day-of-week and times data...... 223
; 26.17 ISBATC - Determine if a batch job................. 224
; 26.18 ISOPSR - Determine if a subjob of OPSER........... 225
; 26.19 KSYCHK - Check pending KSYS....................... 226
; 26.20 LGLACT/LGLRMK - Check strings..................... 227
; 26.21 LOGJOB - LOGIN the job............................ 228
; 26.22 MAILCH - Check for mail........................... 229
; 26.23 MAPJOB - Map all jobs with same PPN............... 230
; 26.24 NEWPPN/OLDPPN - Change PPN........................ 232
; 26.25 CHKLPN - check Logged-in PPN...................... 233
; 26.26 OTHJOB - Report other jobs same PPN............... 234
; 26.27 PTHCHK - Check a path spec........................ 235
; 26.28 PRTPLR - Pluralize strings........................ 236
; 26.29 PRTPPN - Print a PPN.............................. 237
; 26.30 PRTUSR - Print a PPN and name..................... 238
; 26.31 PPNCHK - Check for illegal PPNs................... 239
; 26.32 QUEERR - Process QUEUE. UUO errors................ 240
; 27. Old LOGIN cruft........................................... 241
; 28. Low segment variables..................................... 244
SUBTTL Edit history
;316) FIX TEST FOR WEEKEND TO PREVENT NON-PRIME-TIME USERS FROM
; LOGGING IN DURING PRIME TIME (SPRS 10-14,021 AND 10-14,046)
;317) ENLARGE PARAMETER BLOCK FOR STRUUO SO POINTER TO AUXACC
; ENTRY (RDHED) DOESN'T GET OVERWRITTEN.
; SPRS 10-14,219 AND 10-14,083
;320) MAKE LOGIN PREFIX EACH STR.TXT TYPEOUT WITH THE NAME OF THE
; FILE STRUCTURE FROM WHICH IT CAME. SPR 10-14,031
;321) REALLY IMPLEMENT /HELP (SPR 10-14,031)
;322) CHANGE PREFIX FOR WARNING ERROR MESSAGES FROM ? TO %
; TO PREVENT BATCH JOBS FROM FLUSHING.
; SPRS 10-14,145 AND 10-14,172.
;323) FIX SECURITY BREACH WHERE BOTH NAME AND PSWD ARE REQUIRED AND
; NEITHER IS ASKED FOR. SPR 10-14,306.
;324) PUT IN TEST SO SETUUO IS SKIPPED IF NO BITS WANT TO BE SET.
; SPR 10-14190.
;325) FIX ?LGNIPS IF NO SPACE BETWEEN PPN AND SWITCHES.
; SPR 10-14,031
;326) MOVE MISPLACED CLOSE CONDITIONAL (SPR 10-14,244)
;327) MAKE LOGIN LOOK AT PHYSICAL CORE LIMIT EVEN IN KA MONITORS.
; SPR 10-14,264.
;330) ALLOW PPN TO BE ENCLOSED IN SQUARE BRACKETS ON LOGIN.
;331) REMOVE ALL REFERENCES TO FL.BRK -- OBSOLETE BATCH HACK.
; SPR 10-14,021.
;332) IMPLEMENT /NOWATCH SPR 10-14,145
;333) FIX EDITS 221 AND 226 SO LOGIN REALLY WON'T PRINT NOTICE.TXT
; TO AN OPSER SUBJOB.
;334) MAKE LOGIN SLEEP BETWEEN RETRIES AFTER BAD PASSWORDS ONLY
; ONLY ON PTY'S. SPR 10-14,021.
;335) CLEAR TMPCOR AT BEGINNING OF FLOW RATHER THAN END
; SO /TMPCOR SWITCH WORKS.
;336) FIX EDIT 332, WHICH ONLY DID HALF THE JOB.
;337) FIX EDIT 333, WHICH COMPLETELY MADE NOTICE.TXT GO AWAY, OPSER
; SUBJOB OR NOT!
;340) MAKE ISOPSR ONLY LOOK AT IMMEDIATELY CONTROLLING JOB SO
; NOTICE.TXT WILL GET PRINTED FOR BATCH JOBS.
;341) ANOTHER FIX TO THE INFAMOUS EDIT 333, WHICH SOMETIMES
; TURNED THE TTY INTO A LOCAL COPY TERMINAL
; (SUPER NO-ECHO).
;342) WHEN SETTING UP TEMP SEARCH LIST TO READ SWITCH.INI, ONLY LOOK
; AT STRS WHOSE NAMES BEGIN WITH DSK (DSKA, DSKB, ETC.).
;343) EXIT ON ^Z.
;344) IMPLEMENT SWITCHES TO SET TERMINAL CHARACTERISTICS.
;345) FIX TO EDIT 344 WHERE JOBS WHICH DIDN'T NEED PASSWORDS
; DIDN'T GET TTY CHARACTERISTICS SET.
;346) WHEN SETTING UP TO READ SWITCH.INI, ENABLE SYS (IN CASE
; OF SYSTEMS WITH FUNNY-NAMED FILE STRUCTURES).
;347) PRINT NOTICE.TXT AND /NOTE:FILE EVEN IF CAN'T LOG IN
; (SYS NOT AVAILABLE, BATCH ONLY, ETC.)
;350) MAKE LOGIN GET NAME IF REQUIRED ON ATTACH
; (SPR 10-14,593)
;351) MISCELLANEOUS CODE CLEANUP AND SPEEDUP.
;352) ADD CODE TO SET ENQ/DEQ QUOTAS.
;353) MAKE SURE RP.LOG GETS SET WHEN RECOMPUTING DISK USAGE.
;354) ADD "SYSTEM IS UNATTENDED" MESSAGE
;355) MAKE /NAME LOGIC WORK RIGHT.
;356) ADD CHECK FOR ACCT.SYS FORMAT VERSION 4 AND DON'T
; SET ENQ/DEQ QUOTAS IF NOT VERSION 4.
;357) MISCELLANEOUS CODE CLEANUP ON SUGGESTIONS BY DAL.
;360) MORE CODE CLEANUP.
;361) IF DEVPPN ON SYS FAILS, WE USE GARBAGE. LET'S USE [1,4].
;362) MAKE /NOTE PRINT OUT BEFORE NOTICE.TXT.
;363) DO ALL NON-PRIV. SETUUO'S AFTER PRINTING NOTICES. THIS IS SO
; THE TRMOP.'S (LIKE SPEED) WON'T SCREW UP PRINTING NOTES.
;364) DON'T SETUUO THE SPOOL BITS IF SYSTEM DOESN'T HAVE SPOOLING.
;365) ADD /DEFER AND /NODEFER SWITCHES, AND PREVENT /SPOOL:ALL FROM
; SETTING BIT FOR DEFERRED SPOOLING.
;366) FIX BUG INTRODUCED BY EDIT 324 WHERE /DSKFUL:PAUSE NO LONGER
; WORKS.
;367) ADD CODE TO SLEEP UNTIL OUTPUT BUFFER EMPTY BEFORE DOING
; TRMOP.S WHICH MIGHT GARBLE TTY OUTPUT.
;370) REMOVE ALL REFERENCES TO DATE75 CONDITIONAL
;371) CODE CLEANUP.
;372) MAKE LGNUNV INTO A SEPARATE (UNIVERSAL) FILE TO SPEED ASSEMBLY.
;373) ADD ERROR MESSAGE IN CASE SETUUO FOR DEFER BIT FAILS.
;374) CHECK ST%GAL (GALAXY) BIT IN 2ND STATES WORD AND DON'T TRY
; TO SET DEFER BIT IF ZERO.
;375) IMPROVE ERROR MESSAGE IF TRMOP. FAILS TO TELL FUNCTION CODE.
;376) IF USER TYPES BAD PATH OR PSWD AND RETRIES, HIS PATH
; IS SCREWED UP. FIX: CLEAR PATH BLOCK EACH TIME AROUND.
;377) DON'T DOUBLE-SPACE /NOTE OR /STR TYPEOUT
;400) ADD FTINHOUSE CONDITIONAL AND ENCLOSE IN IT THE CODE
; WHICH WILL ONLY ALLOW FILE STRUCTURES WHOSE NAMES BEGIN WITH
; 'DSK' TO GO INTO YOUR SEARCH LIST WHEN READING SWITCH.INI.
; THIS CODE FIXES THE BUG IN WHICH SWITCH.INI WAS NOT READ
; IF 7 OR 8 PRIVATE PACKS PRECEDE THE PUBLIC PACKS IN THE
; RETURNS FROM SYSSTR. SINCE THIS IS ONLY A PROBLEM IN
; SYSTEMS WITH 9 OR MORE FILE STRUCTURES, THE CODE WILL BE
; CONDITIONED OUT IN FIELD-IMAGE.
;401) PREVENT /MESSAGE:ALL FROM TURNING ON RANDOM WATCH BITS
;402) RANDOM CODE CLEANUP -- ALSO REMOVE CODE FOR ENQ/DEQ SO IT
; CAN BE PUT INTO V57 ALONG WITH SCHED. STUFF IN
; ONE FELL SWOOP
;403) IMPROVE LOGIC FOR READING AUXACC.SYS
;404) (SIGH) FIX EDIT 333 AGAIN.
;405) REMOVE EDIT 372.
;406) SLEEP ON DATASETS AS WELL AS PTY'S FOR RETRIES.
;**** RELEASE VERSION 56 -- -- START VERSION 57 ****
; NEXT EDIT NUMBER WILL BE 420 TO LEAVE ROOM FOR
; MAINTENANCE EDITS.
;420) CHECK LINE NUMBER JUST BEFORE ATTACH UUO SO JOB WHICH
; BECOMES DETACHED DURING ATTACH COMMAND CAN'T STEAL TTY0
; [SPR 15329]
;421) FIX TEST FOR DETACHED LINE. [SPR 15330]
;422) FIX BUG IN RECOMPUTING LOGIC. [SPR 15396]
;423) ADD /RTCOMPATABILITY SWITCH.
;424) MAKE LOGIN USE ALL OF HIGH SEG FOR ACCT.SYS (LOGIN
; USED TO ALWAYS EXPAND CORE EVEN IF NOT NECESSARY)
;425) ADD CODE TO READ SCDMAP.SYS AND SET SCHEDULER CLASSES.
;426) FIX ENQ/DEQ QUOTA ROUTINE.
;427) CHECK FOR END OF STR LIST IN SYSTEMS WITHOUT FENCE AT USRST1.
;430) MAKE A -1 ENQ QUOTA ENTRY MEAN DON'T SET THE QUOTA SO ON THE
; FIRST ENQ UUO MONITOR WILL SUPPLY SYSTEM-WIDE DEFAULT QUOTA
;431) JUMP AROUND ABOUT 30 INSTRUCTIONS IF NON-6.02 MONITOR
; WHICH ONLY APPLY TO 6.02. AREA AFFECTED: PRVSET, PRSET3.
;432) DO A CRLF AFTER TYPING "NO OPERATOR COVERAGE."
;433) FIX POSSIBLE BUG IN SCHED. TABLE BUILDING LOGIC, AND CLEAN
; UP SOME CODE AND ERROR MESSAGES.
;434) ALLOW /HELP TO BE TYPED WITHOUT A PPN
;435) ALLOW CR IN RESPONSE TO # PROMPT WITHOUT NASTY ERROR MESSAGE
;436) ADD CODE TO CALL TSKCHK MODULE. THIS IS USED ON OUR IN-HOUSE
; TIMESHARING SYSTEM TO ASK FOR AND RECORD IN THE FACT FILE
; A COST CENTER AND TASK FOR ACCOUNTING PURPOSES. THIS CODE
; IS UNDER THE FTTASK SWITCH WHICH WILL REMAIN 0 IN FIELD IMAGE.
; THIS CODE IS FOR INFORMATIONAL PURPOSES ONLY AND IS NOT
; SUPPORTED. [NOTE SWITCH REMOVED AS PART OF EDIT 716]
;437) WHEN LOGIN BELIEVES IN ENQ/DEQ AND SCHED. CLASSES, IT
; FORGETS ALL ABOUT VM. FIX - SET NEWACT=-1 IF ACCT.SYS
; VERSION NUMBER IS 3 OR GREATER (NOT JUST 3).
;440) WHEN SAYING "OTHER JOBS SAME PPN", TELL HIM WHAT JOBS.
;441) MAKE START ADDRESS AND PROGRAM NAME WORK RIGHT.
;442) MOVE CALL TO .OSCAN SO A) USER HAS SEARCH LIST WHEN IT IS
; CALLED AND B) /NAME SWITCH WORKS CORRECTLY WITHOUT THE
; NECESSITY OF HACKS LIKE EDIT 355.
;443) FINISH THE JOB OF EDIT 442 BY REMOVING (AT LAST!) SETTMP
; AND CLRTMP.
;444) ADD TWO ROUTINES: LOCK TO WRITE-ENABLE HI SEG AND LOCK
; OUT CTRL-C AND OTHER JOBS WHO WANT TO MODIFY HI SEG, AND
; UNLOCK TO DO THE REVERSE.
;445) DON'T TELL [1,2] JOBS WHICH JOBS ARE ALSO LOGGED IN UNDER
; [1,2] - THERE'RE USUALLY VERY MANY AND YOU DON'T WANT TO KNOW
;446) FIX SPURIOUS ERROR MESSAGE IN TINY MONITOR, AND DO SOME
; RANDOM CODE CLEANUP
;447) MAKE .LOGIN [PROJ,PROG,SFD,SFD,..]/SWITCH WORK
;450) ADD /NOTICE:ARG SWITCH TO CONTROL PRINTING OF NOTICE.TXT
; ARG=ALWAYS TO ALWAYS SEE NOTICE
; ARG=SOMETIMES TO WORK LIKE PROJ/PPN
; ARG=NEVER TO NEVER SEE IT
;451) ALLOW USER TO SPECIFY DIFFERENT DEFAULT PATH THEN LOGGED-IN
; PPN
;452) USE SECOND 512 ENTRIES OF SCDMAP.SYS FOR BATCH JOBS.
;453) MAKE DEFAULT FOR /NOTICE BE SOMETIMES.
;454) FIX BUG IN SFD LOGIC AND TYPO IN /NOTICE LOGIC.
;455) MAKE /VERBOSITY WORK RIGHT.
;456) USE BUFFERED TTY OUTPUT. THIS WILL SPEED UP LOGIN IN
; REAL TIME ON HEAVILY-LOADED DUAL-CPU SYSTEMS.
;457) ADD /PATH SWITCH TO DO THE OBVIOUS THING. THIS WILL OVERRIDE
; A PATH TYPED ON THE LOGIN COMMAND LINE - I.E.,
; .LOG [34,35,FOO]/PATH:[24,25,BAR] WILL LOG THE USER IN
; TO [34,35] WITH A PATH OF [24,25,BAR].
;460) WHEN RECOMPUTING DISK USAGE, DO AN OUTPUT TTY AFTER EACH
; STR SO USER THINKS SYSTEM IS STILL ALIVE
;461) SPRINKLE A FEW OUTPUT TTY,S THROUGHOUT LOGIN SO STUFF
; GETS TYPED A LITTLE AT A TIME, RATHER THAN A LONG
; WAIT AND THEN A GUSH OF TTY OUTPUT. ALSO, RELEASE TTY
; BEFORE ATTACH SO 2,5 JOBS DON'T GET LEFT LYING AROUNG
; IN TO WAIT.
;462) WHEN ATTACHING TO A JOB WHOSE PPN REQUIRES NAME, ONLY ASK
; NAME IF THERE IS ONE IN ACCT.SYS TO CHECK IT AGAINST
;463) FIX POSSIBLE BUG IN SCHED. TABLE LOGIC
;464) REMEMBER TO RESERVE BATMIN JOBS FOR BATCH - I.E., FOR A T/S JOB,
; ALLOW LOGIN ONLY IF LOGMAX-BATMIN-LOGNUM+BATNUM>0 [SPR 10-15847]
;465) ADD OUTPUT TTY, TO TYPE RTN TO KEEP USERS PATIENT.
;466) SAVE ERROR CODE OVER CALL TO UFDSMB AT LGNCAS. [SPR 10-15873]
;467) MAKE /PATH IN SWITCH.INI WORK.
;470) ADD /ASSIGN:PHYS:LOG SWITCH TO DO THE OBVIOUS.
;471) IN EDIT 467, AT NOZAP-1, THE BLT DIDN'T HAVE A -1 AFTER IT
; SO IT BLT'ED THE SPOOL BITS. FIX: ADD A -1.
;472) SPLIT TRMOP.S INTO TWO CLASSES - THOSE WHICH SHOULD BE DONE
; BEFORE PRINTING NOTICE.TXT, AND THOSE WHICH SHOULD BE DONE
; AFTER. CURRENTLY ONLY SPEED IS SET AFTER PRINTING NOTICES.
;473) /ASSIGN:DEV (NO LOG. NAME) MAKES SCAN HALT. FIX: IF EOL IS
; SEEN WHILE PROCESSING /ASSIGN, SET FLAG (R.EOL) SO NO MORE
; INPUT WILL BE DONE AND REEAT ONE CHAR SO SCAN WILL SEE EOL.
;474) FIX POSSIBLE STACK PHASE PROBLEM IN PARSE.
;475) ADD TIMEOUT TO WAITO ROUTINE IN LGNSET & CLEAN UP SOME CODE
;476) FIX BAD RETURN FROM ERROR RECOVERY ROUTINE IN LGNDSK (UFDSE3)
;477) CHECK LOGMAX FOR BATCH JOBS AND ADD A NEW CLASS OF ERROR MESSAGE
; FOR BATCON: REQUE, ERROR CODE 5, MEANING REQUE THIS JOB AND
; DON'T SCHEDULE ANYBODY ELSE FOR A LITTLE WHILE
;500) REMOVED BY EDIT 505.
;501) WHEN SCANNING THRU ALL JOB NUMBERS, SCAN UP TO HIGHJOB, NOT
; LOGNUM.
;502) IN A SEQUENCE OF /ASSIGNS, THE LAST ONE IS NOT DONE.
; CURE: CHANGE AOJL TO AOJLE.
;503) WHEN LOGMAX IS EXCEEDED LOGIN TELLS YOU AND THEN CLEVERLY
; PROCEEDS TO LOG YOU IN. FIX: TREAT REQUE AS A FATAL ERROR.
;504) EQACT WAS MISTAKENLY PUT IN THE LOW SEG. PUT IT IN THE HI SEG.
;505) REMOVE EDIT 500, AND CHECK BATMAX RATHER THAN LOGMAX FOR BATCH
; JOBS. LOGMAX IS NOW DEFINED TO MEAN THE GREATEST NUMBER OF
; INTERACTIVE, USER JOBS LOGGED IN. ALSO ADD CONDITIONAL ASSEMBLY
; SWITCH BATMAX WHICH WILL TURN ON THE NEW BATMAX/LOGMAX
; CODE. THIS REQUIRES EDIT 1055 IN BATCON.
;506) MAKE .LOG 3,4[5,6] WORK.
;507) ADD AN ERROR MESSAGE IF THE ENQC. UUO FAILS.
;510) CLEAN UP SOME ERROR MESSAGES AND ADD SOME HUMAN ENGINEERING.
;511) FIX BUG IN /CORE LOGIC; ADD SOME ERROR MESSAGES FOR 'THIS
; CAN NEVER HAPPEN' TYPE STUFF; DO SOME CODE CLEANUP.
;512) ADD A CHECK IN TYPE ROUTINE TO POPJ RIGHT OUT IF NAME
; OF FILE IS 0 (NO NAME, NO WILDCARDS) TO AVOID AN
; INCREDIBLY BIZARRE BUG IN WILD.
;513) DON'T TURN ECHO OFF UNTIL ENTIRE COMMAND LINE(S) TYPED,
; SO CONTINUATION LINES WILL ECHO.
;514) IF UFD INTERLOCK IS BUSY TOO LONG GET NASTY AND BREAK
; THE DOOR DOWN.
;515) MAKE SURE RP.LOG ALWAYS GETS SET [QAR 3638]
;516) CODE CLEANUP.
;517) DON'T TYPE 'NO OPERATOR COVERAGE' ON EVERY RETRY.
;520) DON'T BOTHER CLEARING TMPCOR, CLEAN UP SOME COSMETICS.
; ALSO LOCK OUT CTRL-C WHILE WE HAVE UFD INTERLOCK.
;521) FIX HANDLING OF /CORE.
; THIS WILL BE LAST EDIT IN VERSION 57. NEXT EDIT NUMBER
; WILL BE 540 TO LEAVE ROOM FOR MAINTENANCE EDITS.
;540) CHECK CREATION DATE-TIME OF ACCOUNTING FILES AND REBUILD
; HIGH SEGMENT DATA BASE IF THEY HAVE CHANGED.
;541) IF NOT JACCTED, GIVE WARNING MESSAGE.
;542) FIX /VERB AND /MESSAG.
;543) MOVE CALL TO RNMAIL TO BEFORE THE LOGIN UUO SO IT HAS
; JACCT AND CAN RENAME MAIL TO USER'S AREA.
;544) .REQUEST SCAN, WILD, AND HELPER TO SIMPLIFY ASSEMBLY & LOADING
;545) FIX ONE MORE BUG IN /CORE.
;546) DETERMINE WHETHER TTY IS A 2741 EARLIER SO IF WE DO THE
; NUMBER-SIGN PROMPT WE GO INTO TI WAIT RATHER THAN
; HIBERNATING SO THE KEYBOARD UNLOCKS.
;547) ALLOW /QUOTA TO FORCE RECOMPUTING EVEN IF OTHER JOBS SAME PPN.
;550) ADD /SFDPROT:055 SWITCH TO DO THE OBVIOUS.
;551) REWROTE CODE AT NSPOOL+1 SO /CORE WILL FINALLY WORK CORRECTLY
;552) REORDERED CODE AROUND ACCT1 THRU ACCT3 AND MOVED
; CODE FOR TYPING DATE AND TIME TO DAYMES,
; WHERE IT BELONGS
;553) FIX BUG IN WAITO ROUTINE.
;554) ADD /UFDPROT:N SWITCH TO DO THE OBVIOUS.
;555) DON'T ALLOW ATTACHES AFTER KSYS UNLESS OPR OR SON-OF-OPR
;556) CLEAN UP THE LISTING
;557) ADD 2 SECURITY FEATURES. ASSEMBLY SWITCH NCRYPT CAUSES CODE TO
; BE GENERATED TO ENCRYPT PASSWORDS BEFORE COMPARING THEM TO THE
; PASSWORD IN ACCT.SYS (WHICH WAS ENCRYPTED BY REACT ALREADY).
; THE ENCRYPTION FUNCTION IS A NON-INVERTIBLE FUNCTION SO HACKERS
; CAN READ ACCT.SYS ALL THEY WANT AND NOT GET INTO SOMEONE'S PPN.
; ASSEMBLY SWITCH PSWCHG ALLOWS USERS TO CHANGE THEIR OWN PSWDS
; AT LOGIN TIME BY SPECIFYING THE /PASSWORD SWITCH IN THE LOGIN
; COMMAND LINE. THIS CAUSES LOGIN TO PROMPT FOR A NEW PASSWORD
; AND WRITE IT INTO ACCT.SYS. NOTE: THE ENCRYPTION FEATURE
; REQUIRES VERSION 32 OF REACT.
;560) REMOVE THE SIGNIFICANCE OF SLASH IN PPN (REPLACED BY /NOTICE)
;561) DO AN EXTENDED LOOKUP OF THE FACT FILES SO WE ALWAYS GET
; THE FILE'S LENGTH IN WORDS AND DON'T MAKE FACT.SYS SEEM
; TO BE MESSED UP (HIATUS RECORDS).
;562) IF WE GET THE SKIP RETURN FROM THE IN UUO THAT READS
; ACCT.SYS, CHECK THE ERROR CODE RATHER THAN ASSUMING THAT IT
; IS END-OF-FILE. IF IT ISN'T, GIVE A MORE ILLUMINATING ERROR
; MESSAGE THAN "INVALID ENTRY - TRY AGAIN".
;563) DON'T ENABLE CONTROL-C IF THE USER IS LOCKED INTO RUNNING
; A PROGRAM BY ACCT.SYS.
;564) CLEAN UP THE EXIT SEQUENCE.
;565) RE-INIT STACK EVERY TIME THROUGH LOGIN3.
;566) TURN RP.LOG OFF IF USER CONTROL-C'S DURING RECOMPUTING
; SO HE WON'T RECOMPUTE NEEDLESSLY NEXT TIME.
;567) IF EITHER HALF OF LIB PPN IS ZERO, USE USER'S HALF AS DEFAULT.
;570) CLEAN UP THE CODE.
;571) REMOVE FACT FILE CODE FROM LOGIN. MOVE IT TO A SEPARATE MODULE
; CALLED FACTOR AND CALL THIS MODULE FROM LOGIN.
;572) ADD CHECK TO BYPASS BLANK AUXACC.SYS ENTRIES.
;573) FIX ?LGNSND ERROR IN MONITORS WITH LIMLVL=5.
;574) SAVE M, N, AND CH OVER STUFBS IF THE MESSAGE IS TYPED
; SO GARBAGE QUOTAS ARE NOT TYPED.
;575) MAKE BATCH JOBS WAIT TWICE AS LONG ON UFD INTERLOCKS
; AS INTERACTIVE JOBS, AND DON'T LET THEM BREAK IT DOWN.
;576) FIX ?ILL MEM REF WHEN CUSP-TO-RUN DOESN'T EXIST
;577) ALLOW LOGIN WITH NO AUXACC.SYS IF OPR OR HIS OFFSPRING
;600) DON'T TYPE ERROR SEVERITY TO ANYTHING BUT A BATCH JOB.
;601) ADD TWOSEG TO LGNDCL MACRO SO LOGIN COMPILES WITH
; MACRO V.51
;602) CHECK JBTLIM TO SEE IF BATCH JOB SO WE DON'T DEPEND
; ON BATCON BEING CALLED BATCON
;603) CHECK TIMES-TO-LOG IN FOR BATCH JOBS AND AC.BAT
;604) FIX PROBLEM WITH 2ND TRY AT LOGGING IN WITH /ASSIGN
; GIVES ? NULL DEVICE ILLEGAL FROM SCAN
;605) REWRITE CODE AT NOJBMS THRU TTYDET TO FIX BUG
; INTRODUCED BY EDITS 602 AND 603
;606) ALLOW ATTACH AND LOGIN AFTER KSYS FROM LOCAL TTY'S
;607) FIX PROBLEM IN EDIT 605.
;610) PASSWORDS IN ACCT.SYS ENTRIES WHICH SPAN DISK BLOCKS CANNOT
; BE CHANGED. CURE: REMEMBER ONLY POINTER TO PASSWORD,
; DON'T WORRY IF WHOLE ENTRY CAN'T BE READ IN ONE DSK READ
;611) PREVENT STRANGE RACES IN ATTACHES
;612) MAKE ?MAY NOT LOGIN REMOTE/DATASET/BATCH/BATCH SUBJOB
; ERRORS FATAL SO BATCON WON'T WASTE TIME
; TRYING TO LOG THE JOB IN
;613) CLEAN UP THE LISTING; REMOVE UNREACHABLE CODE AND
; UNREFERENCED DATA
;614) EDIT 573 IS MISSING A POPJ. CURE: YES.
;615) SETNAM TO LOGIN RATHER THAN FLUSH TO EVADE KLUDGE IN STOP1C.
;616) DON'T CHANGE UFD PROTECTION UNLESS /UFDPROTECT SPECIFIED.
;617) MORE CHANGES TO CONFORM TO MACRO 52.
;620) IMPLEMENT /DEFPROT:NNN TO SET DEFAULT FILE PROTECTION.
;621) DON'T PRINT STRANGE GARBAGE IF USER TYPES .R LOGIN
;622) DON'T LOG IN A USER WHOSE SCHEDULER CLASS HAS A ZERO
; CPU QUOTA IF THE CLASS SCHEDULER IS RUNNING.
;623) ENTRY POINT TO FACTOR IS NOW CALLED .FACTR
;624) PICK UP WHERE EDIT 610 LEFT OFF AND REALLY FIX /PASSWORD.
;625) SLEEP BEFORE TYPING ?LGNIET TO MAKE IT HARDER TO BREAK
; SECURITY (EASIER THAN SLEEPING BEFORE ASKING FOR PASSWORD
; AND TRAPPING FOR CONTROL-C'S WHILE SLEEPING)
;626) IF WE DON'T HAVE JACCT, WE'RE BEING DEBUGGED - SO DON'T
; RECOMPUTE DISK USAGE
;627) /ASSIGN:PHYS-NAME WITH NO LOGICAL NAME LOSES. FIX IT.
;630) MAKE "NO OPR COVERAGE" INFORMATIONAL RATHER THAN WARNING.
;631) LAST-MINUTE CODE CLEANUP. THIS WILL BE THE LAST EDIT
; IN VERSION 60.
;632) DON'T TRY TO SET SCHEDULER CLASS QUOTAS IF 6.03 SCHEDULER
; RUNNING IN WMU MODE
;633) LOCATE USER AT CENTRAL SITE IF LOGGING IN ON A NODE WITHOUT
; AN LPT
;634) SEE EDIT HISTORY FOR 672 EDIT
;%60A(634) SHIPPED WITH 6.03A
;635-637) RESERVED FOR DEC 6.03 SUPPORT
;640) DO PHYSICAL-ONLY RUN UUO FOR CUSP-TO-RUN (SECURITY)
;641) DISABLE CONTROL-C JUST BEFORE LOGIN UUO AND ENABLE ONLY IF
; NO CUSP-TO-RUN SPECIFIED
;642) IF A LINE OF SWITCH.INI ENDS WITH A /ASSIGN, AND THE NEXT LINE
; CONTAINS A /ASSIGN, YOU GET ?SCNILC ILLEGAL CHAR IN CMD
; FIX: CLEAR R.EOL EACH TIME THROUGH ASSIGN
;643) ENQ QUOTA DOESN'T GET SET UP; SENSE OF TEST INSTRUCTION IS BACKWARDS
; AT PRSET3+5
;644) FIX YET ANOTHER CASE OF OFF-BY-ONE ARITHMETIC AT UFDEX1-2
;645) DELETE SEARCH LIST IF USER TYPES ^C WHILE LOGGED OUT
;646) ?LGNCWR UNDESERVEDLY - WRONG GETTAB VALUE BEING USED
;647) FIX SWITCH.INI NOT BEING READ IF FACTSW TURNED OFF
;650) RESERVE BATMIN JOB SLOTS FOR BATCON'S USE
;651) FIX BUG IN /PASSWORD (BUG ONLY IF NCRYPT TURNED ON)
;652) DON'T ATTEMPT TO CREATE SFD'S ON STRS THAT ARE WRITE-LOCKED
;653) REMOVE EDIT 547 WHICH ALLOWS USERS TO AVOID QUOTAS
;654) FIX EDIT 650 SO ATTACH WORKS DESPITE BATMIN. SPR#10-23336
;655) SUPPORT "<" AS PPN DELIMITER ON ATTACH. THIS IS FOR 2741.
; SPR #10-23335
;656) TEACH LOGIN ABOUT FIXED VS. UNFIXED CLASS QUOTAS. SPR#10-23094.
;657) DON'T PERMIT DATA-SET LOGINS AFTER KSYS.
;660) PERMIT DETACHED [1,2] JOB TO LOGIN PTY SUBJOBS. SPR #10-23725.
; NOTE: ONLY PERMITS SON OF [1,2] NOT SON OF DETACHED OPR OR CTY.
;661) MOVE LOGIN UUO AFTER MESSAGE TYPE-OUT TO PERMIT PROPER /STR
; OPERATION. SPR #10-23847
;662) EDIT 661 WAS NOT VERY GOOD. REMOVE IT AND TRY AGAIN.
;663) FIX UP ALL DATES AND COPYRIGHT STATEMENTS
;664) DON'T PERMIT MORE THAN LOGMAX JOBS IF BATMAX TESTING
; IS DISABLED. SPR #10-24354.
;665) LOGMAX+1 JOBS CAN LOGIN; SHOULD BE LOGMAX. SPR #10-24354
;666) IMPLEMENT ACCOUNT AND REMARK PROMPTS TO ENTER AN ACCOUNT STRING
; AND A REMARK
;667) DO UFD ZERO COMPRESSION WHEN RECOMPUTING QUOTA.
; THIS USES THE DISK. UUO FUNCTION CODE 7 WHICH IS NEW FOR
; 7.01. THE EFFECT OF UFD COMPRESSION IS TO SPEED UP
; LOOKUPS AND ENTERS.
;670) FIX BAD POPJ ON ERROR RETURN FROM CTLJOB UUO. SPR #10-24481
;671) FIX SOME PROBLEMS INTRODUCED BY EDIT 666.
;672) ADD BACKROUND BATCH SUPPORT.
;673) IMPLEMENT ACCOUNT VALIDATION
;674) PUT IN TEMPORARY FIX SO BATCH JOBS CAN RUN WITH ACCOUNT VALIDATION
;675) IMPLEMENT /TYPE SWITCH TO SET TERMINAL TYPE.
;676) SPR # 10-25342 WCL JUNE-27-78
; Fix code that checks for necessary job slots for Batch so it checks
; how many Batch jobs are already logged in
; Areas affected: PPNGO
;677) FIX BUG IN 675. AT NOTTYP INSERT POP T,T1.
;700) FIX BUG WHERE CODE AT BACHEK NEVER GETS EXECUTED.
;701) IMPLEMENT USAGE ACCOUNTING, SPECIFICALLY ACCOUNT VALIDATION (LGNUSG MODULE)
;702) FIX A VALIDATION ERROR. ALSO MAKE THE LOGIN MESSAGE REPORT THE TIME
; AS HH:MM INSTEAD OF HHMM.
;703) FIX BUGS INTRODUCED WITH 702
;704) DON'T LOSE OWNER PPN FOR NESTED PTY SUBJOBS. SPR #10-27223
;705) MAKE /PATH[,,SFD] USE LOGGED-IN PPN AS DEFAULT. SPR #10-27073
;706) /BAH
; 1) ADD ATTACH, LOGIN, AND SESSION IPCF MESSAGES SO THE ACCOUNT
; DAEMON CAN DO USAGE ACCOUNTING WITH SESSION ENTRIES.
; 2) ADD /BATSEQ, /BATNAM, AND /REQID SWITCHES SO BATCON CAN PASS
; BATCH JOB INFORMATION TO THE ACCOUNT DAEMON VIA LOGIN IPCF MESSAGES
;707) /BAH ADD SETUUO FUNCTION TO SET OPERATOR PRIVILEGES FOR GALAXY 4 SUPPORT
; 3) FIX UP EDIT 701'S ERROR MESSAGES
;710 REPEAT LOGMAX CHECK JUST PRIOR TO LOGIN UUO
; SPR 10-27195
;711 CHECK THAT STR NAME IN AUXACC IS "FULL FILE STRUCTURE NAME"
; SPR 10-27402
;712 /MSL/BAH 22-MAY-79 Display SEARCH, .REQUEST info during compilation
;713) /MSL/BAH 22-MAY-79 Limit /DSKPRI value by ACCT.SYS
;714) /MSL/BAH 22-MAY-79 Warn user if account expires within one month
;715) /MSL/BAH 22-MAY-79 Let user logging in attach if PPN already has detached job
;716) /MSL/BAH 22-MAY-79 Set up search list before calling OSCAN (for SWITCH.INI), thus
; allowing account switches, UFD defaults, etc. in SWITCH.INI
; This rewrite completely changes the order of things (such as
; where account validation and accounting is done). As a result,
; the FTTASK switch (an unsupported switch used by our in-house
; systems) no longer applied as written and has been removed.
;717) /MSL/BAH 22-MAY-79 No NOTICE.TXT if Job Capacity Exceeded
;720) /MSL/BAH 22-MAY-79 Clear search list before LOGOUT when flushing (c.f. ed.645)
;721) /MSL/BAH 22-MAY-79 Fix so last error try also gets a FACT entry
;722) /MSL/BAH 22-MAY-79 Make ENCODE global (SPR 10-23055)
;723) /MSL/BAH 22-MAY-79 Clear FL.ACC when done with ACCT instead of waiting for AUXACC
;724) /MSL/BAH 22-MAY-79 Fill AUXACC pointer table, even if early EOF
;725) /BAH 31-MAY-79 IF A JOB REQUIRES AN ACCOUNT AND/OR REMARK AND THE
; TERMINAL IS A PTY AND AN ACCOUNT/REMARK WAS NOT SUPPLIED, USE THE
; CONTROLLING JOB'S ACCOUNT (IF IT EXISTS) AND ALLOW A NULL REMARK.
;726 IF A USER HAS ZERO LOGGED-IN QUOTA ON A STR IN HIS SEARCH LIST
; DON'T TRY TO CREATE AN SFD ON IT.
;727 COMMAND LIST IS ONE TOO LONG. ALSO FIX A PJRST P,.USAGE
;730 SEARCH OF AUXACC.SYS FOR PPN IS OFF BY 1.
; SPR 10-28333.
;731 REMOVE EDIT 730
;732 20-SEP-79/BAH CORE UUO TO EXPAND HIGH SEGMENT CAN FAIL IF 1) SOMEONE
; IS SAVING LOGIN OR IF 2) IN AN SMP ENVIRONMENT, ANOTHER CPU IS
; EXECUTING THE SAME CODE WITH THE HIGH SEGMENT WRITE-ENABLED.
; TO GIVE THE MONITOR TIME TO CATCH UP, SLEEP A SECOND AND TRY AGAIN
; (3 TIMES) IF THE CORE UUO FAILS.
;733 4-OCT-79/BAH ADD ATTACH:ARG SWITCH. IF ATTACH:IGNORE IS IN SWITCH.INI OR TYPED,
; THEN DON'T PROMPT USER FOR ATTACH MESSAGE IF ANY DETACHED
; JOBS UNDER HIS PPN. IF ATTACH:ASK IS IN SWITCH.INI OR TYPED, THEN
; ASK USER IF HE WANTS TO ATTACH OR LOGIN. THE DEFAULT IS
; ALWAYS ASK IF ANY DETACHED JOBS. SEE EDIT 715.
;734 22-OCT-79/BAH SET U.ACTS AND U.RMRK TO -1 FOR SCAN. ALSO ZERO THEM
; BEFORE FILLING IN THE CHARACTERS SO THE USAGE FILES GET THEM RIGHT.
;735 7-NOV-79/BAH MAKE LOGIN SEARCH ACTSYM.UNV INSTEAD OF ACCSYM.UNV.
;736 25-JAN-80/BAH EDIT 723 CLEARED FL.ACC TOO SOON CAUSING PASSWORDS
; NOT TO BE CHANGED. ALSO EDIT 716 DELETED THE CALL TO .USAGE THAT
; SENT A LOGIN MESSAGE TO THE ACCOUNT DAEMON. ALSO CHANGE THE CALL TO
; .SIXSW FOR THE /BATNAM SWITCH TO .SIXQW.
;737 14-FEB-80/BAH IF A USER TRIES TO LOGIN WITH AN ILLEGAL PROGRAMMER
; NUMBER, THEN LOGIN GOES INTO A LOOP READING ACCT.SYS AND REBUILDING
; ITS TABLE.
;740 SPR 10-28750 Edit 627 caused SCAN to read the slash after a name
; twice in an /ASSIGN switch if there were more switches.
;741 11-Apr-80/BAH QAR 10-03985 Don't type out error message setting
; operator privileges if the monitor version number is earlier than
; 7.00.
;742 24-Apr-80/BAH LOGIN doesn't send the terminal designator in its
; LOGIN and ATTACH IPCF messages to the account daemon. Include
; a common routine to find the terminal designator, line number and
; node name of the job -- SETTNL. Also include a switch to defer
; TTY output /TTDEFER.
;743 29-april-80/FRS SPR 10-28831
; Change put in FACTOR to check to see if job being attached to
; is DAEMON and [1,2]. If so, skip trying to write FACT entry.
;744 5-May-80/WSM Allow new form for specifing settty switches for LOGIN.
; ie /TERMINAL:(NOPAGE,SPEED:300,WIDTH:80,TYPE:VT52) instead of a
; random set of several switches. Also, cleanup some SCAN switch
; handling. Use standard version macro from MACTEN.
; Fix recovery from %LGNTTI Terminal type invalid errors
;745 6-May-80/WSM Improve command scanning especially for SESSION
;746 6-MAY-80/WSM Fix the bug that didnt set path to area that
; already existed if user had no login quota or software write-locked
; Also, type warning if any PATH. uuo fails.
;747 1-Jun-80/WSM Complete implementation of /TERMINAL by adding
; keywords [no]UC, NOFILL and [no]TIDY. Also, dont prompt with
; password if the user types it on the same line.
;750 2-Jun-80/WSM Include debugged DDT patch for testing LOGIN under 7.01
; (QAR 10-04145) Add /DEFBUFFER:n switch to set default number
; of disk buffers, like .SET DEFAULT BUFFER n command
;751 3-Jun-80/WSM (QARs 10-42046, 10-04172) LOGIN loops if invalid PPN given.
; Edit 737 didnt fix the problem as reported.
;
;;61(751) released with 7.01
;Start V62 for Galaxy 4.1
;
;752 17-Jun-80/WSM Fix the usage accounting entries for ATTACH and
; SESSION commands. Remove unreachable code.
;753 27-Jun-80/DPM
; Add /BATINT:[NO/YES] and /BATSTR:ooo so BATCON can set the Batch
; operator intervention values and Batch stream numbers. This is
; required for Galaxy 4.1 and later versions of QUASAR and ORION.
; These switches apply only to Batch jobs and are ignored for
; timesharing jobs. Also before we open the TTY, determine if the job
; is a Batch job and don't turn off echoing. Note: SCNSER must also
; check this at TTYRS1 plus a few and not turn off echoing when an
; unlogged in job starts running LOGIN.
;754 8-Jul-80/WSM Add some fixes for accounting support
; 1) Include expiration date in UFD (.RBDED)
; 2) Dont type NOTICE.TXT on errors with SESSION command
; 3) Expand ATTACH message to include target job number
; 4) Dont allow retries on SESSION command
; 5) Dont do checks to see if user can LOGIN if SESSION command
; 6) Flush receive queue correctly when waiting for ACK
; Improve date/time printing (use SCANs routines)
; Add lost instruction @RICC to fix ^C problems
;755 SPR #10-29629 RKB 14-Jul-80
; (published 15-Jul as edit 752) Fix a bug in edit 651 so /PASSWORD
; will work properly with NCRYPT set.
;756 Be consistant in handling account string and remark. If its
; -1 (for SCAN and ACTDAE's benifit) it hasnt been specified.
; Anything else should be treated as ASCIZ text
;757 SPR #10-29879 12 AUG 80
; Creating SFDs on all structures is annoying, so lets let the
; user say whether he wants it to happen or not. Install the
; /[NO]SFDCREATE switch, which allows him to say 'DONT CREATE'
;760 If you logged in and recomputed disk usage at or before 4 minutes
; 22.192 seconds after midnight, LOGIN would die with ?Illegal
; address in UUO trying to compress the UFD.
; Also, change REPEAT 0 to IFN FTMAIL for RNMAIL routine.
;761 23-Sep-80/WSM Convert to more UUOSYM and ACTSYM symbols
; Allow /LOCATE to take sixbit node name
; Improve usage accounting routines--Dont let user in if account
; validation is required, and ACTDAE isnt around or talking to us
;762 28-Sep-80/WSM Cleanup error messages and interface with BATCON.
; In the process, fix ?Job capacity errors from dumping the job.
; Dont output ^D when you fail to login. Thats old stuff.
; Define new bit in error macros to WTO to operator. This removes
; all the "Please call the operator" messages. If ORION isnt running
; that text is appended to the users output.
;763 30-Sep-80/WSM (QAR 10-04663) Improve ATTACH query logic. Give
; a small SYSTAT output (job, program, state), and if/when we
; attach to a job, preserve the user/monitor state.
;764 Use ND to set number of days for warning on %PPN will expire message
;765 6-Oct-80/WSM (QAR 10-04728) Improve things a little
; bit if the unsupported PSWCHG feature test is turned on
; by asking for new password twice with echo off
;766 20-Oct-80/WSM Remove part of edit 761 which allowed LOCATE to take SIXBIT name.
; It requires more monitor/GALAXY support than was thought.
; Dont create a UFD of AUXACC says its write-locked.
; (QAR 10-04816) Change BLANK to BLANKS to be consistent with
; INITIA and monitor SET TTY commands
;767 24-Nov-80/WSM (QAR 10-04969) LOGIN is too hard to be debugged.
; Add more tests for R.DBUG
;770 24-Nov-80/WSM LOGIN loses /OPTION when asking for detached jobs.
; Save /OPTION around second .PSCAN call. Requires kludge that assumes
; SCANs OPTION storage is .NMUL##-3 (until OPTION made global)
;771 16-Dec-80/WSM Add support for ACTDAE returning an account string
; from a validation request. (It may be a default, or case changed)
;772 15-Jan-81/WSM (QAR 10-05259) Allow switches on ATTACH to attach to
; the job in either user or monitor mode.
;773 15-Jan-81/WSM Allow OPR[1,2] to login in w/o an account string if
; the PID of ACTDAE doesnt exist in 5 seconds.
; Dont complain if the LOCATE UUO fails and he is trying to locate
; to the central site (node 0)
;774 30-JAN-81/WSM (QAR 10-05356) Allow SESSION command to be invoked
; from CCL entry point and look for TMP:LGN. Always send account
; string to ACTDAE for possible defaulting.
; (QAR 10-05356) Path not also set correctly if we cant create an
; SFD in the path. Get around SCAN bug with .LOGIN/ACCOUNT:"" using
; SWITCH.INI when it shouldnt
;775 17-Feb-81/WSM (QAR 10-05478) Fix up more scanning problems with
; the /ACCOUNT switch. Change some UUOSYM symbols that changed.
; Allow indirect command files for SESSION command.
;776 19-Mar-81/WSM (QAR 10-05786) Fix blanks in TERMINAL scanning
; (QAR 10-05797) Dont type expiration date on ATTACH
;777 7-Apr-81/WSM (QAR 10-05931) Fix a one instruction race
; (QAR 10-05925) Remove checks for level C disk service!
; (QAR 10-05942) Check response from ATTACH question for YES/NO
; (no QAR) Remove checks for old scanner service
;1000 9-Apr-81/WSM Move setting batch stream number before STRUUOs
; to change search list so we dont confuse QUASAR.
;
;1001 9-Jul-81/WSM Increase MAXFS to 7.01 defined value of 10; handle
; more AUXACC entries than can fix in a S/L more gracefully.
;1002 16-Nov-81/WSM Bypass accounting if we are attaching to the
; ACTDAE job so we dont get hung if ACTDAE is ^Ced.
; Improve ATTACH job query logic to show default and preserve
; /OPTION around .PSCAN better.
;1003 23-Nov-81/WSM Insert fix for ^C, and removed window where user
; can ^C out of cusp-to-run. This was incorrectly published as
; edit 754 to LOGIN as CMCO 571.1.
;1004 9-Mar-82/WSM (QAR 10-06880) Explicitly BLT scan block words to
; zero in routine PARSE.
; (QAR 10-06495) /SCAN not set /NOSFDCREATE and the SFD doesnt exist.
;1005 27-Aug-82/DPM (QAR #10-02018) Correct logic to GETTAB ACTDAE pid.
;Start of version 63 for 7.02
;
;1100 14-JUL-81/WSM Add support for new terminal switches, and /DEFAULT:(BIGBUF)
; Allow new batch switch syntax of /BATCH:(args) too.
;1101 30-Jul-81/BCM (SPR 10-30609) Add a new UUO to do LOGMAX/BATMAX
; quota checking. This is necessary to eliminate race between two
; simultaneous LOGINs where LOGNUM could be 1 greater than LOGMAX.
;1102 21-Aug-81/BCM (SPR 10-30832) Correct test for no
; class scheduler at PRSET4 and NOTHER.
;1103 8-Sep-81/WSM Add (under FTMAIL) /[no]MAILCHECK switch to control
; scanning for new mail. Check for mail on ATTACH too.
;1104 3-Feb-82/WSM Add new TRMOP. to see if we are on a full-SCNSER-PTY
; so we know we can turn the echo off.
;1105 26-Apr-82/WSM Rip out lots of code, and call DPM's new UFDSET routine
; to handle UFD setup. This is the same routines that PULSAR/MDA
; use, so it should all do it the same way.
;1106 29-Jun-82/WSM Fix up all error messages and macros (This also
; fixing the ^C ?Ill mem ref bug introduced with edit 1105)
;
;1107 22-Apr-83/DPM
; 1. Turn on echo if called by SCAN for continuation lines.
; 2. Don't make junk FACT file entries on LOGIN failures.
; 3. Allow /QUOTA:(str,...).
; 4. If a name is required, make sure it's non-zero.
;
;1110 26-Apr-83/DPM
; Eliminate problems with I/O to unassigned channel by doing buffered
; OUTSTRs to the TTY. This is a lot more efficient than doing buffered
; I/O and saves lots of OUTPUT TTY, instructions.
;
;1111 8-Jul-83/DPM
; 1. Add a few missing calls to TTYOUT.
; 2. Disconnect line if too many command format errors.
; 3. Call .ISLGI to determine logged-in/out status in FLUSH routine.
; 4. Finally after all these years, add verbosity checking in ERRMSG
; routine. Attn. future LOGIN hackers: calls to .PSCAN wipe .FLVRB!
; 5. Fix up listing stuff in .ERR. macro.
;
;1112 31-Aug-83/DPM
; Don't set UFD protection to <000> when recomputing disk usage on
; structures not in AUXACC.
;
;1113 12-Sep-83/DPM
; 1. FATAL, WARN, INFO, etc. still don't list.
; 2. Make references to .POPJ1 external in LGNMS.
;
;1114 21-Sep-83 /DPM
; 1. Remove ZEROSL. No longer needed now that the LOGOUT UUO does this.
; 2. Remove unreferenced and non-existant symbols from GLOB macros.
; 3. Remove unreferenced low seg locations.
; 4. Repeated ^Cs typed while recomputing disk usage gives ill mem ref.
; ERRMSG isn't recursive. Fix Control-C trap.
;
;1115 12-Jan-84 /DPM
; Add missing AC in test instruction (UFDSET + a bunch).
;
;
;1116 18-Feb-84 /DPM
; If a logging in job is located at a station with an MCR, then locate
; it at the central station to allow spooled LPT output to get printed.
;
;63(1115) released with 7.02
; Start V64 for 7.03
;
;2000 5-Apr-84 /DPM
; 1. Remove old FACT file code.
; 2. Re-write /ASSIGN switch processor to eliminate all bugs.
; R.NXSW and R.EOL crock flags also go away.
;
;2001 7-July-84 /Tarl
; Start massive changes to move all validation into ACTDAE.
; For today, remove edit 557. This edit (PSWCHG and NCRYPT)
; is no longer relevant; Encryption is entirely handled by
; ACTDAE, and password changing is handled by the .SET PASSWORD
; monitor command.
;
;2002 1-Sep-84 /Tarl
; More massive changes to move validation into ACTDAE.
; Move code around so that we don't check password until ACCT,
; which will lead to slightly different behaviour under some
; conditions. Remove all logic to keep files in hiseg, remove
; all logic to read ACCT, AUXACC, SCDMAP. Add code to ask
; for profile from ACCT.
;
;2003 7-Sep-84 /Tarl
; Allow username as well as PPN on login lines, allow attach
; without giving PPN.
;
;2004 26-Dec-84 /DPM
; Rewrite code added by edit 2003 to make LOGIN/BYPASS work.
; Add /WATCH:CONTEXTS.
;
;2005 27-Dec-84 /DPM
; Merge LGNMS into LOGIN. Default FTMAIL on. Define MAILFN and
; MAILEX to be the mail file name and extension respectively, with
; the defaults being 'MAIL ' and 'TXT' for compatibility with DEC's
; mail system (MS).
;
;2006 2-Jan-85 /DPM
; Add /TERMINAL:(EIGHTBIT,ESCAPE,QUOTE,UNPAUSE). Put all old TTY
; switched under OLDTTY conditional. Put all old DEFAULT switches
; under OLDDEF conditional. These conditionals will be removed in
; the next release of LOGIN (version 65).
;
;2007 2-Jan-85 /DPM
; Fix password echoing problem created by edit 2003.
;
;2010 3-Jan-85 /DPM
; Add support for [SET] PASSWORD command and /PASSWORD switch.
; Fix password parsing problems (8-bit stuff) caused by edit 2003.
;
;2011 7-Jan-85 /DPM
; Fix numerous bugs relating to SESSION command scanning and setting
; bogus account strings. Completely separate SESSION handling from
; the mainstream code for reading clarity and cleanliness. This has
; the somewhat undesirable side effect of breaking some user's /ACCOUNT
; defaults in SWITCH.INI, but no one really uses usage accounting, do
; they?
;
;2012 14-Jan-85 /DPM
; Fix bugs introduced by editg 2003 that prevented logging in with
; user names and losing a path spec (i.e. LOGIN DPM[,,FOO] didn't
; work). Also allow ATTACH [PPN] or user name without job number.
; Turn on /TERMINAL switch for ATTACH command. Do lots of general
; clean up work.
;
;2013 16-Jan-85 /DPM
; Begin massive code cleanup.
;
;2014 18-Jan-85 /DPM
; Lots more code cleanup. Rearrange lots of code into subroutines so
; it may eassily be called from several places. Support SWITCH.INI
; processing on ATTACH commands. Remove old stand-alone batch switches
; now superseded by /BATCH:(args).
;
;2015 22-Jan-85 /DPM
; Merge all modules into one. Remove the need for LGNUNV universal.
; Fix bugs associated with setting paths.
;
;2016 24-Jan-85 /DPM
; Replace all IPCF code to create usage entries with QUEUE. UUOs.
; Look at the OTS and application words of the extended LOOKUP
; block to determine if new mail exists.
;
;2017 28-Jan-85 /DPM
; SWITCH.INI won't get scanned and the user is needlessly prompted
; for an account string if:
; 1. The first attempt at LOGIN failed and ...
; 2. The PPN typed was valid but wasn't the intended one and ...
; 3. The PPN typed didn't require an account string but ...
; 4. The correct PPN did require an account string which would
; normally be found in SWITCH.INI
; SETOM .OPTN because SCAN zeroed it the last time it failed to find
; SWITCH.INI, causing all subsequent calls to .OSCAN to fail. A real
; bitch to figure out. Also fix numerous bugs caused by edits 2001,
; 2002, and 2003 which caused /PATH not to work any more.
;
;2020 30-Jan-85 /DPM
; Add code to change user names to support multiple PPN insertions
; in REACT.
;
;2021 6-Feb-85 /DPM
; Set context and saved page quotas. Set the job's search list to
; the system search list if /BYPASS. Also set infinite FCFS and
; logged out quotas.
;
;2022 8-Feb-85 /DPM
; People are wondering what job and PPN are being attached to these
; days since the new ATTACH command syntax allows just a job number,
; PPN, or a user name. Therefore, always type "Attaching to job ..."
; message. Also do a better job chosing monitor or user mode.
;
;2023 11-Feb-85 /DPM
; Add support for locked accounting files. Make .LOGIN 10,# work.
; Plug holes in program-to-run logic by cleaning up exit code. Also
; remove definitions for ACs M and WD as they're no longer used.
;
;2024 15-Feb-85 /DPM
; Use correct AC when testing for LOGIN after KSYS times out.
; Prevent loop typing KJOB in FLUSH. Fix bug that expected passwords
; to be typed on the CTY.
;
;2025 20-Feb-85 /DPM
; If a user hosts into the -10 and is physically located at a node
; that has an MCR, then locate the job at the central site to which
; will cause queued output to be spooled. Also fix problem that
; prevented watch bits in the profile from getting set.
;
;2026 28-Feb-85 /DPM
; Fix up usage of /CORE switch argument by removing .STCLM SETUUO.
; Dynamically determine if BATMAX checking should be done by GETTABing
; the MPB feature test (BATMAX is meaningful only in an MPB environment).
;
;2027 7-Mar-85 /DPM
; Add support for files-only PPNs and password expiration dates.
;
;2030 20-Mar-85 /DPM
; Fix account string validation bug. Make /LOCATE with no argument
; default to the central station. Increase MAXFS to 12.
;
;2031 4-Apr-85 /DPM
; Report ACCT. UUO error codes when we fail to set the account string.
; Fix ATTACH, LOGIN, and SESSION message generation.
;
;2032 17-Apr-85 /DPM
; Respect /NAME when used with /BYPASS.
;
;2033 26-Apr-85 /LWS
; Include account string arg block when doing UGACC$ function
; with QUEUE. ACTDAE expects an account string when doing
; access checking, especially when an account string is required.
;
;2034 7-May-85 /DPM
; Add support for QUEUE. UUO timeout. Incorporate CHAR8 into LOGIN.
; This table is only needed when running LOGIN under a 7.02 monitor.
; 8-bit character translation is done using the CHTRN. UUO under
; later monitors (** no supporting code in LOGIN yet **). Also fix
; a few minor problems reported in QARs.
;
;2035 10-May-85 /DPM
; Be more defensive against logging into [10,777776].
;
;2036 14-May-85 /DPM
; Add routine CHRTRN to do 8-bit chraracter translation via UUO
; or old-style translation table.
;
;2037 22-May-85 /DPM
; Forgot to include account string in ATTACH validation message.
;
;2040 22-Jul-85 /DPM
; Include IPCFS. and IPCFR. UUO error codes in SETIPC errors
;
;2041 15-Aug-85 /LEO
; Do copyrights.
;
;2042 27-AUG-85 /DPM
; Remove references to AE.PCH and key off .AEPCT being -1 to
; indicate a password change is required.
;
;2043 3-Sep-85 /DPM
; Fix off-by-one bug when checking PTY line number.
;
;2044 12-Sep-85 /DPM
; Can't attach to jobs 36, 72, 108, ...
;
;2045 14-Sep-85 /DPM
; Warn when password expiration will happen soon.
;
;2046 23-Oct-85 /DPM
; Setup ALLPPN early so /BYPASS works under OPSER.
;
;2047 28-Oct-85 /DPM
; Re-init switch storage on restarts.
;
;2050 11-Nov-85 /DPM
; Upgrade to version 6 profile format.
;
;2051 22-Jan-86 /DPM
; /WATCH doesn't work because the watch bits belong in the RH
; half of the SETUUO AC, not in the LH.
;
;2052 19-Mar-86 /DPM
; Edit 2051 fixed the watch bits coming from the profile, not the
; command line switch.
;
;2053 19-Mar-86 /DPM
; LOGIN 10,# syntax appears not to create a UFD. Not true. LOGIN
; just creates another unique PPN after the UFD(s) have already
; been created. Remove left over cruft from V63.
;
;2054 9-Apr-86 /DPM
; Move call to CHGPSW back before the LOGIN UUO. If the password
; change fails, you really want to abort the login. Also correct
; ordering of similar calls in the ATTACH and LOGIN code for the
; same reasons.
;
;2055 14-Apr-86 /DPM
; Fix test for CTY by setting up GETLCH bits before storing DEVOPR.
;
;2056 16-Apr-86 /DPM
; Never prompt for a name if L.SOPR is set; works like passwords.
;
;2057 27-Aug-86 /DPM
; Check FAILFL in ASKPSW to avoid letting a malicious user know
; the target PPN really doesn't exist.
;
;2060 22-Jan-87 /KDO
; Defend against QUEUE. UUO hangs.
;
;2061 04-Feb-87 /KDO
; Fix a race condition between MONRET and CTRL/C intercept code.
;
;2062 13-Feb-87 /KDO
; Verify the job number on an attach before telling ACTDAE.
;
;2063 11-Mar-87 /KDO
; Fix edit 2060.
;
;2064 04-May-87 /KDO
; Always type SYS:LOGIN.TXT after successfully logging in.
;
;2065 09-Sep-87 /LWS
; Bomb if batch job and profile does not exist.
; Start Version 65(3000) for 7.04
;
; 3001 30-Dec-87/JJF
; Add support for "Logged-in PPN" GETTAB. Allows LOGIN to
; determine if the user's current PPN isn't the one s/he actually
; logged in under, and to "pivot" back home before logging out.
;
; 3002 13-Jan-88/KDO
; Fix the loop in GETPSW to allow a password that is thirty-nine
; characters long.
;
; 3003 17-Mar-88/KDO
; If SCAN restarts .PSCAN, whether its for /HELP or after an error,
; jump to .MONRT to exit.
;
; 3004 26-Apr-88/KDO
; Fix KJOB/BATCH processing.
;
; 3005 4-Jul-88/KDO
; Allow LOGIN to run with JLOG turned off for 7.03 compatibility.
; In case of a FATAL error, use the LOGIN UUO to get back in.
;
; 3006 3-Aug-88/DPM
; Don't bomb out login if user says /PASSWORD but accounting file
; prohibits password changes.
;
;3007 3-Aug-88/DPM
; Remove local definition of .GTLPN GETTAB table. 7.04 UUOSYM
; has this symbol now.
;
;3010 3-Aug-88/KDO
; Allow password changes if a password change is required (even if
; password changes are prohibited).
;
;3011 28-Sep-88/KDO
; Check to see if we are already detached after setting up the
; PSI vector. Also clear buffered output on a DETACH interrupt.
;
;3012 28-Sep-88/KDO
; Save P1 in ERRMSG before the call to the continuation routine.
; (It is needed by ERRWTO.)
;
;3013 5-Jan-89/DPM (SPR 10-35597)
; Correct problems with unique (10,#) PPNs.
;
;3014 9-Jan-89/DPM
; If LOGIN is run under pre-7.04 monitors as the logout CUSP,
; and the user is over quota, control is returned to the monitor
; via a MONRT. and COMCON logs the job out and bypassing quota
; enforcement. Use the MONRET routine instead. It handles this
; case.
;
;3015 1-Sep-89/JC
; Added TRANSL command to translate PPNs/usernames
;
;3016 29-Nov-89/DPM
; Do not use %CNDAE for checking the monitor version; that is for
; use only by DAEMON. Use %CNDVN instead.
SUBTTL Debugging patch for the monitor
; THIS PATCH WILL ALLOW YOU TO DEBUG LOGIN UNDER NORMAL TIMESHARING.
; THE PATCH IS EXECUTED VIA FILDDT AND CAUSES YOUR TERMINAL TO RUN
; LOGIN FROM HAKSTR/HAKPPN WHILE ALL OTHER TERMINALS USE SYSPPN.
; NOTE THAT THE "$" ARE DOLLAR SIGNS. BEFORE EDITING THIS PATCH OUT
; AND APPLYING IT WITH FILDDT, CHANGE THE DOLLARS SIGNS TO ESCAPES.
;
; THIS PATCH HAS BEEN TESTED UNDER THE 7.04 MONITOR. IT MAY NOT WORK
; WITH PREVIOUS MONITORS.
REPEAT 0,<
PATCH/HAKPPN:10,,56
HAKSTR:$"/DSKB/
LOGLDB:-1
LOGHAK:PUSHJ P,. 2
JRST MSTART
CAME U,LOGLDB
POPJ P,
PUSHJ P,SAVE1
MOVE P1,SGANAM+.JDAT
CAME P1,LOGTXT
POPJ P,
MOVE P1,HAKSTR
MOVEM P1,SGADEV+.JDAT
MOVE P1,HAKPPN
MOVEM P1,SGAPPN+.JDAT
POPJ P,
COMCON$:
SGSET9-FTMP/JRST LOGHAK
GJOB2 7/JFCL
CLOGIN 1/JRST RUNAME
.CPJOB[$Q<JOBNOX:
TTYTAB JOBNOX[
$Q DDBLDB[$Q<LDB:
LOGLDB/LDB
>>>;END REPEAT 0
SUBTTL Definitions -- Assembly parameters
ND ACTFMT,6 ;ACCOUNTING FILE/PROFILE FORMAT NUMBER
ND SUPNOT,1 ;SUPPRESS NOTICE.TXT IF / IN PPN
ND UFDSEC,^D5*^D60 ;SECONDS TO WAIT FOR UFD INTERLOCK
ND OLDTTY,0 ;INCLUDE OLD-STYLE TTY SWITCHES NOW SUPERSEDED BY
; /TERMINAL:(A,B,C...)
ND OLDDEF,0 ;INCLUDE OLD-STYLE DEFAULT SWITCHES NOW SUPERSEDED BY
; /DEFAULT:(A,B,C,...)
ND CLSDEF,0 ;MAKE KJOB/CLEAR THE DEFAULT
ND CTXDLN,20 ;CONTEXT UUO DATA BUFFER LENGTH
ND MAILDV,<SIXBIT/DSK/> ;DEFAULT MAIL FILE DEVICE
ND MAILFN,<SIXBIT/MAIL/>;DEFAULT MAIL FILE NAME
ND MAILEX,<SIXBIT/TXT/> ;DEFAULT MAIL FILE EXTENSION
ND MAILPP,<XWD -1,-1> ;DEFAULT MAIL FILE PPN (-1 MEANS USE PPN)
ND MAILBT,1 ;BIT IN APPLICATION FIELD OF EXTENDED LOOKUP
; BLOCK THAT INDICATES NEW MAIL EXISTS
ND DATLEN,50 ;LENGTH OF QUEUE. UUO DATA BLOCK
ND QUELEN,50 ;LENGTH OF QUEUE. UUO ARGUMENT BLOCK
ND RSPLEN,20 ;LENGTH OF QUEUE. UUO RESPONSE BLOCK
ND ACCTIM,^D20 ;TIMEOUT FOR REQUESTING ACCOUNTING INFO
ND ACCTI2,^D60 ;TIMEOUT FOR RETRIES ON ACCOUNTING INFO
ND ACCTRY,^D10 ;RETRY LIMIT FOR ACCOUNTING INFO REQUESTS
ND CHGTIM,^D20 ;TIMEOUT FOR CHANGING PARAMETERS
ND USGTIM,^D60 ;TIMEOUT FOR MAKING USAGE ENTRIES
ND RETRYM,^D10 ;NUMBER OF RETRIES A USER IS GIVEN TO TYPE THE PPN,
; PASSWORD, ETC.
ND RETRYN,^D5 ;NUMBER OF RETRIES BEFORE UNCONDITIONALLY DISALLOWING
; ACCESS WHETHER OR NOT PPN, PASSWORD, ETC. ARE VALID
ND RETRYS,^D3 ;NUMBER OF SECONDS TO SLEEP BETWEEN RETRIES
; THIS MAKES IT HARD FOR A USER TO TELL WHAT FAILED
; (SECURITY THROUGH OBSCURITY)
ND TTYSLP,2 ;NUMBER OF MINUTES TO SLEEP BEFORE INPUT TIMEOUT
ND PDLSIZ,60 ;DEPTH OF STACK
ND DVICES,20 ;NUMBER OF DEVICES ASSIGNABLE BY /ASSIGN
ND EXPWRN,^D31 ;DAYS TO WARN IF PPN WILL EXPIRE SOON
ND PSWWRN,^D7 ;DAYS TO WARN IF PASSWORD WILL EXPIRE SOON
ND STRMAX,^D36 ;MAXIMUM NUMBER OF STRS IN SYSTEM
ND MAXFS,^D12 ;MAXIMUM NUMBER OF FILE STRUCTURES PER USER
ND WTOCHN,^D240 ;NUMBER OF CHARACTERS MAXIMUM IN WTO BUFFER
SUBTTL Definitions -- AC assignments
F=0 ;FLAGS
T1=1 ;FOUR
T2=T1+1 ; PRESERVED
T3=T2+1 ; ACS
T4=T3+1 ; ...
P1=5 ;FOUR
P2=6 ; PRESERVED
P3=7 ; ACS
P4=10 ; ...
N=P3 ;LAST SCANNING WORD RESULT
C=P4 ;LAST SCANNING CHARACTER RESULT
PP=12 ;PROJECT PROGRAMMER PAIR
P=17 ;PUSHDOWN POINTER
IOC==1 ;RANDOM I/O CHANNEL
MSGOK==1 ;FLAG TO TYPE MEESSAGE EVEN IF USER HAS SEEN IT
FNAME==2 ;FLAG TO REQUEST FILE NAME PRINTING
STONLY==4 ;FLAG TO PRINT STR NAME ONLY
SUBTTL Definitions -- Flags in AC F
;LEFT HALF
FL.LGN==1 ;JOB IS LOGGED IN
L.MANY==2 ;ON IF MORE THAN ONE CONTROLLING JOB IN CHAIN
FL.WKD==4 ;ON IF THIS IS A WEEKDAY
FL.BYP==10 ;SET IF BYPASSING THE ACCOUNTING SYSTEM
FL.BSJ==20 ;SET IF BATCH JOB SUBJOB
FL.BAT==40 ;SET IF THIS JOB IS A BATCH JOB
FL.GPN==100 ;GENERATE A PROGRAMMER NUMBER
L.OPR== 200 ;SET IF MY TTY IS OPR OR CTY
L.SOPR==400 ;SET IF I AM ON PTY UNDER OPR, CTY OR A [1,2] JOB
FL.WLD==1000 ;WILD CARD PROGRAMER
FL.CTY==2000 ;TTY IS A CTY
;RH OF F
R.ACRE==1 ;SET IF ANY CREATES ALLOWED ON ANY STR'S
R.ASTR==2 ;SET IF ANY STR'S IN THIS JOB'S SEARCH LIST
R.PTYJ==10 ;PTY JOB
R.COMA==20 ;COMMA HAS BEEN TYPED WHEN TELLING OTHER JOBS
;SPECIAL PPN CHARACTERS
UNISYM=="#" ;CHARACTER FOR CREATE UNIQUE PPN
UNIPRG==777776 ;INTERNAL VALUE FOR UNIQUE PPN
DEFPRG==777777 ;DEFAULT (INTERNAL TO REACT) PPN
SUBTTL Definitions -- Command bits and offsets
DEFINE CMDS,<
;; PFX, NAME , HELP ,PROCES,PROMPT,OSCNAM
X LOG,LOGIN ,LOGIN ,DOLOG ,<#> ,<>
X ATT,ATTACH,ATTACH,DOATT ,<#> ,<>
X RTA,REATTA,REATTA,REATTA,<New terminal: >,<>
X SES,SESSIO,SESSIO,SESSIO,<> ,<>
X PSW,PASSWO,PASSWO,PASSWO,<> ,<>
X SET,SET ,PASSWO,SETPSW,<> ,<>
X KJB,KJOB ,LOGOUT,KJOB ,<> ,<KJOB,LOGOUT>
X TRN,TRANSL,TRANSL,TRANSL,<#> ,<>
>
ZZ==-1
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<
COM'PFX==<ZZ==ZZ+1>
CM.'PFX==1B<COM'PFX>
>
CMDS
SUBTTL Definitions -- Message macros
;ERROR CODES FOR TYPES OF LOGIN ERRORS (FOR PTY JOBS)
;**** NOTE ERROR COMMENTS SHOULD ALL BEGIN WITH A QUESTION MARK
;**** AND FOR PTY JOBS INCLUDE AN ERROR TYPE OF THE FORM
;**** (#) WHERE # IS ONE OF THE FOLLOWING:
;ERR.NF==1 ;NON FATAL (Not used by BATCON or LOGIN)
;ERR.SF==2 ;SEMI FATAL (Not used by BATCON or LOGIN)
ERR.FT==3 ;FATAL - CANCEL JOB
ERR.SS==4 ;STOP SCHEDULING (Shutdown batch stream but requeue job)
ERR.RQ==5 ;REQUE JOB (Requeue job)
IF1,<
;FLAGS IN LEFT HALF OF EF
EF.SYS==1B1 ;SYSTEM ERROR
EF.ERR==1B2 ;FATAL ERROR
EF.WRN==1B3 ;WARNING
EF.INF==1B4 ;INFORMATION LINE (IN [])
EF.REQ==1B5 ;REQUE JOB
EF.WTO==1B6 ;WTO ERROR TO OPERATOR (ANY ERROR MESSAGE TYPE)
EF.SIL==1B7 ;SUPPRESS NOTICE.TXT TYPEOUT ON FATAL ERRORS
EF.FMT==1B8 ;FORMAT ERROR (USER GETS TO RETRY)
EF.ACF==1B9 ;ACCESS FAILURE
;SUPER FATAL ERROR -- NEVER RETURNS
;THE BATCH STREAM IS SHUTDOWN, AND THE JOB IS REQUEUED
DEFINE STOP(PFX,TXT,FLG,MOR),<
.ERR. EF.SYS,PFX,<TXT>,FLG,MOR
>
;FATAL ERROR (HOWEVER, SYSTEM IS STILL OK)
DEFINE FATAL(PFX,TXT,FLG,MOR),<
.ERR. EF.ERR,PFX,<TXT>,FLG,MOR
>
;WARNING MESSGAE
;CALL WITH:
; WARN PREFIX,<TEXT>
DEFINE WARN(PFX,TXT,FLG,MOR),<
.ERR. EF.WRN,PFX,<TXT>,FLG,MOR
>
;SEMI-FATAL ERROR--BATCON SHOULD REQUE JOB AND STOP SCHEDULING
;FOR A LITTLE WHILE
;CALL WITH:
; REQUE PREFIX,<TEXT>
; NEVER RETURN
DEFINE REQUE(PFX,TXT,FLG,MOR),<
.ERR. EF.REQ,PFX,<TXT>,FLG,MOR
>
;INFORMATION MESSAGE (PRINTED IN [])
;CALL WITH:
; INFO PREFIX,<TEXT>
DEFINE INFO(PFX,TXT,FLG,MOR),<
.ERR. EF.INF,PFX,<TXT>,FLG,MOR
>
DEFINE .ERR. (TYP,PFX,TXT,FLG,MOR),<
PUSHJ P,[XLIST
PUSHJ P,ERRMSG ;CALL ERROR MESSAGE
IFB <MOR>,<XWD 0,''PFX''>
IFNB <MOR>,<XWD MOR,''PFX''>
IFB <FLG>,<TYP![ASCIZ\TXT\]>
IFNB <FLG>,<TYP!FLG![ASCIZ\TXT\]>
LIST]
>
> ;END IF1
SUBTTL Program initialization
START: TDZA 17,17 ;CLEAR AC17 ON A NORMAL START
MOVEI 17,1 ;SETUP A 1 ON A CCL START
SETZB 0,ZZBEG ;PREPARE TO CLEAR CORE
MOVEI 16,1 ;CLEAR THE AC'S
BLT 16,16 ; ..
MOVE T1,[ZZBEG,,ZZBEG+1] ;CLEAR OUT THE LOWSEG
BLT T1,ZZMAX-1 ; ..
MOVEM 17,SAOFST ;SAVE STARTING OFFSET
MOVE P,PDPLST ;SET UP THE STACK
PUSHJ P,GTTABS ;GET INFORMATION
PUSHJ P,ISLGO ;CHECK TO SEE IF WE ARE LOGOUT (BEFORE 7.04)
MOVE T1,[4,,RICC] ;LOAD UP JOBINT BLOCK
MOVEM T1,INTBLK ; ..
MOVX T1,ER.ICC ;ASK FOR CONTROL-C
MOVEM T1,INTBLK+1 ; INTERCEPT
MOVEI T1,INTBLK ;CONTROL-C INTERCEPT BLOCK
MOVEM T1,.JBINT## ;STORE FOR THE MONITOR
RESET ;
PUSHJ P,PSINIT ;INITIALIZE PSI
PJOB T1, ;Get our job number
MOVEM T1,THSJOB ;Store for later
PUSHJ P,ISBATC ;Is this a Batch job ?
SKIPA ;No
TLO F,FL.BAT!L.SOPR ;This guy is a real son of a batch
PUSHJ P,.TOINI## ;INITIALIZE TTY OUTPUT
PUSHJ P,TTYNEC ;SET TTY NO ECHO
PUSHJ P,.T8BIT## ;ENABLE 8-BIT TTY I/O
PUSHJ P,GENTIM ;GENERATE DAY-OF-WEEK AND TIMES DATA
PUSHJ P,NOTBAT ;INIT TTY/JOB STATUS BITS
PUSHJ P,CTYCHK ;CHECK CTY STATUS
GETLIN T1, ;GET MY TTY NAME
MOVEM T1,MYTTY ;SAVE IT
MOVE T3,TTBITS ;GET TTY BITS
TXNN T3,GL.CTY ;IS MY TTY THE CTY?
CAMN T1,SAVOPR ;OR THE OPR?
TLO F,L.OPR ;YES. REMEMBER THAT IN FLAG AC
MOVE T3,THSJOB ;GET OUR JOB NUMBER
TRMNO. T3, ;GET TTY UDX
SETZ T3, ;SO WHAT?
MOVEM T3,TTYUDX ;SALT AWAY FOR TRMOP. STUFF
SETOM OOBEG ;SET SCAN SWITCH BLOCK TO -1
MOVE T1,[XWD OOBEG,OOBEG+1]
BLT T1,OOMAX-1
MOVEI T1,RETRYM ;GET MAX NUMBER OF RETRIES
MOVEM T1,LOGTRY
DATE T1,
MOVEM T1,TDATE ;SAVE FOR LATER
PJRST COMMAN
GTTABS: MOVSI T2,-GTBLEN ;MAKE AOBJN POINTER
GTTAB1: MOVE T1,GTBARG(T2) ;GET AN ARGUMENT
GETTAB T1, ;DO THE GETTAB
MOVE T1,GTBFAI(T2) ;FAILED: USE THIS VALUE
XCT GTBXCT(T2) ;STORE THE RESULT
AOBJN T2,GTTAB1 ;GET ALL OF THE INFORMATION
LDB T1,[POINTR UFDPRT,RB.PRV]
MOVEM T1,UFDPRT ;RIGHT-JUSTIFY THE UFD PROTECTION CODE
POPJ P, ;RETURN WHEN DONE
; THE ARGUMENTS TO THE TABS MACRO ARE:
;
; 1) GETTAB ARGUMENT
; 2) VALUE TO USE SHOULD THE GETTAB FAIL
; 3) INSTRUCTION TO STORE THE RESULT (WITHOUT THE AC)
DEFINE TABS,<
XLIST
XX <%CNOPR> ,<'CTY '> ,<MOVEM SAVOPR>
XX <%CNSJN> ,<^D64> ,<HRRZM L.MXJB>
XX <%CNSTS> , ,<MOVEM STATES>
XX <%CNST2> , ,<MOVEM STATS2>
XX <%CNTIC> ,<^D60> ,<MOVEM JIFFIE>
XX <%CNDTM> , ,<MOVEM CURDTM>
XX <%CNFLN> , ,<MOVEM FRCLIN>
XX <%CNDVN> , ,<MOVEM MONVER>
XX <%NSHJB> , ,<MOVEM L.HJIU>
XX <%LDMFD> ,<1,,1> ,<MOVEM MFDPPN>
XX <%LDSYS> ,<1,,4> ,<MOVEM SYSPPN>
XX <%LDFFA> ,<1,,2> ,<MOVEM ALPPPN>
XX <%LDHLP> ,<2,,5> ,<MOVEM HLPPPN>
XX <%LDQUE> ,<3,,3> ,<MOVEM QUEPPN>
XX <%LDUFP> ,<775B8> ,<MOVEM UFDPRT>
XX < 0,,.GTLOC> , ,<MOVEM LOCSTA>
XX <-1,,.GTLOC> , ,<MOVEM JOBSTA>
XX <-1,,.GTPPN> , ,<MOVEM PPN>
XX <-1,,.GTPRG> , ,<MOVEM PRGNAM>
XX <-1,,.GTPRV> , ,<MOVEM PRIVWD>
XX <-1,,.GTLPN> , ,<MOVEM LPNPPN>
XX <-1,,.GTNM1> , ,<MOVEM NAME>
XX <-1,,.GTNM2> , ,<MOVEM NAME2>
XX <-1,,.GTCNO> , ,<MOVEM CHGNO>
XX <-1,,.GTKCT> , ,<MOVEM KCTNUM>
XX <-1,,.GTRCT> , ,<MOVEM DSKRDS>
XX <-1,,.GTWCT> , ,<MOVEM DSKWTS>
XX <-1,,.GTTIM> , ,<MOVEM RUNTIM>
XX <-1,,.GTJLT> , ,<MOVEM JLOGTM>
XX <-1,,.GTLIM> , ,<MOVEM BATLIM>
XX <-1,,.GTEQJ> , ,<MOVEM ENQLOK>
LIST
> ;END OF TABS MACRO
; BUILD THE TABLE OF GETTAB ARGUMENTS
;
DEFINE XX (ARG,FAI,XCT),<EXP <ARG>>
GTBARG: TABS
GTBLEN==.-GTBARG
; BUILD THE TABLE OF VALUES TO USE IN CASE OF FAILURE
;
DEFINE XX (ARG,FAI<0>,XCT),<EXP <FAI>>
GTBFAI: TABS
; BUILD THE TABLE OF INSTRUCTIONS TO SAVE THE RESULT
;
DEFINE XX (ARG,FAI,XCT),<EXP <<<XCT>&<777037,,777777>>+<<T1>B12>>>
GTBXCT: TABS
ISLGO: MOVE T1,PRGNAM ;GET THE NAME OF THIS PROGRAM
CAMN T1,['LOGOUT'] ;IS IT LOGOUT?
SKIPN JLOGTM ;HAS THIS JOB EVER LOGGED IN?
POPJ P, ;NO--RETURN
PUSHJ P,.ISLGI## ;IS THE JOB CURRENTLY LOGGED IN?
SETOM IAMLGO ;NO--MUST BE BEFORE 7.04
POPJ P, ;RETURN
SUBTTL Command processing -- Initialization and dispatch
COMMAN: MOVE T1,[SCILEN,,SCIBLK] ;POINT TO SCAN ARGUMENTS
PUSHJ P,.ISCAN## ;CALL SCAN TO GET COMMAND
JUMPGE T1,COMMA2 ;JUMP IF WE HAVE A COMMAND
SKIPN SAOFST ;CCL ENTRY?
JRST COMMA1 ;NO
PUSHJ P,.SIXSW## ;READ COMMAND NAME FROM TMPCOR
JUMPE N,COMMA1 ;GIVE UP IF NO KEYWORD
MOVE T1,[IOWD COMLEN,COMLST] ;POINT TO LIST OF COMMANDS
MOVE T2,N ;GET KEYWORD
PUSHJ P,.LKNAM## ;SOME FLAVOR OF PASSWORD?
COMMA1: TLOA T1,(1B0) ;STILL DON'T KNOW WHAT THE COMMAND IS
MOVEI T1,-COMLST(T1) ;CONVERT FROM -M,,COMLST+N TO N
COMMA2: MOVN T2,THSJOB ;MAKE NEGATIVE
JOBSTS T2, ;READ JOB STATUS
SETZ T2, ;???
JUMPGE T1,COMMA3 ;SKIP THIS STUFF IF COMMAND IS KNOWN
MOVEI T1,COMLOG ;ASSUME A LOGIN COMMAND
TXNN T2,JB.ULI ;JOB LOGGED IN?
SKIPE IAMLGO ;RUNNING LOGOUT?
MOVEI T1,COMKJB ;YES--THEN MUST BE A KJOB COMMAND
COMMA3: TXNE T2,JB.ULI ;JOB LOGGED IN?
TLO F,FL.LGN ;REMEMBER FOR LATER
MOVE T3,COMLST(T1) ;GET COMMAND NAME
MOVEM T3,COMNAM ;SAVE IT
MOVN T3,T1 ;SAVE COMMAND VALUE
MOVNM T3,COMIDX ;SAVE FOR LATER
MOVSI T4,400000 ;GET A BIT
LSH T4,(T3) ;POSITION IT
HLLM T4,COMIDX ;SAVE IT TOO
MOVSI T3,(CM.LOG) ;BIT TO TEST
TLNE F,FL.LGN ;ALREADY LOGGED IN?
TDNN T3,COMIDX ;YES--LOGIN COMMAND?
JRST COMMA4 ;LET IT GO
SKIPN .JBDDT## ;SKIP IF DDT LOADED
FATAL KOD,<Please KJOB or DETACH>,EF.SIL
COMMA4: TXNN T2,JB.UJC ;JACCT?
WARN IDJ,<I do not have JACCT>
HRRZ T1,COMIDX ;GET COMMAND INDEX
MOVE T2,COMNAM ;GET COMMAND NAME
MOVEM T2,.NMUL## ;INCASE OF ERROR
MOVEI T2,.TSIXN## ;TYPEOUT ROUTINE
MOVEM T2,.LASWD## ;SAVE IT TOO
PJRST @COMDSP(T1) ;DISPATCH
SUBTTL Command processing -- ATTACH - ATTACH command
DOATT: SETOM NOWBIT ;CAN ALWAYS ATTACH
PUSHJ P,TTYECH ;SET TTY ECHO
PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER
CAIL C,"0" ;RANGE
CAILE C,"9" ; CHECK
JRST ATTAC1 ;NOT A JOB NUMBER
PUSHJ P,.REEAT## ;BACKUP ONE CHARACTER
MOVEI T1,[ASCIZ /a job number/]
MOVEM T1,HELP
PUSHJ P,.DECNW## ;READ JOB NUMBER TO BE ATTACHED TO
MOVEM N,ATTJBN ;SAVE JOB NUMBER
PUSHJ P,SWTSCN ;CHECK FOR SWITCHES
CAIN C," " ;SITTING ON A SPACE?
PUSHJ P,.TIAUC## ;PRIME THE PUMP
HRLZ PP,ATTJBN ;GET TARGET JOB NUMBER
HRRI PP,.GTPPN ;GETTAB TABLE
GETTAB PP, ;READ THE PPN
MOVEI PP,0 ;SHOULDN'T FAIL
PUSHJ P,USRDEF ;DO /BYPASS LEGALITY CHECKING
CAIN C,"," ;ATTACH JOB,PASSWORD?
JRST ATTACX ;YES
JUMPG C,ATTAC1 ;EOL?
JRST ATTAC2 ;ONWARD
ATTAC1: MOVEI T1,[ASCIZ /a PPN or user name/]
MOVEM T1,HELP ;SAVE INCASE INPUT TIMEOUT
PUSHJ P,GETUSR ;READ USER ID (PPN/PATH/NAME)
SKIPE FAILFL ;ACCESS FAILURE?
JRST ATTAC2 ;YES
SKIPN AENTRY+.AEPPN ;DID WE GET A REASONABLE PROFILE?
JRST DOATT ;NO--PROBABLY THE RESULT OF A SCAN ERROR
JUMPE PP,DOATT ;IGNORE BLANK LINES
ATTAC2: MOVE T1,[2,,U.PATH+.FXDIR] ;INCASE OF ERROR
SKIPE U.PATH+.FXDIR+2 ;ANY SFDS GIVEN?
FATAL SIP,<SFDs illegal in PPN specification >,EF.FMT,.TDIRB##
ATTACX: PUSHJ P,ASKPSW ;READ PASSWORD
SKIPE PP ;REALLY HAVE A PPN?
PUSHJ P,ASKATT ;YES--SEE IF OTHER JOBS SAME PPN
FATAL NJS,<No job number specified>,EF.SIL
MOVX T1,%NSHJB ;
GETTAB T1, ;GET THE HIGHEST JOB IN USE
TRNA ;ERROR - BE SAFE: DON'T ALLOW IT
CAMGE T1,ATTJBN ;IS THIS A VALID JOB NUMBER?
JRST NOATT ;NO - TELL THE USER
MOVEI T1,.GTPPN ;CHECK TO SEE THAT THIS
HRL T1,ATTJBN ; JOB HAS THE PPN HE
GETTAB T1, ; CLAIMED IT DOES. THE MONITOR
SETZ T1, ; MAKES THIS CHECK BUT LOGIN
CAMN T1,PPN ; COULD HAVE A BUG WHICH WOULD
JRST ATTAC3 ; ZAP A USER.
MOVE PP,T1
MOVEM PP,PPN
ATTAC3: SKIPE AENTRY+.AEPPN ;ALREADY HAVE PROFILE?
JRST ATTAC4 ;YES
MOVE T1,[EXP <QA.IMM!1B17!.UGPPN>] ;QUEUE. BLOCK CODE
MOVE T2,PPN ;PPN THAT WE WANT
PUSHJ P,STACCT ;GET ACCT DATA
SETOM FAILFL ;NO SUCH PPN
ATTAC4: MOVE T1,[.ACTRD,,T2] ;SET UP UUO AC
MOVEI T2,2 ;TWO WORDS FOLLOWING (JOB NUMBER IN T3)
MOVE T3,ATTJBN ;GET TARGET JOB NUMBER
MOVEI T4,U.ACTS ;POINT TO STORAGE
ACCT. T1, ;READ CONTROLLING JOB'S ACCOUNT STRING
JFCL ;LET ACTDAE WORRY ABOUT IT
SETZM AENTRY+.AEPCT ;CLEAR PASSWORD CHANGE REQUIREMENTS
PUSHJ P,PSWCHK ;CHECK FOR A LEGAL PASSWORD
SKIPE FAILFL ;ANY FAILURES?
JRST NOATT ;TOO BAD
PUSHJ P,PFLCHK ;PERFORM PROFILE CHECKS
PUSHJ P,NEWPPN ;CHANGE PPN
PUSHJ P,BLDJSL ;BUILD JOB SEARCH LIST
SKIPA ;FAILED
PUSHJ P,SWITCH ;READ SWITCH.INI
ATTAC5: SKIPLE U.PASS ;/PASSWORD SEEN (LOGIN TURNED INTO ATTACH)?
PUSHJ P,CHGPSW ;YES--REQUEST CHANGE
PUSHJ P,AVLCHK ;CHECK FOR SYSTEM AVAILABILITY
PUSHJ P,KSYCHK ;CHECK FOR PENDING KSYS
MOVE T3,CNTLJT ;GET CONTROLLING JOB'S BITS (PROBABLY OURS)
TXNN T3,GL.LCP!GL.CNE!GL.HDP ;LOCAL COPY, COMMAND NO ECHO OR HDX?
PUSHJ P,TTYECH ;SET TTY ECHO
PUSHJ P,MAILCH ;CHECK FOR MAIL
PUSHJ P,OLDPPN ;SWITCH BACK TO OUR OLD PPN ([2,5])
PUSHJ P,USGATT ;SEND USAGE MESSAGE TO [SYSTEM]ACCOUNTING
PUSHJ P,PRETMS ;DO PRE-MESSAGE TRMOPS
PUSHJ P,LGNMES ;TYPE SYS:LOGIN.TXT
PUSHJ P,POSTMS ;DO POST MESSAGE TRMOPS
PUSHJ P,ATTLGL ;SEE IF TARGET JOB AND PPN AGREE
PUSHJ P,ATTJOB ;ATTACH TO THE TARGET JOB
PJRST MONRET ;GO FINISH UP
SUBTTL Command processing -- KJOB - KJOB command
KJOB: PUSHJ P,GTTABS ;FILL IN ALL THE GETTABS
PUSHJ P,CHKLPN ;CHECK TO SEE IF WE'RE PIVOTED
PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER AND EAT SWITCHES
JUMPG C,ERREXA ;CHECK FOR JUNK ON COMMAND LINE
SKIPN REPARS ;ANYTHING TYPED?
JRST MONLGO ;JUST /HELP
PUSHJ P,SWITCH ;DO SWITCH.INI PROCESSING
SKIPGE T1,U.KJOB ;GET TYPE OF KJOB
MOVEI T1,1 ;ASSUME /FAST
TLNE F,FL.BAT ;BATCH JOB?
SETZ T1, ;YES
MOVEM T1,U.KJOB ;UPDATE
MOVE T1,TTBITS ;GET TTY BITS
TXNN T1,GL.ITY ;PTY?
TLNE F,FL.BAT ;OR BATCH?
CLRBFI ;CLEAR TYPEAHEAD
GETPPN PP, ;GET OUR PPN
JFCL ;JACCT
MOVSI T1,.STTLM ;FUNCTION,,ZERO
SETUUO T1, ;CLEAR TIME LIMIT
WARN CCT,<Can't clear time limit>
MOVX T1,1 ;
MOVEM T1,CCWAIT ;NO MORE CTRL/C'S ALLOWED
SKIPE ENQLOK ;HAVE ANY OUTSTANDING LOCKS?
FATAL ENQ,<Job has outstanding eternal ENQ. locks set>,EF.SIL
PUSHJ P,TRMCLS ;CLEAR SCREEN
PUSHJ P,TYPLPN ;TELL USER WE PIVOTED BACK IF NEEDED
SKIPE U.NMSG ;/NOMESSAGE?
PUSHJ P,OTHJOB ;CHECK FOR OTHER JOBS SAME PPN
PUSHJ P,DELTMP ;DELETE TMP FILES
PUSHJ P,SETPTH ;SET PATH TO [,]
PUSHJ P,CHKQTA ;CHECK QUOTAS
PUSHJ P,SUMARY ;PRINT SUMMARY
SKIPE T1,.JBDDT## ;DEBUGGING?
JRST (T1) ;YES, GO TO DDT
SETZB T3,T4 ;BLOCK FOR TMPCOR UUO
MOVE T1,[.TCRDD,,T3] ;DELETE DIRECTORY
TMPCOR T1, ;DO IT
JFCL ;DOESN'T MATTER
LOGOUT ;****END OF JOB****
SUBTTL Command processing -- DOLOG - LOGIN command
DOLOG: PUSHJ P,BANNER ;TYPE LOGIN BANNER
RESTAR: MOVE T1,[OOBEG,,OOBEG+1] ;SET UP BLT
SETOM OOBEG ;INIT FIRST WORD
BLT T1,OOMAX ;INIT SWITCH STORAGE
MOVE T1,[N.ZER##,,N.ZER##+1] ;SET UP BLT
SETZM N.ZER## ;CLEAR FIRST WORD
BLT T1,N.EZER## ;ZERO SCAN'S SCAN BLOCK FOR /RUN
SETOM .OPTN## ;INIT /OPTION INCASE RESTART
MOVE P,PDPLST ;RE-INIT STACK
PUSHJ P,ACCLOG ;DO LOGMAX CHECKING
PUSHJ P,FAILUR ;CHECK LOGIN FAILURE FLAG
PUSHJ P,GENTIM ;GENERATE DAY-OF-WEEK AND TIMES DATA
PUSHJ P,PARSE ;GO PARSE LOGIN LINE
PUSHJ P,ASKPSW ;READ PASSWORD(S)
PUSHJ P,NEWPPN ;CHANGE PPN
SKIPN FAILFL ;DON'T BOTHER WITH SEARCH LIST STUFF IF FAILING
PUSHJ P,BLDJSL ;BUILD JOB SEARCH LIST
SKIPA ;FAILED
PUSHJ P,SWITCH ;READ SWITCH.INI
PUSHJ P,ASKNAM ;READ USER NAME IF REQUIRED
PUSHJ P,ASKACT ;READ ACCOUNT STRING IF REQUIRED
PUSHJ P,ASKRMK ;READ REMARK STRING IF REQUIRED
PUSHJ P,PSWCHK ;CHECK VALAIDITY OF PASSWORD
PUSHJ P,PPNEXP ;CHECK FOR PPN/PSW EXPIRATION
PUSHJ P,PFLCHK ;CHECK USER'S PROFILE
PUSHJ P,TIMCHK ;CHECK FOR LEGAL ACCESS TIMES
SKIPE FAILFL ;ANY FAILURES?
JRST TRYAGN ;TOO BAD
PUSHJ P,ASKLOG ;ASK LOGIN/ATTACH PREFERENCE IF DETACHED JOBS
JRST ATTAC5 ;USER ATTACHING INSTEAD OF LOGGING IN A NEW JOB
PUSHJ P,AVLCHK ;CHECK FOR SYSTEM AVAILABILITY
PUSHJ P,KSYCHK ;CHECK FOR PENDING KSYS
MOVE T1,AENTRY+.AEPRV;AND PRIV WD
MOVEM T1,PRIVWD ;STORE PRIV WORD
PUSHJ P,SETGLX ;SETUP GALAXY BATCH PARAMETERS
PUSHJ P,OTHJOB ;REPORT OTHER JOBS SAME PPN
PUSHJ P,MNTSTR ;MOUNT ALL STRS (SET RIPLOG)
PUSHJ P,CHGNAM ;CHANGE USER NAME IF NECESSARY
SKIPLE U.PASS ;/PASSWORD SEEN?
PUSHJ P,CHGPSW ;YES--REQUEST CHANGE
PUSHJ P,USGLOG ;SEND USAGE MESSAGE TO [SYSTEM]ACCOUNTING
PUSHJ P,STRCHK ;CHECK NEED TO RECOMPUTE, EMPTY S/L, ETC.
PUSHJ P,PRVSET ;SET PRIV'ED JOB PARAMETERS
PUSHJ P,ACCCHK ;CHECK LAST VALIDATION FAILURE
PUSHJ P,MAILCH ;CHECK FOR MAIL
PUSHJ P,STRMES ;DO /STR IF DESIRED
PUSHJ P,LOGJOB ;LOG THE JOB IN
PUSHJ P,USRSET ;SET UNPRIV'ED JOB PARAMETERS
PUSHJ P,DAYMES ;PRINT OUT DAILY MESSAGES
PUSHJ P,POSTMS ;DO POST-MESSAGE TRMOP.S (SPEED)
PJRST MONRET ;EXIT
;SUBROUTINE TO PARSE THE LOGIN COMMAND LINE
;CALL WITH:
; PUSHJ P,PARSE
; RETURN HERE IF OK
;
PARSE: TLZ F,FL.WLD
SETZM Z.STRT ;INIT SOME SWITCHES TO 0
MOVE T1,[XWD Z.STRT,Z.STRT+1];SETUP BLT
BLT T1,Z.END-1 ;CLEAR THEM OUT
SETOM OOBEG ;CLEAR OUT SWITCH BLOCK
MOVE T1,[XWD OOBEG,OOBEG+1]
BLT T1,OOMAX-1
MOVE T1,[IOWD DVICES*2+1,DEVTAB] ;INIT PTR TO DEV TABLE
MOVEM T1,DEVPTR ;..
PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER
MOVEI T1,[ASCIZ /a PPN, path, or user name/]
MOVEM T1,HELP ;SAVE INCASE INPUT TIMEOUT
PUSHJ P,GETUSR ;READ USER ID (PPN/PATH/NAME)
SKIPE FAILFL ;ACCESS FAILURE?
JRST PARSE1 ;YES
SKIPN AENTRY+.AEPPN ;DID WE GET A REASONABLE PROFILE?
JRST PARSE ;NO--PROBABLY THE RESULT OF A SCAN ERROR
JUMPE PP,PARSE ;IGNORE BLANK LINES
MOVEM PP,PPN ;YES - SALT PPN AWAY FOR LOGIN UUO
PARSE1: MOVEI T1,U.PATH ;GET ADDR OF PATH SPEC TO CHECK
PUSHJ P,PTHCHK ;MAKE SURE IT'S A NICE PATH SPEC
BADPTH: FATAL IPS,<Invalid path specification>,EF.FMT
SKIPN U.PATH+.FXDEV ;WAS A PATH TYPED?
POPJ P, ;NO
SKIPN T4,U.PATH+.FXDIR ;WAS A PPN TYPED IN THE PATH?
MOVE T4,PP ;NO--USE TARGET PPN
TLNN T4,-1 ;IS PROJECT NUMBER ZERO?
HLL T4,PP ;DEFAULT TO USER'S
TRNN T4,-1 ;IS PROGRAMMER NUMBER ZERO?
HRR T4,PP ;DEFAULT TO USER'S
MOVEM T4,U.PATH+.FXDIR ;UPDATE IN PATH BLOCK
POPJ P, ;RETURN
SUBTTL Command processing -- REATTA - REATTACH command
REATTA: GETPPN PP, ;GET OUR PPN
JFCL ;INCAES OF JACCT
PUSHJ P,USRDEF ;DO /BYPASS LEGALITY CHECKING
MOVE T1,[EXP <QA.IMM!1B17!.UGPPN>] ;QUEUE. BLOCK CODE
MOVE T2,PP ;PPN THAT WE WANT
PUSHJ P,STACCT ;READ OUR ACCOUNTING PROFILE
SETOM FAILFL ;???
PUSHJ P,TTYECH ;SET TTY ECHO
MOVE T1,PP ;INCASE OF ERROR
SKIPE FAILFL ;ERRORS ALREADY?
FATAL NSP,<No such PPN as >,EF.FMT!EF.SIL,.TPPNW##
PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER AND EAT SWITCHES
PUSHJ P,.TICAN## ;CHECK FOR ALPHANUMERICS
JUMPG C,ERREXA ;CHECK FOR JUNK ON COMMAND LINE
SKIPN REPARS ;ANYTHING TYPED
JRST MONRET ;JUST /HELP
PUSHJ P,.SIXSC## ;READ TARGET TTY NAME
CAIN C,":" ;DEVICE TERMINATOR?
PUSHJ P,.TIAUC## ;EAT IT
JUMPE N,REATTA ;REPROMPT IF NO INPUT
JUMPL N,REATT1 ;HAVE A REAL NAME?
HLRZS N ;PUT IN RH
HRLI N,'TTY' ;MAKE IT TTYNNN
REATT1: MOVEM N,NEWTTY ;SAVE TARGET TTY NAME
PUSHJ P,SWTSCN ;CHECK FOR TRAILING SWITCHES
JUMPG C,ERREXA ;CHECK FOR JUNK ON THE LINE
PUSHJ P,SWITCH ;DO SWITCH.INI PROCESSING
MOVE N,NEWTTY ;GET TTY NAME BACK
MOVE T1,N ;GET TTY NAME (SAVE FOR ERRORS)
MOVE T2,T1 ;MAKE A WORKING COPY
IONDX. T2,UU.PHY ;REAL TTY?
REATT2: FATAL DNT,<Device not a physical terminal >,EF.FMT!EF.SIL,.TSIXN##
MOVEM T2,TTYUDX ;SAVE TARGET UDX
GETLCH T2 ;READ TTY BITS
MOVEM T2,TTBITS ;SAVE
MOVE T3,TTYUDX ;GET NAME AGAIN
DEVCHR T3, ;GET DEVICE CHARACTERISTICS
TXNN T3,DV.DSK ;A DSK?
TXNN T3,DV.TTY ;A TTY?
JRST REATT2 ;NOT A PHYSICAL TTY
MOVX T1,UU.PHS ;PHYSICAL
MOVE T2,N ;DEVICE NAME
SETZ T3, ;NO BUFFERS
OPEN IOC,T1 ;SEE IF AVAILABLE
SKIPA T1,N ;FAILED
JRST REATT3 ;ONWARD
MOVE T1,TTYUDX ;GET TARGET UDX
DEVTYP T1, ;READ OWNING JOB NUMBER
JRST REATT1 ;FAILED
LDB T1,[POINTR T1,TY.JOB] ;GET OWNER JOB
FATAL TIU,<Terminal in use by job >,EF.FMT!EF.SIL,.TDECW##
REATT3: MOVEI T1,IOC ;CHANNEL NUMBER
IONDX. T1, ;GET UDX
JRST REATT1 ;FAILED
MOVSI T2,'TTY' ;GET OUR TTY
IONDX. T2,UU.PHY ;CONVERT TO UDX
JFCL ;CAN'T FAIL
CAMN T1,T2 ;SAME?
FATAL TIY,<Terminal is your job's controlling TTY>,EF.FMT!EF.SIL
MOVE T3,[%CNFLN] ;ARGUMENT
GETTAB T3, ;READ FRCLIN LINE NUMBER
JFCL
TRO T3,.UXTRM ;MAKE INTO A UDX
CAMN T3,TTYUDX ;SAME?
FATAL TIF,<Terminal is FRCLIN>,EF.FMT!EF.SIL!EF.WTO!EF.ACF
MOVE T1,N ;RESET NAME INCASE OF ERRORS
MOVX T2,GL.SLV ;BIT TO TEST
TDNE T2,TTBITS ;SLAVED?
FATAL TIS,<Terminal is slaved; >,EF.FMT!EF.SIL,.TSIXN##
MOVX T1,JP.POK ;BIT TO TEST
CAME PP,ALPPPN ;GOD CAN DO ANYTHING
TDNE T1,AENTRY+.AEPRV ;AND SO MAY HIS APPOSTLES
JRST REATT4 ;GO REATTACH TO ANOTHER TTY
PUSHJ P,PFLCHK ;CHECK PROFILE FOR LEGAL TTY TYPES
REATT4: MOVE T1,THSJOB ;GET OUR JOB NUMBER
INFO FJN,<From job >,,.TDECW##
MOVEI T1,CRLFPD ;<CRLF>DOT
PUSHJ P,.TSTRG## ;TYPE IT
PUSHJ P,.TOOUT## ;FORCE OUTPUT
MOVE T2,TTYUDX ;GET TARGET UDX
TRZ T2,.UXTRM ;STRIP OFF UDX OFFSET
HRLZS T2 ;PUT IN LH
TXO T2,AT.UUM ;ATTACH IN USER MODE
HRR T2,THSJOB ;INCLUDE OUR JOB NUMBER
ATTACH T2, ;DO THE ATTACH
FATAL ATF,<ATTACH to terminal failed>,EF.FMT!EF.SIL
MOVE T1,THSJOB ;GET JOB AGAIN
INFO NAJ,<Now attached to job >,,.TDECW##
RELEAS IOC, ;GIVE UP CHANNEL
PJRST MONRET ;CLEAN UP
SUBTTL Command processing -- SESSIO - SESSION command
SESSIO: PUSHJ P,TTYECH ;SET TTY ECHO
GETPPN PP, ;GET OUR PPN
JFCL ;INCASE OF JACCT
MOVEM PP,PPN ;SAVE
PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER AND EAT SWITCHES
JUMPG C,ERREXA ;CHECK FOR JUNK ON COMMAND LINE
SKIPN REPARS ;ANYTHING TYPED?
JRST MONRET ;JUST /HELP
PUSHJ P,SWITCH ;DO SWITCH.INI PROCESSING
MOVE T1,[EXP <QA.IMM!1B17!.UGPPN>] ;QUEUE. BLOCK CODE
MOVE T2,PPN ;PPN THAT WE WANT
PUSHJ P,STACCT ;GET ACCT DATA
FATAL APA,<Accounting profile not available>,EF.FMT!EF.SIL
PUSHJ P,ASKACT ;READ ACCOUNT STRING IF REQUIRED
PUSHJ P,ASKRMK ;READ REMARK STRING IF REQUIRED
PUSHJ P,SETACT ;SET ACCOUNT STRING
PUSHJ P,USGSES ;SEND USAGE MESSAGE TO [SYSTEM]ACCOUNTING
PJRST MONRET ;DONE
SUBTTL Command processing -- SETPSW - SET PASSWORD command
SETPSW: PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER AND EAT SWITCHES
JUMPLE C,SETPS1 ;ERROR IF EOL
PUSHJ P,.SIXSC## ;GET NEXT WORD
MOVE T1,[IOWD 1,['PASSWO']]
MOVE T2,N ;GET KEYWORD
PUSHJ P,.LKNAM## ;SOME FLAVOR OF PASSWORD?
SETPS1: FATAL PMS,<"PASSWORD" missing in SET PASSWORD command>,EF.SIL
PUSHJ P,SWTSCN ;SCAN SWITCHES (MAYBE THE CLOWN TYPED /H)
JRST PASSW0 ;JOIN COMMON CODE
SUBTTL Command processing -- PASSWO - PASSWORD command
PASSWO: PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER AND EAT SWITCHES
PASSW0: JUMPG C,ERREXA ;CHECK FOR JUNK ON COMMAND LINE
SKIPN REPARS ;ANYTHING TYPED?
JRST MONRET ;JUST /HELP
MOVEI T1,[ASCIZ /password may not be changed/]
PUSHJ P,LOKWRN ;CHECK FOR LOCKED ACCOUNTING FILES
PJRST MONRET ;GIVE UP
MOVEI T1,1 ;GET A "YES"
MOVEM T1,U.PASS ;FORCE /PASSWORD:YES
GETPPN T1, ;GET OUR PPN
JFCL ;INCASE OF JACCT
MOVEM T1,PPN ;SAVE
PASSW1: MOVEI T1,[ASCIZ /your old password/]
MOVEI T2,[ASCIZ /Old password: /]
MOVEI T3,PASSWD ;BUFFER ADDRESS
PUSHJ P,ASKPSW ;READ PASSWORDS
PUSHJ P,CHGPSW ;REQUEST PASSWORD CHANGE
PJRST MONRET ;FINISH UP
SUBTTL Command processing -- TRANSL - TRANSL command
TRANSL: SETZM TRNCNT ;ZERO COUNT
SETZM PMTFLG ;ZERO FLAG
PUSHJ P,TTYECH ;SET TTY ECHO
PUSHJ P,PSCAN ;INIT PARTIAL LINE SCANNER
SKIPA ;ALREADY HAVE FIRST CHARACTER
TRANS1: PUSHJ P,.TICHE## ;GET FIRST CHARACTER
TRANS2: SETZB USERID ;ZERO USER NAME
SETZ PP,LSTPPN ;ZERO PPN
PUSHJ P,GETUSR ;GET PPN/USERNAME
MOVE T1,[2,,U.PATH+.FXDIR] ;SAVE IN CASE OF ERROR
SKIPE U.PATH+.FXDIR+2 ;ANY SFDs GIVEN?
FATAL SIP,<SFDs illegal in PPN specification >,EF.FMT,.TDIRB##
MOVEM PP,LSTPPN ;SAVE INCASE OF FAILURE
MOVE T1,AENTRY+.AEPPN ;GET PPN
IOR T1,AENTRY+.AENAM ;AND NAME
JUMPN T1,TRANS3 ;HAVE EITHER
JUMPL C,TRNXIT ;EOL?
PJRST ERRILC ;ILLEGAL CHARACTER ON COMMAND LINE
TRANS3: AOS TRNCNT ;ADD ONE TO COUNT
PUSHJ P,TRNPRT ;PRINT TRANSLATION LINE
CAIN C,"," ;ANOTHER SPEC ON THE WAY?
JRST TRANS1 ;YES, LOOP
JUMPG C,ERREXA ;CHECK FOR EXCESS DATA ON COMMAND LINE
HRRZ T1,TRNCNT ;GET THE TOTAL COUNT
CAILE T1,1 ;DON'T PRINT OUT TOTALS ON DULL RESULTS
PUSHJ P,TRNPR2 ;PRINT TOTALS
TRNXIT: SKIPN PMTFLG ;SKIP IF NO REPROMPT
AOJGE C,TRANSL ;EOF?
PUSHJ P,MONRET ;EXIT TO MONITOR
JRST START ;THE FOOL TYPED CONTINUE
TRNPRT: PUSHJ P,.TCRLF## ;START WITH A BLANK LINE
SKIPE T1,AENTRY+.AEPPN ;MUST HAVE A PPN
SKIPN AENTRY+.AENAM ;AND A NAME
SKIPA ;TRANSLATION FAILED
JRST TRNPR1 ;DISPLAY RETURNED DATA
MOVE T2,[1,,0] ;
ADDM T2,TRNCNT ;ADD TO ERROR COUNT
SKIPE T1,LSTPPN ;A PPN?
WARN (NTF,<Name translation failed for >,,PRTPPN)
JUMPN T1,TRNDON ;PRINT IT
MOVEI T1,USERID ;POINT TO NAME
WARN (PTF,<PPN translation failed for >,,.T8STR##)
TRNDON: POPJ P, ;RETURN
TRNPR1: MOVEI T1,2 ;TWO
PUSHJ P,.TSPAN## ;SPACES
PUSHJ P,PRTUSR ;PRINT USER-ID
PUSHJ P,.TCRLF## ;APPEND A CRLF
POPJ P,
TRNPR2: PUSHJ P,.TCRLF## ;PRINT A CRLF
MOVEI T1,[ASCIZ / A total of /]
PUSHJ P,.TSTRG## ;START SUMMARY LINE
HRRZ T1,TRNCNT ;GET TOTAL COUNT
HLRZS TRNCNT ;GET FAILURE COUNT
SUB T1,TRNCNT ;GET SUCCESS COUNT
JUMPE T1,TRNPR3 ;JUMP IF NO TRANSLATIONS
MOVEI T2,[ASCIZ /translation/]
PUSHJ P,PRTPLS ;PRINT PLURALIZED STRING
SKIPE TRNCNT ;ANY ERRORS?
JUMP .TCRLF## ;NO, ALL DONE
MOVEI T1,[ASCIZ / and /]
PUSHJ P,.TSTRG## ;PRINT TEXT
TRNPR3: MOVE T1,TRNCNT ;GET ERROR COUNT AGAIN
MOVEI T2,[ASCIZ /error/]
PUSHJ P,PRTPLS ;PRINT PLURALIZED STRING
PJRST .TCRLF## ;END LINE AND RETURN
SUBTTL EXIT routines -- FLUSH - Special error processing
FLUSH: PUSHJ P,.CLRBF## ;CLEAR TYPE-AHEAD
SKIPE IAMLGO ;ARE WE RUNNING LOGOUT BEFORE 7.04?
JRST MONLGO ;YES--EXIT
PUSHJ P,.ISLGI## ;ARE WE LOGGED IN?
SKIPA T1,[KLGMSG] ;POINT TO KJOB TEXT
JRST MONRET ;GO FINISH UP
PUSHJ P,.TSTRG## ;PRINT TEXT
PUSHJ P,.TOOUT## ;FORCE OUTPUT
SKIPN .JBDDT## ;DEBUGGING?
SKIPLE LOGTRY ;FAILED SEVERAL TIMES TO LOGIN?
JRST MONRET ;DON'T DISCONNECT THE LINE
MOVEI T1,3 ;WAIT A BIT SO THE
SLEEP T1, ; KJOB TEXT GETS OUT
MOVE T1,[.NDTDS,,T2] ;SET UP UUO
MOVEI T2,2 ;TWO WORDS
MOVE T3,MYTTY ;SIXBIT TTY NAME
NODE. T1, ;DISCONNECT OUR LINE
JFCL ;OK IF DISCONNECT FAIELD
PJRST MONRET ;FINISH UP
NOATT: FATAL CAJ,<Can't ATTACH to job>,EF.SIL
TRYAGN: TLNE F,FL.BAT ;BATCH JOB?
TDZA T1,T1 ;DON'T WASTE TIME
MOVEI T1,RETRYS ;GET SECONDS TO SNOOZE ON RETRY
SKIPE T1 ;ZERO?
SLEEP T1, ;ZZZZZZ
FATAL IET,<Invalid entry>,EF.FMT!EF.SIL,
SUBTTL Exit routines -- MONRET - Exit program
MONRET: MOVSI T1,(AC.DCR) ;GET THE DECREMENT BIT
ACCLG. T1, ;TRY TO COUNT DOWN
JFCL ;IF ERROR IGNORE AND CONTINUE
MONLGO: SKIPE T1,.JBDDT## ;SKIP IF NO DDT
JRST (T1) ;GO TO DDT
RESET ;STOP I/O
MOVX T1,CM.ATT ;BIT TO TEST
TDNE T1,COMIDX ;ATTACH?
JRST MONRE1 ;YES--IT'S SPECIAL
PUSHJ P,.TOOUT## ;FORCE OUT ANY REMAIN TEXT IN OUTPUT BUFFER
PUSHJ P,.ISLGI## ;ARE WE LOGGED IN?
JRST MONRE1 ;NO
SKIPN RUNBLK+.RNDEV ;SKIP IF USER IS LOCKED INTO A PROGRAM
PUSHJ P,.RUNCM## ;PROCESS /RUN IF ANY
MONRE1: SKIPE IAMLGO ;ARE WE RUNNING LOGOUT BEFORE 7.04?
PUSHJ P,RELOGN ;YES--RELOGIN THE JOB
MOVX T1,PS.FOF ;
PISYS. T1, ;TURN OFF THE PSI INTERRUPT SYSTEM
JFCL ;OH WELL, WE TRIED
SETZM .JBSA## ;CLEAR START ADDRESS
SETZM .JBREN## ;CLEAR REENTER ADDRESS
SETZM .JBINT## ;CLEAR INTERCEPTS (JACCT STILL ON)
MOVSI 17,XITMON ;ASSUME NORMAL PROGRAM EXIT
SKIPE RUNBLK+.RNDEV ;PROGRAM-TO-RUN?
MOVSI 17,XITRUN ;YES
BLT 17,17 ;LOAD THE ACS
JRST 0 ;JUMP INTO THE ACS AND FINISH UP
RELOGN: SKIPN JLOGTM ;JUST TO BE SURE, WERE WE EVER LOGGED IN?
POPJ P, ;NO--RETURN
MOVE T1,[-5,,LGNBLK] ;SET UP UUO AC
LOGIN T1, ;GET BACK IN
POPJ P, ;
SUBTTL Exit routines -- RICC - Control-C trapping
; SUBROUTINE TO ALLOW CONTROL-C'S TO WORK AGAIN
; CALL WITH:
; PUSHJ P,CTLCOK
; RETURN HERE IF NO CONTROL-C TYPED
;
CTLCOK: SETZM CCWAIT ;CLEAR THE CONTROL-C DELAY FLAG
AOSE CCTYPED ;WAS A CONTROL-C TYPED?
POPJ P,0 ;NO--RETURN TO CALLER
;YES--FALL INTO RICC
;HERE WHEN A CONTROL-C TYPED
RICC: PUSH P,INTBLK+2 ;SAVE OLD PC
SKIPN CCWAIT ;DO WE WANT CONTROL-C HELD UP?
JRST RICC1 ;NO--CHARGE AHEAD
SKIPG CCWAIT ;DO WE WANT THIS MESSAGE?
INFO WFC,<Please wait for Control-C>
SETZM INTBLK+2 ;REENABLE INTERRUPTS
SETOM CCTYPED ;SET THE FLAG
POPJ P,0 ;RETURN
RICC1: SKIPE IAMLGO ;ARE WE RUNNING LOGOUT BEFORE 7.04?
JRST MONLGO ;YES--EXIT
PUSHJ P,.ISLGI## ;ARE WE LOGGED IN?
AOJE T1,.MNRET## ;NO--EXIT
HRRZ T1,COMIDX ;GET INVOKING COMMAND INDEX
CAIN T1,COMLOG ;LOGIN?
WARN LAC,<LOGIN aborted by Control-C; job is logged in>
JRST MONRET ;EXIT QUICKLY
SUBTTL Exit routines -- SUMARY - Print KJOB summary
SUMARY: SKIPE U.KJOB ;/BATCH?
SKIPE U.NMSG ;OR NOT /NOMESSAGE?
TRNA ;YES, SHOW THE SUMMARY
JRST SUMAR3 ;NO, EXIT QUICKLY
MOVE T1,RUNTIM ;GET RUNTIME IN TICKS
IMULI T1,^D1000 ;CONVERT TO MILLI-TICKS
IDIV T1,JIFFIE ;CONVERT TO MILLI-SECONDS
MOVEM T1,RUNTIM ;AND STORE RUNTIME
MOVE T1,KCTNUM ;GET CTI IN KCTS
IMULI T1,^D100 ;GET CTI IN <KCT>*100
IDIV T1,JIFFIE ;DIVIDE BY JIFSEC
MOVEM T1,KCTNUM ;YIELDING KILO-CORE-CENTI-SECS
MOVSI T1,777700 ;MASK FOR INCREMENTAL READS AND WRITES
ANDCAM T1,DSKRDS ;TURN OFF INCREMENTAL READS
ANDCAM T1,DSKWTS ;TURN OFF INCREMENTAL WRITES
MOVEI T1,[ASCIZ /Job /]
PUSHJ P,.TSTRG##
MOVE T1,THSJOB ;JOB NUMBER
PUSHJ P,.TDECW##
MOVEI T1,[ASCIZ / User /]
PUSHJ P,.TSTRG##
SKIPE T1,NAME ;GET FIRST HALF OF MY NAME
PUSHJ P,.TSIXN## ;TYPE IT
SKIPN T1,NAME ;GET FIRST HALF OF MY NAME BACK
MOVEI T1,77 ;MAKE THE FOLLOWING TEST FAIL
TRNN T1,77 ;WAS THE LAST CHARACTER A SPACE?
PUSHJ P,.TSPAC## ;YES, TYPE A SPACE
SKIPE T1,NAME2 ;GET SECOND HALF
PUSHJ P,.TSIXN## ;TYPE IT
PUSHJ P,.TSPAC## ;TYPE A SPACE
MOVE T1,PP ;GET PPN
PUSHJ P,.TPPNW## ;AND TYPE IT
PUSHJ P,.TCRLF## ;TYPE A CRLF
MOVEI T1,[ASCIZ /Logged-off /]
PUSHJ P,.TSTRG## ;TYPE THE STRING
MOVE T1,MYTTY ;GET THE TTY NAME
PUSHJ P,.TSIXN## ;AND TYPE IT
MOVEI T1,[ASCIZ / at /]
PUSHJ P,.TSTRG## ;TYPE IT
MOVE T1,CURDTM ;GET DATE AND TIME
PUSHJ P,.CNTDT## ;TAKE APART
ADDI T1,^D500 ;ROUND TO SECOND FOR PRINTING
CAMG T1,[^D24*^D60*^D60*^D1000];PAST MIDNIGHT?
JRST SUMAR1 ;NO, NORMAL CASE
ADDI T2,1 ;WAS 23:59:59.835, BUMP DAY
SUB T1,[^D24*^D60*^D60*^D1000];MAKE TIME 0:0:0
SUMAR1: PUSH P,T2 ;SAVE DATE
PUSHJ P,.TTIME## ;TYPE TIME
MOVEI T1,[ASCIZ / on /]
PUSHJ P,.TSTRG##
POP P,T1 ;GET DATE
PUSHJ P,.TDATE## ;TYPE DATE
PUSHJ P,.TCRLF## ;AND A CRLF
MOVEI T1,[ASCIZ /Runtime:/]
PUSHJ P,.TSTRG## ;AND A LABEL
MOVE T1,RUNTIM ;GET RUNTIME IN MILLI-SECONDS
PUSHJ P,.TTIME## ;TYPE IT
MOVEI T1,[ASCIZ /, KCS:/]
PUSHJ P,.TSTRG##
MOVE T1,KCTNUM ;GET CORE-TIME INTEGRAL IN KCS*100
IDIVI T1,^D100 ;CONVERT TO KCS
PUSHJ P,.TDECW## ;TYPE IT
MOVEI T1,[ASCIZ /, Connect time:/]
PUSHJ P,.TSTRG## ;TYPE IT
MOVE T1,CURDTM ;GET TIME OF DAY NOW
SUB T1,JLOGTM ;SUBTRACT JOB LOGIN TIME
MULI T1,^D86400 ;CONVERT TO SECONDS
ASHC T1,^D17 ;SHIFT IT IN
IMULI T1,^D1000 ;CONVERT TO MILLISECS
PUSHJ P,.TTIME## ;AND TYPE IT
PUSHJ P,.TCRLF## ;AND A CRLF
MOVEI T1,[ASCIZ /Disk Reads:/]
PUSHJ P,.TSTRG## ;TYPE A LINE
MOVE T1,DSKRDS ;GET NUMBER OF READS
PUSHJ P,.TDECW## ;AND TYPE IT
MOVEI T1,[ASCIZ /, Writes:/]
PUSHJ P,.TSTRG##
MOVE T1,DSKWTS ;GET NUMBER OF WRITES
PUSHJ P,.TDECW## ;TYPE IT
SKIPE L.OJCS ;OTHER JOB CONTAIN CONFLICTING STR?
JRST SUMAR2 ;YES, WE DIDN'T COUNT EVERYTHING THEN
MOVEI T1,[ASCIZ /, Blocks saved:/]
PUSHJ P,.TSTRG##
MOVE T1,TOTBLK ;GET TOTAL NUMBER OF BLOCKS
PUSHJ P,.TDECW## ;AND TYPE IT
SUMAR2: PUSHJ P,.TCRLF## ;AND A CRLF
SUMAR3: MOVX T1,GL.ITY ;
SKIPL DETFLG ;DETACHED?
TDNE T1,TTBITS ;USING A PTY?
POPJ P, ;YES - FINISHED
PUSHJ P,.TCRLF## ;TYPE A CRLF
MOVEI T1,"." ;
PUSHJ P,.TCHAR## ;TYPE A DOT
PUSHJ P,.TOOUT## ;FORCE OUT THE LAST OUTPUT
SETO T3, ;THIS TERMINAL
SKIPL U.DISC ;/DISCONNECT OR /NODISCONNECT?
JRST SUMAR4 ;YES - NO DEFAULT TO FILL IN
DMOVE T1,[EXP <2,,T2>,<.TOAPC>]
TRMOP. T1, ;GET APC CODE
JRST SUMAR4 ;ERROR
MOVEI T4,1 ;
MOVSI T2,-DISLEN ;-LENGTH OF TABLE
CAME T1,DISTAB(T2) ;MATCH?
AOBJN T2,.-1 ;LOOP
SKIPG T2 ;FOUND A MATCH?
MOVEM T4,U.DISC ;YES - /DISCONNECT
SUMAR4: MOVEI T2,.TOSOP ;FUNCTION
SUMAR5: MOVX T1,<2,,T2> ;LENGTH,,ADDRESS
SKIPL DETFLG ;DETACHED?
TRMOP. T1, ;OUTPUT COMPLETE?
JRST SUMAR6 ;YES - HANG UP THE PHONE
MOVEI T1,1 ;SLEEP TIME
SLEEP T1, ;ZZZZZZ
JRST SUMAR5 ;TRY AGAIN
SUMAR6: SKIPG U.DISC ;WANT TO DISCONNECT LINE?
POPJ P, ;NO, FINISHED
MOVEI T1,1 ;OK NOW GIVE THE OUTPUT A CHANCE TO
SLEEP T1, ; MAKE IT THROUGH THE REMOTE STATION
DMOVE T1,[EXP <2,,T2>,<.TODSF>]
SKIPL DETFLG ;DETACHED?
TRMOP. T1, ;DISCONNECT DATASET
JFCL ;OH WELL, WE TRIED
DMOVE T1,[EXP <2,,T2>,<.TODNT>]
SKIPL DETFLG ;DETACHED?
TRMOP. T1, ;DISCONNECT NETWORK TERMINAL
JFCL ;OH WELL, WE TRIED
POPJ P, ;RETURN
; MACRO TO DEFINE APC CODES FOR LINES WHICH WILL GET AUTOMATICALLY
; DISCONNECTED.
DEFINE DISC,<
X (<NRT,CTM,LAT>) ;;NRT, CTERM, LAT
> ;END DEFINE DISC
DEFINE X,(APC),<
IRP APC,<EXP .TO'APC>
>
DISTAB: DISC
DISLEN==.-DISTAB
SUBTTL Exit routines -- XITMON - Code to exit to the monitor
XITMON: PHASE 0
SETZM .JBDA ;(00) CLEAR FIRST WORD
MOVSI 0,.JBDA ;(01) START OF LOW SEGMENT TO ZERO
HRRI 0,.JBDA+1 ;(02) MAKE A BLT POINTER
BLT 0,.JBDA!777 ;(03) CLEAR MOST OF FIRST PAGE
MOVEI 0,.JBDA!777 ;(04) END OF LOW SEG TO ZERO
HRLI 0,1 ;(05) KILL THE HIGH SEGMENT TOO
CORE 0, ;(06) RELEASE MOST OF LOW SEG + ALL OF HIGH SEG
JFCL ;(07) SHOULDN'T FAIL
SETZ 0, ;(10) ZAP AC
SETNAM 0 ;(11) CLEAR PROGRAM NAME AND JACCT
LOGOUT 1, ;(12) DIE QUIETLY
JRST .-1 ;(13) STAY DEAD
EXP 0 ;(14) FREE AC
EXP 0 ;(15) FREE AC
EXP 0 ;(16) FREE AC
EXP 0 ;(17) FREE AC
DEPHASE
SUBTTL Exit routines -- XITRUN - Code to do a RUN UUO
XITRUN: PHASE 0
SETZM Z.XITE ;(00) CLEAR FIRST WORD
MOVSI 0,Z.XITE ;(01) START OF LOW SEGMENT TO ZERO
HRRI 0,Z.XITE+1 ;(02) MAKE A BLT POINTER
BLT 0,Z.XITE!777 ;(03) CLEAR MOST OF FIRST PAGE
MOVEI 0,Z.XITE!777 ;(04) END OF LOW SEG TO ZERO
HRLI 0,1 ;(05) KILL THE HIGH SEGMENT TOO
CORE 0, ;(06) RELEASE MOST OF LOW SEG + ALL OF HIGH SEG
JFCL ;(07) SHOULDN'T FAIL
SETZ 0, ;(10) ZAP AC
SETNAM 0 ;(11) CLEAR PROGRAM NAME AND JACCT
MOVEI 0,RUNBLK ;(12) POINT TO RUN UUO BLOCK
RUN 0,UU.PHY ;(13) CHAIN TO PROGRAM-TO-RUN
LOGOUT 1, ;(14) FAILED--DIE QUIETLY
EXP 0 ;(15) FREE AC
EXP 0 ;(16) FREE AC
EXP 0 ;(17) FREE AC
DEPHASE
SUBTTL Exit routines -- DAYMES - Print daily messages
DAYMES: PUSHJ P,.SAVE1## ;SAVE P1
MOVE T1,PPN ;GET PPN
TLNE F,FL.WLD ;WILD PPN?
INFO LIA,<You are logged in as >,,.TPPNW##
PUSHJ P,DAYTIM ;TYPE DAYTIME, DATE, DAY
MOVX T1,CM.LOG ;BIT TO TEST
TDNE T1,COMIDX ;LOGIN COMMAND?
PUSHJ P,LGNMES ;YES--TYPE SYS:LOGIN.TXT
MOVEI T1,2 ;GET DEFAULT FOR /NOTICE
MOVE P1,U.NOTC ;GET SWITCH TYPED
AOSN P1 ;WAS A SWITCH TYPED?
MOVEM T1,U.NOTC ;NO - USE DEFAULT
PUSHJ P,NOTE ;PRINT NOTES
MOVSI T1,(CM.LOG!CM.ATT) ;BITS TO TEST
TDNN T1,COMIDX ;LOGIN OR ATTACH COMMAND?
POPJ P, ;NO
PUSHJ P,ISOPSR ;IS THIS AN OPSER SUBJOB?
PUSHJ P,NOTICE ;NO--PRINT NOTICE.TXT
POPJ P, ;DON'T TYPE NOTICE.TXT
SUBTTL Accounting routines -- ACCCHK - Check for a previous valid LOGIN
ACCCHK: TLNN F,FL.WLD ;WILDCARDED PPN?
SKIPN LSTACC ;HAVE A LAST ACCESS UDT?
POPJ P, ;MAYBE THIS IS THE FIRST TIME
MOVX T1,AE.FAI ;BIT TO TEST
TDNE T1,LSTFLG ;WAS IT A FAILURE?
JRST ACCCH1 ;YES--WARN USER
INFO LAS,<Last access to >,,E.LAS
POPJ P, ;RETURN
ACCCH1: WARN LAF,<Last access to >,,E.LAF
POPJ P, ;RETURN
E.LAF:!
E.LAS: MOVE T1,PPN ;GET PPN
PUSHJ P,.TPPNW## ;PRINT IT
MOVEI T1,[ASCIZ / succeeded on /]
MOVX T2,AE.FAI ;GET FAILURE BIT
TDNE T2,LSTFLG ;WAS IT A FAILURE?
MOVEI T1,[ASCIZ / failed on /]
PUSHJ P,.TSTRG## ;PRINT DELIMITER
MOVE T1,LSTACC ;GET UFD OF LAST ACCESS
PJRST .TDTTM## ;TYPE IT AND RETURN
SUBTTL Accounting routines -- ACTCHK - Check for [SYSTEM]ACCOUNTING
ACTCHK: TLNE F,FL.BYP ;BYPASSING THE ACCOUNTING SYSTEM?
POPJ P, ;YES--RETURN NOW
MOVEI T1,^D5 ;TRY 5 TIMES
MOVEI T2,^D1 ;WAITING 1 SECOND
PUSHJ P,ACTCH1 ;SEE IF PID FOR [SYSTEM]ACCOUNTING EXISTS
POPJ P, ;IT IS
INFO WFA,<Waiting for accounting daemon to start>
MOVEI T1,^D30 ;TRY 30 TIMES
MOVEI T2,^D10 ;WAITING 10 SECONDS
PUSHJ P,ACTCH1 ;SEE IF PID FOR [SYSTEM]ACCOUNTING EXISTS
POPJ P, ;IT IS
STOP ADN,<Accounting daemon not running>,EF.WTO
ACTCH1: MOVE T3,[%SIACT] ;GETTAB ARGUMENT
GETTAB T3, ;GET PID FROM MONITOR
JRST .POPJ1## ;NOT THERE
JUMPN T3,.POPJ## ;RETURN IF THERE'S A PID
SOJLE T1,.POPJ1## ;COUNT DOWN
SLEEP T2, ;ZZZZ
JRST ACTCH1 ;AND TRY AGAIN
SUBTTL Accounting routines -- CHGNAM - Change name
CHGNAM: MOVX T1,AE.NCH ;BIT TO TEST
TDNN T1,AENTRY+.AEFLG ;CHANGING THE NAME?
POPJ P, ;NO
PUSHJ P,ACTCHK ;WAIT FOR [SYSTEM]ACCOUNTING TO START
MOVEI T1,.QUMAE ;ACCOUNTING FUNCTION
MOVEI T2,0 ;CENTRAL STATION OPR
MOVE T3,[RSPLEN,,RSPBLK] ;RESPONSE BLOCK POINTER
MOVEI T4,CHGTIM ;TIMEOUT
PUSHJ P,QUEINI ;SET UP QUEUE. UUO ARGUMENT BLOCK
DMOVE T2,[EXP <QA.IMM!1B17!.QBAFN>,<UGCUP$>] ;FUNCTION CODE
DMOVEM T2,(T1)
MOVE T2,[EXP <QA.IMM!2B17!.AEVRS>] ;SET VERSION VALIDATION
MOVEM T2,2(T1) ;STORE
DMOVE T2,[EXP <%AECVN,,0>,<AE.VRS>] ;GET VERSION INFO
DMOVEM T2,3(T1) ;STORE
DMOVE T2,[EXP <XWD 1,.AEPPN!AF.AND>,<PPN>] ;PPN WE ARE GOING TO AFFECT
DMOVEM T2,5(T1) ;STORE
DMOVE T2,[EXP <XWD .AANLW,.AENAM>,<AENTRY+.AENAM>] ;NEW NAME
DMOVEM T2,7(T1)
HRLI T1,-QUEBLK+11(T1) ;GET LENGTH
HRRI T1,QUEBLK ;AND ADDRESS
PUSH P,CCWAIT ;PRESERVE THE SETTING OF ^C FLAG
SETOM CCWAIT ;DON'T LET THE GUY ^C OUT
QUEUE. T1, ;REQUEST PASSWORD CHANGE
PJRST QUEERR ;REPORT QUEUE. UUO ERROR
INFO UNS,<User name has been set>
POP P,CCWAIT ;RESTORE
POPJ P, ;RETURN
SUBTTL Accounting routines -- CHGPSW - Change password
CHGPSW: PUSHJ P,ACTCHK ;WAIT FOR [SYSTEM]ACCOUNTING TO START
MOVEI T1,.QUMAE ;ACCOUNTING FUNCTION
MOVEI T2,0 ;CENTRAL STATION OPR
MOVE T3,[RSPLEN,,RSPBLK] ;RESPONSE BLOCK POINTER
MOVEI T4,CHGTIM ;TIMEOUT
PUSHJ P,QUEINI ;SET UP QUEUE. UUO ARGUMENT BLOCK
DMOVE T2,[EXP <QA.IMM!1B17!.QBAFN>,<UGCUP$>] ;FUNCTION CODE
DMOVEM T2,(T1)
MOVE T2,[EXP <QA.IMM!2B17!.AEVRS>] ;MUST VALIDATE VERSION
MOVEM T2,2(T1) ;SET IT UP
DMOVE T2,[EXP <%AECVN,,0>,<AE.VRS>] ;GET VERSION INFO
DMOVEM T2,3(T1) ;STORE
DMOVE T2,[EXP <XWD 1,.AEPPN!AF.AND>,<PPN>] ;PPN WE ARE GOING TO AFFECT
DMOVEM T2,5(T1)
DMOVE T2,[EXP <XWD .APWLW,.AEPSW!AF.AND>,<PASSWD>] ;OLD PASSWORD
DMOVEM T2,7(T1)
DMOVE T2,[EXP <XWD .APWLW,.AEPSW>,<NEWPSW>] ;NEW PASSWORD
DMOVEM T2,11(T1)
HRLI T1,-QUEBLK+13(T1) ;GET LENGTH
HRRI T1,QUEBLK ;AND ADDRESS
PUSH P,CCWAIT ;PRESERVE THE SETTING OF ^C FLAG
SETOM CCWAIT ;DON'T LET THE GUY ^C OUT
QUEUE. T1, ;REQUEST PASSWORD CHANGE
PJRST QUEERR ;REPORT QUEUE. UUO ERROR
INFO PHC,<Password has been changed>
POP P,CCWAIT ;RESTORE
POPJ P, ;RETURN
SUBTTL Accounting routines -- LOKCHK/LOKWRN - Check for locked files
LOKCHK: SETZ T1, ;NO MESSAGE
LOKWRN: PUSH P,T1 ;SAVE T1
AOS -1(P) ;ASSUME NOT LOCKED
MOVX T1,AE.LOK ;BIT TO TEST
TDNN T1,AENTRY+.AEFLG ;ACCOUNTING FILE LOCKED?
JRST LOKWR1 ;NO
SOS -1(P) ;COMPENSATE FOR AOS
SKIPE T1,0(P) ;SKIP IF NO MESSAGE WANTED
WARN AFL,<Accounting files locked; >,,.TSTRG##
LOKWR1: POP P,T1 ;RESTORE T1
POPJ P, ;AND RETURN
SUBTTL Accounting routines -- PFLCHK - Profile check
PFLCHK: SKIPE FAILFL ;ABOUT TO FAIL?
POPJ P, ;YES--LET USER THINK ALL IS WELL
MOVE T3,AENTRY+.AEACC ;GET ACCESS BITS
MOVE T1,TTBITS ;AND OUR TTY BITS
TXNN T1,GL.ITY ;SKIP IF PTY
JRST PFLCH1 ;SEE IF MAY LOGIN AT THIS TERMINAL
TLNE F,FL.BSJ ;SKIP IF NOT BATCH JOB SUBJOB
TXNE T3,AE.SBJ ;SKIP IF MAY NOT LOGIN AS SUBJOB
SKIPA ;OK
JRST PFLCH2 ;NO GOOD
TLNE F,FL.BAT ;BATCH JOB?
TXNE T3,AE.BAT ;YES - ALLOWED TO BE ONE?
SKIPA ;NOT BATCH OR BATCH & ALLOWED TO BE
JRST PFLCH2 ;BATCH & SHOULDN'T BE - COMPLAIN
TLNE F,FL.BAT ;BATCH JOB?
POPJ P, ;YES--RETURN
MOVE T2,CNTLJP ;CONTROL JOB PPN
CAME T2,ALPPPN ;OK IF RUN BY JOB WITH ALL PRIVILEGES
CAMN T2,PPN ;OK IF RUN BY SAME PPN
POPJ P, ;NO MORE CHECKS NEEDED
MOVE T1,CNTLJT ;GET LINE BITS FOR CONTROL JOB
PFLCH1: TLNE F,FL.BYP!L.OPR!L.SOPR ;OK IF /BYPASS, OPR, SUB OF OPR, OR [1,2]
POPJ P, ;LET HIM THROUGH
MOVX T2,AE.LOC ;LOCAL BIT
TXNE T1,GL.REM ;SKIP IF NOT REMOTE HARDWIRED TTY
MOVX T2,AE.RMT ;REMOTE BIT
TXNE T1,GL.DSL ;SKIP IF NOT DATA SET TTY
MOVX T2,AE.DST
TDNN T2,T3 ;SKIP IF MAY LOGIN AT THIS TERMINAL
JRST PFLCH2 ;NO GOOD
TXNN T3,AE.FIO ;SKIP IF FILES-ONLY
POPJ P, ;RETURN
MOVX T2,AE.FIO ;FIX BIT
PFLCH2: MOVX T1,CM.ATT ;BIT TO TEST
TDNE T1,COMIDX ;ATTACH COMMAND?
FATAL MNA,<May not ATTACH >,EF.SIL,E.MNA
FATAL MNL,<May not LOGIN >,EF.SIL,E.MNL
E.MNL:!
E.MNA: MOVEI T1,[ASCIZ/files-only PPN/]
TXNN T2,AE.FIO ;FILES-ONLY?
MOVEI T1,[ASCIZ/local/]
TXNE T2,AE.RMT ;SKIP IF NOT REMOTE HARDWIRED TTY
MOVEI T1,[ASCIZ/remote/]
TXNE T2,AE.DST ;SKIP IF NOT DATA SET TTY
MOVEI T1,[ASCIZ/data set/]
TXNE T2,AE.ROP ;SKIP IF NOT REMOTE CTY OR OPR
MOVEI T1,[ASCIZ/remote CTY or OPR/]
TLNE F,FL.BSJ ;SKIP IF NOT BATCH JOB SUBJOB
MOVEI T1,[ASCIZ/as a batch job subjob/]
TLNE F,FL.BAT ;BATCH JOB?
MOVEI T1,[ASCIZ/as a batch job/]
PJRST .TSTRG## ;TYPE AND RETURN
SUBTTL Accounting routines -- PSWCHK - Check for a legal password
PSWCHK: SKIPN FAILFL ;IGNORE PSW CHECK IF GOING TO FAIL ANYWAY
TLNE F,FL.CTY!FL.BYP!FL.BAT!L.SOPR ;PASSWORD REQUIRED?
POPJ P, ;NO
MOVE T2,CNTLJP ;CONTROL JOB PPN
CAME T2,ALPPPN ;OK IF RUN BY JOB WITH ALL PRIVILEGES
CAMN T2,PPN ;OK IF RUN BY SAME PPN
POPJ P, ;DON'T NEED TO CHECK PASSWORD
MOVEI T1,.QUMAE ;ACCOUNTING FUNCTION
MOVEI T2,0 ;CENTRAL STATION OPR
MOVE T3,[RSPLEN,,RSPBLK] ;RESPONSE BLOCK POINTER
MOVEI T4,ACCTIM ;TIMEOUT
PUSHJ P,QUEINI ;SET UP QUEUE. UUO ARGUMENT BLOCK
DMOVE T2,[EXP <QA.IMM!1B17!.QBAFN>,<UGACC$>]
DMOVEM T2,(T1) ;CHECK PASSWORD AND ACCOUNT STRING
MOVE T2,[EXP <QA.IMM!1B17!.UGPPN>]
MOVE T3,PPN ;PPN THAT WE WANT
DMOVEM T2,2(T1) ;
DMOVE T2,[EXP <.APWLW,,.UGPSW>,PASSWD]
DMOVEM T2,4(T1) ;POINT TO PASSWORD
DMOVE T2,[EXP <.AACLW,,.UGACT>,U.ACTS]
DMOVEM T2,6(T1) ;POINT TO ACCOUNT STRING
MOVEI T3,ACCTRY ;INITIALIZE RETRY COUNTER
HRLI T4,-QUEBLK+10(T1) ;GET LENGTH
HRRI T4,QUEBLK ;AND ADDRESS
PSWCH1: MOVE T1,T4 ;COPY LENGTH,,ADDRESS
QUEUE. T1, ;DO THE QUEUE.
TRNA ;EXAMINE THE ERROR
POPJ P, ;NO ERROR: RETURN
CAIE T1,QUTMO% ;TIMEOUT ERROR?
JRST PSWCH2 ;NO, FAILED
SOJL T3,PSWCH2 ;TOO MANY RETRIES: FAILURE
INFO WAR,<Waiting for [SYSTEM]ACCOUNTING response>
MOVEI T1,ACCTI2 ;TIMEOUT FOR RETRIES
MOVEM T1,QUEBLK+.QUTIM
JRST PSWCH1 ;TRY AGAIN
PSWCH2: SETOM FAILFL ;FAILED
POPJ P, ;RETURN
SUBTTL Accounting routines -- PPNEXP - Check for PPN/PSW expiration
PPNEXP: SKIPE FAILFL ;ABOUT TO FAIL?
POPJ P, ;YES
MOVE T2,[%CNDTM] ;DATE TIME IN INTERNAL FORMAT
GETTAB T2, ;GET IT
POPJ P, ;IF FAILS, GIVE THE GUY A BREAK
MOVE T1,AENTRY+.AEEXP ;GET EXPIRATION DATE/TIME OF PPN
MOVEM T1,XPDDTM ;SAVE
JUMPLE T1,PPNEX1 ;DON'T CHECK IF NO EXPIRATION DATE
CAMG T1,T2 ;SKIP IF NOT EXPIRED YET
FATAL PHE,<PPN has expired>
SUB T1,[EXPWRN,,0] ;SUBTRACT OFF THRESHOLD
CAML T1,T2 ;SKIP IF WE'RE CLOSE
JRST PPNEX1 ;NO NEED FOR WARNING
MOVE T1,XPDDTM ;GET EXPIRATION DATE
WARN PPE,<PPN will expire on >,,.TDTTM##
PPNEX1: SKIPG T1,AENTRY+.AEPCT ;GET PSW EXIPRATION DATE/TIME
POPJ P, ;WON'T EXPIRE OR ALREADY EXPIRED
SUB T1,[PSWWRN,,0] ;SUBTRACT OFF THRESHOLD
CAML T1,T2 ;SKIP IF WE'RE CLOSE
POPJ P, ;NO NEED FOR WARNING
MOVE T1,AENTRY+.AEPCT ;GET DATE/TIME AGAIN
WARN PSE,<Password will expire on >,,.TDTTM##
POPJ P, ;RETURN
SUBTTL Accounting routines -- SETTNL - Set up terminal designator for USAGE
SETTNL: PUSHJ P,.PSH4T## ;SAVE TEMPS
MOVSI T4,(ASCIZ/D/) ;ASSUME DETACHED
MOVNI T1,1 ;-1 FOR OUR JOB
TRMNO. T1, ;GET TERMINAL DESIGNATOR
JRST SETTN1 ;DETACHED
DPB T1,[POINT 9,MONLNO,35] ;STORE IN CASE NO NETWORKS
MOVE T1,TTBITS ;GET OUR TTY BITS
MOVSI T4,(ASCIZ/T/) ;ASSUME REGULAR TTY
TXNE T1,GL.CTY ;THE SYSTEM CTY
MOVSI T4,(ASCIZ/C/) ;YES
TXNE T1,GL.ITY ;INVISIBLE (PSEUDO) TTY
MOVSI T4,(ASCIZ/P/) ;YES
HRRZS T1 ;GET RID OF GETLCH BITS
GTNTN. T1, ;CONVERT TO NODE AND LINE
JRST SETTN1 ;NO NETWORKS
HRRZM T1,MONLNO ;STORE REAL LINE NUMBER
HLRZ T3,T1 ;ISOLATE NODE NUMBER
HRRI T2,2 ;NUMBER OF ARGUMENTS
MOVE T1,[.NDRNN,,T2] ;RETURN NODE NAME FOR NUMBER
NODE. T1, ;ASK TODD
SKIPA ;FAILED?
MOVEM T1,MONNOD ;STORE SIXBIT NODE NAME
SETTN1: MOVEM T4,MONTDE ;STORE TERMINAL DESIGNATOR
PUSHJ P,.POP4T## ;RESTORE TEMPS
POPJ P, ;AND RETURN
SUBTTL Accounting routines -- STACCT - Read a user profiles
; HERE TO ASK [SYSTEM] ACCOUNTING FOR USER'S PROFILE
; CALL:
; T1/ QA.IMM!.UGPPN OR LEN,,.UGUSR
; T2/ PPN OR POINTER TO USER'S NAME
; RETURN
; NON SKIP - NO SUCH USER
; SKIP - ENTRY IS STORED IN AENTRY
STACCT: TLNE F,FL.BYP ;SUPPOSED TO BYPASS ACCOUNTING?
JRST STACC1 ;YES, DON'T WAIT FOR HIM TO START
PUSH P,T2 ;SAVE PPN OR POINTER TO USER'S NAME
PUSH P,T1 ;SAVE QA.IMM!.UGPPN OR LEN,,.UGUSR
PUSHJ P,TTYNEC ;SET TTY NO ECHO
PUSHJ P,ACTCHK ;WAIT FOR [SYSTEM]ACCOUNTING TO START
MOVEI T1,.QUMAE ;ACCOUNTING FUNCTION
MOVEI T2,0 ;CENTRAL STATION OPR
MOVE T3,[.AEMAX,,AENTRY] ;RESPONSE BLOCK POINTER
MOVEI T4,ACCTIM ;TIMEOUT
PUSHJ P,QUEINI ;SET UP QUEUE. UUO ARGUMENT BLOCK
DMOVE T2,[EXP <QA.IMM!1B17!.QBAFN>,<UGOUP$!AF.PRV>]
DMOVEM T2,(T1) ;OBTAIN PROFILE
POP P,2(T1) ;RESTORE QA.IMM!.UGPPN OR LEN,,.UGUSR
POP P,3(T1) ;RESTORE PPN OR POINTER TO USER'S NAME
MOVEI T3,ACCTRY ;INITIALIZE RETRY COUNTER
HRLI T4,-QUEBLK+4(T1) ;GET LENGTH
HRRI T4,QUEBLK ;AND ADDRESS
STACC3: MOVE T1,T4 ;COPY LENGTH,,ADDRESS
QUEUE. T1, ;DO THE QUEUE.
TRNA ;EXAMINE THE ERROR
JRST STACC2 ;ONWARD
CAIE T1,QUTMO% ;TIMEOUT ERROR?
JRST STACC4 ;NO, FAILED
SOJL T3,STACC4 ;TOO MANY RETRIES: FAILURE
INFO WAR,<Waiting for [SYSTEM]ACCOUNTING response>
MOVEI T1,ACCTI2 ;TIMEOUT FOR RETRIES
MOVEM T1,QUEBLK+.QUTIM
JRST STACC3 ;TRY AGAIN
STACC4: MOVE T1,[BADACT,,AENTRY] ;NO SUCH USER
BLT T1,AENTRY+.AEMIN ;COPY
SETOM FAILFL ;REMEMBER THE FAILURE
TLNE F,FL.BAT ;BATCH JOB?
FATAL NPB,<No profile for batch user>,EF.WTO
POPJ P, ;GIVE UP
STACC1: MOVE T1,[DEFACT,,AENTRY] ;COPY DEFAULT FOR /BYPASS TO AENTRY
BLT T1,AENTRY+.AEMIN ;COPY AS FAR AS THE DEC RESERVED WORDS
PUSHJ P,SSLCOP ;COPY THE SSL
STACC2: HLRZ T1,AENTRY+.AEVRS ;GET VERSION NUMBER
CAIE T1,ACTFMT ;CURRENT?
STOP (WVR,<Wrong profile version; found >,,E.WVR)
JRST .POPJ1## ;RETURN
E.WVR: PUSHJ P,.TOCTW## ;PRINT BAD VERSION NUMBER
MOVEI T1,[ASCIZ / when expecting /]
PUSHJ P,.TSTRG## ;PRINT TEXT
MOVEI T1,ACTFMT ;GET GOOD NUMBER
PJRST .TOCTW## ;PRINT IT AND RETURN
; MACRO TO GENERATE WORDS IN THE DEFAULT (/BYPASS) PROFILE
DEFINE ADEF (OFS,DAT),<
RELOC DEFACT+.AE'OFS
DAT
>
DEFACT: ADEF (VRS,<ACTFMT,,.AEMIN>) ;VERSION AND LENGTH
ADEF (PPN,<1,,2>) ;PPN
ADEF (NAM,<BYTE(8)"O","p","e","r","a","t","o","r">)
ADEF (PRV,<-1,,0>) ;PRIVILEGE WORD 1
; ALL DEC PRIVS
ADEF (PRX,<<.OBSOP>B1>) ;PRIVILEGE WORD 2
; SYSTEM OPERATOR PRIVS
ADEF (LGT,<-1>) ;LOGIN TIMES
; ALL HOURS (WEEKDAYS AND WEEKENDS)
ADEF (COR,<40000,,40000>) ;PHYSICAL,,VIRTUAL CORE LIMITS
; 16384K
ADEF (IPC,<777,,-1>) ;IPCF QUOTAS
; 512 PIDS, 512 SENDS, 512 RECEIVES
ADEF (CTX,<4B8!1000>) ;CONTEXT QUOTAS
; 4 SAVED CONTEXTS, 512 SAVED PAGES
ADEF (WCH,<JW.WMT>) ;WATCH MTA
ADEF (ACC,<-1>) ;ALL ACCESS TYPES
ADEF (ENQ,<777>) ;ENQ/DEQ QUOTA
ADEF (EXP,<-1>) ;EXPIRATION DATE/TIME
RELOC DEFACT+.AEMIN
; MACRO TO GENERATE WORDS IN THE BAD PROFILE
DEFINE ABAD (OFS,DAT),<
RELOC BADACT+.AE'OFS
DAT
>
BADACT: ABAD (VRS,<ACTFMT,,.AEMIN>) ;VERSION AND LENGTH
ABAD (PPN,<0,,0>) ;PPN
ABAD (NAM,<BYTE(8)"U","n","k","n","o","w","n"," ","U","s","e","r">)
ABAD (PRV,<0,,0>) ;PRIVILEGE WORD 1
; NO PRIVS
ABAD (PRX,<0>) ;PRIVILEGE WORD 2
; NO PRIVS
ABAD (LGT,<-1>) ;LOGIN TIMES
; ALL HOURS (WEEKDAYS AND WEEKENDS)
ABAD (COR,<1000,,1000>) ;PHYSICAL,,VIRTUAL CORE LIMITS
ABAD (IPC,<0>) ;IPCF QUOTAS
; 0 PIDS, 0 SENDS, 0 RECEIVES
ABAD (CTX,<1B8!1000>) ;CONTEXT QUOTAS
; 1 SAVED CONTEXT, 512 SAVED PAGES
ABAD (WCH,<JW.WMT>) ;WATCH BITS - MTA
ABAD (EXP,<-1>) ;EXPIRATION DATE/TIME
RELOC BADACT+.AEMIN
SUBTTL Accounting routines -- TIMCHK - Check for access times
TIMCHK: SKIPE FAILFL ;ABOUT TO FAIL?
POPJ P, ;YES--LET USER THINK ALL IS WELL
MOVE T2,AENTRY+.AELGT;PICK UP TIME TO LOGIN TIMES WORD
TDNN T2,NOWBIT ;IS HE ALLOWED NOW?
REQUE SOT,<PPN not valid for this time of day>
POPJ P, ;RETURN
SUBTTL KJOB routines -- CHKQTA - Main quota checking loop
CHKQTA: PUSHJ P,.SAVE1## ;SAVE P1
SETZ P1, ;INITIALIZE ERROR COUNT
PUSHJ P,INIQTA ;INITIALIZE STRUCTURE LIST
SETZM TOTBLK ;INITIALIZE TOTAL BLOCKS USED
SETOM RDUFLG ;SET SO WE GET A RECOMPUTING MSG
SETOM QTACNT ;START AT THE BEGINNING
CHKQT1: PUSHJ P,NXTQTA ;GET THE NEXT STRUCTURE IN THE S/L
JRST CHKQT3 ;DONE
SETZ T1, ;CHECK QUOTAS
PUSHJ P,UFDDMO ;DISMOUNT THE STRUCTURE
JRST CHKQT2 ;ERROR
MOVE T1,UFDARG+.UFUSD ;GET THE NUMBER OF BLOCKS USED
ADDM T1,TOTBLK ;UPDATE THE TOTAL NUMBER OF BLOCKS
JRST CHKQT1 ;FIND NEXT STRUCTURE
CHKQT2: MOVE T1,UFDARG+.UFERR ;GET THE ERROR CODE
CAIN T1,UFSND% ;STRUCTURE NOT DISMOUNTED (OVER QUOTA)
SKIPE U.KJOB ;AND DOING /BATCH?
AOJA P1,CHKQT1 ;NO, UNRECOVERABLE ERRORS
PUSHJ P,LGTBAT ;YES, ENFORCE LOGGED-OUT QUOTA
ADDM T1,TOTBLK ;UPDATE THE TOTAL NUMBER OF BLOCKS
SETOM U.NMSG ;SHOW SUMMARY, EVEN IF /NOMESSAGE
MOVX T1,UF.NOQ ;DO NOT CHECK QUOTAS
PUSHJ P,UFDDMO ;DISMOUNT THE STRUCTURE
AOJA P1,CHKQT1 ;ERROR: FIND THE NEXT STRUCTURE
JRST CHKQT1 ;FIND NEXT STRUCTURE
CHKQT3: JUMPE P1,.POPJ## ;NO UNRECOVERABLE ERRORS: RETURN
PUSHJ P,RESQTA ;RESTORE THIS JOB'S SEARCH LIST
PJRST MONRET ;GO EXIT
SUBTTL KJOB routines -- INIQTA - Initialize the list of structures
;CALL INIQTA TO RECORD THE JOB SEARCH LIST IN QTATAB AND SET UP FOR
; SUBSEQUENT CALLS TO NXTSTR TO RETURN NEXT STRUCTURE IN JOB'S
; SEARCH LIST.
INIQTA: SETZM QTANUM ;CLEAR NUMBER OF STRUCTURES IN JSL
SETO T2, ;START WITH FIRST STRUCTURE
INIQT1: MOVE T1,[3,,T2] ;GET POINTER TO ARGUMENTS
JOBSTR T1, ;ASK FOR NEXT STR IN JOB SEARCH LIST
JRST INIQT3 ;ERROR
CAMN T2,[-1] ;END OF LIST IF -1
POPJ P, ;RETURN
AOS T1,QTANUM ;BUMP NUMBER OF STRUCTURES
CAILE T1,STRMAX ;TOO MANY STRUCTURES?
JRST INIQT2 ;YES, ERROR
SUBI T1,1 ;WE WANT AN OFFSET
IMULI T1,.DFJBL ;TIMES LENGTH OF AN ENTRY
MOVEM T2,QTATAB+.DFJNM(T1) ;STORE STRUCTURE NAME
MOVEM T3,QTATAB+.DFJDR(T1) ;STORE RESERVED QUOTA
MOVEM T4,QTATAB+.DFJST(T1) ;STORE STATUS BITS
JRST INIQT1 ;ON TO NEXT STRUCTURE
INIQT2: WARN TMS,<Too mamy structures - no quota enforcement>
SOSA QTANUM ;
INIQT3: WARN JUF,<JOBSTR UUO failed - no quota enforcement>
POPJ P, ;
SUBTTL KJOB routines -- NXTQTA - Get next structure in search list
;CALL NXTQTA WILL THE CURRENT STRUCTURE NAME IN QTATAB TO RETURN
; THE NEXT STRUCTURE IN THE SEARCH LIST IN QTATAB.
;
;WHEN THE END OF THE SEARCH LIST IS REACHED (OR IF JOBSTR FAILS),
; THE NON-SKIP RETURN IS TAKEN.
NXTQTA: AOS T4,QTACNT ;ADVANCE TO NEXT STRUCTURE
CAML T4,QTANUM ;GONE PAST THE END?
POPJ P, ;YES, TAKE DONE RETURN
IMULI T4,.DFJBL ;TIMES LENGTH OF AN ENTRY
SKIPN T1,QTATAB+.DFJNM(T4) ;GET STRUCTURE NAME
JRST NXTQTA ;SKIP THE FENCE
MOVEM T1,UFDFSN ;SAVE FOR POSTERITY
; MOVE T2,QTATAB+.DFJDR(T4) ;GET RESERVED QUOTA
MOVE T3,QTATAB+.DFJST(T4) ;GET STATUS BITS
TXZN T3,DF.SWL ;WAS SOFTWARE WRITE LOCK SET?
JRST .POPJ1## ;NO, SKIP RETURN
MOVX T1,.FSMNW ;LOAD FUNCTION CODE INTO T1
MOVE T2,UFDFSN ;PICK UP STRUCTURE NAME AGAIN
MOVE T4,[3,,T1] ;POINT AT ARGUMENTS
STRUUO T4, ;CLEAR SOFTWARE WRITE-LOCK
SKIPA T1,UFDFSN ;ERROR
JRST .POPJ1## ;NOERROR: SKIP RETURN
WARN CCW,<Can't clear software write-lock on >,,.TSIXN##
POPJ P, ;ERROR RETURN
SUBTTL KJOB routines -- RESQTA - Restore this job's search list
RESQTA: SKIPG QTANUM ;ANY STRUCUTURES IN S/L?
POPJ P, ;NO, NOTHING TO RESTORE
MOVX T1,.FSDSL ;FUNCTION TO DEFINE S/L
MOVEM T1,QTAUUO+.FSFCN
MOVE T1,THSJOB ;MY JOB NUMBER
MOVEM T1,QTAUUO+.FSDJN
MOVE T1,.MYPPN## ;MY PPN
MOVEM T1,QTAUUO+.FSDPP
SETZM QTAUUO+.FSDFL ;NO FLAGS
MOVE T1,QTANUM ;GET NUMBER OF STRUCTURES
IMULI T1,.DFJBL ;TIMES LENGTH OF AN ENTRY
ADDI T1,.FSDSO ;ADD IN HEADER LENGTH
HRLI T1,QTAUUO ;POINT AT ARGUMENTS
MOVSS T1 ;...
STRUUO T1, ;PUT S/L BACK IN ORIGINAL ORDER
JFCL ;WE TRIED
POPJ P, ;RETURN
SUBTTL KJOB routines -- LGTBAT - Batch deletion algorithm
LGTBAT: PUSHJ P,.SAVE1## ;SAVE P1
SETZM BATTOT ;CLEAR TOTAL BLOCKS
SETZM BATNQC ;CLEAR TOTAL NQC BLOCKS
SETZM BATDFL ;CLEAR NUMBER OF FILES DELETED
MOVE T1,UFDARG+.UFQTO
MOVEM T1,BATQTO ;QUOTA OUT
PUSHJ P,STEP1 ;GO TO STEP 1
RELEAS IOC, ;RELEASE THE CHANNEL
MOVE T1,BATTOT ;RETURN THE TOTAL NUMBER OF BLOCKS
ADD T1,BATNQC ; (BOTH CHECKED AND UNCHECKED)
POPJ P, ;
SUBTTL KJOB routines -- STEP1 - Delete files that are too large
;STEP 1 OF THE FILE-DELETION ALGORITHM DOES A RECOMP OF THE SPECIFIED
; UFD, AND DELETES ALL FILES WHICH ARE STRICTLY LARGER THAN THE
; LOGGED-OUT QUOTA.
STEP1: PUSHJ P,BATALL ;SETUP TO GET *.*
STEP1A: PUSHJ P,BATNXT ;GET A FILE TO WORK ON
JRST STEP1C ;NO MORE FILES
OPEN IOC,OPN ;OPEN THE CHANNEL
JRST STEP1A ;LOSE, IGNORE IT
LOOKUP IOC,LEB ;LOOKUP THE FILE
JRST STEP1A ;LOSE, IGNORE IT
MOVX T4,RP.NQC ;GET NQC BIT
TDNE T4,LEB+.RBSTS ;IS IT SET?
JRST STEP1D ;YES, COUNT THE FILE
MOVE T3,LEB+.RBALC ;GET BLOCKS ALLOCATED
SKIPE LEB+.RBSIZ ;CHECK FOR ZERO BLOCK FILES
CAMLE T3,BATQTO ;LARGER THAN QUOTA?
JRST STEP1B ;YES, DELETE IT
ADDM T3,BATTOT ;NO, ACCUMLATE THE TOTAL
JRST STEP1A ;AND LOOP
STEP1B: PUSHJ P,BATDEL ;DELETE THE FILE
JRST STEP1A ;AND LOOP
STEP1C: MOVE T1,BATTOT ;GET TOTAL BLOCKS
CAMG T1,BATQTO ;GREATER THAN QUOTA?
POPJ P, ;NO, EXIT THE ALGORITHM
JRST STEP2 ;YES, GO ON TO STEP 2
STEP1D: MOVE T3,LEB+.RBALC ;GET BLOCKS ALLOCATED
ADDM T3,BATNQC ;ADD TO TOTAL
JRST STEP1A ;AND LOOP AROUND
SUBTTL KJOB routines -- STEP2 - Delete FIRST files
;STEP 2 OF THE FILE-DELETION ALGORITHM LOOPS THRU THE 'FIRST' TABLE
; OF EXTENSIONS IN ORDER, AND FOR EACH EXTENSION, 'EXT', WE
; BEGIN DELETING ALL UNPROTECTED (<200) *.EXT UNTIL WE ARE
; UNDER QUOTA. IF WE DELETE *.EXT AND ARE STILL OVER QUOTA
; WE GO ON TO THE NEXT EXTENSION. IF WE REACH THE END OF THE
; TABLE, ON TO STEP 3.
STEP2: MOVEI P1,FIRST ;START ADR OF TABLE
HRLI P1,-FIRLEN ;AND NEGATIVE LENGTH
STEP2A: MOVE T1,(P1) ;GET EXT,,MASK
PUSHJ P,BATEXT ;SETUP TO GET *.EXT
STEP2B: PUSHJ P,BATNXT ;GET A FIND
JRST STEP2C ;THAT'S ALL FOLKS
MOVEI T1,177 ;MAX PROTECTION
PUSHJ P,BATLKP ;LOOKUP AND DELETE
MOVE T1,BATTOT ;GET TOTAL BLOCKS USED
CAMG T1,BATQTO ;STILL OVER QUOTA?
POPJ P, ;NO, RETURN
JRST STEP2B ;YES, LOOP
STEP2C: AOBJN P1,STEP2A ;FINISHED THAT EXT,
; ON TO THE NEXT
JRST STEP3 ;NO NEXT EXT, ON TO STEP 3
SUBTTL KJOB routines -- STEP3 - Get all other unIMPORTant files
;STEP 3 DELETES ALL REMAINING UNPROTECTED FILES WHOSE EXTENSIONS DON'T
; APPEAR IN THE "IMPORT" TABLE.
STEP3: PUSHJ P,BATALL ;SETUP TO READ ABSOLUTELY EVERYTHING
STEP3A: PUSHJ P,BATNXT ;GET A FILE TO LOOKUP
JRST STEP4 ;NO MORE, ON TO STEP 4
MOVE P1,[-IMPLEN,,IMPORT] ;POINT TO IMPORT TABLE
HLLZ T3,LEB+.RBEXT ;GET THE EXTENSION OF THE FILE
STEP3B: CAMN T3,(P1) ;MATCH???
JRST STEP3A ;YES, IT'S IMPORTANT, SKIP IT
AOBJN P1,STEP3B ;NO, KEEP LOOPING
STEP3C: MOVEI T1,177 ;MAX PROTECTION
PUSHJ P,BATLKP ;AND LOOKUP AND DELETE
MOVE T1,BATTOT ;GET THE TOTAL
CAMG T1,BATQTO ;STILL OVER QUOTA?
POPJ P, ;NO, DONE!!
JRST STEP3A ;YES, KEEP GOING
SUBTTL KJOB routines -- STEP4 - Delete rest of FIRST files
;STEP FOUR OF THE FILE-DELETION ALGORITHM DELETES ALL REMAINING
; FILES WHOSE EXTENSION IS IN THE "FIRST" TABLE. THE TABLE
; IS, AS IN STEP 2, SCANNED IN ORDER AND THE ALGORITHM STOPS
; AS SOON AS WE ARE UNDER QUOTA.
STEP4: MOVEI P1,FIRST ;START ADR OF TABLE
HRLI P1,-FIRLEN ;AND NEGATIVE LENGTH
STEP4A: MOVE T1,(P1) ;GET EXT,,MASK
PUSHJ P,BATEXT ;SETUP TO GET *.EXT
STEP4B: PUSHJ P,BATNXT ;GET A FIND
JRST STEP4C ;THAT'S ALL FOLKS
MOVEI T1,1000 ;SUPER MAX
PUSHJ P,BATLKP ;LOOKUP AND DELETE
MOVE T1,BATTOT ;GET TOTAL BLOCKS USED
CAMG T1,BATQTO ;STILL OVER QUOTA?
POPJ P, ;NO, RETURN
JRST STEP4B ;YES, LOOP
STEP4C: AOBJN P1,STEP4A ;FINISHED THAT EXT,
; ON TO THE NEXT
JRST STEP5 ;NO NEXT EXT, ON TO STEP 5
SUBTTL KJOB routines -- STEP5 - Delete unprotected IMPORTant files
;STEP FIVE DELETES ALL FILES WHOSE EXTENSIONS APPEAR IN
; THE "IMPORT" TABLE WHICH ARE UNPROTECTED.
STEP5: MOVEI P1,IMPORT ;START ADR OF TABLE
HRLI P1,-IMPLEN ;AND NEGATIVE LENGTH
STEP5A: HLLO T1,(P1) ;GET EXT,,MASK
PUSHJ P,BATEXT ;SETUP TO GET *.EXT
STEP5B: PUSHJ P,BATNXT ;GET A FIND
JRST STEP5C ;THAT'S ALL FOLKS
MOVEI T1,177 ;MAX PROTECTION
PUSHJ P,BATLKP ;LOOKUP AND DELETE
MOVE T1,BATTOT ;GET TOTAL BLOCKS USED
CAMG T1,BATQTO ;STILL OVER QUOTA?
POPJ P, ;NO, RETURN
JRST STEP5B ;YES, LOOP
STEP5C: AOBJN P1,STEP5A ;FINISHED THAT EXT,
; ON TO THE NEXT
JRST STEP6 ;NO NEXT EXT, ON TO STEP 6
SUBTTL KJOB routines -- STEP6 - Delete rest of unIMPORTant files
;STEP 6 IS SIMILAR TO STEP 3 IN THAT IT GETS FILES WHOSE EXTENSIONS
; DON'T APPEAR IN THE "IMPORT" TABLE, EXCEPT THAT NOW IT
; IGNORES THE PROTECTION AND JUST DELETES THE FILE.
STEP6: PUSHJ P,BATALL ;SETUP TO READ ABSOLUTELY EVERYTHING
STEP6A: PUSHJ P,BATNXT ;GET A FILE TO LOOKUP
JRST STEP7 ;NO MORE, ON TO STEP 7
MOVE P1,[-IMPLEN,,IMPORT] ;POINT TO IMPORT TABLE
HLLZ T3,LEB+.RBEXT ;GET THE EXTENSION OF THE FILE
STEP6B: CAMN T3,(P1) ;MATCH???
JRST STEP6A ;YES, IT'S IMPORTANT, SKIP IT
AOBJN P1,STEP6B ;NO, KEEP LOOPING
STEP6C: MOVEI T1,1000 ;SUPER MAX PROTECTION
PUSHJ P,BATLKP ;LOOKUP IT AND DELETE
MOVE T1,BATTOT ;GET THE TOTAL
CAMG T1,BATQTO ;STILL OVER QUOTA?
POPJ P, ;NO, DONE!!
JRST STEP6A ;YES, KEEP GOING
SUBTTL KJOB routines -- STEP7 - Delete the rest of the files
;STEP 7 SIMPLY DELETES EVERYTHING
STEP7: PUSHJ P,BATALL ;SETUP TO GET EVERYTHING
STEP7A: PUSHJ P,BATNXT ;GET A FILE
POPJ P, ;WE'RE DONE...
MOVEI T1,1000 ;GET THEM ALL!!!
PUSHJ P,BATLKP ;LOOKUP AND DELETE
MOVE T1,BATTOT ;GET TOTAL
CAMG T1,BATQTO ;DONE YET?
POPJ P, ;YES, RETURN
JRST STEP7A ;NO, LOOP
SUBTTL KJOB routines -- BATLKP - Routine to LOOKUP a file
;BATLKP IS CALLED WITH T1 CONTAINING A PROTECTION, AND T2 CONTAINING
; THE ADDRESS OF A LOOKUP BLOCK. THE FILE IS LOOK-ED UP, AND
; IF THE PROTECTION IS .LE. THAN THE PROTECTION SPECIFIED
; BY THE USER IN T1, THE FILE IS DELETED, AND ALL COUNTS
; ARE UPDATED.
;
;IF THE FILE IS ANY SFD, TRY TO DELETE IT IN ANY CASE
BATLKP: OPEN IOC,OPN ;OPEN THE CHANNEL
POPJ P, ;FAILED, FORGET IT
LOOKUP IOC,LEB ;LOOKUP THE FILE
POPJ P, ;FAILED, FORGET IT
MOVX T2,RP.NQC ;GET NQC BIT
TDNE T2,LEB+.RBSTS ;IS IT AN NQC FILE?
POPJ P, ;YES, IGNORE IT
HLRZ T2,LEB+.RBEXT ;GET THE FILE EXTENSION
MOVEI T3,0 ;LOAD A SMALL PROTECTION
CAIE T2,'SFD' ;SKIP IF ITS AN SFD
LDB T3,[POINT 9,LEB+.RBPRV,8] ;GET THE PROTECTION
CAMLE T3,T1 ;IS IT LESS?
POPJ P, ;YES, JUST RETURN
MOVN T1,LEB+.RBALC ;NO, GET RIBALC
ADDM T1,BATTOT ;AND DECREMENT TOTAL
PJRST BATDEL ;DELETE THE FILE
SUBTTL KJOB routines -- BATDEL - Routine to DELETE a file
;BATDEL IS CALLED WITH T1 CONTAINING THE ADDRESS OF THE LOOKUP BLOCK.
; A MESSAGE IS TYPED AND THE FILE (WHICH IS ASSUMED TO BE
; LOOK'ED UP) IS DELETED.
BATDEL: SETZB T1,T2 ;CLEAR A RENAME BLOCK
SETZB T3,T4 ; " "
RENAME IOC,T1 ;DELETE THE FILE
JRST BATDE2 ;FAILED?
SKIPE BATDFL ;DID WE DELETE ANY ALREADY?
JRST BATDE1 ;YES, SKIP THE EXTRA MESSAGE
MOVEI T1,[ASCIZ /Files deleted:
/]
PUSHJ P,.TSTRG## ;NO, TYPE THE MESSAGE
BATDE1: AOS BATDFL ;ANOTHER ONE DELETED
MOVEI T1,[ASCIZ / /] ;LOAD SOME SPACES
PUSHJ P,.TSTRG## ;AND TYPE THEM
MOVEI T1,OPN ;GET ADR OF OPEN BLOCK
MOVEI T2,LEB ;GET ADR OF LKP BLOCK
PUSHJ P,.TOLEB## ;TYPE A FILESPEC
MOVEI T1,[ASCIZ / /] ;LOAD SEVEN SPACES
PUSHJ P,.TSTRG## ;TO LINE UP TAB STOPS
PUSHJ P,.TTABC## ;A TAB
MOVE T1,LEB+.RBALC ;GET BLOCKS ALLOCATED
PUSHJ P,.TDECW## ;TYPE IT
MOVEI T1,[ASCIZ / blocks freed/]
PUSHJ P,.TSTRG## ;AND TYPE IT
PJRST .TCRLF## ;AND A CRLF AND RETURN
BATDE2: MOVE T1,LEB+.RBALC ;GET BLOCKS ALLOCATED
ADDM T1,BATTOT ;ADD BACK IN
HRRZS T2 ;GET ONLY THE ERROR CODE IN T2
CAIE T2,ERPRT% ;IS IT PROTECTION FAILURE?
ADDM T1,BATQTO ;NO, MAKE HIS QUOTA BIGGER (SORT OF)
CAIN T2,ERDNE% ;TRYING TO DELETE NON-EMPTY DIRECTORY?
POPJ P, ;YES - JUST RETURN
PUSH P,T2 ;SAVE ERROR CODE
MOVX T1,'LGNCDF' ;GET PREFIX
MOVE T2,["%",,[ASCIZ |Cannot delete file: |]]
PUSHJ P,.ERMSG## ;TYPE IT
MOVEI T1,OPN ;GET ADDRESS OF OPEN BLOCK
MOVEI T2,LEB ;GET ADDRESS OF LOOKUP BLOCK
PUSHJ P,.TOLEB## ;TYPE A FILESPEC
MOVEI T1,[ASCIZ | ; error code |] ;MORE TEXT
PUSHJ P,.TSTRG## ;TYPE IT
POP P,T1 ;GET ERROR CODE
PUSHJ P,.TOCTW## ;TYPE IT
PJRST .TCRLF## ;TYPE A CRLF AND RETURN
DEFINE FIRMAC,<
X TMP,777777
X TEM,777777
X SFD,777777
X BAK,777777
X Q??,770000
X MAP,777777
X CRF,777777
X LSD,777777
X LSQ,777777
X LST,777777
X LIS,777777
X LPT,777777
X PTP,777777
X PLT,777777
X CDP,777777
X Z??,770000
X FOO,777777
X LOG,777777
X BIN,777777
X DMP,777777
X FIN,777777
> ;END DEFINE FIRMAC
;NOW GENERATE THE "FIRST" TABLE
DEFINE X(A,B),<
XLIST
<SIXBIT /A/>+B
LIST
> ;END DEFINE X
FIRST: FIRMAC
FIRLEN==.-FIRST
DEFINE IMPMAC,<
X RNO
X RND
X RNH
X CMD
X KBD
X CED
X MCR
X SNO
X FAI
X FOR
X F4
X MAC
X ALG
X AID
X BLI
X B10
X B11
X COB
X CBL
X BAS
X PAL
X P11
X SRC
X IDA
X IDX
X DAT
X DBS
X B16
X B32
X B36
X REQ
X R16
X R36
X PAS
X INI
> ;END DEFINE IMPMAC
;NOW GENERATE THE "IMPORT" TABLE
DEFINE X(A),<
XLIST
SIXBIT /A/
LIST
> ;END DEFINE X
IMPORT: IMPMAC
IMPLEN==.-IMPORT
SUBTTL KJOB routines -- BATALL - Setup to LOOKUP STR:[,,**]
;THIS ROUTINE WAS ORIGINALLY WRITTEN BY DON LEWINE FOR LOGIN VERSION
; 55. MY THANKS TO HIM FOR SUPPLYING IT FULLY DEBUGGED./LSS
BATALL: MOVE T1,[WILDBK,,WILDBK+1] ;BLT POINTER TO WILD BLOCK
SETZM WILDBK ;CLEAR THE FIRST WORD
BLT T1,WILDBK+.FXLEN-1 ;AND CLEAR THE REST
MOVE T1,UFDARG+.UFSTR ;
MOVEM T1,WILDBK+.FXDEV ;SAVE THE STRUCTURE
MOVE T1,.MYPPN## ;
MOVEM T1,WILDBK+.FXDIR ;SAVE THE PPN
SETOM WILDBK+.FXDIM ;AND SET DIRECTORY MASK
MOVX T1,FX.DIR!FX.PHY!FX.NOM!FX.PRT
MOVEM T1,WILDBK+.FXMOD ;STORE ALL THE STATUS BITS
TXO T1,FX.STR ;SET ANOTHER BIT
MOVEM T1,WILDBK+.FXMOM ;AND THE MASK FOR THE MOD WORD
MOVSI T1,'* ' ;CLASSICAL WILDCARD
MOVEM T1,WILDBK+.FXNAM ;STORE AS FILENAME
MOVEM T1,WILDBK+.FXEXT ; EXTENSION
MOVEM T1,WILDBK+.FXDIR+2 ; 1ST SFD
MOVEM T1,WILDBK+.FXDIR+4 ; 2ND SFD
MOVEM T1,WILDBK+.FXDIR+6 ; 3RD SFD
MOVEM T1,WILDBK+.FXDIR+10 ; 4TH SFD
MOVEM T1,WILDBK+.FXDIR+12 ; 5TH SFD
SETOM WILDBK+.FXBFR ;NO /BEFORE
SETOM WILDBK+.FXSNC ;NO /SINCE
SETZM WILDPT ;WILD'S POINTER
POPJ P, ;RETURN
SUBTTL KJOB routines -- BATEXT - Setup to read *.EXT[*,*,*,*,*]
;BATALL IS CALLED TO SETUP A WILD BLOCK TO LOOKUP EVERY FILE ON A
; STRUCTURE WITH A GIVEN EXTENSION,,MASK (IN T1). USES T1.
BATEXT: PUSH P,T1 ;SAVE EXT,,MASK
PUSHJ P,BATALL ;SETUP TO READ *.*
POP P,WILDBK+.FXEXT ;STORE EXT,,MASK
POPJ P, ;AND RETURN
SUBTTL KJOB routines -- BATNXT - Routine to call .LKWLD
;BATNXT IS CALLED WITH T1 CONTAINING THE ADDRESS OF AN OPEN BLOCK,
; AND T2 CONTAIN XWD SIZE,,ADR WHERE ADR IS THE ADDRESS OF A
; LOOKUP BLOCK, AND SIZE IS THE LENGTH OF THE BLOCK - 1
; (I.E. THE NUMBER OF RIB WORDS DESIRED). IF ANY OF THESE
; FIELDS ARE ZERO UPON CALLING BATNXT, IT IS FILLED IN WITH
; DEFAULT PARAMETERS. BATNXT ALL CALLS .LKWLD TO SETUP
; THE LOOKUP AND OPEN BLOCK FOR THE NEXT FILE (.LGTSA SHOULD
; BE CALLED TO SET EVERYTHING UP BEFORE THE FIRST CALL).
; RETURNS T1 AND T2 UNCHANGED (WITH MISSING FIELDS FILLED).
; SKIP RETURN WITH NEXT FILE, NON-SKIP IF NO MORE FILES.
BATNXT: MOVSI T1,[WILDBK] ;
MOVEM T1,WLDARG+0 ;FIRST FILE SPEC,,LAST FILE SPEC
MOVE T1,[OPN,,LEB] ;
MOVEM T1,WLDARG+1 ;OPEN BLOCK,,LOOKUP BLOCK
MOVE T1,[.FXLEN,,.RBMAX]
MOVEM T1,WLDARG+2 ;FILE SPEC SIZE,,LOOKUP BLOCK SIZE
MOVEI T1,WILDPT ;
MOVEM T1,WLDARG+3 ;ADDRESS OF POINTER (NO CHANNEL)
MOVE T1,[4,,WLDARG] ;LENGTH,,ADDRESS
PUSHJ P,.LKWLD## ;CALL WILD
POPJ P, ;NO MORE!!
PJRST .POPJ1## ;SKIP RETURN
SUBTTL File I/O -- DELFIL - Delete a single file
DELFIL: MOVE T1,[.FOMAX,,FOP] ;SET UP UUO AC
HRRZ T2,FOP+.FOLEB ;POINT TO LOOKUP/ENTER BLOCK FOR LATER
FILOP. T1, ;DELETE THE FILE
TDZA T2,T2 ;ERROR
JRST DELFI1 ;RETURN WITH FILE SIZE
CAIE T1,ERPRT% ;PROTECTION FAILURE?
WARN CDF,<Cannot delete >,,E.CDF
DELFI1: LDB T1,[POINTR (FOP+.FOFNC,FO.CHN)] ;GET CHANNEL
RESDV. T1, ;RELEASE CHANNEL
JFCL ;...
JUMPE T2,.POPJ## ;ERROR: RETURN
MOVE T1,.RBALC(T2) ;RETURN WITH ALLOCATED FILE SIZE
PJRST .POPJ1## ;
E.CDF: PUSH P,T1 ;SAVE ERROR CODE
MOVEI T1,FOP ;POINT TO FILOP BLOCK
PUSHJ P,.TOFEB## ;TYPE FILESPEC
MOVEI T1,[ASCIZ /; error /]
PUSHJ P,.TSTRG## ;PRINT TEXT
POP P,T1 ;GET ERROR CODE BACK
PJRST .TOCTW## ;PRINT IT AND RETURN
SUBTTL File I/O -- INIFIL - Initialize I/O data storage
; ZERO I/O DATA STORAGE AND DEFAULT THE FILESPEC TO
; DSK:[,]/PHYSICAL/ASCII
; CALL: PUSHJ P,INIFIL
INIFIL: SETZM IO.ZB ;CLEAR FIRST WORD
MOVE T1,[IO.ZB,,IO.ZB+1] ;SET UP BLT
BLT T1,IO.ZE-1 ;CLEAR I/O DATA STORAGE
; FILOP BLOCK
INIFOP: MOVE T1,[RNB,,LEB] ;RENAME AND LOOKUP/ENTER BLOCKS
MOVEM T1,FOP+.FOLEB
MOVE T1,[.FOFMX,,RFS] ;RETURNED FILESPEC BLOCK
MOVEM T1,FOP+.FOFSP
; OPEN BLOCK
INIOPN: MOVE T1,[UU.PHS+.IOASC] ;DEFAULT IS ASCII /PHYSICAL
MOVEM T1,FOP+.FOIOS
MOVSI T1,'DSK' ;DEFAULT DEVICE
MOVEM T1,FOP+.FODEV
; LOOKUP/ENTER BLOCK
INILEB: MOVEI T1,.RBMAX ;LENGTH OF BLOCK
MOVEM T1,LEB+.RBCNT
MOVE T1,AENTRY+.AEPPN ;PPN
MOVEM T1,LEB+.RBPPN
POPJ P, ;RETURN
SUBTTL File I/O -- NEWFIL - Check file creation time
; ROUTINE TO COMPARE CREATIONS DATES OF A FILE VS. THE
; UFD CREATION TIME.
; CALL: PUSHJ P,NEWFIL
; <NON-SKIP> ;OLD FILE
; <SKIP> ;NEW FILE
NEWFIL: LDB T1,[POINTR(LEB+.RBPRV,RB.CRD)] ;GET LOW DATE
LDB T2,[POINTR(LEB+.RBEXT,RB.CRX)] ;GET HIGH DATE
LSH T2,^D12 ;POSITION
IORI T1,(T2) ;FORM STANDARD 15-BIT DATE
LDB T2,[POINTR(LEB+.RBPRV,RB.CRT)] ;GET CREATE TIME
CAMLE T1,UFDDAT ;FILE NEWER THAN UFD CREATION?
JRST .POPJ1## ;YES
CAMN T1,UFDDAT ;SAME DAY?
CAMGE T2,UFDTIM ;YES--FILE NEWER THAN UFD CREATION?
POPJ P, ;OLDER
JRST .POPJ1## ;A NEW FILE
SUBTTL File I/O -- NOTE - Print file(s) specified by /NOTE switch
NOTE: TLNE F,FL.BYP ;BYPASSING THE ACCOUNTING SYSTEM?
POPJ P, ;YES--PROBABLY DON'T WANT THIS STUFF
MOVEI T1,NOTSPC ;/NOTE FILESPEC
MOVEI P1,FNAME ;PRINT FILE NAME
PJRST TYPE ;DO PRINT IT AND RETURN
SUBTTL File I/O -- NOTICE - Print NOTICE.TXT
NOTICE: TLNE F,FL.BYP ;BYPASSING THE ACCOUNTING SYSTEM?
POPJ P, ;YES--PROBABLY DON'T WANT THIS STUFF
MOVE T1,[DAYSPC] ;PRINT NOTICE.TXT
MOVEI P1,0 ;FLAGS
PJRST TYPE ;GO PRINT IT AND RETURN
; SCAN BLOCK FOR SYS:NOTICE.TXT/PHYSICAL/NOSTR
DAYSPC: SIXBIT /SYS/
SIXBIT /NOTICE/
EXP -1
XWD 'TXT',-1
EXP FX.PHY!FX.NOM
EXP FX.STR!FX.PHY!FX.NOM
BLOCK .FXLEN-<.-DAYSPC>
SUBTTL File I/O -- STRMES - Print STR.TXT
STRMES: SKIPG U.STR ;/STR GIVEN
POPJ P,0 ;NO--RETURN
MOVEI T1,STRSPC ;STR.TXT SPEC
MOVEI P1,MSGOK!FNAME!STONLY ;OK TO TYPE MESSAGE
PJRST TYPE ;GO PRINT IT AND RETURN
; SCAN BLOCK FOR SYS:STR.TXT/PHYSICAL/STRS
STRSPC: SIXBIT /ALL/
SIXBIT /STR/
EXP -1
XWD 'TXT',-1
EXP FX.PHY!FX.STR
EXP FX.PHY!FX.STR
XWD 1,4
XWD -1,-1
BLOCK .FXLEN-<.-STRSPC>
SUBTTL File I/O -- LGNMES - Print LOGIN.TXT
LGNMES: MOVEI T1,LGNSPC ;LOGIN.TXT SPEC
MOVEI P1,MSGOK ;ALWAYS TYPE MESSAGE
PJRST TYPE ;GO PRINT IT AND RETURN
; SCAN BLOCK FOR SYS:WELCOM.TXT/PHYSICAL/NOSTR
LGNSPC: SIXBIT /SYS/
SIXBIT /LOGIN/
EXP -1
XWD 'TXT',-1
EXP FX.PHY!FX.NOM
EXP FX.STR!FX.PHY!FX.NOM
BLOCK .FXLEN-<.-LGNSPC>
SUBTTL File I/O -- TYPE - Print a file on the terminal
;SUBROUTINE TO TYPE A FILE
;CALL: MOVEI T1,ADDRESS-OF-SCAN-STYLE-FILESPEC
; MOVEI P1,FLAGS
; PUSHJ P,TYPE
; RETURN HERE
TYPE: SKIPN .FXNAM(T1) ;ANY NAME OR MASK SPECIFIED?
POPJ P, ;NO - SKIP IT
HRLZ T1,T1 ;FLIP AROUND
HRRI T1,TYPSPC ;ADDRESS OF OUT SPEC
BLT T1,TYPSPC+.FXLEN-1 ;COPY THE FILESPEC
SETZM WILDPT ;CLEAR MEMORY FOR FIRST CALL
MOVX T1,FX.NOM!FX.PRT ;/OKNONE AND /OKPROT
IORM T1,TYPSPC+.FXMOD;FORCE SWITCH TO BE
IORM T1,TYPSPC+.FXMOM; SET ON ALL CALLS TO WILD
TYPE1: PUSHJ P,INIFIL ;INIT STORAGE FOR FILE I/O
MOVEI T1,B.DC## ;SET UP ADDRESS OF BUFFER HEADER
MOVEM T1,OPN+.OPBUF ;SAVE
MOVE T1,[4,,[[TYPSPC],,0
OPN,,LEB
.FXLEN,,.RBMAX
IOC,,WILDPT]]
PUSHJ P,.LKWLD## ;LOOK FOR FILE
POPJ P,0 ;ALL DONE
OPEN IOC,OPN ;OPEN THE FILE
PJRST E.DFO## ;CAN'T
LOOKUP IOC,LEB ;LOOKUP FILE
JRST [PUSHJ P,E.DFL## ;REPORT ERROR
JRST TYPE1] ;LOOK FOR NEXT FILE
MOVE T1,[2,,T2] ;SET UP UUO AC
MOVE T2,[IOC,,.FOFIL] ;CHANNEL,,FUNCTION CODE
MOVE T3,[.FOFMX,,RFS] ;LENGTH,,ADDR
FILOP. T1, ;READ LOOKUP'ED FILESPEC
JFCL ;CAN'T FAIL
IFN SUPNOT,<
TRNE P1,MSGOK ;WANT MESSAGE ALWAYS?
JRST TYPE3 ;YES--GO TYPE IT
SKIPE UFDNDL ;SKIP IF UFD CAN BE DELETED
JRST TYPE2 ; SAW THE MESSAGE
PUSHJ P,NEWFIL ;A NEW FILE?
JRST TYPE2 ;NO
JRST TYPE3 ;YES--GO PRINT
TYPE2: MOVE T1,U.NOTC ;GET /NOTICE VALUE
CAIL T1,2 ;[450,453] SOMETIMES OR NEVER?
JRST TYPE1 ;YES -LOOK FOR NEXT FILE
>
TYPE3: MOVE T1,U.NOTC ;GET /NOTICE VALUE
CAIN T1,3 ;NEVER PRINT?
JRST TYPE1 ;YES - SKIP IT
MOVEI T1,RFS ;POINT TO RETURNED FILESPEC BLOCK
TXNE P1,FNAME ;WANT TO SEE FILE NAME?
INFO FIL,<File: >,,.TFRFS##
TYPE4: PUSHJ P,.NXDTW## ;GET A BYTE
JRST TYPE1 ;END OF FILE
PUSHJ P,.TCHAR## ;TYPE IT
JRST TYPE4
SUBTTL Command dispatch tables
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<<SIXBIT/NAM/>>
COMLST: CMDS
COMLEN==.-COMLST
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<EXP PRC>
COMDSP: CMDS
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<XWD PFX'PL,PFX'PB>
COMPBK: CMDS
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<XWD PFX'OL,PFX'OB>
COMOBK: CMDS
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<EXP [ASCIZ \'PMT\]>
COMPMT: CMDS
SUBTTL Command scanning routines -- ERRUKK/ERREXA/ERRILC - Error messages
; THESE ERROR MESSAGE EXIST BECAUSE WE CAN'T DISPATCH TO SCAN.
; SCAN WANTS TO RESTART .PSCAN WHICH GOES INTO AN INFINITE LOOP.
ERRUKK: EXCH T1,N ;SWAP KEYWORD WITH VALUE
SKIPGE N ;UNKNOWN OR AMBIGUOUS?
FATAL UKW,<Unknown keyword >,EF.SIL,.TSIXN##
FATAL AKW,<Ambiguous keyword >,EF.SIL,.TSIXN##
ERREXA: FATAL EXA,<Excess arguments starting with >,EF.SIL,E.EXA
ERRILC: FATAL ILC,<Illegal character >,EF.SIL,E.ILC
E.EXA:!
E.ILC: MOVEI T1,"""" ;GET DOUBLE QUOTES
PUSHJ P,.TCHAR## ;PRINT THEM
MOVE T1,C ;GET CHARACTER IN ERROR
PUSHJ P,.TFCHR## ;PRINT POSSIBLE FUNNY CHARACTER
SKIPE .LASWD## ;HAVE A TYPEOUT ROUTINE?
SKIPN .NMUL## ;HAVE A WORD SCANNING RESULT?
JRST E.ILC1 ;NO TO EITHER
MOVEI T1,[ASCIZ /" following word "/]
PUSHJ P,.TSTRG## ;PRINT STRING
MOVE T1,.NMUL## ;GET LAST WORD INPUT
SKIPGE T2,.LASWD## ;A STRING PERHAPS?
MOVEI T1,.NMUL## ;YES--GET ADDRESS INSTEAD
PUSHJ P,(T2) ;PRINT WORD (OR STRING) IN ERROR
E.ILC1: MOVEI T1,"""" ;DOUBLE QUOTE
PJRST .TCHAR## ;PRINT IT AND RETURN
SUBTTL Command scanning routines -- GETUSR - Read PPN/path/user name
GETUSR: PUSHJ P,.SAVE2## ;SAVE P1 AND P2
SETZB PP,USERID ;CLEAR TARGET
SETZM USERID ;CLEAN OUT BLOCK BEFORE START
MOVE T1,[USERID,,USERID+1] ;BLT POINTER
BLT T1,USERID+.AANLW-1 ;CLEAN IT
SKIPA ;ALREADY HAVE FIRST CHARACTER
GETUS1: PUSHJ P,.TICHE## ;GET FIRST CHARACTER
JUMPLE C,.POPJ## ;ALLOW BLANK LINES
CAIE C,.CHTAB ;TAB?
CAIN C," " ;SPACE?
JRST GETUS1 ;IGNORE THEM
CAIN C,"""" ;QUOTED STRING?
JRST GETUS2 ;MUST BE A USER NAME
PUSHJ P,.TICAN## ;SEE IF ALPHANUMERIC
JRST GETUS3 ;IT'S NOT
MOVEI T1,USRPPN ;ASSUME A PPN ON THE WAY
CAIL C,"0" ;RANGE
CAILE C,"9" ; CHECK
GETUS2: MOVEI T1,USRNAM ;A USER NAME
PUSHJ P,(T1) ;PARSE PPN OR USER NAME
DMOVE P1,T1 ;COPY ARGUMENTS TO VALIDATE PPN OR USER NAME
JUMPLE C,GETUS4 ;JUMP IF EOL
GETUS3: PUSHJ P,SWTSCN ;CHECK FOR SWITCHES
JUMPLE C,GETUS4 ;JUMP IF EOL
CAIE C,"[" ;PATH SPEC?
CAIN C,"<" ;2741 STYLE?
SKIPA ;YES
JRST GETUS4 ;ELSE ALMOST DONE HERE
PUSHJ P,USRPAT ;READ PATH AND PARSE SWITCHES
DMOVE P1,T1 ;COPY ARGUMENTS TO VALIDATE PPN
GETUS4: PUSHJ P,USRDEF ;PERFORM PPN DEFAULTING AND /BYPASS CHECKING
DMOVE T1,P1 ;GET ARGUMENTS TO VALIDATE PPN/PATH/USER NAME
PUSHJ P,STACCT ;GET USER'S PROFILE
SETOM FAILFL ;NO SUCH PPN OR USER
SKIPN PP ;HAVE A PPN ALREADY?
MOVE PP,AENTRY+.AEPPN;GET PPN
TLNE F,FL.BYP ;BYPASSING THE ACCOUNTING SYSTEM?
MOVEM PP,AENTRY+.AEPPN;USE THE PPN WE JUST PARSED
SKIPE T1,LSTPPN ;HAVE A PREVIOUS PPN?
CAME T1,PP ;SAME AS LOGGING-IN PPN?
SKIPA T1,AENTRY+.AEPPN ;GET LAST ACCESS PPN
POPJ P, ;ALREADY HAVE LAST FAILURE INFO
MOVEM T1,LSTPPN ;SAVE
MOVE T1,AENTRY+.AEFAI ;GET LAST ACCESS UDT
MOVEM T1,LSTACC ;SAVE IT NOW
MOVE T1,AENTRY+.AEFLG ;GET LAST ACCESS FLAGS
MOVEM T1,LSTFLG ;SAVE
POPJ P, ;RETURN
USRPPN: PUSHJ P,.OCTNC## ;GET PROJECT NUMBER (FIRST DIGIT IN C)
JUMPGE C,USRPP1 ;JUMP IF NOT EOL
JUMPE N,.POPJ## ;IGNORE BLANK LINES
PJRST ERRILC ;REPORT ILLEGAL CHARACTER
USRPP1: CAIE C,"/" ;SLASH BREAK?
CAIN C,"," ;ORDINARY COMMA BREAK?
SKIPA ;EITHER IS OK
PJRST ERRILC ;REPORT ILLEGAL CHARACTER
MOVE T1,N ;INCASE OF ERROR
TRNE N,377777 ;MUST HAVE A NON-ZERO PROJECT NUMBER
TDNE N,[-1,,400000] ;ALSO ONLY 6 DIGITS
FATAL IPJ,<Illegal project number >,EF.FMT,.TOCTW##
HRLZ PP,N ;PUT IN AC PP
PUSHJ P,.TIAUC## ;LOOK AT NEXT CHAR
CAIE C,UNISYM ;WANT UNIQUE PPN?
JRST USRPP2 ;NO, COLLECT PROGRAMMER NO
PUSHJ P,.TIAUC## ;GET SEPARATOR INTO CH
MOVEI N,UNIPRG ;PUT UNIQUE CODE INTO N
TLOA F,FL.WLD ;NOTE UNIQUE PROGRAMMER NO
USRPP2: PUSHJ P,.OCTNC## ;COLLECT PROGRAMMER, 1ST CHAR IN CH
MOVE T1,N ;INCASE OF ERROR
TRNE N,777777 ;MUST HAVE A NON-ZERO PROGRAMMER NUMBER
TLNE N,777777 ;ALLOW ONLY 6 DIGITS
FATAL IPG,<Illegal programmer number >,EF.FMT,.TOCTW##
HRR PP,N ;MAKE AN XWD
USRPP3: PUSHJ P,PPNCHK ;CHECK LEGALITY OF THE TARGET PPN
USRPP4: MOVE T1,[EXP <QA.IMM!1B17!.UGPPN>] ;QUEUE. BLOCK CODE
MOVE T2,PP ;PPN THAT WE WANT
POPJ P, ;RETURN
USRPAT: PUSHJ P,.REEAT## ;BACK UP ONE CHARACTER
PUSHJ P,.FILIN## ;GO SCAN OFF THE PATH
MOVEI T1,U.PATH ;NOW GO COPY THE SPEC
MOVEI T2,.FXLEN ; INTO LOGIN'S CORE
PUSHJ P,.GTSPC## ; AREA
JUMPN PP,USRPP4 ;RETURN IF ALREADY CHECKED OUT PPN
SKIPE USERID ;HAVE A USER NAME?
PJRST USRNA3 ;YES--DON'T WORRY ABOUT THE PPN NOW
MOVE T1,[2,,U.PATH+.FXDIR] ;INCASE OF ERROR
SKIPN PP,U.PATH+.FXDIR ;GET THE PPN FROM THE PATH
FATAL NPP,<No PPN in path specification >,EF.FMT,.TDIRB##
TLNE PP,777777 ;MUST HAVE NON-ZERO PROJECT NUMBER
TRNN PP,777777 ; AND A NON-ZERO PROGRAMMER NUMBER
FATAL IPP,<Must have non-zero programmer number >,EF.FMT,.TDIRB##
MOVE T2,U.PATH+.FXDIM ;GET MASK
AOSE T2 ;CHECK IT
FATAL WPP,<Wildcarded PPN >,EF.FMT,.TDIRB##
PJRST USRPP3 ;FINISH UP
USRNAM: CAIE C,"""" ;QUOTED NAME?
TDZA T1,T1 ;NO
MOVEI T1,1 ;REMEMBER FOR LATER
PUSH P,T1 ;SAVE FLAG
PUSHJ P,.AS8QC## ;PARSE A POSSIBLY QUOTED ASCII STRING
POP P,T1 ;GET FLAG BACK
SKIPN T1 ;NOTHING SPECIAL IF A QUOTED STRING
CAIE C,":" ;STOPPED ON A COLON?
JRST USRNA2 ;NO--JUST A NORMAL NAME
MOVE T1,.NMUL## ;PICK UP FIRST WORD
TDNE T1,[BYTE(8)0,0,377,0] ;LESS THAN THREE CHARACTERS OR
TRNE T1,7760 ; MORE THAN THREE CHARACTERS IS JUST TEXT
JRST USRNA2 ;GO PROCESS USER NAME
MOVE T3,[POINT 8,.NMUL##] ;POINT TO STRING
MOVEI T4,3 ;INIT COUNTER
SETZ T1, ;CLEAR STORAGE
USRNA1: ILDB T2,T3 ;GET A CHARACTER
ANDI T2,177 ;REDUCE TO 7-BITS
SUBI T2," " ;CONVERT TO SIXBIT
LSH T2,36 ;POSITION
LSHC T1,6 ;STORE
SOJG T4,USRNA1 ;LOOP
HRLZS T1 ;PUT IN LH
DEVPPN T1,UU.PHY ;COULD THIS BE AN ERSATZ DEVICE?
JRST USRNA2 ;NO
MOVE PP,T1 ;COPY PPN
PUSHJ P,.TIALT## ;EAT ONE CHARACTER BEYOND THE COLON
PJRST USRPP4 ;PRETEND WE PARSED A PPN
USRNA2: MOVE T1,[.NMUL##,,USERID] ;SET UP BLT
BLT T1,USERID+.AANLW ;COPY IT
USRNA3: MOVE T1,[XWD .AANLW,.UGUSR] ;QUEUE. BLOCK CODE
MOVEI T2,USERID ;POINT TO THE USERNAME WE JUST READ
SETZ PP, ;CAN'T DETERMINE PPN
POPJ P, ;RETURN
; HERE TO DO /BYPASS LEGALITY CHECKING AND PPN DEFAULTING
; THE USER IS ALLOWED TO BYPASS THE ACCOUNTING SYSTEM IF
; ANY OF THE FOLLOWING CONDITIONS ARE TRUE:
;
; 1. LOGIN/BYPASS WAS TYPED ON ANY CTY (REMOTE CTYS EXCLUDED)
; 2. LOGIN/BYPASS WAS TYPED ON OPR:
; 3. LOGIN/BYPASS WAS TYPED ON A SUBJOB OF A [1,2] JOB
; 4. LOGIN/BYPASS WAS TYPED ON A LOCAL TERMINAL
; 5. LOGIN/BYPASS WAS TYPED ON ANY TERMINAL AND SCHED 10 IS IN EFFECT
;
; FOR ANY OTHER CASE, /BYPASS IS NOT VALID AND A FATAL ERROR MESSAGE
; IS ISSUED.
USRDEF: TLZ F,FL.BYP ;DEFAULT TO OFF (A LITTLE PARANOIA HERE)
SKIPG U.BYPA ;BYPASSING THE ACCOUNTING SYSTEM?
JRST USRDE2 ;NO
; CHECK FOR ANY CTY
TLNN F,FL.CTY ;ONE OF THE CTYS?
; CHECK FOR OPR OR SUBJOB OF OPR
TLNE F,L.OPR!L.SOPR ;PERHAPS OPR OR SUBJOB OF OPR?
JRST USRDE1 ;GO BYPASS ACCOUNTING SYSTEM
; CHECK FOR A LOCAL TERMINAL
MOVX T1,GL.REM!GL.DSL ;BITS TO TEST
TDNN T1,TTBITS ;SOME FLAVOR OF LOCAL?
JRST USRDE1 ;YES
; CHECK FOR SCHED 10
MOVE T1,STATES ;GET MONITOR'S STATES WORD
TXNE T1,ST%NRL ;OR DEBUGGING THE MONITOR (SCHED 10)?
JRST USRDE1 ;KEEP JMF, DPM, SPIDER, AND KBY HAPPY
FATAL NPB,<No privileges to bypass the accounting system>,EF.FMT!EF.SIL
USRDE1: TLO F,FL.BYP ;OK TO BYPASS ACCOUNTING SYSTEM
USRDE2: MOVE T1,U.PATH+.FXDIR;GET NORMAL DEFAULT PPN FROM PATH BLOCK
TLNE F,FL.BYP ;BYPASSING THE ACCOUNTING SYSTEM?
MOVE T1,DEFACT+.AEPPN ;GET DEFAULT PPN
SKIPE USERID ;BUT IS THERE A USER-ID?
POPJ P, ;YES--CAN'T TRUST THE PPN FROM THE PATH
SKIPN PP ;HAVE A PPN?
MOVE PP,T1 ;USE DEFAULT
POPJ P, ;RETURN
SUBTTL Command scanning routines -- PSCAN - Init scanning of switches
; ROUTINE TO DO PARTIAL LINE SCANNING AND LEADING SWITCH HANDLING
; CALL: PUSHJ P,PSCAN
PSCAN: SETOM REPARS ;INIT REPARSE FLAG
HRRZ T1,COMIDX ;GET INVOKING COMMAND INDEX
MOVE T1,COMPBK(T1) ;POINT TO SCAN ARGUMENTS
PUSH P,.OPTN## ;SAVE /OPTION
PUSH P,.FLVRB## ;SAVE /MESSAGE
PUSHJ P,.PSCAN## ;SET UP PARTIAL LINE SCANNER
TDZA T1,T1 ;WANTS TO PROMPT
MOVEI T1,1 ;JUST PARSE
MOVEM T1,PMTFLG ;REPROMPT
SKIPL REPARS ;DID SCAN RESTART .PSCAN (/HELP MAYBE)?
JRST .MONRT## ;YES, EXIT
POP P,.FLVRB## ;RESTORE /MESSAGE
POP P,.OPTN## ;RESTORE /OPTION
JUMPN T1,PSCAN1 ;JUMP IF NO PROMPT NEEDED
HRRZ T1,COMIDX ;GET INVOKING COMMAND INDEX
MOVE T1,COMPMT(T1) ;AND IT'S ASSOCIATED PROMPT STRING
SKIPN (T1) ;NULL STRING?
POPJ P, ;NEVER PROMPT--JUST EXIT
PUSHJ P,TTYPMT ;PROMPT
PSCAN1: PUSHJ P,.TIAUC## ;PRIME THE PUMP
PJRST SWTSCN ;ENTER SWITCH SCANNER
SUBTTL Command scanning routines -- PXSCAN - Init scanning one argument
; INITIALIZE SCANNING OF A SINGLE ARGUMENT. THIS IS NOT TO BE
; USED FOR FILESPEC OR SWITCH SCANNING.
; CALL: MOVE T1, INPUT TIMEOUT TEXT ADDRESS
; MOVE T2, PROMPT STRING TEXT ADDRESS
; PUSHJ P,PXSCAN
PXSCAN: MOVEM T1,HELP ;SAVE INPUT TIMEOUT TEXT
PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,T2 ;COPY PROMPT STRING
PUSHJ P,.PSH4T## ;SAVE T1-T4
PUSH P,.OPTN## ;SAVE /OPTION
PUSH P,.FLVRB## ;SAVE /MESSAGE
SETZ T1, ;NO ARGUMENTS
PUSHJ P,.PSCAN## ;INITIALIZE
PUSHJ P,[MOVE T1,P1 ;COPY PROMPT STRING
PJRST TTYPMT];TYPE IT
POP P,.FLVRB## ;RESTORE /MESSAGE
POP P,.OPTN## ;RESTORE /OPTION
PUSHJ P,.POP4T## ;RESTORE T1-T4
POPJ P, ;RETURN
SUBTTL Command scanning routines -- SCMPMT - SCAN prompt
SCNPMT: PUSHJ P,TTYECH ;SET TTY ECHO
MOVEI T1,"#" ;ALWAYS PROMPT WITH "#" WHETHER
PUSHJ P,.TCHAR## ;FIRST OR CONTINUATION LINE
PJRST .TOOUT## ;FORCE OUTPUT AND RETURN
SUBTTL Command scanning routines -- SWTSCN - Parse switches
; ROUTINE TO DO SWITCH SCANNING
; CALL: PUSHJ P,SWTSCN
SWTSCN: CAIN C," " ;A SPACE?
PUSHJ P,.TIAUC## ;YES--GET A REAL CHAR
TLNE F,FL.LGN ;JOB LOGGED IN?
CAIE C,"@" ;YES--SEE IF INDIRECT CMD FILE
JRST SWTSC1 ;IT ISN'T
PUSHJ P,.GTIND## ;YES--SETUP FOR IT
JUMPLE C,SWTSC1 ;LOOP IF EOL
JRST E.ILSC## ;ELSE ERROR
SWTSC1: CAIE C,"/" ;SWITCH COMING?
POPJ P, ;NO
AOS REPARS ;FIRST TIME THROUGH
PUSHJ P,.KEYWD## ;YES--GO PROCESS IT
FATAL NSS,<No switch specified>
AOS REPARS ;INDICATE A SWITCH TYPED
JUMPLE C,.POPJ## ;RETURN IF EOL
CAIN C," " ;A SPACE?
PUSHJ P,.TIAUC## ;YES--EAT IT
JRST SWTSC1 ;LOOP BACK FOR ANOTHER SWITCH
SUBTTL Prompt for additional data -- ASKACT - Read account string
ASKACT: SKIPE FAILFL ;DO WE ALREADY KNOW WE'RE GOING TO FAIL?
POPJ P, ;YES--DON'T BOTHER WITH THIS STUFF
MOVE T1,U.ACTS ;GET FIRST WORD OF /ACCOUNT STORAGE
AOJN T1,ASKAC5 ;JUMP IF /ACCOUNT HAS BEEN SEEN
SETZM .NMUL## ;CLEAR FIRST WORD
MOVE T1,[.NMUL##,,.NMUL##+1] ;SET UP BLT
BLT T1,.NMUL##+7 ;CLEAR ENTIRE ACCOUNT STRING
MOVX T1,AE.ACT ;BIT TO TEST
TLNN F,FL.BYP ;BYPASSING THE ACCOUNTING SYSTEM?
TDNN T1,AENTRY+.AEREQ ;IS AN ACCOUNT REQUIRED?
JRST ASKAC2 ;NO--FINISH UP
MOVX T1,GL.ITY ;ANOTHER BIT TO TEST
TDNE T1,TTBITS ;DON'T CONFUSE BATCON OR OPSER
JRST ASKAC3 ;TRY TO GET CONTROLLING JOB'S ACCOUNT STRING
PUSHJ P,TTYECH ;SET TTY ECHO
MOVEI T1,[ASCIZ /an account string/]
MOVEI T2,[ASCIZ /Account: /]
PUSHJ P,PXSCAN ;INIT PARTIAL LINE SCANNING AND PROMPT
MOVE T1,[POINT 7,.NMUL##]
ASKAC1: PUSHJ P,.TICHE## ;GET A CHARACTER
JUMPLE C,ASKAC2 ;JUMP IF EOL OR EOF
CAME T1,[POINT 7,.NMUE##,34] ;ABOUT TO OVERFLOW BUFFER?
IDPB C,T1 ;NO--STORE CHARACTER
JRST ASKAC1 ;LOOP
ASKAC2: PUSHJ P,LGLACT ;CHECK THE ACCOUNT STRING FOR LEGAL CHARACTERS
MOVE T1,[.NMUL##,,U.ACTS] ;SET UP BLT
BLT T1,U.ACTS+7 ;COPY ACCOUNT STRING
JRST ASKAC5 ;AND PROCEED
ASKAC3: MOVNI T3,1 ;-1 TO START THINGS OFF
CTLJOB T3, ;GET CONTROLLING JOB NUMBER
MOVNI T3,1 ;THERE ISN'T ONE
JUMPLE T3,ASKAC4 ;JUMP IF NONE
HRL T1,T3 ;GET JOB NUMBER
HRRI T1,.GTPPN ;GETTAB TABLE NUMBER
GETTAB T1, ;READ PPN
SETZ T1, ;CAN'T
CAME T1,PPN ;SAME PPN?
JRST ASKAC4 ;NO
MOVE T1,[.ACTRD,,T2] ;SET UP UUO AC
MOVEI T2,2 ;TWO WORDS FOLLOWING (JOB NUMBER IN T3)
MOVEI T4,U.ACTS ;POINT TO STORAGE
ACCT. T1, ;READ CONTROLLING JOB'S ACCOUNT STRING
ASKAC4: FATAL NAS,<No account string specified>,EF.FMT
ASKAC5: PJRST USGVAL ;SEND VALIDATION MESSAGE TO [SYSTEM]ACCOUNTING
SUBTTL Prompt for additional data -- ASKATT - Read detached job# for ATTACH
ASKATT: SKIPE ATTJBN ;HAVE A JOB TO ATTACH TO YET?
JRST .POPJ1## ;YES--NOTHING TO DO
MOVEI T1,ATTMAP ;SUBROUTINE TO VALIDATE JOB NUMBER
PUSHJ P,MAPJOB ;SEE IF OTHER JOBS EXIST
SKIPN T1,JOBCNT ;FOUND ANY JOBS?
POPJ P, ;NO
SOJN T1,ASKAT1 ;JUMP IF MORE THAN ONE
PUSHJ P,MAPNXT ;FIND THE JOB
POPJ P, ;JOB MUST EXIST BUT DOESN'T??
MOVEM T1,ATTJBN ;SAVE JOB NUMBER
JRST .POPJ1## ;AND RETURN
MOVE T1,JOBCNT ;GET COUNT OF JOBS MAPPED
SOJN T1,ASKAT1 ;JUMP IF MORE THAN ONE
PUSHJ P,MAPNXT ;FIND THE JOB
POPJ P, ;JOB MUST EXIST BUT DOESN'T??
MOVEM T1,ATTJBN ;SAVE JOB NUMBER
JRST .POPJ1## ;AND RETURN
ASKAT1: PUSHJ P,DETJOB ;REPORT DETACHED JOBS
ASKAT2: PUSHJ P,TTYECH ;SET TTY ECHO
MOVEI T1,[ASCIZ /a job number/] ;INPUT TIMEOUT TEXT
MOVEI T2,[ASCIZ /Type a job number to attach to: /] ;PROMPT
PUSHJ P,PXSCAN ;INIT PARTIAL LINE SCANNING
PUSHJ P,.SWDEC## ;READ A DECIMAL NUMBER
JUMPG C,ERRILC ;ERROR IF NOT EOL
JUMPE N,ASKAT2 ;USER IS UNDECIDED
MOVEM N,ATTJBN ;STORE JOB NUMBER AWAY
JRST .POPJ1## ;AND RETURN
ATTMAP: MOVE T2,T1 ;COPY JOB NUMBER
TRMNO. T2, ;DETACHED?
SKIPA ;YES
POPJ P, ;CANNOT BE ATTACHED
HRLZ T2,T1 ;GET JOB NUMBER
HRRI T2,.GTDFL ;GET DEFAULT
GETTAB T2, ;FIND OUT IF USER WANTED TO BE ASKED
MOVEI T2,0 ;ALWAYS DEFAULT TO ASK THE USER
TXNN T2,JD.DAD ;DOES THIS JOB WANT TO PROMPT?
AOS (P) ;PUT THIS JOB IN THE MAP
POPJ P, ;RETURN
SUBTTL Prompt for additional data -- ASKLOG - Read detached job# for LOGIN
ASKLOG: MOVE T1,U.ATT ;GET /ATTACH ARGUMENT
TLNN F,FL.WLD ;WILDCARDED PPN?
CAIN T1,ATTIGN ;DID THE USER TYPE /ATTACH:INGORE?
JRST .POPJ1## ;YES--DON'T PROMPT
MOVX T1,GL.ITY ;BIT TO TEST
MOVE T2,PPN ;GET PPN
TDNN T1,TTBITS ;A PTY?
CAMN T2,ALPPPN ;OR [1,2]?
JRST .POPJ1## ;DON'T ASK
ASKLOX: MOVEI T1,LOGMAP ;SUBROUTINE TO VALIDATE JOB NUMBER
PUSHJ P,MAPJOB ;SEE IF OTHER JOBS EXIST
SKIPN T2,JOBCNT ;FOUND ANY JOBS?
JRST .POPJ1## ;NO
PUSHJ P,TTYECH ;SET TTY ECHO
CAIE T2,1 ;JUST ONE JOB?
JRST ASKLO2 ;NO
ASKLO1: PUSHJ P,DETJOB ;REPORT DETACHED JOB
MOVEI T1,[ASCIZ /LOGIN or ATTACH preference/]
MOVEI T2,[ASCIZ /Do you want to ATTACH to this job? [Y] /]
PUSHJ P,PXSCAN ;INIT PARTIAL LINE SCANNING
PUSHJ P,.SIXSW## ;READ A SIXBIT WORD
JUMPG C,ERRILC ;ERROR IF NOT EOL
JUMPE N,[MOVE N,JOBNUM ;GET TARGET JOB NUMBER
JRST ASKLO3] ;GO ATTACH
MOVE T1,[IOWD YNLEN,YNTBL] ;POINT TO ANSWERS
PUSHJ P,.NAME## ;CHECK THEM OUT
JRST ERRUKK ;ERROR
MOVE N,JOBNUM ;GET LAST JOB NUMBER FOUND BY MAPNXT
MOVEI T1,-YNTBL(T1) ;FORM INDEX
JUMPN T1,.POPJ1## ;JUMP IF USER SAID NO
JRST ASKLO3 ;ELSE GO FAKE UP AN ATTACH COMMAND
ASKLO2: PUSHJ P,DETJOB ;REPORT DETACHED JOBS
MOVEI T1,[ASCIZ /LOGIN or ATTACH preference/]
MOVEI T2,[ASCIZ /Type a job number to ATTACH or return to LOGIN a new job: /]
PUSHJ P,PXSCAN ;INIT PARTIAL LINE SCANNING
PUSHJ P,.SWDEC## ;READ A DECIMAL NUMBER
JUMPG C,ERRILC ;ERROR IF NOT EOL
JUMPE N,.POPJ1## ;USER WANTS TO LOGIN A NEW JOB
MOVX T1,%NSHJB ;
GETTAB T1, ;GET THE HIGHEST JOB IN USE
TRNA ;ERROR - BE SAFE: DON'T ALLOW IT
CAMGE T1,N ;IS THIS A VALID JOB NUMBER?
JRST ASKLO4 ;NO - TELL THE USER
MOVEI T1,.GTPPN ;CHECK TO SEE THAT THIS
HRL T1,N ; JOB HAS THE PPN HE
GETTAB T1, ; CLAIMS IT DOES
TRNA ;ERROR - DON'T ALLOW THE ATTACH
CAME T1,PPN ;DOES THE PPN MATCH?
JRST ASKLO4 ;NO - TELL THE USER
ASKLO3: MOVEM N,ATTJBN ;STORE JOB NUMBER AWAY
MOVEI T1,1 ;GET A "YES"
MOVEM T1,U.MODE ;MAKE IT LOOK LIKE /USER WAS TYPED
MOVE T1,[CM.ATT+COMATT] ;MUST DUMMY UP INVOKING COMMAND
MOVEM T1,COMIDX ; WORD TO LOOK LIKE AN ATTACH COMMAND
SETOM NOWBIT ;ALL ACCESS TIMES ARE LEGAL
MOVEI T1,[ASCIZ /.ATTACH /]
PUSHJ P,.TSTRG## ;PRINT A REASSURING MESSAGE
MOVE T1,ATTJBN ;GET TARGET JOB NUMBER
PUSHJ P,.TDECW## ;PRINT IT
MOVE T1,PPN ;GET TARGET PPN
PUSHJ P,.TPPNW## ;PRINT IT TOO
PJRST .TCRLF## ;END LINE WITH A CRLF AND TAKE ATTACH RETURN
ASKLO4: WARN IJN,<Invalid job number; try again>
JRST ASKLOX
LOGMAP: MOVE T2,T1 ;COPY JOB NUMBER
TRMNO. T2, ;DETACHED?
SKIPA ;YES
POPJ P, ;CANNOT BE ATTACHED
HRLZ T2,T1 ;GET JOB NUMBER
HRRI T2,.GTDFL ;GET DEFAULT
GETTAB T2, ;FIND OUT IF USER WANTED TO BE ASKED
MOVEI T2,0 ;ALWAYS DEFAULT TO ASK THE USER
TXNN T2,JD.DAD ;DOES THIS JOB WANT TO PROMPT?
AOS (P) ;PUT THIS JOB IN THE MAP
POPJ P, ;RETURN
YNTBL: SIXBIT /YES/
SIXBIT /NO/
YNLEN==.-YNTBL
SUBTTL Prompt for additional data -- ASKNAM - Read user name
ASKNAM: MOVE T1,U.NAME ;GET THE USER NAME
MOVE T2,U.NAME+1 ;GET THE SECOND HALF
MOVE T3,T1 ;COPY FIRST WORD
IOR T3,T2 ;MERGE THE TWO
CAMN T1,[EXP -1] ;NAME GIVEN?
CAME T2,[EXP -1] ;MUST CHECK BOTH WORDS
JUMPN T3,ASKNA6 ;JUMP IF WE HAVE A NAME
MOVE T1,CNTLJP ;GET CONTROLLING JOB'S PPN
CAME T1,ALPPPN ;OK IF [1,2]
TLNE F,FL.BYP!L.SOPR ;BYPASS OR SON OF OPR?
JRST ASKNA4 ;NEVER ASK FOR A NAME
MOVX T1,AE.NCH ;BIT TO TEST
MOVX T2,AE.NRT ;GET NAME REQUIRED BIT
TDNN T1,AENTRY+.AEFLG ;NAME REQUIRED BY SYSTEM ADMINISTRATOR?
JRST ASKNA1 ;NO
PUSHJ P,LOKCHK ;CHECK FOR LOCKED ACCOUNTING FILES
JRST ASKNA4 ;CAN'T CHANGE NAME
IORM T2,AENTRY+.AEREQ ;SET THE BIT
WARN NCR,<A name is required for accounting purposes>
ASKNA1: TDNN T2,AENTRY+.AEREQ ;NAME REQUIRED?
JRST ASKNA4 ;NO--USE WHAT'S IN THE PROFILE
PUSHJ P,TTYECH ;SET TTY ECHO
MOVEI T1,[ASCIZ /your name/]
MOVEI T2,[ASCIZ/Name: /]
PUSHJ P,PXSCAN ;INIT PARTIAL LINE SCANNING AND PROMPT
MOVE T1,[AENTRY+.AENAM,,AENTRY+.AENAM+1] ;SET UP BLT
SETZM AENTRY+.AENAM ;CLEAR FIRST WORD
BLT T1,AENTRY+.AENAM+.AANLW-1 ;CLEAR NAME STORAGE
MOVE T1,[POINT 8,AENTRY+.AENAM] ;BYTE POINTER TO STORAGE
MOVEI T2,.AANLC ;MAXIMUM NUMBER OF CHARACTERS
ASKNA2: PUSHJ P,.TICHE## ;GET A CHARACTER
JUMPLE C,ASKNA3 ;EOL?
IDPB C,T1 ;PUT A CHARACTER
SOJG T2,ASKNA2 ;LOOP
ASKNA3: SKIPE AENTRY+.AENAM ;MUST BE NON-ZERO
JRST ASKNA5 ;IT IS
SETOM FAILFL ;ELSE FORCE A FAILURE
ASKNA4: MOVX T1,AE.NCH ;BIT TO CLEAR
ANDCAM T1,AENTRY+.AEFLG ;DON'T ALLOW NAME CHANGES
ASKNA5: SETZM NAME ;CLEAR WORD 1
SETZM NAME2 ;CLEAR NAME 2
MOVEI T1,AENTRY+.AENAM ;ADDRESS OF ACCOUNTING NAME
MOVE T2,[POINT 6,NAME];BYTE POINTER TO DESTINATION
MOVEI T3,^D12 ;NAME IS 12 CHARACTERS LONG
PJRST CHRTRN ;TRANSLATE STRING AND RETURN
ASKNA6: DMOVEM T1,NAME ;STORE IT
POPJ P, ;RETURN
SUBTTL Prompt for additional data -- ASKPSW - Read password(s)
ASKPSW: MOVE T1,COMIDX ;GET COMMAND FLAGS
TXNE T1,CM.PSW!CM.SET ;PASSWORD OR SET PASSWORD COMMANDS?
JRST ASKPS1 ;YES--ALWAYS ASK
SKIPE FAILFL ;GOING TO FAIL?
JRST ASKPS1 ;ASK FOR PASSWORD ANYWAY
JUMPG C,ASKPS1 ;ALSO ASK IF PASSWORD ON ATTACH OR LOGIN LINE
MOVE T2,CNTLJP ;GET CONTROLLING JOB'S PPN
CAME T2,ALPPPN ;OK IF [1,2]
TLNE F,FL.CTY!FL.BYP!FL.BAT!L.SOPR ;PASSWORD REQUIRED?
POPJ P, ;NO
JUMPE PP,ASKPS1 ;IF NO PPN, THEN LOGIN WON'T SUCCEED, SO ASK
CAMN T2,PP ;OK IF US
POPJ P, ;RETURN IF NOT ORDINARY UNPRIV'ED ATTACH/LOGIN
TXNE T1,CM.ATT ;ATTACH COMMAND?
JRST ASKPS1 ;ALWAYS ASK FOR A PASSWORD
MOVX T1,AE.PRT ;BIT TO TEST
TDNN T1,AENTRY+.AEREQ ;IS A PASSWORD REQUIRED?
POPJ P, ;NO--RETURN
ASKPS1: MOVEI T1,[ASCIZ /your password/]
MOVEI T2,[ASCIZ /Password: /]
MOVEI T3,PASSWD ;BUFFER ADDRESS
PUSHJ P,GETPSW ;READ PASSWORD
PUSHJ P,.GTNOW## ;GET CURRENT UDT
SKIPN T2,AENTRY+.AEPCT ;GET PASSWORD CHANGE TIME
MOVE T2,T1 ;ZERO MEANS NOT YET
CAMLE T1,T2 ;TIME TO CHANGE PASSWORD?
SETOB T1,AENTRY+.AEPCT ;YES
SKIPG U.PASS ;USER ASK FOR A PASSWORD CHANGE?
CAME T1,[EXP -1] ;PASSWORD CHANGE REQUIRED?
JRST ASKPS2 ;DON'T BOTHER USER WITH USELESS CHATTER
PUSHJ P,LOKCHK ;CHECK FOR A LOCKED FILE
JRST ASKPS3 ;GIVE UP
WARN PCR,<A password change is required by the system administrator>
MOVEI T1,1 ;NOW FAKE STORAGE
MOVEM T1,U.PASS ;SO IT LOOKS LIKE /PASSWORD:YES WAS TYPED
ASKPS2: SKIPG U.PASS ;/PASSWORD SEEN?
POPJ P, ;NO--DONE
MOVEI T1,[ASCIZ /password may not be changed/]
PUSHJ P,LOKWRN ;CHECK FOR A LOCKED FILE
SKIPA ;GIVE UP
JRST ASKPS4 ;ONWARD
ASKPS3: SETZM U.PASS ;NO PASSWORD CHANGE
POPJ P, ;RETURN
ASKPS4: MOVX T1,AE.PCP ;GET "PASSWORD CHANGE PROHIBITED" BIT
SKIPN FAILFL ;BYPASS CHECKS IF LOGIN WON'T SUCCEED
TDNN T1,AENTRY+.AEREQ ;PASSWORD CHANGE PROHIBITED?
JRST ASKPS5 ;NO, PROCEED
MOVE T1,AENTRY+.AEPCT ;GET THE PASSWORD CHANGE REQUIRED FLAG
AOJE T1,ASKPS5 ;REQUIRED BY SYSTEM ADMINISTRATOR: PROCEED
WARN PCP,<Password change prohibited>
JRST ASKPS3 ;NO PASSWORD CHANGE
ASKPS5: MOVEI T1,[ASCIZ /your new password/]
MOVEI T2,[ASCIZ /New password: /]
MOVEI T3,NEWPSW ;BUFFER ADDRESS
PUSHJ P,GETPSW ;READ NEW PASSWORD
MOVEI T1,[ASCIZ /your new password/]
MOVEI T2,[ASCIZ /Verification: /]
MOVEI T3,CHKPSW ;BUFFER ADDRESS
PUSHJ P,GETPSW ;READ NEW PASSWORD AGAIN
MOVSI T1,-.APWLW ;-WORD COUNT
MOVE T2,NEWPSW(T1) ;GET A WORD
CAMN T2,CHKPSW(T1) ;A MATCH?
AOBJN T1,.-2 ;LOOP
JUMPGE T1,.POPJ## ;RETURN IF ALL WORDS CHECK OUT
WARN PNV,<The new password did not verify; try again>,,
JRST ASKPS5 ;LOOP BACK
; READ A ONE PASSWORD
; CALL: MOVE T1, TIME-OUT HELP TEXT
; MOVE T2, ADDRESS OF PROMPT STRING
; MOVE T3, ADDRESS OF BUFFER
; PUSHJ P,GETPSW
GETPSW: SETZM 0(T3) ;CLEAR FIRST WORD OF BUFFER
MOVSI T4,0(T3) ;POINT TO START OF BUFFER
HRRI T4,1(T3) ;MAKE A BLT POINTER
BLT T4,.APWLW-1(T3) ;CLEAR ENTIRE BUFFER
JUMPG C,GETPS1 ;JUMP IF ALREADY HAVE A CHARACTER
PUSHJ P,.PSH4T## ;SAVE T1-T4
PUSH P,.OPTN## ;SAVE /OPTION
PUSH P,.FLVRB## ;SAVE /MESSAGE
MOVEI T1,0 ;NO ARGUMENTS
PUSHJ P,.PSCAN## ;CALL PARTIAL LINE SCANNER
JFCL ;MUST ALWAYS PROMPT
POP P,.FLVRB## ;RESTORE /MESSAGE
POP P,.OPTN## ;RESTORE /OPTION
PUSHJ P,.POP4T## ;RESTORE T1-T4
MOVEM T1,HELP ;SAVE INCASE INPUT TIMEOUT
PUSHJ P,TTYNEC ;SET TTY NO ECHO
PUSHJ P,PMTPSW ;PROMPT THE USER
GETPS1: MOVE T2,T3 ;GET PASSWORD BUFFER ADDRESS
HRLI T2,(POINT 8,) ;MAKE A BYTE POINTER
MOVEI T3,.APWLC ;MAXIMUM NUMBER OF CHARACTERS
GETPS2: PUSHJ P,.TICHE## ;GET A CHARACTER
JUMPLE C,GETPS3 ;DONE?
SOSG T3 ;WATCH FOR OVERFLOW
FATAL PTL,<Password too long>
IDPB C,T2 ;STORE
JRST GETPS2 ;LOOP
GETPS3: MOVEI T1,.CHNUL ;GET TERMINATOR
IDPB T1,T2 ;MAKE ASCIZ
PJRST .TNEWL## ;PRINT A CRLF IF NEEDED AND RETURN
; ROUTINE TO ISSUE PASSWORD PROMPT
PMTPSW: PUSH P,T2 ;SAVE PROMPT STRING
PUSH P,T3 ;SAVE BUFFER ADDRESS
PUSHJ P,.TNEWL## ;START ON A NEW LINE
MOVE T3,CNTLJT ;GET CONTROLLING JOB'S BITS (PROBABLY OURS)
TXNN T3,GL.LCP!GL.CNE!GL.HDP ;LOCAL COPY, COMMAND NO ECHO OR HDX?
JRST PMTPS2 ;YES
MOVEI T2,3 ;NUMBER OF TIMES TO OVERSTRIKE LINE
PMTPS1: MOVE T1,-1(P) ;GET PROMPT STRING
PUSHJ P,.TSTRG## ;TYPE IT
MOVEI T3,.APWLC ;LENGTH OF PASSWORD IN CHARACTERS
MOVE T1,[EXP "*","#","@"]-1(T2) ;GET MASK CHARACTER
PUSHJ P,.TCHAR## ;TYPE MASK CHARACTER
SOJG T3,.-1 ;LOOP
MOVEI T1,.CHCRT ;RETURN THE
PUSHJ P,.TCHAR## ; CARRIAGE
SOJG T2,PMTPS1 ;LOOP
PMTPS2: MOVE T1,-1(P) ;GET PROMPT STRING ONCE MORE
PUSHJ P,.TSTRG## ;TYPE IT
PUSHJ P,.TOOUT## ;FORCE OUTPUT
POP P,T3 ;RESTORE BUFFER ADDRESS
POP P,T2 ;RESTORE PROMPT STRING
POPJ P, ;RETURN
SUBTTL Prompt for additional data -- ASKRMK - Read remark string
ASKRMK: SKIPE FAILFL ;DO WE ALREADY KNOW WE'RE GOING TO FAIL?
POPJ P, ;YES--DON'T BOTHER WITH THIS STUFF
MOVE T1,U.RMRK ;GET FIRST WORD OF /REMARK STORAGE
AOJN T1,.POPJ## ;RETURN IF A /REMARK SWITCH HAS BEEN SEEN
MOVEI T1,1 ;SET FLAG TO ASSUME REMARK NEEDED
MOVX T2,AE.RMK ;BIT TO TEST
MOVX T3,GL.ITY ;ANOTHER BIT TO TEST
TDNN T3,TTBITS ;DON'T CONFUSE BATCON OR OPSER
TDNN T2,AENTRY+.AEREQ ;IS A REMARK REQUIRED?
MOVEI T1,0 ;NO--SET FLAG ACCORDINGLY
SETZM .NMUL## ;CLEAR FIRST WORD
MOVE T2,[.NMUL##,,.NMUL##+1] ;SET UP BLT
BLT T2,.NMUL##+7 ;CLEAR ENTIRE REMARK STRING
JUMPE T1,.POPJ## ;RETURN IF NO REMARK NEEDED
TLNE F,FL.BYP ;BYPASSING THE ACCOUNTING SYSTEM?
POPJ P, ;YES
PUSHJ P,TTYECH ;SET TTY ECHO
MOVEI T1,[ASCIZ/a remark string/]
MOVEI T2,[ASCIZ/Remark: /]
PUSHJ P,PXSCAN ;INIT PARTIAL LINE SCANNING AND PROMPT
MOVE T1,[POINT 7,.NMUL##]
ASKRM1: PUSHJ P,.TICHE## ;GET A CHARACTER
JUMPLE C,ASKRM2 ;JUMP IF EOL OR EOF
CAME T1,[POINT 7,.NMUE##,34] ;ABOUT TO OVERFLOW BUFFER?
IDPB C,T1 ;NO--STORE CHARACTER
JRST ASKRM1 ;LOOP
ASKRM2: PUSHJ P,LGLRMK ;CHECK THE REMARK STRING FOR LEGAL CHARACTERS
MOVE T1,[.NMUL##,,U.RMRK] ;SET UP BLT
BLT T1,U.RMRK+7 ;COPY REMARK STRING
POPJ P,
SUBTTL SCAN argument blocks -- .ISCAN
SCIBLK: IOWD COMLEN,COMLST ;POINTER TO INVOKING COMMAND NAMES
XWD SAOFST,'LGN' ;CCL OFFSET,,CCL FILE NAME
XWD TTYGET,TTYPUT ;TTY INPUT ROUTINE,,TTY OUTPUT ROUTINE
XWD 0,0 ;POINTER TO INDIRECT COMMAND FILE SCAN BLOCK
XWD SCNPMT,FLUSH ;PROMPT ROUTINE,,EXIT ROUTINE
EXP FS.ICL ;FLAGS,,RESERVED
SCILEN==.-SCIBLK ;LENGTH OF BLOCK
SUBTTL SCAN argument blocks -- .OSCAN
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<
PFX'OB:
IFE PFX'SWL,<EXP 0,0,0>
IFN PFX'SWL,<
IOWD PFX'SWL,PFX'SWN
XWD PFX'SWD,PFX'SWM
XWD 0,PFX'SWP
>
<SIXBIT /'HLP/>
IFB <OSC>,<
XWD 1,COMNAM
>
IFNB <OSC>,<
ZZ==0
IRP OSC,<ZZ==ZZ+1>
XWD ZZ,[
IRP OSC,<SIXBIT /OSC/>
]
>
PFX'OL==.-PFX'OB
>
CMDS
SUBTTL SCAN argument blocks -- .PSCAN
DEFINE X (PFX,NAM,HLP,PRC,PMT,OSC),<
PFX'PB:
IFE PFX'SWL,<EXP 0,0,0>
IFN PFX'SWL,<
IOWD PFX'SWL,PFX'SWN
XWD PFX'SWD,PFX'SWM
XWD 0,PFX'SWP
>
<SIXBIT /'HLP/>
PFX'PL==.-PFX'PB
>
CMDS
SUBTTL SCAN switch tables -- ATTACH command
DEFINE SWTCHS,<
SN BYPASS,U.BYPA,
SS MONITOR,U.MODE,0
SP TERMINAL,,TERMSW,,FS.VRQ!FS.HEL
SS USER,U.MODE,1
>
; TABLE EXPANSION
DOSCAN(ATTSW)
SUBTTL SCAN switch tables -- KJOB command
DEFINE SWTCHS,<
SS *BATCH,U.KJOB,0
SN *CLEAR,U.CLEA,
SN *DISCONNECT,U.DISC,
SS FAST,U.KJOB,1
SS *NOMESSAGE,U.NMSG,0
SN *TEMP,U.TEMP,
>
; TABLE EXPANSION
DOSCAN(KJBSW)
SUBTTL SCAN switch tables -- LOGIN command
DM COR,^D0,^D262143,^D262143
DM DPR,3,0,1
DM FIL,.FXLEN,0,0
DM LOC,77,0,0
DM QTA,1,0,0
DM TIM,0,0,^D60
DM YN,1,0,1
KEYS ATT,<ASK,IGNORE>
KEYS DSKF,<ERROR,PAUSE>
KEYS SPOL,<LPT,PLT,PTP,CDP,CDR>
KEYS NOTC,<ALWAYS,SOMETIMES,NEVER>
KEYS WTCH,<FILES,MTA,VERSION,WRITE,READ,WAIT,RUN,DAY,CONTEXTS>
WCHLSH==^D17-WTCHDA ;AMOUNT TO SHIFT BITS FOR SETUUO
DEFINE SWTCHS,<
SP ACCOUNT,<POINT ^D65-^D8,U.ACTS>,ACCTSW,,FS.VRQ!FS.HEL
SP ASSIGN,DEVTAB,ASGNSW,,FS.VRQ!FS.HEL
SL ATTACH,U.ATT,ATT,ATTASK
SP BATCH,,BATCSW,,FS.VRQ!FS.HEL
SN BYPASS,U.BYPA,
SP CORE,U.CORE,.SWCOR##,COR,FS.VRQ
SN DEFER,U.DFER,
SP DEFAULT,,DEFASW,,FS.VRQ!FS.HEL
SL DSKFUL,U.DFUL,DSKF,DSKFPA
SP DSKPRI,U.DPRI,DSKPSW,DPR,FS.VRQ!FS.HEL
SN GUIDELINE,U.GUID
SP LIB,LIBSPC,.SWFIL##,FIL,FS.VRQ
SN LIMIT,U.LIMIT
SP LOCATE,U.STA,.SWOCT##,LOC,
SN MAILCHECK,U.MAIL,
SP NAME,<POINT ^D65-2,U.NAME>,.SIXQW##,,FS.VRQ
SN NEW,U.NEW,
SS NOLIB,LIBSPC+.FXDIR,0
SP NOTE,NOTSPC,.SWFIL##,FIL,FS.VRQ
SL NOTICE,U.NOTC,NOTC,0,FS.VRQ
SS NOWATCH,U.NWAT,0
SN PASSWORD,U.PASS,0
SP PATH,U.PATH,.SWFIL##,FIL,FS.VRQ
SP *PHYSICAL,U.CPPL,.SWCOR##,COR,FS.VRQ
SP QUOTA,U.QTA,QUOTSW,QTA,FS.HEL
SP REMARK,<POINT ^D65-^D8,U.RMRK>,RMRKSW,,FS.VRQ!FS.HEL
SP REQID,U.BREQ,.SWDEC##,,FS.VRQ
SN SETTTY,U.SETT,
SN SCAN,U.SCAN,
SN SFDCREATE,U.SFDC,
SP SFDPROT,U.SFDP,.SWOCT##,,FS.VRQ
SL SPOOL,U.SPL,SPOL,0,FS.OBV
SN STR,U.STR,
SN SYS,U.SYS,
SP TERMINAL,,TERMSW,,FS.VRQ!FS.HEL
SP TIME,U.TIME,.SWDEC##,TIM,FS.VRQ
SP UFDPROT,U.UFDP,.SWOCT##,,FS.VRQ
SP VIRTUAL,U.CVPL,.SWCOR##,COR,FS.VRQ
SL WATCH,U.WAT,WTCH,0,FS.OBV
; **NOTE** DO NOT ADD NEW SWITCHES HERE. ADD THEM IN THE OTHER KEYWORD
; TABLES (/DEFAULT OR /TERMINAL). THESE DEFINITIONS WILL GO AWAY IN LOGIN
; VERSION 65.
IFN OLDDEF,<
SP DEFBUFFER,U.DFBU,.SWDEC##,BUF,
SP DEFPROT,U.DFPR,.SWOCT##,PRO,FS.VRQ
> ;END IFN OLDDEF
IFN OLDTTY,<
SN ALTMODE,U.ALTM,
SN BLANK,U.BLNK,
SN CRLF,U.CRLF,
SN DEBREAK,U.DBRK,
SN ECHO,U.ECHO,
SP FILL,U.FILL,.SWOCT##,FLL
SN FORM,U.FORM,
SN GAG,U.GAG,
SN LC,U.LC,
SN PAGE,U.PAGE,
SP PAGESIZE,U.PGSZ,.SWDEC##,PSZ,FS.VRQ
SL RCVSPEED,U.RSPD,SPED,0,FS.VRQ
SN RTCOMP,U.RTC,
SL SPEED,U.SPED,SPED,0,FS.VRQ
SN TABS,U.TABS,
SN TAPE,U.TAPE,
SN TTDEFER,U.TTDE,
SP TYPE,U.TYPE,.SWSIX##,,FS.VRQ
SP WIDTH,U.WDTH,.SWDEC##,WTH,
SL XMTSPEED,U.XSPD,SPED,0,FS.VRQ
> ;END IFN OLDTTY
>
; TABLE EXPANSION
DOSCAN(LOGSW) ;LOGIN SWITCHES
SUBTTL SCAN switch tables -- [SET] PASSWORD COMMAND
DEFINE SWTCHS,<
>
; TABLE EXPANSION
DOSCAN (SETSW)
DOSCAN (PSWSW)
SUBTTL SCAN switch tables -- REATTA command
DEFINE SWTCHS,<
>
; TABLE EXPANSION
DOSCAN (RTASW)
SUBTTL SCAN switch tables -- SESSION command
DEFINE SWTCHS,<
SP ACCOUNT,<POINT ^D65-^D8,U.ACTS>,ACCTSW,,FS.VRQ!FS.HEL
SP REMARK,<POINT ^D65-^D8,U.RMRK>,RMRKSW,,FS.VRQ!FS.HEL
>
; TABLE EXPANSION
DOSCAN (SESSW)
SUBTTL SCAN switch tables -- TRANLS command
DEFINE SWTCHS,<
>
; TABLE EXPANSION
DOSCAN (TRNSW)
SUBTTL SCAN switch tables -- /BATCH switch
DEFINE SWTCHS,<
SN INTERVENTION,U.BINT,
SP NAME,U.BNAM,BATNAM,,FS.VRQ
SP SEQUENCE,U.BSEQ,.SWDEC##,,FS.VRQ
SP STREAM,U.BSTR,.SWOCT##,,FS.VRQ
SP REQUESTID,U.BREQ,.SWDEC##,,FS.VRQ
>
; TABLE EXPANSION
DOSCAN (BATC.)
SUBTTL SCAN switch tables -- /DEFAULT switch
DM PRO,777,0,0
DM BUF,777,0,2
DM BIG,^D31,0,^D4
DEFINE SWTCHS,<
SP BIGBUFFER,U.DFBB,.SWDEC##,BIG,
SP BUFFER,U.DFBU,.SWDEC##,BUF,
SP PROTECTION,U.DFPR,.SWOCT##,PRO,FS.VRQ
>
; TABLE EXPANSION
DOSCAN (DEFA.)
SUBTTL SCAN switch tables -- /TERMINAL switch
DM ESC,377,377,.CHESC
DM FLL,3,0,2
DM PSZ,^D255,^D255,^D24
DM UPS,377,377,.CHCNQ
DM WTH,^D255,^D80,^D132
KEYS SPED,<50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,EXTA,EXTB>
DEFINE SWTCHS,<
SN ALTMODE,U.ALTM,
SN BLANKS,U.BLNK,
SN CRLF,U.CRLF,
SN DEBREAK,U.DBRK,
SN DEFER,U.TTDE,
SN DISPLAY,U.DISP,
SN ECHO,U.ECHO,
SN EIGHTBIT,U.8BIT,
SP ESCAPE,U.ESCA,.SWCHR##,ESC,
SN FFHOME,U.FFHO,
SN FFSIMULATE,U.FFSI
SN FFSTOP,U.FFST
SP FILL,U.FILL,.SWOCT##,FLL
SN FORM,U.FORM,
SN GAG,U.GAG,
SN LC,U.LC,
SP LENGTH,U.LENG,.SWDEC##,PSZ,FS.VRQ
SN LOCALCOPY,U.LCP,
SS NOFILL,U.FILL,0
SS NOSTOP,U.STOP,0
SS NOSSTOP,U.SSTO,0
SN PAGE,U.PAGE,
SP PAGESIZE,U.PGSZ,.SWDEC##,PSZ,FS.VRQ
SN QUOTE,U.QUOT,
SL RCVSPEED,U.RSPD,SPED,0,FS.VRQ
SN RTCOMP,U.RTC,
SN SBELL,U.SBEL,
SL SPEED,U.SPED,SPED,0,FS.VRQ
SP STOP,U.STOP,.SWDEC##,PSZ,FS.VRQ
SP SSTOP,U.SSTO,.SWDEC##,PSZ,FS.VRQ
SN TABS,U.TABS,
SN TAPE,U.TAPE,
SN TIDY,U.TIDY,
SP TYPE,U.TYPE,.SIXSW##,,FS.VRQ
SN UC,U.UC,
SP UNPAUSE,U.UNPA,.SWCHR##,UPS,
SP WIDTH,U.WDTH,.SWDEC##,WTH,
SN XONXOFF,U.XONXO,
SL XMTSPEED,U.XSPD,SPED,0,FS.VRQ
>
; TABLE EXPANSION
DOSCAN (TERM.)
SUBTTL SCAN switch processing -- ACCTSW - /ACCOUNT
XWD 0,[ASCIZ /"ASCII string"/]
ACCTSW: PUSHJ P,.SWASQ## ;READ THE QUOTED STRING
MOVE N,.NMUL## ;MAKE SCAN HAPPY
PUSHJ P,LGLACT ;CHECK STRING FOR LEGAL CHARACTERS AND LENGTH
PJRST .SWDPB## ;GO STORE RESULT AND RETURN
SUBTTL SCAN switch processing -- ASGNSW - /ASSIGN
XWD 0,[ASCIZ /Device:logical-name/]
ASGNSW: MOVE T1,DEVPTR ;GET POINTER TO TABLE
AOBJP T1,ASGNS1 ;TOO MANY /ASSIGN SWITCHES
PUSH P,T1 ;SAVE T1 OVER .SIXQW
PUSHJ P,.SIXSW## ;GET SIXBIT STRING
MOVE T1,(P) ;GET POINTER BACK
MOVEM N,0(T1) ;STORE DEVICE NAME
CAIE C,":" ;LOGICAL NAME ON THE WAY?
TDZA N,N ;NO
PUSHJ P,.SIXSW## ;GET IT
POP P,T1 ;GET POINTER BACK
MOVEM N,1(T1) ;SAVE
AOBJP T1,.+1 ;ACCOUNT FOR TWO WORD ENTRIES
MOVEM T1,DEVPTR ;UPDATE POINTER
JRST .SWDON## ;RETURN
ASGNS1: WARN A2M,<Attempt to assign too many devices with /ASSIGN>
POPJ P, ;AND RETURN
SUBTTL SCAN switch processing -- BATCSW - /BATCH
PUSHJ P,BATHLP ;/HELP:ARG ROUTINE
BATCSW: MOVEI T1,BATSWT ;POINT TO SUB-TABLE
PJRST KEYWRD ;HANDLE THE KEYWORDS
BATHLP: MOVE T1,BATSWT+SWA ;POINT TO KEYWORD TABLE
PJRST HELPTB ;PRINT TABLE AND RETURN
IOWD BATC.L,BATC.N ;POINTER TO SWITCH KEYWORDS
BATSWT: BATC.N(P1) ;SWITCH POINTERS FOR /BATCH
BATC.P(P1)
BATC.M(P1)
BATC.D(P1)
SUBTTL SCAN switch processing -- BATNAM - /BATCH:NAME
BATNAM: PUSHJ P,.SIXQW## ;READ QUOTED SIXBIT STRING
MOVE N,.NMUL## ;RETURN FIRST WORD
JRST .SWDPB## ;AND LET SCAN STORE
SUBTTL SCAN switch processing -- DEFASW - /DEFAULT
PUSHJ P,DEFHLP ;/HELP:ARG ROUTINE
DEFASW: MOVEI T1,DEFSWT ;POINT TO SUB-TABLE
PJRST KEYWRD ;HANDLE THE KEYWORDS
DEFHLP: MOVE T1,DEFSWT+SWA ;POINT TO KEYWORD TABLE
PJRST HELPTB ;PRINT TABLE AND RETURN
IOWD DEFA.L,DEFA.N ;POINTER TO SWITCH KEYWORDS
DEFSWT: DEFA.N(P1) ;SWITCH POINTERS FOR /DEFAULT
DEFA.P(P1)
DEFA.M(P1)
DEFA.D(P1)
SUBTTL SCAN switch processing -- DSKPSW - /DSKPRIORITY
XWD 0,[ASCIZ /Octal number (Min=-3, Max=3)/]
DSKPSW: PUSHJ P,.OCTNW## ;READ THE NUMBER
CAML N,[-3] ;TOO SMALL
CAILE N,3 ;TOO BIG
PUSHJ P,DSKPS1 ;COMPLAIN A LITTLE
MOVEM N,U.DPRI ;STORE THE ANSWER
PJRST .SWDON## ;RETURN
DSKPS1: MOVE T1,N ;GET BAD NUMBER
WARN DPO,</DSKPRIORITY switch value >,,E.DPO
MOVEI N,0 ;DEFAULT IT TO ZERO
POPJ P, ;RETURN
E.DPO: PUSHJ P,.TOCTW## ;PRINT VALUE
MOVEI T1,[ASCIZ /; defaulting to zero/]
PJRST .TSTRG## ;PRINT TEXT AND RETURN
SUBTTL SCAN switch processing -- QUOTSW - /QUOTA
; /QUOTA SWITCH PROCESSING. THIS ROUTINE WILL EXPAND ABBREVIATED
; STRUCTURE NAMES AND "ALL". IT ALSO SPECIAL CASES "DSK" TO MEAN
; ALL STRUSTURES IN THE JOB'S SEARCH LIST. WHEN SWITCH SCANNING
; IS DONE, THE JOB'S SEARCH LIST IS UNKNOWN SO WE LIGHT A FLAG
; AND GO AWAY. "DSK" CANNOT BE EXPANDED.
XWD 0,[ASCIZ /List of structure names/]
QUOTSW: PUSHJ P,.SIXSW## ;GET STR NAME
SETZM LSTSTR ;INIT "LAST" STR
MOVE T3,N ;GET STR
CAME T3,['DSK '] ;WAS IT DSK?
JRST QUOTS1 ;NO
AOS U.QTA ;INDICATE /QUOTA:DSK
JRST .POPJ1## ;AND RETURN WITHOUT STORE
QUOTS1: CAMN T3,['ALL '] ;ALL STRS IN SYSTEM?
TDZA N,N ;ALLOW ALL STRS TO MATCH
QUOTS2: PUSHJ P,.MKMSK## ;GENERATE A MASK
MOVEM T1,STRMSK ;SAVE MASK
QUOTS3: MOVE T1,LSTSTR ;GET LAST STR
SYSSTR T1, ;GET NEXT
JRST QUOTS5 ;ILLEGAL STR
JUMPE T1,.POPJ1## ;RETURN IF NO MORE
MOVEM T1,LSTSTR ;SET NEW "LAST" STR
JUMPE N,QUOTS4 ;ALL?
AND T1,STRMSK ;MASK NAME
CAME T1,N ;MATCH?
JRST QUOTS3 ;NO--TRY THE NEXT ONE
MOVE T1,LSTSTR ;RELOAD STR NAME
QUOTS4: PUSHJ P,STRPUT ;ADD TO QTATAB
JRST QUOTS3 ;LOOP FOR ALL STRS
QUOTS5: WARN (ISN,<Illegal structure name ">,QUOTS6)
JRST .POPJ1## ;RETURN WITHOUT STORE
QUOTS6: MOVE T1,N ;GET STR NAME
PUSHJ P,.TSIXN## ;TYPE IT
MOVEI T1,"""" ;GET A DOUBLE QUOTE
PJRST .TCHAR## ;TYPE IT AND RETURN
SUBTTL SCAN switch processing -- RMRKSW - /REMARK
XWD 0,[ASCIZ /"ASCII string"/]
RMRKSW: PUSHJ P,.SWASQ## ;READ THE QUOTED STRING
MOVE N,.NMUL## ;MAKE SCAN HAPPY
PUSHJ P,LGLRMK ;CHECK STRING FOR LEGAL CHARACTERS AND LENGTH
PJRST .SWDPB## ;GO STORE RESULT AND RETURN
SUBTTL SCAN switch processing -- TERMSW - /TERMINAL
PUSHJ P,TERHLP ;/HELP:ARG ROUTINE
TERMSW: MOVEI T1,TERSWT ;POINT TO SUB-TABLE
PJRST KEYWRD ;HANDLE THE KEYWORDS
TERHLP: MOVE T1,TERSWT+SWA ;POINT TO KEYWORD TABLE
PJRST HELPTB ;PRINT TABLE AND RETURN
IOWD TERM.L,TERM.N ;POINTER TO SWITCH KEYWORDS
TERSWT: TERM.N(P1) ;SWITCH POINTERS FOR /TERMINAL
TERM.P(P1)
TERM.M(P1)
TERM.D(P1)
SUBTTL SCAN switch processing -- HELPTB - Keyword help typeout
HELPTB: PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,T1 ;GET IOWD POINTER TO SWITCH NAME TABLE
MOVEI T1,"(" ;START LIST
PUSHJ P,.TCHAR##
HELPT1: MOVE T1,1(P1) ;GET A KEYWORD
PUSHJ P,.TSIXN## ;TYPE IT
AOBJP P1,HELPT2 ;ADVANCE POINTER
PUSHJ P,.TCOMA## ;SEPARATE
JRST HELPT1 ;LOOP THROUGH TABLE
HELPT2: MOVEI T1,")" ;FINISH
PJRST .TCHAR## ;TYPE IT AND RETURN
SUBTTL SCAN switch processing -- KEYWRD - Complex switch argument parsing
; THIS ROUTINE IS SIMILIAR TO .KEYWD IN SCAN, EXCEPT IT DOESNT HANDLE
; ALSO THE CASES THAT SCAN'S DOES. BUT, IT HANDLES THE SIMPLE SN,SP,SL
; SUB-SWITCHES THAT LOGIN USES FOR /TERMINAL:. MAYBE SOMEDAY IF SCAN
; CHANGES, WE CAN REMOVE THIS CODE
; OFFSETS INTO SWT TABLES FOR KEYWRD ROUTINE
SWA==-1
SWN==0
SWP==1
SWM==2
SWD==3
KEYWRD: PUSHJ P,.SAVE2## ;SAVE P1 (SWITCH INDEX)
MOVEI P2,(T1) ;SAVE POINTER TO SWITCH TABLE
PUSHJ P,SIXSW ;GET NAME
MOVE T1,SWA(P2) ;GET POINTER TO TABLES
PUSHJ P,SWTNAM ;LOOKUP IN TABLE
SKIPA ;CAN'T FIND, TRY HARDER
JRST KEYWDG ;GOT IT
JUMPG T1,E.UKK## ;AMBIGUOUS IF MORE THAN ONE
TLC N,'NO ' ;SEE IF /NOXYZ
TLCE N,'NO ' ;..
JRST E.UKK## ;NO--ISSUE ERROR
PUSH P,N ;SAVE WORD
LSH N,^D12 ;STRIP "NO"
MOVE T1,SWA(P2) ;POINT TO TABLES AGAIN
PUSHJ P,SWTNAM ;LOOKUP
JRST [POP P,N ;ERROR--RESTORE WORD
JRST E.UKK##] ;AND ISSUE ERROR
POP P,N ;RESTORE NAME
TLO P1,-1 ;FLAG /NOXYZ
MOVX T1,FS.NOS ;GET YES/NO BIT
TDNN T1,@SWD(P2) ;SEE IF YES/NO SWITCH
JRST [MOVNI T1,1 ;ELSE PRETEND UNKNOWN
JRST E.UKK##] ;FOR SCAN
KEYWDG: MOVE T2,@SWD(P2) ;GET DEFAULT
MOVEI N,(T2) ;COPY INTO N
MOVE T1,@SWM(P2) ;GET PROCESSOR OR TABLE POINTER
TXNE T2,FS.NOS ;SEE IF "NO" SWITCH
JRST [HLRZ N,P1 ;IF SN STYLE, GET NO INDICATOR
MOVEI N,1(N) ;SET N=0 IF NO, 1 IF NOT NO
JRST KEYWDA] ;GO STUFF RESULT
CAIN C,":" ;SEE IF VALUE SPECIFIED
JRST KEYWD2 ;YES--GO CHECK INTO IT
; HERE WHEN DEFAULT NEEDED
KEYWD1: TXNE T2,FS.VRQ ;SEE IF VALUE REQUIRED
JRST E.SVR## ;YES--GIVE ERROR
TLNN T1,-1 ;SEE IF MAX SET
JUMPN T1,KEYWDJ ;NO--DIRECT ACTION
JRST KEYWD8 ;YES--GO STORE DEFAULT
; HERE WHEN VALUE SPECIFIED BY USER (MAY BE NULL)
KEYWD2:;JUMPE T1,E$$NMA ;IF NO VALUE LEGAL, GIVE ERROR
JUMPG T1,KEYWDJ ;IF SPECIAL PROCESSOR, GO DO IT
PUSHJ P,SIXSW ;VALUE IS ANOTHER KEYWORD--GET IT
MOVE T1,@SWM(P2) ;REFETCH SUB-KEY POINTER
PUSHJ P,.NAME ;LOOK IT UP
JRST E.UKK## ;ERROR
SUB T1,@SWM(P2) ;DETERMINE INDEX AS VALUE
MOVEI N,(T1) ;PLACE IN VALUE (1,2,...)
JRST KEYWD8 ;AND GO STORE IT AWAY
; HERE IF SN SWITCH TO LOOK FOR VALUES
KEYWDA: JUMPE N,KEYWD8 ;IF NO, PROCEED (NO VALUES)
CAIE C,":" ;SEE IF VALUE COMING
JRST KEYWD8 ;NO--THAT'S IT
KEYWDB: PUSHJ P,SIXSW ;GET VALUE AS NAME
MOVE T1,[IOWD YNTABL,YNTAB] ;TRY YES-NO TABLE
PUSHJ P,.NAME ;LOOK UP NAME
JRST E.UKK## ;UNKNOWN
MOVEI N,(T1) ;GET LOCATION OF MATCH
SUBI N,YNTAB ;GET OFFSET IN TABLE
ANDI N,1 ;GET YES/NO SETTING
JRST KEYWD8 ;RETURN THAT VALUE
; HERE TO GO TO SWITCH PROCESSOR
KEYWDJ: PUSHJ P,(T1) ;GO DO IT
JFCL ;GO STORE
; HERE TO STORE SWITCH
KEYWD8: LDB T1,@SWP(P2) ;GET STORED VALUE
CAME T1,[-1] ;SEE IF SET
JRST [CAME T1,N ;SAME AS BEFORE?
SKIPE INISCN ;IN SWITCH.INI?
JRST .SWDON## ;YES--JUST FORGET
JRST E.DSI##] ;NO--ERROR
DPB N,@SWP(P2) ;NO--STORE VALUE
JRST .SWDON## ;AND RETURN W/O STORE
; TABLE OF YES/NO VALUES--MUST BE NO/YES PAIRS
YNTAB: SIXBIT /0/
SIXBIT /1/
SIXBIT /NO/
SIXBIT /YES/
SIXBIT /OFF/
SIXBIT /ON/
YNTABL==.-YNTAB
; ROUTINE TO READ SIXBIT WORD IGNORING LEADING SPACES
SIXSW: PUSHJ P,.TIAUC## ;PRIME THE PUMP
CAIN C," " ;SPACE?
PUSHJ P,.TIAUC## ;YES--GET A REAL CHAR
PJRST .SIXSC## ;READ SIXBIT (CHAR IN C)
; ROUTINE TO LOOKUP SWITCH IN TABLE
SWTNAM: PUSHJ P,.NAME## ;LOOKUP IN TABLE
POPJ P, ;NOT FOUND
HRRZ T2,SWN(P2) ;GET START
MOVEI P1,(T1) ;GET MATCH
SUBI P1,(T2) ;COMPUTE OFFSET
JRST .POPJ1## ;AND SKIP RETURN
SUBTTL SCAN switch processing -- SWITCH - Read SWITCH.INI
SWITCH: HRRZ T1,COMIDX ;GET INVOKING COMMAND INDEX
MOVE T1,COMOBK(T1) ;POINT TO APPROPRIATE SWITCH TABLES
SETOM INISCN ;FLAG IN SWITCH.INI OSCAN
TLNN F,FL.WLD ;FUNNY PPN'S GET NO SWITCH.INI
PUSHJ P,.OSCAN## ;READ SWITCH.INI
SETZM INISCN ;DONE WITH SWITCH.INI
MOVE T3,TTBITS ;GET TTY BITS
TXNN T3,GL.ITY ;PTY?
POPJ P, ;NO--DONE
SETZM U.PASS ;DON'T CONFUSE BATCON OR OPSER
POPJ P, ;RETURN
SUBTTL SCAN switch defaulting -- TTYDEF - Terminal parameters
TTYDEF: SKIPG T1,U.SPED ;DID HE SAY /SPEED:N?
JRST TTYDE1 ;NOPE
MOVEM T1,U.RSPD ;YES -- SET BOTH RCV AND XMIT
MOVEM T1,U.XSPD ;SPEED TO N
TTYDE1: MOVEI T1,1 ;A BIT
SKIPG U.STOP ;STOP?
SKIPLE U.SSTOP ;OR SSTOP?
MOVEM T1,T.STOP ;YES--SET STOP
SKIPLE U.SSTOP ;SSTOP?
MOVEM T1,T.SSTOP ;YES--SET SSTOP TOO
POPJ P, ;RETURN
SUBTTL Set routines -- ASNDEV - Assign devices
ASNDEV: PUSHJ P,.SAVE1## ;SAVE P1
MOVSI P1,-DVICES ;AOBJN POINTER
ASNDE1: SETZB T1,T3 ;SET UP OPEN BLOCK
SKIPN T2,DEVTAB+0(P1) ;GET PHYSICAL NAME
POPJ P, ;DONE
OPEN IOC,T1 ;INIT DEVICE
JRST ASNDE3 ;FAILED
MOVEI T1,IOC ;CHANNEL NUMBER
SKIPN T2,DEVTAB+1(P1) ;GET LOGICAL NAME
JRST ASNDE2 ;NONE--KEEP GOING
DEVLNM T1, ;ASSIGN LOGICAL NAME
JRST ASNDE3 ;CAN'T
ASNDE2: MOVE T1,THSJOB ;SET ASSCON BY REASSIGN
MOVEI T2,IOC ;CHANNEL NUMBER
REASSI T1, ;ASSIGN DEV:LOG
SKIPA ;ONWARD
ASNDE3: WARN CAD,<Cannot assign device >,,E.CAD
RELEAS IOC, ;GIVE UP CHANNEL
AOS P1 ;ACCOUNT FOR TWO WORD ENTRIES
AOBJN P1,ASNDE1 ;LOOP THROUGH DEVICE LIST
POPJ P, ;RETURN
E.CAD: MOVE T1,DEVTAB+0(P1) ;GET DEVICE NAME
PUSHJ P,.TSIXN## ;PRINT IT
SKIPN DEVTAB+1(P1) ;HAVE A LOGICAL NAME?
POPJ P, ;NO--DONE
MOVEI T1,[ASCIZ / logical name /]
PUSHJ P,.TSTRG## ;PRINT TEXT
MOVE T1,DEVTAB+1(P1) ;GET LOGICAL NAME
PJRST .TSIXN## ;PRINT IT AND RETURN
SUBTTL Set routines -- CRESFD - Create SFDs
CRESFD: SETOM UFDFSN ;START WITH FIRST STR
CRESF1: MOVE T2,UFDFSN ;GET STR NAME
MOVE T1,[3,,T2] ;POINTER TO ARG BLOCK
JOBSTR T1, ;GET NEXT STR
POPJ P, ;EMPTY S/L
JUMPE T2,.POPJ## ;JUMP IF WE ARE UP TO FENCE
AOJE T2,.POPJ## ;OR END OF LIST IN ONE-STR SYSTEMS
SOS T2 ;ACCOUNT FOR AOJE
MOVEM T2,UFDFSN ;SAVE STR NAME
MOVE T1,[2,,T2] ;POINTER TO ARG BLOCK
DSKCHR T1, ;GET AMOUNT OF LOGGED-IN QUOTA
JRST CRESF2 ;FAIL-SKIP THIS STR
TRNN T3,-1 ;ANY BLOCKS LEFT?
JRST CRESF2 ;NO - SKIP THIS STR
TXNE T4,DF.SWL ;UNLESS SOFTWARE W/L STR
CRESF2: TDZA T1,T1 ;INDICATE DONT CREATE SFDS
MOVEI T1,1 ;FLAG TO CREATE SFDS
SKIPN U.SFDC ;USER WANT THEM CREATED?
MOVEI T1,0 ;NO--FLAG NOT TO CREATE EVEN IF WE COULD
PUSHJ P,ENTPTH ;CREATE SFD'S AS NEEDED
JRST CRESF1 ;LOOP OVER ALL ACTIVE STRS
SUBTTL Set routines -- PRETMS/POSTMS - Set terminal parameters
; ROUTINE TO RO PRE-MESSAGE TRMOPS
PRETMS: PUSHJ P,TTYDEF ;DEFAULT TERMINAL PARAMETERS
MOVE T1,[-TTLNTH,,TTAB] ;TABLE OF PRE-NOTICE TRMOP.S
PJRST TRMOPL ;DO TRMOPS AND RETURN
; ROUTINE TO DO POST-MESSAGE TRMOPS
POSTMS: MOVEI P1,^D120 ;WAIT FOR TTY OUTPUT FOR 2 MIN.
POSTM1: MOVE T1,[XWD 2,T2] ;SET UP POINTER FOR TRMOP.
MOVEI T2,.TOSOP ;SKIP IF OUTPUT BUFFER NON-EMPTY
MOVE T3,TTYUDX ;OUR UNIVERSAL I/O INDEX
TRMOP. T1, ;IF OUTPUT BUFFER EMPTY OR TRMOP.
JRST POSTM2 ;FAILED, ASSUME OK AND RETURN
MOVEI T1,1 ;SLEEP FOR ONE SECOND
SLEEP T1, ;ZZZZZZ
SOJG P1,POSTM1 ;IF STILL PATIENT, KEEP SLEEPING
POSTM2: MOVE T1,[-PTLNTH,,PTAB] ;TABLE OF POST-NOTICE TRMOP.S
PJRST TRMOPL ;DO THEM UP
SUBTTL Set routines -- PRVSET - Set all privileged parameters
PRVSET: PUSHJ P,SETSPL ;SET SPOOLING PARAMETERS
PUSHJ P,SETCOR ;SET CORE LIMITS
PUSHJ P,SETENQ ;SET ENQ/DEQ QUOTAS
PUSHJ P,SETSCD ;SET SCHEDULER PARAMETERS
PUSHJ P,SETACT ;SET ACCOUNT STRING
PUSHJ P,SETIPC ;SET IPCF QUOTAS
PUSHJ P,SETCTX ;SET CONTEXT QUOTAS
POPJ P,
SUBTTL Set routines -- USRSET - Set all unprivileged parameters
USRSET: PUSHJ P,CRESFD ;CREATE SFDS
PUSHJ P,SETPTH ;SET PATH
PUSHJ P,SETWAT ;SET WATCH
PUSHJ P,SETDSF ;SET DSKFUL
PUSHJ P,SETDSP ;SET DSKPRIORITY
PUSHJ P,SETLOC ;SET JOB'S LOCATION FOR SPOOLING
PUSHJ P,SETDEF ;SET DEFAULTS
PUSHJ P,SETVMX ;SET CURRENT VIRTUAL AND PHYSICAL LIMITS
PUSHJ P,PRETMS ;DO PRE-MESSAGE TRMOPS
PUSHJ P,ASNDEV ;ASSIGN DEVICES
POPJ P,
SUBTTL Set routines -- SETACT - Set account string
SETACT: MOVE T1,U.ACTS ;GET ACCOUNT STRING
AOJE T1,.POPJ## ;RETURN IF NONE TO SET
MOVE T1,[.ACTCH,,T2] ;SET UP UUO AC
MOVEI T2,1 ;ONE ARGUMENT
HRROI T3,U.ACTS ;SEVEN BIT BYTE POINTER TO ACCOUNT STRING
ACCT. T1, ;TELL THE MONITOR THE USER'S ACCOUNT STRING
SKIPA ;FAILED
POPJ P, ;RETURN
SKIPE .JBDDT## ;DEBUGGING?
JRST SETAC1 ;YES--JUST MAKE IT A WARNING
MOVE T2,STATS2 ;GET SECOND STATES WORD
TXNE T2,ST%ACV ;ACCOUNT VALIDATION REQUIRED?
STOP FSA,<Cannot set account string; ACCT. UUO error >,EF.WTO,.TOCTW##
SETAC1: WARN WSA,<Cannot set account string>,EF.WTO
POPJ P, ;AND RETURN
SUBTTL Set routines -- SETCOR - Set core limits
SETCOR: LDB T3,[POINTR AENTRY+.AECOR,AE.NPP] ;GET PHYS. LIMIT
LDB T4,[POINTR AENTRY+.AECOR,AE.NVP] ;GET VIRT LIM
SKIPG T1,U.CORE ;GET /CORE ARG IF ONE
JRST SETCO2 ;NO ARG--USE PHYS. LIMIT
CAIL T1,1000 ;IS ARG ALREADY IN WORDS ?
JRST SETCO1 ;YES--SKIP ON
CAILE T1,^D256 ;IS ARG UNREASONABLE ?
LSH T1,^D9 ;YES--ASSUME HE MEANT P AND CONVERT
CAIG T1,^D256 ;IS ARG IN K ?
LSH T1,^D10 ;YES--CONVERT TO WORDS
SETCO1: LSH T1,-11 ;CONVERT TO PAGES
CAML T3,T1 ;IS /CORE ARG .LT. OR = PHYS. LIMIT
MOVE T3,T1 ;NO--USE PHYS. LIMIT FROM /CORE
SETCO2: HRL T3,T4 ;MAKE IT VIRT,,PHYS
MOVE T1,[.STUVM,,T3] ;LOAD POINTER TO STUFF
PUSHJ P,SETXXX ;SET VM LIMITS
WARN SVM,<Set maximum virtual and physical limits failed>
POPJ P, ;RETURN
SUBTTL Set routines -- SETCTX - Set context quotas
SETCTX: MOVEI T1,.CTSQT ;FUNCTION CODE TO SET QUOTAS
PUSHJ P,CTXINI ;INIT CONTEXT BLOCKS
SETOM CTXDAT+.CTJOB ;-1 FOR OUR JOB
MOVE T1,AENTRY+.AECTX ;COPY CONTEXT QUOTA WORD
LDB T2,[POINTR T1,AE.CNQ] ;GET CONTEXT QUOTA
MOVEM T2,CTXDAT+.CTCTQ ;SAVE
LDB T2,[POINTR T1,AE.CPQ] ;GET SAVED PAGE QUOTA
MOVEM T2,CTXDAT+.CTPGQ ;SAVE
PUSHJ P,CTXUUO ;EXECUTE CONTEXT UUO AND PROCESS ERRORS
JFCL ;FAILED (MESSAGE ALREADY PRINTED ON TTY)
POPJ P, ;RETURN
SUBTTL Set routines -- SETDEF - Set DEFAULT
SETDEF:
; FILE PROTECTION
MOVE T1,[.STDEF,,T2] ;SETUUO FOR DEFAULTS
HRRZI T2,.STDPC ;FUNCTION CODE FOR FILE PROTECTION
SKIPGE T3,U.DFPR ;SWITCH SPECIFIED?
JRST SETDE1 ;NO - SKIP THE SETUUO
PUSHJ P,SETXXX ;SET DEFAULT FILE PROTECTION
WARN SFP,<Set default file protection failed>
; ATTACH ASK/IGNORE
SETDE1: MOVE T1,[.STDEF,,T2] ;SET UUO FOR DEFAULTS
MOVSI T2,1 ;ASSUME IGNORE
HRRI T2,.STDAD ;FUNCTION CODE
SKIPL T3,U.ATT ;DID USER TYPE A /ATTACH SWITCH?
CAIE T3,ATTIGN ;YES. DID HE SAY TO IGNORE ATTACH PROMPTING?
TDZA T3,T3 ;NO. DEFAULT TO ASK
SETOM T3 ; SET JOB'S DEFAULT TO DON'T ASK
PUSHJ P,SETXXX ;SET ATTACH
WARN SAF,<Set ATTACH failed>
; DEFAULT BUFFERS
MOVE T1,[.STDEF,,T2] ;SETUP ARGS
MOVEI T2,.STDNB ;SUBFUNCTION DEFAULT BUFFERS
SKIPGE T3,U.DFBU ;GET USERS SWITCH VALUE
JRST SETDE2 ;NONE GIVEN
PUSHJ P,SETXXX ;SET DEFAULT BUFFERS
WARN SBN,<Set default buffers failed>
;HERE TO SET DEFAULT BIGBUF
SETDE2: SKIPGE T3,U.DFBB ;SEE IF BIGBUF GIVEN
POPJ P, ;NO
HRLZS T3 ;POSITION TO LH FOR JOB-WIDE DEFAULT
MOVE T1,[.STDEF,,T2] ;SETUP ARGS
MOVEI T2,.STDSB ;SUBFUNCTION DEFAULT BIGBUF
PUSHJ P,SETXXX ;SET DEFAULT BIGBUF
WARN SBB,<Set default big buffers failed>
POPJ P, ;RETURN
SUBTTL Set routines -- SETDSF - Set DSKFUL
SETDSF: SKIPGE T2,U.DFUL ;GET DISK FULL SWITCH
POPJ P, ;RETURN
CAIN T2,DSKFER ;ERROR?
MOVX T1,.DFERR ;YES--SET ERROR ARG
CAIN T2,DSKFPA ;PAUSE?
MOVX T1,.DFPSE ;YES--SET THAT
HRLI T1,.STDFL ;SET FUNCTION
PUSHJ P,SETXXX ;SET DSKFUL
WARN SDF,<Set DSKFUL failed>
POPJ P, ;RETURN
SUBTTL Set routines -- SETDSP - Set DSKPRIORITY
SETDSP: SKIPN T1,U.DPRI ;GET DISK PRIORITY
POPJ P, ;NONE SPECIFIED
LDB T2,[POINTR AENTRY+.AEPRV,JP.DPR] ;GET VALUE FROM PROFILE
JUMPE T2,.POPJ## ;NONE ALLOWED
CAILE T1,(T2) ;IS SWITCH VALUE WITHIN LIMITS?
MOVEI T1,(T2) ;NO--USE LIMITS FROM USER'S PROFILE
HRLI T1,-2
MOVE T2,[.DUPRI,,T1] ;ARG POINTER
DISK. T2, ;DO THE UUO
WARN SDP,<Can not set disk priority>
POPJ P, ;RETURN
SUBTTL Set routines -- SETENQ - Set ENQ/DEQ parameters
SETENQ: MOVE T1,AENTRY+.AEENQ ;GET ENQ/DEQ QUOTA
HRLZ T1,T1 ;PUT QUOTA IN LEFT HALF
HRR T1,THSJOB ;AND JOB NUMBER IN RIGHT HALF
MOVE T2,[XWD 2,T1] ;SET UP POINTER TO ARG
ENQC. T2, ;DO IT UP
CAMN T2,[XWD 2,T1] ;AC UNCHANGED (UUO NOT IMPLEMENTED)?
POPJ P, ;YES--DON'T BOTHER USER
MOVE T1,T2 ;PICK UP ERROR CODE
WARN EUF,<ENQC. UUO failederror code = >,EF.WTO,.TOCTW##
POPJ P, ;RETURN
SUBTTL Set routines -- SETGLX - Set GALAXY batch parameters
SETGLX: TLNN F,FL.BAT ;BATCH JOB?
POPJ P, ;NO
; SET WTO/WTOR PRIVS
SKIPGE T1,U.BINT ;GET /BATINT VALUE
MOVEI T1,1 ;ASSUME YES INCASE BATCON FORGOT THIS SWITCH
MOVE T1,[.OBNWR ;WTO ALLOWED
.OBALL](T1) ;WTO AND WTOR ALLOWED
HRLI T1,.STWTO ;SETUUO FUNCTION CODE
PUSHJ P,SETXXX ;SET WTO/WTOR PRIVS
WARN SWT,<Set write to OPR privileges failed>
; SET BATCH STREAM NUMBER
SKIPGE T1,U.BSTR ;GET /BATSTR VALUE
POPJ P, ;THERE WASN'T ONE
HRLI T1,.STBSN ;SETUUO FUNCTION CODE
PUSHJ P,SETXXX ;SET BATCH STREAM NUMBER
WARN SBS,<Set batch stream number failed>
POPJ P, ;AND RETURN
SUBTTL Set routines -- SETIPC - Set IPCF quotas
SETIPC: MOVE T1,STATS2 ;GET 2ND STATES WORD
TXNN T1,ST%IPC ;DO WE HAVE IPCF?
POPJ P,0 ;NO--RETURN NOW
MOVE T1,[%IPCCP] ;GET THE PID OF [SYSTEM]IPCF
GETTAB T1, ; ..
POPJ P,0 ;CAN NOT FAIL
MOVEM T1,TOPID ;SAVE AS TARGET OF THIS MESSAGE
MOVX T1,IP.CFP ;INDICATE THAT I HAVE PRIVS AND
MOVEM T1,IPCFLG ; WANT TO USE THEM
MOVE T1,[3,,IPCMSG] ;POINTER TO THE MESSAGE
MOVEM T1,IPCPTR ; ..
MOVX T1,.IPCSQ ;WANT TO SET QUOTA
MOVEM T1,IPCMSG ;STORE AS FUNCTION
HRRZ T1,AENTRY+.AEIPC ;GET IPCF QUOTAS
MOVEM T1,IPCQTA ;STORE IT AWAY
MOVE T1,THSJOB ;GET MY JOB NUMBER
MOVEM T1,IPCJOB ;STORE THAT AWAY
MOVEM T1,FMPID ;ALSO LOAD AS SENDERS PID
MOVE T1,[4,,IPCFLG] ;POINTER TO THE MESSAGE
IPCFS. T1, ;SEND IT
JRST IPCSER ;SEND ERROR
MOVX T1,IP.CFB ;SAY WE DON'T WANT TO BLOCK
MOVEM T1,IPCFLG
MOVE T1,[4,,IPCFLG] ;SET UP TO GET BACK AN
IPCFR. T1, ; ANSWER.
JRST IPCRER ;NO ANSWER
MOVE T1,IPCFLG ;GET THE FALGS WORD
TXNN T1,IP.CFE ;ANY ERROR CODE?
POPJ P,0 ;NO--RETURN
WARN ESI,<Error from [SYSTEM]IPCF>,EF.WTO
POPJ P,0 ;ALL DONE
JRST IPCQER ;TELL HIM MORE
IPCSER: WARN STI,<Send to [SYSTEM]IPCF failed; error >,EF.WTO,.TOCTW##
JRST IPCQER ;TELL HIME MORE
IPCRER: CAIN T1,IPCNP% ;QUEUE EMPTY?
POPJ P,0 ;YES--ALL IS WELL
WARN RFI,<Receive from [SYSTEM]IPCF failed; error >,EF.WTO,.TOCTW##
IPCQER: WARN IQS,<IPCF quotas may not be set correctly>
POPJ P,0 ;RETURN
SUBTTL Set routines -- SETLOC - Set job's location for spooling
SETLOC: MOVE T1,U.STA ;GET STATION
CAME T1,[-1] ;SEE IF SPECIFIED
JRST SETLO1 ;ONE WAS SPECIFIED, USE IT
MOVEI T1,.GTLOC ;GETTAB FOR NODE # OF CENTRAL SITE
GETTAB T1, ;GET CENTRAL SITE NODE NUMBER
POPJ P, ;MONITOR MUST NOT SUPPORT NETWORKS
HRROI T2,.GTLOC ;THIS JOB'S LOCATION
GETTAB T2, ;GET THAT
POPJ P, ;NO NETWORK SOFTWARE
CAMN T1,T2 ;ALREADY LOCATED AT CENTRAL SITE?
POPJ P, ;YES, NO POTENTIAL PROBLEMS THEN
MOVEM T2,NODLOC ;STORE THIS JOB'S LOCATION IN NODE BLOCK
MOVEI T2,5 ;LENGTH OF THE ARGUMENT BLOCK
MOVEM T2,NODLEN ;STORE IN NODE UUO ARGUMENT BLOCK
DMOVE T2,[EXP .TYLPT,.TYMCR] ;DEVICE TYPES
DMOVEM T2,NODDEV ;STORE THAT IN THE ARGUMENT BLOCK
MOVE T2,[.NDRCI,,NODBLK] ;NODE UUO ARGUMENT
NODE. T2, ;GET NODE CONFIGURATION INFORMATION
POPJ P, ;NOT IMPLEMENTED?
HLRZ T2,NODDEV+1 ;SEE IF LOCATED NODE HAS AN MCR
JUMPN T2,SETLO1 ;IF SO, THEN LOCATE AT CENTRAL STATION
HLRZ T2,NODDEV+0 ;NOW SEE IF STATION AS AT LEAST ONE LPT
JUMPN T2,.POPJ## ;IF SO, THEN USER CAN GET LISTINGS
SETLO1: LOCATE T1, ;SET JOB'S LOCATION FOR SPOOLING
CAIN T1,0 ;FAILED--SEE IF FOR CENTRAL SITE
SKIPA ;OK OR POSSIBLY NETSER NOT LOADED
WARN LUF,<LOCATE UUO failed>
POPJ P, ;RETURN
SUBTTL Set routines -- SETPTH - Set PATH
SETPTH: HRREI T1,.PTFSD ;FUNCTION TO SET DEFAULT PATH
MOVEM T1,PTHBUF+.PTFCN ;STORE IN ARGUMENT BLOCK
SKIPGE T1,U.SCAN ;SCAN SWITCH GIVEN
MOVEI T1,AD.YN ;NO--SETUP DEFAULT
ADDI T1,.PTSCN ;ADJUST TO START OF RANGE
MOVEM T1,PTHBUF+.PTSWT ;SAVE SWITCH IN ARGUMENT BLOCK
MOVE T1,[.PTMAX,,PTHBUF] ;DO THE PATH UUO TO SET
PATH. T1, ; DEFAULT PATH
SKIPA T1,[1,,PTHBUF+.PTPPN] ;FAILED--POINT TO PATH BLOCK
JRST SETPT1 ;ONWARD
WARN CSP,<Can not set path to >,,.TDIRB##
SETZM PTHBUF+.PTSFD ;CLEAR SFDS IN CASE THEY DIDNT EXIST
MOVE T1,[.PTMAX,,PTHBUF];SETUP ARGS AGAIN
PATH. T1, ;ONE MORE TRY
WARN CSS,<Can not set /SCAN switch>
SETPT1: SETZM PTHBUF+.PTSWT ;CLEAR THE SWITCHES
SKIPN LIBSPC+.FXDIR ;IF THERE IS NO LIB REQUESTED
SETZM PTHBUF+.PTPPN ;CLEAR THE LIB PPN
HRREI T1,.PTFSL ;CHANGE FUNCTION TO SET DEFAULT
MOVEM T1,PTHBUF+.PTFCN ; LIBRARY
SKIPGE T1,U.SYS ;WAS /SYS GIVEN?
MOVEI T1,AD.YN ;NO--SET DEFAULT
JUMPE T1,SETPT2 ;JUMP IF NOSYS
MOVX T1,PT.SSY ;ELSE ADD SYS BIT
IORM T1,PTHBUF+.PTSWT ; INTO ARGUMENT
SETPT2: SKIPGE T1,U.NEW ;WAS /NEW GIVEN
MOVEI T1,AD.YN ;NO--SUPPLY ABSENT DEFAULT
JUMPE T1,SETPT3 ;JUMP IF NONEW
MOVX T1,PT.SNW ;SET THE NEW BIT IN
IORM T1,PTHBUF+.PTSWT ; PATH. UUO ARGUMENT BLOCK
SETPT3: SKIPN T1,LIBSPC+.FXDIR ;GET LIB PPN
JRST SETPT4 ;JUMP IF NONE
TLNN T1,-1 ;IS PROJECT # ZERO?
HLL T1,PP ;YES - USE USER'S
TRNN T1,-1 ;ZERO PROGRAMMER NO.?
HRR T1,PP ;DEFAULT TO USER'S OWN
MOVEM T1,PTHBUF+.PTPPN ;STORE PPN
MOVX T1,PT.LIB ;SET THE LIB BIT
IORM T1,PTHBUF+.PTSWT ;SET /LIB
SETPT4: MOVE T1,[.PTMAX,,PTHBUF] ;DO THE PATH UUO
PATH. T1, ; ..
JFCL ; ..
POPJ P, ;RETURN
SUBTTL Set routines -- SETSCD - Set scheduler parameters
SETSCD: MOVE T1,STATS2 ;GET 2ND STATES WORD
TXNN T1,ST%NCS ;SKIP THIS IF 6.03 SCHEDULER IN WMU MODE
TXNN T1,ST%SHC ;DOES MONITOR HAVE SCHED. UUO?
POPJ P, ;NO--SKIP THIS STUFF
LDB T4,[POINTR AENTRY+.AESCD,AE.SCT] ;GET TIMESHARING SCHED CLASS
TLNE F,FL.BAT ;BATCH JOB?
LDB T4,[POINTR AENTRY+.AESCD,AE.SCB] ;YES, USE BATCH CLASS INSTEAD
MOVX T1,%SSMSI ;NOW GETTAB THE MEDIUM-TERM
GETTAB T1, ;SCHEDULING INTERVAL TO SEE
POPJ P, ;CLASS SCHEDULER NOT RUNNING
JUMPE T1,SETSC2 ;IF INTERVAL=0, CLASS SCHEDULER
;ISN'T RUNNING SO SKIP CHECKS
MOVX T1,%SSSET ;CHECK FLAG FOR CLASS
GETTAB T1, ;SCHEDULING
SETO T1, ;NOT WMU CLASS SCHEDULER
JUMPE T1,SETSC2 ;SKIP CHECKS IF RUNNING ROUND ROBIN
HRRZI T1,.GTCQP ;NOW GET CPU QUOTA FOR THIS CLASS
HRL T1,T4 ;T4 HAS OUR CLASS
GETTAB T1,
POPJ P, ;MONITOR NOT BUILT FOR CLASS SCHEDULER
TRNE T1,-1 ;IF PRIMARY % NON-ZERO,
JRST SETSC2 ;WERE OK
MOVE T2,[%SSBBQ] ;CHECK BACKROUND BATCH
GETTAB T2, ;GET BB CLASS
SETO T2, ;NO BB
CAMN T2,T4 ;IS USER IN BB?
JRST SETSC2 ;YES, HE IS OK
JUMPL T1,SETSC1 ;GIVE ERROR IF FIXED SWAPIN BIT SET
HRRZI T1,.GTSQP ;NOW GETTAB SECONDARY ALLOCATION
HRL T1,T4 ;FOR THIS CLASS
GETTAB T1,
JRST SETSC2 ;NOT WMU SCHEDULAR
JUMPN T1,SETSC2 ;OK IF THERE IS A SECONDARY QUOTA
SETSC1: FATAL CWR,<CPU class quota is zero; You would never run>
SETSC2: HRLI T4,-1 ;-1 MEANS THIS JOB
MOVE T1,[1,,T2] ;SET UP POINTER FOR SCHED. UUO
MOVE T2,[.SCSJC,,T3] ;XWD FUNC, LOC OF ARG LIST
MOVEI T3,1 ;ONLY ONE ARGUMENT
SCHED. T1, ;ZAP!
CAMN T1,[1,,T2] ;FAILED--SEE IF NOT IMPLEMENTED
POPJ P, ;OK OR NOT IMPLEMENTED
WARN SCF,<SCHED. UUO failed; error code = >,EF.WTO,.TOCTW##
POPJ P, ;RETURN
BYTTAB: POINT 9,(T1),8 ;BYTE PTR FOR REMAINDER=0
POINT 9,(T1),17 ;REMAINDER=1
POINT 9,(T1),26 ;T1 HAS ADDR OF WORD TO LOOK AT
POINT 9,(T1),35
SUBTTL Set routines -- SETSPL - Set spooling parameters
SETSPL: SKIPGE T1,U.TIME ;WANT TIME LIMIT SET?
JRST SETSP1 ;NO--CHECK SPOOL
HRLI T1,.STTLM ;YES--SET UP ENTIRE ARGUMENT
PUSHJ P,SETXXX ;SET TIME LIMIT
WARN STL,<Set time limit failed>
SETSP1: HRROI T1,.GTSPL ;GET SPOOL BITS FOR JOB TO SEE
GETTAB T1, ;IF SYSTEM HAS SPOOLING. IF NOT,
POPJ P, ;DON'T TRY TO SET SPOOL BITS
MOVE T1,AENTRY+.AESPL ;GET SPOOL BITS
IOR T1,U.SPL ;OR IN ONES REQUESTED BY USER
HRLI T1,.STSPL ;COMPLETE ARGUMENT
TRZ T1,-JS.PAL-1 ;CLEAR BITS WHICH AREN'T DEVICES
PUSHJ P,SETXXX ;SET SPOOL BITS
WARN SSB,<Set spool bits failed>
LDB T1,[POINTR AENTRY+.AEPRX,JP.OPR];GET OPERATOR PRIVILEGE CODE
HRLI T1,.STOPP
PUSHJ P,SETXXX ;SET GALAXY OPR PRIVS
WARN SOP,<Set OPR privileges failed>
SKIPGE T1,U.DFER ;WAS THERE A /DEFER SWITCH?
POPJ P, ;NO
HRLI T1,.STDFR ;SETUUO CODE FOR DEFERRED SPOOLING
PUSHJ P,SETXXX ;SET DEFERRED SPOOLING
WARN SDS,<Set deferred spooling failed>
POPJ P, ;RETURN
SUBTTL Set routines -- SETVMX - Set current virtual and physical limits
SETVMX: MOVEI T3,0 ;PRESET ANSWER TO ZERO
SKIPGE T1,U.CVPL ;GET CURRENT VIRT LIMIT
JRST SETVM1 ;NONE SUPPLIED
CAIG T1,^D512 ;JUST A NUMBER?
IMULI T1,^D1024 ;YES--CONVERT TO WORDS
LSH T1,-9 ;CONVERT TO PAGES
HRL T3,T1 ;USER SUPPLIED ONE -- USE IT
SETVM1: SKIPGE T1,U.CPPL ;GET CURRENT PHYS LIMIT
JRST SETVM2 ;NONE SUPPLIED--LEAVE ZERO
CAIG T1,^D512 ;JUST A NUMBER?
IMULI T1,^D1024 ;YES--CONVERT TO WORDS
LSH T1,-9 ;CONVERT TO PAGES
HRR T3,T1 ;USER SPECIFIED ONE -- USE IT
SETVM2: JUMPE T3,.POPJ## ;JUMP IF NOTHING REQUESTED
SKIPG U.LIMIT ;SKIP IF /LIMIT
SKIPN U.GUID ;SKIP UNLESS /NOGUIDELINE GIVEN
TRO T3,400000 ;SET THE BIT
MOVE T1,[.STCVM,,T3] ;ARGUMENT TO SET UUO
PUSHJ P,SETXXX ;SET CURRENT VIRTUAL AND PHYSICAL LIMITS
WARN SCV,<Set current virtual and physical limits failed>
POPJ P, ;RETURN
SUBTTL Set routines -- SETWAT - Set watch bits
SETWAT: SKIPN U.NWAT ;SKIP IF NO /NOWATCH
POPJ P, ;NO
MOVE T1,AENTRY+.AEWCH ;GET WATCH BITS
HRLZ T2,U.WAT ;GET WATCH BITS
LSH T2,WCHLSH ;SHIFT TO CORRECT PLACE
IOR T1,T2 ;OR IN THE USER SETTINGS
MOVE T2,.FLVRB## ;GET /VERBOSITY FROM SCAN
LSH T2,^D6 ;SHIFT OVER TO RIGHT PLACE
ANDI T2,700 ;THROW AWAY GARBAGE BITS
IOR T1,T2 ;OR INTO WATCH BITS
HLRZS T1 ;PUT IN RH FOR UUO
HRLI T1,.STWTC ;SET WATCH FUNCTION
PUSHJ P,SETXXX ;SET WATCH BITS
WARN SWB,<Set watch failed>
POPJ P, ;RETURN
SUBTTL Set routines -- SETXXX - Do a SETUUO
SETXXX: SETUUO T1, ;DO THE UUO
POPJ P, ;FAILED
JRST .POPJ1## ;RETURN
SUBTTL Set routines -- TRMOP - TRMOP. UUO loop processor
TRMOPL: SKIPN U.SETT ;/NOSETTTY?
POPJ P, ;YES--RETURN
PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,T1 ;COPY AOBJN POINTER TO TABLE
TRMOP1: HLRZ T4,(P1) ;GET ADDR OF ARG FOR TRMOP.
MOVE T4,(T4) ;GET ACTUAL ARGUMENT
CAMN T4,[-1] ;IF -1,
JRST TRMOP2 ; SCAN DIDN'T TOUCH IT
MOVE T1,[3,,T2] ;SET UP UUO AC
HRRZ T2,(P1) ;GET TRMOP. FUNCTION CODE & FLAGS
MOVE T3,TTYUDX ;GET TTY UDX
TRZE T2,TF.CMP ;CLEAR FLAGS OUT OF T2 SO IT
TRC T4,1 ;YUP
TRMOP. T1,
PUSHJ P,TRMERR ;REPORT ERROR IF NECESSARY
TRMOP2: AOBJN P1,TRMOP1 ;GO ROUND AGAIN
POPJ P, ;ALL DONE
TRMERR: CAIE T1,TOILF% ;ILLEGAL FUNCTION?
CAIN T1,TOPRC% ;NOT PRIVILEGED?
POPJ P, ;IGNORE
PUSH P,T1 ;WATCH OUT FOR T1
HRRZ T1,(P1) ;PICK UP FUNCTION CODE
CAIN T1,.TOTRM+.TOSET ;TRYING TO SET TERMINAL TYPE
JRST TRMER1 ;YES
WARN TUF,<TRMOP. UUO failed; function code = >,,.TOCTW##
JRST TRMER2 ;FINISH UP
TRMER1: MOVE T1,T4 ;GET TYPE WE TRIED TO SET
WARN UTT,<Unknown terminal type >,,.TSIXN##
TRMER2: POP P,(P) ;PHASE STACK
POPJ P, ;RETURN
; MACRO TO GENERATE TRMOP TABLE ENTRIES
DEFINE X(TCODE,ARG,FLAGS),<XWD ARG,FLAGS!TCODE+.TOSET>
TF.CMP==1B18 ;USE COMPLEMENT OF VALUE STORED BY SCAN
; PRE-MESSAGE TABLE
TTAB: X .TOTRM,U.TYPE,0 ;DO TYPE SETTING FIRST THEN ALTER
X .TOALT,U.ALTM,TF.CMP ;TRMOP.S WHICH ARE DONE BEFORE
X .TOBLK,U.BLNK,TF.CMP ;PRINTING NOTICE.TXT
X .TONFC,U.CRLF,TF.CMP
X .TODBK,U.DBRK,0
X .TOLCP,U.LCP,0
X .TOFLC,U.FILL,0
X .TOFRM,U.FORM,0
X .TOSND,U.GAG,TF.CMP
X .TOLCT,U.LC,TF.CMP
X .TOPAG,U.PAGE,0
X .TOPSZ,U.PGSZ,0
X .TORTC,U.RTC,0
X .TOTAB,U.TABS,0
X .TOTAP,U.TAPE,0
X .TOWID,U.WDTH,0
X .TODEM,U.TTDE,0
X .TODIS,U.DISP,0
X .TOLCT,U.UC,0
X .TOTDY,U.TIDY,0
;; X .TOFFH,U.FFHO,0
;; X .TOFFF,U.FFSI,0
;; X .TOFFS,U.FFST,0
X .TOLNB,U.LENG,0
X .TOSBL,U.SBEL,0
X .TOSSZ,U.SSTO,0 ;STOP SIZE
X .TOSSZ,U.STOP,0 ; " "
X .TOXNF,U.XONXO,0
X .TOSTO,T.STOP,0 ;STOP BIT
X .TOSST,T.SSTOP,0 ;SSTOP BIT
X .TOUNP,U.UNPA,0 ;UNPAUSE CHARACTER (ACTS LIKE CONTROL-Q)
X .TOESC,U.ESCA,0 ;ESCAPE CHARACTER (ACTS LIKE ESCAPE ON TYPEIN)
X .TO8BT,U.8BIT,0 ;EIGHT-BIT TERMINAL
X .TOQOT,U.QUOT,0 ;TTY QUOTE ENABLED
X .TOCLE,U.ECHO,0 ;COMMAND MODE ECHO
TTLNTH==.-TTAB ;LENGTH OF TABLE
; POST-MESSAGE TABLE
PTAB: X .TORSP,U.RSPD,0 ;TRMOP.S WHICH SHOULD BE DONE
X .TOTSP,U.XSPD,0 ;AFTER PRINTING NOTICE.TXT
PTLNTH==.-PTAB ;LENGTH OF TABLE
SUBTTL Structure routines -- BLDJSL - Build job S/L
BLDJSL: PUSHJ P,.SAVE2## ;SAVE P1 AND P2
TRZ F,R.ACRE!R.ASTR ;CLEAR ANY CREATE AND ANY STR FLAGS
SKIPN P1,AENTRY+.AEAUX ;GET AOBJN POINTER TO AUXACC DATA
POPJ P, ;THERE ARE NO STRUCTURES FOR THIS GUY
ADDI P1,AENTRY ;INDEX INTO THE PROFILE
SETZ P2, ;CLEAR COUNT OF STRUCTURES PROCESSED
BLDJS1: SKIPN T2,.AUSTR(P1) ;ANOTHER STRUCTURE?
JRST BLDJS4 ;NOPE, END OF LIST
MOVE T1,[XWD 1,T2] ;SET UP UUO AC
DSKCHR T1, ;SEE IF STR IS IN SYSTEM
JRST BLDJS3 ;NO, DO NOT PUT IN SEARCH LIST
LDB T2,[POINTR(T1,DC.TYP)] ;GET STR TYPE
TXNN T1,DC.SAF ;SKIP IF SINGLE ACCESS
CAIE T2,.DCTFS ;IS IT FULL FILE STRUCTURE NAME?
JRST BLDJS3 ;IGNORE STRUCTURE
MOVX T1,AU.DNM ;BIT TO TEST
TDNE T1,.AUBIT(P1) ;DO NOT MOUNT?
JRST BLDJS3 ;THAT'S RIGHT
CAIGE P2,MAXFS ;TOO MANY STRS IN S/L?
JRST BLDJS2 ;GO ADD STR
WARN MTS,<More than >,,E.MTS
JRST BLDJS3 ;GIVE UP ON THIS STR
BLDJS2: TLNN F,FL.WLD ;WILDCARDED PPN?
PUSHJ P,ADDSTR ;NO--ADD STRUCTURE TO SEARCH LIST
SKIPA ;AND FO TO NEXT STRUCTURE
BLDJS3: SETOM .AUSTR(P1) ;INVALIDATE STRUCTURE NAME
ADDI P2,1 ;COUNT THE STRUCTURE JUST ADDED
ADD P1,[.AULEN-1,,.AULEN-1] ;ACCOUNT FOR MULTI-WORD ENTRIES
AOBJN P1,BLDJS1 ;LOOP
BLDJS4: JUMPG P2,.POPJ1## ;SKIP IF S/L HAS AT LEAST ONE STR
POPJ P, ;RETURN
E.MTS: MOVEI T1,MAXFS ;GET THE MAX
PUSHJ P,.TDECW## ;OUTPUT
MOVEI T1,[ASCIZ/ structures in search list; cannot add structure /]
PUSHJ P,.TSTRG##
MOVE T1,.AUSTR(P1) ;GET STR BACK
PJRST .TSIXN## ;TYPE AND RETURN
SUBTTL Structure routines -- MNTSTR - Mount structures (set RIPLOG)
MNTSTR: PUSHJ P,.SAVE1## ;SAVE P1
TLNE F,FL.WLD ;WILDCARD PPN?
TLO F,FL.GPN ;LITE SPECIAL FLAG FOR UFDSET
SKIPN P1,AENTRY+.AEAUX ;GET AOBJN POINTER TO AUXACC DATA
POPJ P, ;EMPTY S/L
ADDI P1,AENTRY ;INDEX INTO PROFILE
SKIPN .AUSTR(P1) ;EMPTY S/L?
POPJ P, ;YES
SETOM RDUFLG ;INIT RECOMP TYPEOUT FLAG
MNTST1: SKIPE T1,.AUSTR(P1) ;ANOTHER ONE IN THE WINGS?
CAMN T1,[EXP -1] ;DID WE INVALIDATE A STR NAME EARLIER?
JRST MNTST2 ;YES--IGNORE THIS ONE
MOVE T1,.AUBIT(P1) ;GET STATUS BITS
TXNN T1,DF.SWL!DF.SNC;CAN WE CREATE ON THIS STR
TRO F,R.ACRE ;YES-INDICATE CREATION POSSIBLE
PUSHJ P,UFDSET ;SET UP UFD FOR USER ON THIS STR
MNTST2: ADD P1,[.AULEN-1,,.AULEN-1] ;ACCOUNT FOR MULTI-WORD ENTRIES
AOBJN P1,MNTST1 ;LOOP THROUGH S/L
POPJ P, ;DONE
SUBTTL Structure routines -- SSLCOP - Copy the system search list
SSLCOP: PUSHJ P,.SAVE2## ;SAVE P1 AND P2
MOVEI P1,AENTRY+.AEMIN ;POINT TO END OF STATIC PROFILE
MOVEI P2,GOBBLK ;POINT TO GOBSTR UUO BLOCK
SETZM .DFGJN(P2) ;0 FOR SYSTEM SEARCH LIST
MOVE T1,SYSPPN ;GET [1,4]
MOVEM T1,.DFGPP(P2) ;SAVE
SETOM .DFGNM(P2) ;START WITH THE FIRST STRUCTURE
SSLCO1: MOVE T1,P2 ;POINT TO BLOCK
HRLI T1,.DFGST+1 ;GET LENGTH
GOBSTR T1, ;GET THE NEXT STRUCTURE
JRST SSLCO2 ;GIVE UP
MOVE T1,.DFGNM(P2) ;GET STR NAME
SKIPE T1 ;END OF S/L?
CAMN T1,[EXP -1] ;FENCE?
JRST SSLCO2 ;ALMOST DONE
MOVEM T1,.AUSTR(P1) ;SAVE STR NAME
MOVE T1,.DFGST(P2) ;GET STR BITS
MOVEM T1,.AUBIT(P1) ;SAVE
HRLOI T1,377777 ;+INFINITY
MOVEM T1,.AULIN(P1) ;SET FCFS QUOTA
MOVEM T1,.AUOUT(P1) ;SET LOGGED OUT QUOTA
SETZM .AURES(P1) ;ZERO RESERVED QUOTA
ADDI P1,.AULEN ;OFFSET TO THE NEXT STR STORAGE
JRST SSLCO1 ;LOOP
SSLCO2: SUBI P1,AENTRY+.AEMIN ;COMPUTE WORDS APPENDED
ADDM P1,AENTRY+.AEVRS ;ADD TO TOTAL LENGTH OF PROFILE
MOVNS P1 ;NEGATE
HRLZS P1 ;PUT IN LH
HRRI P1,.AEMIN ;RELATIVE OFFSET WHERE AUXACC DATA BEGINS
MOVEM P1,AENTRY+.AEAUX ;SAVE
POPJ P, ;RETURN
SUBTTL Structure routines -- ENTPTH - Create a path
;ARGS: U.PATH=PATH DESIRED
; UFDFSN=STR NAME
;CALL WITH:
; MOVEI T1,1 ;TO CREATE SFDS
; MOVEI T1,0 ;TO NOT CREATE SFDS
; PUSHJ P,ENTPTH
; RETURN HERE ALWAYS (PTHBUF SET UP FOR PATH. UUO)
ENTPTH: PUSHJ P,.SAVE3## ;SAVE P1 AND P2 AND P3
MOVEI P3,(T1) ;SAVE FLAG TO CREATE SFDS
HRRZ T1,U.PATH+.FXDIR;GET PROG NUMBER
CAIN T1,UNIPRG ;IS IT #
HRRZ T1,PPN ;YES--CORRECT FOR ACTUAL NO.
HRRM T1,U.PATH+.FXDIR;STORE BACK CORRECTED NUMBER
SETZM PTHBUF+.PTFCN ;IGNORED ON ENTER
MOVEI T1,.PTSCN ;/SCAN:NO
MOVEM T1,PTHBUF+.PTSWT;STORE THE SWITCH
SKIPN T1,U.PATH+.FXDIR;GET PPN
MOVE T1,PPN ;USE TARGET PPN
MOVEM T1,PTHBUF+.PTPPN;STORE IN PATH
MOVEI P1,PTHBUF+.PTPPN+1 ;WHERE PATH GOES
MOVEI P2,U.PATH+.FXDIR+2 ;WHERE PATH COMES FROM
HRLI P1,-<.FXLND-1> ;INIT MAX LOOP CNTR
ENTPT1: SKIPN (P2) ;ANOTHER SFD GIVEN?
POPJ P, ;NO. DONE
SETZM (P1) ;MAKE END OF LIST
MOVE T1,(P2) ;GET NAME OF SFD
JUMPE P3,ENTPT5 ;JUMP IF DOESNT WANT SFDS MADE
MOVEI T2,17 ;MODE
MOVE T3,UFDFSN ;STR NAME
SETZM T4 ;NO BUFFERS
OPEN IOC,T2 ;OPEN STR
POPJ P, ;A FATE TOO EVIL TO CONSIDER
MOVSI T2,'SFD' ;EXTENSION IS SFD
SKIPGE T3,U.SFDP ;/SFDPROT SPECIFIED?
SETZM T3 ;NO - ASSUME STANDARD
ANDI T3,777 ;MASK OUT JUNK
LSH T3,^D27 ;SLING OVER TO LEFT HALF
MOVEI T4,PTHBUF ;PATH POINTER
ENTER IOC,T1 ;TRY TO ENTER SFD
SKIPA ;CAN NOT--SEE WHY
JRST ENTPT4 ;WE WON.
HRRZ T3,T2 ;GET ERROR CODE
CAIE T3,ERFBM% ;IS FILE BEING MODIFIED?
CAIN T3,ERCSD% ;OR DOES IT EXIST YET?
JRST ENTPT4 ;MODIFIED OR EXITSING -- ALL OK
CAIE T3,ERLVL% ;LEVEL ERROR?
JRST ENTPT2 ;NO
WARN SND,<SFDs nested too deeply>,,E.SND
JRST ENTPT3 ;FINISH UP
ENTPT2: WARN SEF,<SFD enter failure >,,E.SEF
ENTPT3: SETZ P3, ;DON'T CREATE ANY MORE SFDS
MOVE T1,(P2) ;RESTORE SFD NAME
ENTPT4: CLOSE IOC,0 ;CLOSE OUT THE SFD
ENTPT5: MOVEM T1,(P1) ;STORE SFD NAME SO SFDS NEXT CORRECTLY
ADDI P2,2 ;POINT TO NEXT NAME
AOBJN P1,ENTPT1 ;LOOP OVER THE PATH
RELEAS IOC, ;RELEASE CHANNEL
POPJ P,
E.SEF: PUSH P,T3 ;SAVE ERROR CODE
MOVEI T1,"(" ;START WITH
PUSHJ P,.TCHAR## ; PARANTHESIS
POP P,T1 ;GET ERROR CODE BACK
PUSHJ P,.TOCTW## ;PRINT IT
MOVEI T1,")" ;SURROUND ERROR CODE
PUSHJ P,.TCHAR## ; PRINT CLOSING PARANTHESIS
E.SND: MOVEI T1,[ASCIZ /; file: /]
PUSHJ P,.TSTRG## ;PRINT DELIMITING TEXT
MOVE T1,UFDFSN ;STRUCTURE NAME
PUSHJ P,.TSIXN## ;PRINT IT
PUSHJ P,.TCOLN## ;PRINT A COLON
MOVE T1,(P2) ;GET SFD NAME
PUSHJ P,.TSIXN## ;TYPE THAT OUT TOO
MOVEI T1,[ASCIZ /.SFD/] ;WE KNOW THE EXTENSION
PUSHJ P,.TSTRG## ;SO TELL THE USER
MOVEI T1,[PTHBUF] ;POINT TO PATH. BLOCK
PJRST .TDIRB## ;PRINT PATH AND RETURN
SUBTTL Structure routines -- STRCHK - Check recomp, empty S/L, etc.
STRCHK: PUSHJ P,STRNXT ;GET NEXT STR TO RECOMPUTE USAGE ON
JRST STRCH1 ;DONE
PUSHJ P,UFDRCP ;SET UP UFDSET AND DO IT
JRST STRCHK ;LOOP
STRCH1: TRZN F,R.ASTR ;ARE ANY STR'S DEFINED IN SEARCH LIST?
JRST STRCH2 ;NO, WARN SO
TRNN F,R.ACRE ;ARE ANY CREATES ALLOWED?
WARN SNC,<Search list does not allow creates>
POPJ P, ;RETURN
STRCH2: WARN SLE,<Search list is empty>
POPJ P, ;RETURN
SUBTTL Structure routines -- STRPUT - Store structure name
STRPUT: MOVE T2,T1 ;GET STR NAME
MOVE T1,[-STRMAX,,QTATAB] ;AOBJN POINTER TO TABLE
STRPU1: SKIPN (T1) ;ENTRY IN USE?
JRST STRPU2 ;NO
CAME T2,(T1) ;ALREADY IN TABLE?
AOBJN T1,STRPU1 ;NO--KEEP CHECKING
POPJ P, ;RETURN
STRPU2: MOVEM T2,(T1) ;STORE STR NAME
POPJ P, ;RETURN
SUBTTL Structure routines -- STRNXT - Return next structure
STRNXT: MOVE T2,[-STRMAX,,QTATAB] ;AOBJN POINTER TO TABLE
SKIPN T1,(T2) ;GET AN ENTRY
AOBJN T2,.-1 ;LOOP 'TIL WE FIND ONE
JUMPGE T2,.POPJ## ;RETURN IF TABLE EMPTY
SETZM (T2) ;ZERO OUT ENTRY
JRST .POPJ1## ;AND RETURN
SUBTTL Structure routines -- STRQTA - Check for /QUOTA on structure
STRQTA: PUSHJ P,QTASTR ;SEE IF IN QTATAB
SKIPL U.QTA ;/QUOTA?
AOS (P) ;SKIP
POPJ P, ;RETURN
QTASTR: MOVE T2,[-STRMAX,,QTATAB] ;AOBJN POINTER TO TABLLE
CAME T1,(T2) ;WANT TO RECOMPUTE ON THIS STR?
AOBJN T2,.-1 ;LOOP THROUGH EACH ENTRY
JUMPGE T2,.POPJ## ;RETURN OF NO MATCH
SETZM (T2) ;MARK THIS ONE DONE
JRST .POPJ1## ;AND SKIP
SUBTTL TTY I/O -- TTYPMT - Prompt
TTYPMT: PUSH P,T1 ;SAVE PROMPT TEXT
PUSHJ P,TTYECH ;SET TTY ECHO
PUSHJ P,.TNEWL## ;TYPE A CRLF IF NEEDED
POP P,T1 ;RESTORE T1
PUSHJ P,.TSTRG## ;TYPE PROMPT STRING
PJRST .TOOUT## ;FORCE OUTPUT
SUBTTL TTY I/O -- TTYGET - Read a character
;CALLED ONLY FROM SCAN -- MAY CHANGE NO AC'S
TTYGET: PUSHJ P,.SAVE2## ;SAVE P1 AND P2
TRNE F,R.PTYJ ;PTY JOB?
JRST TTGET2 ;YES -- GO INTO TI WAIT
MOVEI P2,TTYSLP ;NUMBER OF MINS. TO SLEEP
TTGET1: SKPINL ;ANYTHING THERE??
SKIPA ;NO--LOOP
JRST TTGET2 ;YES--GO GET IT
MOVE P1,[HB.RTL!HB.RWJ!^D60000]
SKIPE .JBDDT## ;DEBUGGING?
HRRI P1,^D10000 ;YES--WAIT 10 SECONDS MAX
HIBER P1, ;HIBER FOR 1 MIN.
JRST TTGET2 ;TINY MONITOR
SKPINL
SKIPA
JRST TTGET2
SOJG P2,TTGET1 ;LOOP FOR A WHILE
FATAL (WFS,<Waiting for >,EF.SIL,E.WFS)
TTGET2: INCHWL C ;GET A CHAR. INTO C
SKIPG .VQUOT## ;QUOTING WITH CONTROL-V?
POPJ P, ;YES--RETURN NOW
CAIE C,.CHCNC ;CONTROL-C?
CAIN C,.CHCNZ ;OR CONTROL-Z?
PJRST RICC ;YES--GO EXIT
POPJ P, ;RETURN
E.WFS: MOVE T1,HELP ;POINT TO HELP TEXT
PUSHJ P,.TSTRG## ;TYPE IT
MOVEI T1,[ASCIZ /; please start over/]
PJRST .TSTRG## ;TYPE END OF ERROR AND RETURN
; SET TERMINAL ECHO STATUS
TTYNEC: TDZA T1,T1 ;SET TTY NO ECHO
TTYECH: MOVEI T1,1 ;SET TTY ECHO
TLNN F,FL.BAT ;BATCH PTYS DON'T NEED TO TURN OFF ECHO
PUSHJ P,.TECHO## ;TOGGLE ECHO STATUS
POPJ P, ;RETURN
SUBTTL TTY I/O -- TTYPUT - Write a character
;CALLED ONLY FROM SCAN -- MAY CHANGE NO AC'S
TTYPUT: SKIPL DETFLG ;DETACHED?
OUTCHR T1 ;NO, WRITE THIS CHARACTER
POPJ P, ;RETURN
SUBTTL PSI routines -- PSINIT - Initialization
PSINIT: MOVEI T1,PSIBLK ;ADDRESS OF INTERRUPT VECTOR
PIINI. T1, ;INITIALIZE THE PSI SYSTEM
WARN PIF,<PIINI. UUO failed>
MOVEI T1,PSIDET ;ADDRESS OF INTERRUPT SERVICE ROUTINE
MOVEM T1,DETINB+.PSVNP;PUT IT IN THE INTERRUPT VECTOR
MOVX T1,PS.VDS ;DISMISS ADDITIONAL REQUESTS
MOVEM T1,DETINB+.PSVFL; FOR THIS CONDITION
HRREI T1,.PCDAT ;GET CONDITION=ATTACH/DETACH
MOVSI T2,DETINB-PSIBLK;GET VECTOR OFFSET,,0
SETZ T3, ;GET PRIORITY=0
MOVE T4,[PS.FON+PS.FAC+T1]
PISYS. T4, ;TURN ON PSI, ADD NEW CONDITION
WARN PSF,<PISYS. UUO failed>
GETLIN T1, ;GET THE TTY NAME
TLNN T1,777777 ;ARE WE ALREADY DETACHED?
SETOM DETFLG ;YES, SET FLAG
POPJ P, ;RETURN
SUBTTL PSI routines -- PSIDET - Handle ATTACH/DETACH conditions
; COME HERE WHEN THE JOB ATTACHES OR DETACHES. LOCATION DETFLG IS THE
; .PSVIS (STATUS) WORD IN THE INTERRUPT CELL. IT WILL BE SET TO
; MINUS ONE ON A DETACH.
PSIDET: SKIPG DETINB+.PSVIS ;DETACHED?
CLRBFO ;YES, CLEAR TTY OUTPUT
DEBRK. ;DISMISS THE INTERRUPT
FATAL DBF,<DEBRK. UUO failed>
POPJ P, ;NO INTERRUPT IN PROGRESS
SUBTTL UFD setup -- UFDSET - Call .UFD to mount/setup STR/UFD
;SUBROUTINE TO SET UP A UFD FOR USE
;ARGS: P1=ADDRESS OF AUXACC DATA
;
;IF T4=-1 ASSUME NO UFD DESIRED - PERFORM OTHER OPERATIONS
;
;CALL PUSHJ P,UFDSET
;ERROR DONT PROCEED (MESSAGE TYPED)
;OK STR IS IN SEARCH LIST (WARNING MAY BE TYPED)
;
UFDSET: MOVE T1,.AUSTR(P1) ;GET STR NAME
MOVEM T1,UFDFSN ;SAVE STR NAME
PUSHJ P,GETLOK ;GET UFD INTERLOCK
PUSHJ P,UFDINI ;SETUP ARG BLOCK
SETZM UFDARG+.UFQTR ;NO RESERVED QUOTA
MOVE T1,.AULIN(P1) ;FCFS QUOTA
MOVEM T1,UFDARG+.UFQTF
MOVE T1,.AUOUT(P1) ;LOGGED OUT QUOTA
MOVEM T1,UFDARG+.UFQTO
MOVE T1,.AURES(P1) ;RESERVED QUOTA
MOVEM T1,UFDARG+.UFQTR
MOVE T1,.AUBIT(P1) ;STRUCTURE STATUS BITS
MOVEM T1,UFDARG+.UFSTS
MOVE T1,PPN ;GET THE PPN TO USE
TLNE F,FL.GPN ;GENERATE A PROGRAMMER NUMBER?
TRZ T1,-1 ;YES--START WITH 400000
MOVEM T1,UFDARG+.UFPPN ;SET IT
MOVE T1,XPDDTM ;UFD EXPIRATION
MOVEM T1,UFDARG+.UFDED ;SAVE
MOVE T1,U.UFDP ;GET /UFDPROTECTION
MOVEM T1,UFDARG+.UFPRO ;SAVE (-1=NONE SPECIFIED)
MOVEI T1,UFDTYO ;ERROR TYPER
MOVEM T1,UFDARG+.UFTYO ;SAVE
MOVX T1,UF.LGI!UF.NLK!UF.AIS!INSVL.(.UFMNT,UF.FNC) ;MOUNT AND
; SET LOGGED IN (HAVE INTERLOCK)
TLNE F,FL.WLD ;WILDCARDED PPN?
TXZ T1,UF.AIS ;YES--THEN STR CAN'T BE IN THE S/L
TLZE F,FL.GPN ;GENERATE A UNIQUE PROGRAMMER NUMBER?
TXO T1,UF.WLD ;YES--TELL UFDSET
MOVEM T1,UFDARG+.UFFLG ;SAVE FLAGS
MOVE T1,UFDARG+.UFSTR ;GET STR NAME
PUSHJ P,STRQTA ;NEED TO RECOMPUTE QUOTAS?
TDZA T2,T2 ;NO
MOVX T2,UF.ARD ;YES
IORM T2,UFDARG+.UFFLG ;SET FLAG (MAYBE)
MOVEI T1,UFDARG ;POINT TO ARGS
PUSHJ P,.UFD## ;SET IT UP
JRST UFDDON ;ERROR--JUST FINISH UP
MOVE T1,UFDARG+.UFFLG ;GET THE FLAG WORD
TXNE T1,UF.NDL ;RIPNDL TURNED ON FOR THIS UFD?
SETOM UFDNDL ;YES
TXNE T1,UF.NUE ;NO UFD EXIST?
JRST UFDDON ;YES--NO UFD
TRO F,R.ASTR ;NO--GOT A UFD
MOVE T1,UFDARG+.UFCDT ;CREATION DATE
MOVE T2,UFDARG+.UFCTM ;CREATION TIME
CAMGE T1,UFDDAT ;OLD?
JRST UFDDON ;YES.
CAME T1,UFDDAT ;SAME?
JRST UFDEXB ;NO--NEW. UPDATE.
CAMGE T2,UFDTIM ;SAME DATE. TIME OLD?
JRST UFDDON ;NO.
UFDEXB: MOVEM T1,UFDDAT ;STORE NEWEST TIME
MOVEM T2,UFDTIM ;AND DATE
UFDDON: MOVX T1,UF.WLD ;GET THE WILD PPN BIT
TDNN T1,UFDARG+.UFFLG ;WAS IT ON?
PJRST CLRLOK ;NO--RELEASE INTERLOCK AND RETURN
MOVE T1,UFDARG+.UFPPN ;YES--GET REAL PPN USED
MOVEM T1,PPN ;SAVE FOR LOGIN
MOVEM T1,.MYPPN## ;SAVE FOR SCAN
PJRST CLRLOK ;RELEASE INTERLOCK AND RETURN
SUBTTL UFD setup -- UFDRCP - Recompute disk usage on random structures
UFDRCP: MOVEM T1,UFDFSN ;SAVE STR NAME
PUSHJ P,GETLOK ;GET UFD INTERLOCK
PUSHJ P,UFDINI ;SETUP ARG BLOCK
SETOM UFDARG+.UFQTR ;DON'T
SETOM UFDARG+.UFQTF ; SET
SETOM UFDARG+.UFQTO ; QUOTAS
MOVE T1,PPN ;GET THE PPN TO USE
MOVEM T1,UFDARG+.UFPPN ;SET IT
MOVE T1,U.UFDP ;GET /UFDPROTECTION
MOVEM T1,UFDARG+.UFPRO ;SAVE (-1=NONE SPECIFIED)
MOVEI T1,UFDTYO ;ERROR TYPER
MOVEM T1,UFDARG+.UFTYO ;SAVE
MOVX T1,UF.NLK!UF.ARD!INSVL.(.UFRDU,UF.FNC) ;ALWAYS RECOMPUTE
MOVEM T1,UFDARG+.UFFLG ;SAVE FLAGS
MOVEI T1,UFDARG ;POINT TO ARGS
PUSHJ P,.UFD## ;SET IT UP
JRST UFDDON ;ERROR--JUST FINISH UP
PJRST CLRLOK ;RELEASE INTERLOCK AND RETURN
SUBTTL UFD setup -- UFDDMO - Dismount a structure
UFDDMO: PUSH P,T1 ;SAVE THE FLAG BITS
PUSHJ P,UFDINI ;SETUP ARG BLOCK
POP P,T1 ;RESTORE FLAG BITS
IORX T1,UF.LGO!UF.TSP!INSVL.(.UFDMO,UF.FNC) ;DISMOUNT
MOVEM T1,UFDARG+.UFFLG ;SAVE FLAGS
SETOM UFDARG+.UFPPN ;DEFAULT PPN
SETOM UFDARG+.UFJOB ;DEFAULT JOB
SETOM UFDARG+.UFQTR ;DON'T
SETOM UFDARG+.UFQTF ; SET
SETOM UFDARG+.UFQTO ; QUOTAS
SETOM UFDARG+.UFPRO ;DON'T CHANGE UFD PROTECTION
MOVEI T1,UFDTYO ;ERROR TYPER
MOVEM T1,UFDARG+.UFTYO ;SAVE
MOVEI T1,UFDARG ;POINT TO ARGS
PJRST .UFD## ;SET IT UP
SUBTTL UFD setup -- UFDTYO - Handle typeout of errors from .UFD
UFDTYO: SKIPE .JBDDT ;DEBUGGING?
JRST UFDTY1 ;YES, BE VERBOSE
HRRZ T1,UFDARG+.UFPFX ;GET PREFIX
CAIE T1,'MNT' ;MOUNT MSG?
CAIN T1,'AJL' ;ADD S/L MSG?
POPJ P, ;YES--TOO VERBOSE
CAIE T1,'DMO' ;DISMOUNT MSG?
CAIN T1,'NUC' ;NO UFD CREATED MSG?
POPJ P, ;YES--WE DONT WANT EITHER
MOVE T2,COMIDX ;GET THE COMMAND INDEX
TXNE T2,CM.KJB ;KJOB COMMAND
CAIE T1,'QTA' ; AND QUOTA MSG?
TRNA ;NO - PROCEED
POPJ P, ;YES - SKIP IT
CAIN T1,'RDU' ;RECOMPUTING?
AOSN RDUFLG ;YES--ALREADY SEEN IT?
CAIA ;OK
POPJ P, ;YES--ONCE IS ENOUGH
UFDTY1: HLRZ T1,UFDARG+.UFPFX ;GET ERROR CHAR
PUSHJ P,.TCHAR## ;TYPE
HRRZ T1,UFDARG+.UFPFX ;ERROR PREFIX
HRLI T1,'LGN' ;PREFIX
PUSHJ P,.TSIXN## ;TYPE
PUSHJ P,.TSPAC## ;SPACE OVER
MOVE T1,UFDARG+.UFTXT ;ADDESS OF TEXT
PUSHJ P,.TSTRG## ;TYPE
HLRZ T1,UFDARG+.UFPFX ;ERROR CHAR
CAIN T1,"[" ;INFORMATIONAL?
PUSHJ P,.TRBRK## ;YES--CLOSE IT
PUSHJ P,.TCRLF## ;CRLF
POPJ P, ;AND RETURN
SUBTTL UFD setup -- UFDINI - Initialize block
UFDINI: MOVE T1,[UFDARG,,UFDARG+1] ;SETUP BLT
SETZM UFDARG ;CLEAR FIRST
BLT T1,UFDARG+.UFSIZ-1 ;ZERO THEM ALL
MOVE T1,UFDFSN ;GET STR NAME
MOVEM T1,UFDARG+.UFSTR ;SAVE STRUCTURE
SETOM UFDARG+.UFPPN ;DEFAULT PPN
SETOM UFDARG+.UFJOB ;AND JOB
POPJ P, ;RETURN
SUBTTL UFD setup -- ADDSTR - Add a structure to search list
ADDSTR: MOVE T1,.AUSTR(P1) ;GET STR NAME
MOVEM T1,UFDFSN ;SAVE IT
PUSHJ P,UFDINI ;SET UP BLOCK
MOVEI T1,UFDTYO ;GET TYPER
MOVEM T1,UFDARG+.UFTYO ;SAVE
MOVX T1,.UFAJL ;ADD TO SEARCH LIST
DPB T1,[POINTR UFDARG+.UFFLG,UF.FNC] ;STORE
MOVEI T1,UFDARG ;POINT TO ARGS
PUSHJ P,.UFD## ;ADD THE STR
JFCL ;DONT CARE
POPJ P, ;AND RETURN
SUBTTL UFD setup -- GETLOK - Get UFD interlock
GETLOK: TLNE F,FL.WLD ;WILDCARD PROGRAMMER NUMBER?
POPJ P, ;YES - NO NEED TO GET INTERLOCK
PUSHJ P,UFDINI ;SETUP BLOCK
MOVSI T1,UFDSEC ;SECOND TO WAIT FOR INTERLOCK
SKIPE .JBDDT## ;DEBUGGING?
MOVEI T1,1 ;DON'T WAIT SO LONG
TLNE F,FL.BAT ;BATCH?
LSH T1,1 ;YES--TWICE AS TOUGH
HRRI T1,^D10 ;MESSAGE AFTER 10 SECONDS
MOVEM T1,UFDARG+.UFLOK ;SAVE LOCK TIMER
MOVEI T1,LOKTYO ;TYPER
MOVEM T1,UFDARG+.UFTYO ;SET
MOVX T1,.UFSUI ;SET UFD INTERLOCK
DPB T1,[POINTR UFDARG+.UFFLG,UF.FNC] ;STORE
MOVEI T1,UFDARG ;POINT TO BLOCK
SETOM CCWAIT ;DONT ALLOW ^C
PUSHJ P,.UFD## ;GET THE INTERLOCK
TLNN F,FL.BAT ;BATCH?
POPJ P, ;NO--GIVE IN AND GET HIM GO
REQUE UBT,<UFD interlock busy too long> ;YES--TRY AGAIN LATER
LOKTYO: MOVE T1,UFDARG+.UFERR ;GET ERROR CODE
CAIN T1,UFUBT% ;BUSY TOO LONG?
POPJ P, ;YES--NO MESSAGE
PJRST UFDTYO ;ELSE TYPE THE STANDARD WAY
SUBTTL UFD setup -- CLRLOK - Clear the UFD interlock
CLRLOK: TLNE F,FL.WLD ;WILDCARD PROGRAMMER NUMBER?
POPJ P, ;YES - NO INTERLOCK TO CLEAR
PUSHJ P,UFDINI ;SETUP BLOCK
MOVX T1,.UFCUI ;CLEAR INTERLOCK
DPB T1,[POINTR UFDARG+.UFFLG,UF.FNC] ;STORE CODE
MOVEI T1,UFDARG ;POINT TO ARGS
PUSHJ P,.UFD## ;CLEAR THE INTERLOCK
JFCL ;DONT CARE
PJRST CTLCOK ;CHECK/CLEAR ^C
SUBTTL Usage entry creation -- USGATT - Attach
USGATT: TLNE F,FL.BYP ;BYPASS THE ACCOUNTING SYSTEM?
POPJ P, ;YES
PUSHJ P,SETTNL ;FIND TERMINAL DESIGNATOR, LINE NO., NODE NAME
MOVEI T1,UA$TJN+1 ;LENGTH OF DATA BLOCK
MOVEI T2,UGATT$ ;MAKE AN ENTRY
PUSHJ P,USGQUE ;LOAD ACCOUNTING SPECIFIC DATA IN THE UUO BLOCK
PUSH P,T2 ;SAVE UUO AC FOR LATER
MOVEI T2,UGATT$ ;ATTACH MESSAGE TYPE
MOVEM T2,UA$TYP(T1)
MOVE T2,[SIXBIT /LOGIN/]
MOVEM T2,UA$PRG(T1) ;PROGRAM NAME
MOVE T2,.JBVER ;VERSION NUMBER OF LOGIN
MOVEM T2,UA$VER(T1)
MOVE T2,THSJOB ;GET THE JOB NUMBER
MOVE T2,MONLNO ;LINE NUMBER
MOVEM T2,UA$LIN(T1) ;STORE THE LINE NUMBER
MOVE T2,MONNOD ;NODE NAME
MOVEM T2,UA$NOD(T1)
MOVE T2,MONTDE ;TERMINAL DESIGNATOR
MOVEM T2,UA$TDE(T1)
MOVE T2,ATTJBN ;GET TARGET JOB
MOVEM T2,UA$TJN(T1)
POP P,T1 ;GET UUO AC
QUEUE. T1, ;CREATE SESSION ENTRY
PJRST QUEERR ;REPORT ERROR
POPJ P, ;RETURN
SUBTTL Usage entry creation -- USGLOG - Login
USGLOG: TLNE F,FL.BYP ;BYPASS THE ACCOUNTING SYSTEM?
POPJ P, ;YES
PUSHJ P,SETTNL ;FIND TERMINAL DESIGNATOR, LINE NO., NODE NAME
MOVEI T1,UL$TDE+1 ;LENGTH OF DATA BLOCK
MOVEI T2,UGLGN$ ;MAKE AN ENTRY
PUSHJ P,USGQUE ;LOAD ACCOUNTING SPECIFIC DATA IN THE UUO BLOCK
PUSH P,T2 ;SAVE UUO AC FOR LATER
MOVEI T2,UGLGN$ ;MESSAGE TYPE
MOVEM T2,UL$TYP(T1)
MOVE T2,[SIXBIT /LOGIN/]
MOVEM T2,UL$PRG(T1) ;PROGRAM NAME
MOVE T2,.JBVER ;VERSION NUMBER
MOVEM T2,UL$VER(T1)
HRLI T2,U.ACTS ;ACCOUNT STRING
HRRI T2,UL$ACT(T1)
MOVE T3,U.ACTS ;GET FIRST WORD
AOSE T3 ;SKIP IF NONE GIVEN
BLT T2,UL$ACE(T1)
PUSH P,T1 ;SAVE T1
PUSHJ P,.GTNOW## ;GET CURRENT UDT
POP P,T2 ;RESTORE BLOCK POINTER
EXCH T1,T2 ;SWAP
MOVEM T2,UL$BEG(T1)
MOVEI T2,ULJTI$ ;DEFAULT TO A TIMESHARING LOGIN
MOVEM T2,UL$JTY(T2)
TLNN F,FL.BAT ;IS THIS A BATCH JOB?
JRST USGLO1 ;NO
MOVEI T2,ULJBA$ ;YES. INDICATE A BATCH JOB
MOVEM T2,UL$JTY(T1)
MOVE T2,U.BSEQ ;BATCH SEQUENCE NUMBER
MOVEM T2,UL$BSQ(T1)
MOVE T2,U.BNAM ;BATCH JOB NAME
MOVEM T2,UL$BNM(T1)
MOVE T2,U.BREQ ;BATCH REQUEST ID
MOVEM T2,UL$BRI(T1)
USGLO1: HRLI T2,U.RMRK ;SESSION REMARK
HRRI T2,UL$RMK(T1)
MOVE T3,U.RMRK ;GET FIRST WORD
AOSE T3 ;SKIP IF NONE GIVEN
BLT T2,UL$RME(T1)
LDB T2,[POINTR AENTRY+.AESCD,AE.SCD]
MOVEM T2,UL$CLS(T1) ;SCHEDULING CLASS
MOVE T2,PPN ;USER'S PPN
MOVEM T2,UL$PPN(T1)
MOVE T2,NAME
MOVEM T2,UL$NM1(T1)
MOVE T2,NAME2
MOVEM T2,UL$NM2(T1)
MOVE T2,THSJOB ;GET THE JOB NUMBER
MOVE T2,MONLNO ;LINE NUMBER
MOVEM T2,UL$LIN(T1) ;STORE THE LINE NUMBER
MOVE T2,MONNOD ;NODE NAME
MOVEM T2,UL$NOD(T1)
MOVE T2,MONTDE ;LINE DESIGNATOR
MOVEM T2,UL$TDE(T1)
POP P,T1 ;GET UUO AC
QUEUE. T1, ;CREATE SESSION ENTRY
PJRST QUEERR ;REPORT ERROR
POPJ P, ;RETURN
SUBTTL Usage entry creation -- USGQUE - Set up QUEUE. UUO blocks
; LOAD THE QUEUE. UUO BLOCK WITH ACCOUNTING-FUNCTION SPECIFIC DATA
; CALL: MOVE T1, DATA BLOCK LENGTH
; MOVE T2, ACCOUNTING SUB-FUNCTION CODE
; PUSHJ P,USGQUE
; <RETURN>
;
; ON RETURN, THE QUEUE. UUO BLOCK, RESPONSE BLOCK, AND DATA BLOCK
; WILL BE ZEROED AND FILLED IN WITH THE APPROPRIATE DATA. T1 WILL
; POINT TO THE DATA BLOCK AND T2 WILL CONTAIN THE UUO AC TO BE USED
; WITH THE QUEUE. UUO.
USGQUE: PUSH P,T1 ;SAVE DATA BLOCK LENGTH
PUSH P,T2 ;SAVE SUB-FUNCTION CODE
MOVEI T1,.QUMAE ;ACCOUNTING FUNCTION
MOVEI T2,0 ;CENTRAL STATION OPR
MOVE T3,[RSPLEN,,RSPBLK] ;RESPONSE BLOCK POINTER
MOVEI T4,USGTIM ;TIMEOUT
PUSHJ P,QUEINI ;SET UP QUEUE. UUO ARGUMENT BLOCK
MOVE T2,[QA.IMM!<1,,.QBAFN>] ;BLOCK TYPE (ACCOUNTING FUNCTION)
POP P,T3 ;GET SUB-FUNCTION CODE BACK
DMOVEM T2,(T1) ;SAVE WORD PAIR
ADDI T1,2 ;ADVANCE POINTER
POP P,T2 ;GET DATA BLOCK LENGTH
HRLZS T2 ;PUT IN LH
HRRI T2,.QBAET ;BLOCK TYPE (ACCOUNTING DATA)
MOVEI T3,DATBLK ;DATA BLOCK ADDRESS
DMOVEM T2,(T1)
MOVSI T2,-QUEBLK+2(T1) ;COMPUTE LENGTH OF QUEUE. UUO BLOCK
HRRI T2,QUEBLK ;SET UP UUO AC
MOVEI T1,DATBLK ;NOW POINT TO DATA BLOCK
POPJ P, ;AND RETURN
SUBTTL Usage entry creation -- USGSES - Session
USGSES: TLNE F,FL.BYP ;BYPASS THE ACCOUNTING SYSTEM?
POPJ P, ;YES
MOVEI T1,US$RME+1 ;LENGTH OF DATA BLOCK
MOVEI T2,UGSES$ ;MAKE AN ENTRY
PUSHJ P,USGQUE ;LOAD ACCOUNTING SPECIFIC DATA IN THE UUO BLOCK
PUSH P,T2 ;SAVE UUO AC FOR LATER
MOVEI T2,UGSES$ ;MESSAGE TYPE
MOVEM T2,US$TYP(T1)
MOVE T2,[SIXBIT /LOGIN/]
MOVEM T2,US$PRG(T1) ;PROGRAM NAME
MOVE T2,.JBVER ;VERSION NUMBER
MOVEM T2,US$VER(T1)
HRLI T2,U.ACTS ;NEW ACCOUNT STRING
HRRI T2,US$ACT(T1)
MOVE T3,U.ACTS ;GET FIRST WORD
AOSE T3 ;SKIP IF NONE GIVEN
BLT T2,US$ACE(T1)
PUSH P,T1 ;SAVE T1
PUSHJ P,.GTNOW## ;GET CURRENT UDT
POP P,T2 ;RESTORE BLOCK POINTER
EXCH T1,T2 ;SWAP
MOVEM T2,US$BEG(T1) ;SESSION START DATE/TIME
HRLI T2,U.RMRK ;NEW SESSION REMARK
HRRI T2,US$RMK(T1)
MOVE T3,U.RMRK ;GET FIRST WORD
AOSE T3 ;SKIPE IF NONE GIVEN
BLT T2,US$RME(T1)
POP P,T1 ;GET UUO AC
QUEUE. T1, ;CREATE SESSION ENTRY
PJRST QUEERR ;REPORT ERROR
POPJ P, ;RETURN
SUBTTL Usage entry creation -- USGVAL - Validate an account string
USGVAL: TLNE F,FL.BYP ;BYPASS THE ACCOUNTING SYSTEM?
POPJ P, ;YES
MOVEI T1,UV$ACE+1 ;LENGTH OF DATA BLOCK
MOVEI T2,UGVAL$ ;DO VALIDATION
PUSHJ P,USGQUE ;LOAD ACCOUNTING SPECIFIC DATA IN THE UUO BLOCK
PUSH P,T2 ;SAVE UUO AC FOR LATER
MOVEI T2,UGVAL$ ;FUNCTION CODE
MOVEM T2,-1(T1) ;FUDGE HERE
MOVEM T2,UV$TYP(T1) ;PUT THE MESSAGE TYPE IN THE IPCF SEND
MOVE T2,PPN ;GET THE PPN TO BE VALIDATED
MOVEM T2,UV$PPN(T1)
HRLI T2,U.ACTS ;WHERE TO BLT THE ACCOUNT FROM
HRRI T2,UV$ACT(T1) ;WHERE TO BLT THE ACCOUNT TO
MOVE T3,U.ACTS ;GET FIRST WORD
AOSE T3 ;SKIP IF NONE GIVEN
BLT T2,UV$ACE(T1)
POP P,T1 ;GET UUO AC
QUEUE. T1, ;CREATE SESSION ENTRY
PJRST QUEERR ;REPORT ERROR
MOVEI T1,RSPBLK ;POINT TO THE RESPONSE BLOCK
SKIPN UC$ACT(T1) ;DO WE HAVE AN ACCOUNT STRING?
POPJ P, ;NO--USE WHAT WE HAD FIRST
HRLI T2,UC$ACT(T1) ;SETUP BLT
HRRI T2,U.ACTS ;INTO OUR ACCOUNT STRING
BLT T2,U.ACTS+7 ;COPY IT OVER
POPJ P, ;AND RETURN WITH NEW ACCOUNT STRING
SUBTTL WTO routines -- WTOINI - Initialize WTO message
WTOINI: PUSH P,T1 ;SAVE "TYPE" TEXT (-- LOGIN FOO --)
MOVE T1,[Z.BWTO,,Z.BWTO+1] ;SET UP BLT
SETZM Z.BWTO ;CLEAR FIRST WORD
BLT T1,Z.EWTO-1 ;CLEAR ENTIRE BLOCK
POP P,WTOTYP ;SAVE
MOVE T1,[POINT 7,WTOBFO] ;BYTE POINTER
MOVEM T1,WTOPTR ;SAVE
MOVEI T1,WTOCHN ;BYTE COUNT
MOVEM T1,WTOCTR ;SAVE
MOVEI T1,WTOTYO ;SPECIAL TYPEOUT ROUTINE
PUSHJ P,.TYOCH## ;TELL SCAN
MOVEM T1,WTOSAV ;SAVE OLD TYPER
POPJ P, ;RETURN
WTOTYO: SOSLE WTOCTR ;COUNT CHARACTERS
IDPB T1,WTOPTR ;STORE
POPJ P, ;RETURN
SUBTTL WTO routines -- WTOSND - Send a WTO to OPR
WTOSND: SKIPE .JBDDT## ;DEBUGGING?
PJRST WTOCTY ;YES--DON'T BOTHER THE OPERATOR
MOVE T1,WTOSAV ;GET SAVED CHARACTER TYPER
PUSHJ P,.TYOCH## ;UPDATE SCAN
MOVX T1,.QUWTO ;FUNCTION CODE
DPB T1,[POINTR WTOBLK+.QUFNC,QF.FNC] ;STORE
SETOM WTOBLK+.QUNOD ;CENTRAL SITE OPR
SETZM WTOBLK+.QURSP ;NO RESPONCE BLOCK
HLLZ T1,WTOTYP ;GET "TYPE" LENGTH
HRRI T1,.QBTYP ;AND BLOCK CODE
MOVEM T1,WTOBLK+.QUARG
HRRZ T1,WTOTYP ;GET ADDRESS OF TEXT
MOVEM T1,WTOBLK+.QUARV
MOVX T1,<INSVL.(<WTOCHN/5>,QA.LEN)!INSVL.(.QBMSG,QA.TYP)>
MOVEM T1,WTOBLK+.QUARG+2
MOVEI T1,WTOBFO ;GET TEXT BUFFER ADDRESS
MOVEM T1,WTOBLK+.QUARV+2
MOVE T1,[WTOLEN,,WTOBLK] ;SET UP UUO ACS
QUEUE. T1, ;SEND TO OPR
SKIPA T1,WTOSAV ;FAILED--MUST RESET CHARACTER STICKER
JRST .POPJ1## ;RETURN
PUSHJ P,.TYOCH## ;TELL SCAN
; PJRST WTOCTY ;REPORT ON THE CTY
SUBTTL WTO routines -- WTOCTY - Send text to the CTY if OPR not available
WTOCTY: MOVEI T1,WTOTYO ;SPECIAL TYPEOUT ROUTINE
PUSHJ P,.TYOCH## ;TELL SCAN
MOVEM T1,WTOSAV ;SAVE FOR LATER
PUSHJ P,.TCRLF## ;APPEND A CRLF TO THE OPR BUFFER
MOVE T1,[POINT 7,WTOBFC] ;BYTE POINTER
MOVEM T1,WTOPTR ;SAVE
MOVEI T1,WTOCHN ;BYTE COUNT
MOVEM T1,WTOCTR ;SAVE
PUSHJ P,.TCRLF## ;START WITH A CRLF
MOVEI T1,[ASCIZ /-- /]
PUSHJ P,.TSTRG## ;STORE IN CTY BUFFER
HRRZ T1,WTOTYP ;POINT TO "TYPE" TEXT
PUSHJ P,.TSTRG## ;STORE IN CTY BUFFER
MOVEI T1,[ASCIZ / at /]
PUSHJ P,.TSTRG## ;STORE TEXT
PUSHJ P,.GTNOW## ;GET CURRENT UDT
PUSHJ P,.TDTTM## ;STORE IN BUFFER
MOVEI T1,[ASCIZ / --/]
PUSHJ P,.TSTRG## ;STORE TRAILING DASHES
PUSHJ P,.TCRLF## ;APPEND A CRLF
MOVE T1,WTOSAV ;GET CALLER'S SAVED CHARACTER TYPER
PUSHJ P,.TYOCH## ;TELL SCAN
MOVE T1,[3,,T2] ;SET UP UUO AC
MOVEI T2,.TOOUS ;FUNCTION CODE
MOVSI T3,'CTY' ;DEVICE
SKIPN .JBDDT## ;DON'T BOTHER THE OPERATOR IF DEBUGGING
IONDX. T3,UU.PHY ;GET UDX
MOVNI T3,1 ;-1 FOR OUR TERMINAL
MOVEI T4,WTOBFC ;POINT TO CTY BUFFER
TRMOP. T1, ;SEND TO THE CTY
POPJ P, ;CAN DO NO MORE AT THIS POINT
MOVEI T4,WTOBFO ;POINT TO OPR BUFFER
TRMOP. T1, ;SEND TO THE CTY
JFCL ;IGNORE ERRORS AT THIS POINT
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- ACCLOG - Perform LOGMAX and BATMAX checking
ACCLOG: MOVSI T1,(AC.MAX) ;ALWAYS DO LOGMAX CHECKING
TLNN F,FL.BAT ;BATCH?
JRST ACCLO1 ;NO
MOVE T2,[F%MPB&<-1,,0>!.GTFET] ;CHECK MPB SUPPORT
GETTAB T2, ;ASK MONITOR
MOVEI T2,0 ;ASSUME NOT
TRNE T2,F%MPB&<0,,-1> ;MPB MONITOR?
TLO T1,(AC.BMX) ;YES--DO BATMAX CHECKING
ACCLO1: ACCLG. T1, ;SEE IF WE CAN GET ACCESS
SKIPA T2,T1 ;FAILED--COPY ERROR CODE
POPJ P,
CAIL T2,ACLLEN ;KNOWN ERROR CODE?
MOVEI T2,0 ;NO
JRST ACLTAB(T2) ;BARF APPROPRIATELY
ACLTAB: STOP UAE,<Unknown ACCLG. UUO error >,EF.WTO!EF.SIL,E.UAE
REQUE JCE,<Job capacity exceeded>,EF.SIL
REQUE BJC,<Batch job capacity exceeded>,EF.SIL
STOP ARG,<Illegal argument detected>,EF.WTO!EF.SIL
STOP JLG,<Decrement tried with JLOG on>,EF.WTO!EF.SIL
STOP DCR,<Decrement tried with PD.LGN on>,EF.WTO!EF.SIL
ACLLEN==.-ACLTAB
E.UAE: PUSH P,T1 ;SAVE ERROR CODE
MOVEI T1,"(" ;OPEN PARANTHESIS
PUSHJ P,.TCHAR## ;PRINT IT
POP P,T1 ;GET ERROR CODE BACK
PUSHJ P,.TOCTW## ;PRINT IT
MOVEI T1,")" ;CLOSE PARANTHESIS
PJRST .TCHAR## ;PRINT IT AND RETURN
SUBTTL Miscellaneous routines -- ATTJOB - ATTACH the job
ATTJOB: INFO ATJ,<Attaching to job >,,E.ATJ
MOVE T1,THSJOB ;LOAD OUR CURRENT JOB NUMBER
TLNE F,FL.LGN ;ARE WE LOGGED IN?
INFO DJB,<Detaching job >,,.TDECW##
MOVEI T1,CRLFPD ;PRINT A DOT
MOVE T2,ATTUAC ;GET ATTACH UUO AC
TXNE T2,AT.UMM ;MONITOR MODE ATTACH?
PUSHJ P,.TSTRG## ;MAKE IT LOOK GOOD
PUSHJ P,.TOOUT## ;FORCE OUTPUT
MOVE T1,ATTUAC ;SET UP UUO AC
ATTACH T1, ;ATTACH JOB TO TTY
JRST NOATT ;WOOPS, COULDNT!
POPJ P, ;RETURN
E.ATJ: MOVE T1,ATTJBN ;GET TARGET JOB
PUSHJ P,.TDECW## ;PRINT IT
PUSHJ P,.TSPAC## ;SPACE OVER
MOVE T1,PPN ;GET TARGET PPN
PUSHJ P,.TPPNW## ;PRINT IT
MOVE T1,ATTSTS ;GET JOBSTS FOR TARGET JOB
TXNN T1,JB.URN ;RUNNING?
JRST E.ATJ1 ;NO
HRLZ T1,ATTJBN ;GET TARGET JOB
HRRI T1,.GTPRG ;WANT PROGRAM NAME
GETTAB T1, ;ASK MONITOR
SETZ T1, ;NOT TODAY
JUMPE T1,E.ATJ1 ;DON'T TYPE "RUNNING JUNK"
PUSH P,T1 ;SAVE PROGRAM NAME
MOVEI T1,[ASCIZ/ running /];GET TEXT
PUSHJ P,.TSTRG## ;TYPE
POP P,T1 ;GET PROGRAM NAME BACK
PUSHJ P,.TSIXN## ;TYPE PROGRAM NAME
E.ATJ1: MOVEI T1,[ASCIZ/ in user mode/]
MOVE T2,ATTUAC ;GET ATTACH UUO AC
TXNE T2,AT.UMM ;MONITOR MODE?
MOVEI T1,[ASCIZ/ in monitor mode/]
PJRST .TSTRG##
SUBTTL Miscellaneous routines -- ATTLGL - Check for a legal ATTACH
ATTLGL: MOVEI T1,.GTPPN ;GETTAB ARGUMENT
HRL T1,ATTJBN ;GET TARGET PPN
GETTAB T1, ;ASK MONITOR FOR PPN
PJRST NOATT ;CAN'T GET IT
CAME T1,PPN ;SAME PPN?
PJRST NOATT ;NO
HRRZ T1,ATTJBN ;GET TARGET JOB NUMBER
TRMNO. T1, ;SEE OF SOMEONE ALREADY THERE
SKIPA ;OK IF JOB IS DETACHED
PJRST NOATT ;DON'T DETACH JOB--SQUATTER'S RIGHTS
MOVN T1,ATTJBN ;DO MORE CHECKING ON JOB
JOBSTS T1, ;GET JOB STATUS
PJRST NOATT ;NOT THERE??
JUMPGE T1,.POPJ## ;JUMP IF JNA NO SET
MOVNI T1,1 ;-1 FOR OUR TTY
GETLCH T1 ;READ TTY BITS (REDUNDANT SUPER-PARANOID CALL)
CAMN T1,[-1] ;ARE WE DETACHED?
PJRST NOATT ;YES--THEN DON'T ALLOW ATTACH TO HAPPEN
TRZ T1,.UXTRM ;STRIP OFF UDX BIT
HRL T1,ATTJBN ;GET TARGET JOB NUMBER
MOVSM T1,ATTUAC ;SAVE AS LINE#,,JOB#
HRLZ T2,ATTJBN ;GET JOB NUMBER
HRRI T2,.GTST2 ;GETTAB TABLE NUMBER
GETTAB T2, ;GET SECOND JOB STATUS WORD
SETZ T2, ;??
MOVN T3,ATTJBN ;GET -TARGET JOB NUMBER
JOBSTS T3, ;READ JOB STATUS
JRST NOATT ;SHOULDN'T HAPPEN
MOVEM T3,ATTSTS ;SAVE RESULT
TRNN T2,1B26 ;ALLOW JOB MONITOR LEVEL?
SKIPE U.MODE ;USER REQUESTED MONITOR MODE?
TXNN T3,JB.URN ;RUNNING?
SKIPA T3,[AT.UMM] ;NO--GIVE HIM A DOT
MOVX T3,AT.UUM ;INDICATE USER MODE
IORM T3,ATTUAC ;COMPLETE ATTACH UUO AC
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- AVLCHK - Check system availability
AVLCHK: MOVE T1,STATES ;GET STATES WORD
TXNE T1,ST%NOP ;IS THERE AN OPERATOR?
INFO NOC,<No operator coverage>
TLNE F,L.OPR!L.SOPR ;OPR OR HIS SUB?
TLNE F,FL.BAT ;AND NON-BATCH JOB?
SKIPA ;NO--CONTINUE
POPJ P, ;SYSTEM AVAILABLE
TXNE T1,ST%NLG ;NO LOGIN?
STOP SNA,<System not available>
MOVE T2,TTBITS ;GET GETLCH BITS
TXNE T2,GL.DSL!GL.REM ;NON-LOCAL?
TXNN T1,ST%NRL ;AND STATES SAYS LOCAL ONLY?
SKIPA T2,COMIDX ;NO--GET COMMAND BITS
REQUE NRU,<No remote users>
TLNN F,FL.BAT ;BATCH?
TXNE T2,CM.ATT ;ATTACH COMMAND?
POPJ P, ;YES--DONE
TXNE T1,ST%BON ;BATCH ONLY ONES ALLOWED?
FATAL OBU,<Only batch users may LOGIN>
POPJ P, ;SYSTEM AVAILABLE TO THIS USER
SUBTTL Miscellaneous routines -- BANNER - Print LOGIN banner
BANNER: MOVEI T1,[ASCIZ/Job /]
PUSHJ P,.TSTRG## ;PRINT TEXT
MOVE T1,THSJOB ;GET JOB NUMBER
PUSHJ P,.TDECW## ;PRINT IT
PUSHJ P,.TSPAC## ;SPACE OVER
PUSHJ P,.TSPAC## ;AGAIN
MOVSI T3,-5 ;AOBJN POINTER
BANNE1: HRLZ T1,T3 ;GET OFFSET
ADD T1,[%CNFG0] ;FORM GETTAB ARGUMENT
GETTAB T1, ;GET NEXT WORD OF MONITOR NAME
SETZ T1, ;SHOULDN'T HAPPEN
MOVEM T1,CONFIG(T3) ;SAVE WORD
AOBJN T3,BANNE1 ;LOOP FOR ENTIRE MONITOR NAME
MOVEI T1,CONFIG ;POINT TO NAME
PUSHJ P,.TSTRG## ;PRINT IT
PUSHJ P,.TSPAC## ;SPACE OVER
PUSHJ P,.TSPAC## ;AGAIN
MOVE T1,MYTTY ;GET TTY NAME
PUSHJ P,.TSIXN## ;PRINT IT
PJRST .TCRLF## ;PRINT A CRLF AND RETURN
SUBTTL Miscellaneous routines -- CHRTRN - Translate 8-bit ASCII strings
; TRANSLATE 8-BIT ASCII STRINGS TO 6-BIT OR 7-BIT STRINGS
; CALL: MOVE T1, ADDRESS OF 8-BIT STRING
; MOVE T2, BYTE POINTER TO DESTINATION
; MOVE T3, # CHARACTERS
; PUSHJ P,CHRTRN
CHRTRN: MOVE T4,[TRNBLK,,TRNBLK+1] ;SET UP BLT
SETZM TRNBLK ;CLEAR FIRST WORD
BLT T4,TRNBLK+.CHDB2 ;CLEAR OUT BLOCK
MOVX T4,CH.FBR!CH.RAI ;GET BITS
TXO T4,CH.IGN ;*** TEMP ***
MOVEM T4,TRNBLK+.CHFLG ;DO FALLBACK REPRESENTATION AND RAISE CASE
HRLI T1,(POINT 8) ;MAKE B.P.
MOVEM T1,TRNBLK+.CHSB1 ;SAVE SOURCE B.P.
MOVEM T2,TRNBLK+.CHDB1 ;AND DEST. B.P.
DPB T3,[POINTR (TRNBLK+.CHSCT,CH.SCT)] ;SET FOR UUO
DPB T3,[POINTR (TRNBLK+.CHDCT,CH.DCT)] ;SET FOR UUO
LDB T3,[POINT 6,T2,11] ;GET BYTE SIZE
MOVX T4,CH.6BT ;INCASE SIXBIT
CAIN T3,6 ;TRANSLATING TO SIXBIT?
IORM T4,TRNBLK+.CHFLG ;YES
MOVEI T1,TRNBLK ;SET UP UUO AC
CHTRN. T1, ;TRANSLATE STRING
CAIN T1,CHDCE% ;DESTINATION BYTE COUNT RUN OUT?
POPJ P, ;RETURN
CAIN T1,TRNBLK ;UUO IMPLEMENTED?
JRST CHRTRX ;NO--DO IT THE HARD WAY
LDB T2,TRNBLK+.CHSB1 ;GET TERMINATING CHARACTER
CAIN T1,CHILC% ;ILLEGAL CHARACTER?
JUMPE T2,.POPJ## ;NULS ARE REALLY OK
STOP (STE,<String translation error; >,,E.STE)
E.STE: PUSH P,T1 ;SAVE ERROR CODE
CAIN T1,TRNBLK ;UUO IMPLEMENTED?
MOVNI T1,1 ;NO
CAIL T1,CHRELN ;KNOWN ERROR CODE?
MOVEI T1,0 ;NO
MOVE T1,CHRETB(T1) ;AND ASSOCIATED TEXT
PUSHJ P,.TSTRG## ;PRINT TEXT
POP P,T1 ;TRIM STACK
CAIGE T1,CHRELN ;CHECK AGAIN
POPJ P, ;RETURN
PUSHJ P,.TOCTW## ;PRINT ERROR CODE
MOVEI T1,")" ;CLOSE
PJRST .TCHAR## ;PRINT AND RETURN
[ASCIZ /CHTRN. UUO not implemeted/]
CHRETB: [ASCIZ /CHTRN. UUO error (/]
[ASCIZ /Address check/]
[ASCIZ /Illegal byte pointer/]
[ASCIZ /Unknown or reserved flag bit specified/]
[ASCIZ /Illegal character encountered/]
[ASCIZ /Destination count exhausted prematurely/]
[ASCIZ /Invalid bit combination specified/]
CHRELN==.-CHRETB
CHRTRX: MOVX T1,CH.6BT ;BIT TO TEST
TDNN T1,TRNBLK+.CHFLG ;TRANSLATING TO SIXBIT?
TDZA T1,T1 ;NO
MOVEI T1," " ;OFFSET FOR SIXBIT
PUSH P,T1 ;SAVE
CHRTR1: LDB T1,[POINTR (TRNBLK+.CHSCT,CH.SCT)] ;GET ASCIZ8 BYTE LENGTH
LDB T2,[POINTR (TRNBLK+.CHDCT,CH.DCT)] ;GET DEST BYTE LENGTH
CHRTR2: SOJL T1,.POPJ## ;RETURN IF SOURCE RUNS OUT
ILDB T3,TRNBLK+.CHSB1 ;GET A SOURCE CHARACTER
JUMPE T3,CHRTR4 ;HANDLE END OF STRING
ADD T3,[POINT 7,CHAR8] ;MAKE POINTER TO TRANSLATION TABLE
CHRTR3: ILDB T4,T3 ;GET NEXT TRANSLATION CHARACTER
JUMPE T4,CHRTR2 ;NONE, TRY NEXT SOURCE BYTE
SUB T4,(P) ;ADJUST
IDPB T4,TRNBLK+.CHDB1 ;STORE IN DESTINATION STRING
SOJG T2,CHRTR3 ;LOOP
CHRTR4: SKIPN T4,(P) ;GET OFFSET
IDPB T4,TRNBLK+.CHDB1 ;MAKE ASCIZ DESTINATION IF NECESSARY
POP P,(P) ;TRIM STACK
POPJ P, ;RETURN
; THIS TABLE IS ONLY NEEDED FOR RUNNING LOGIN UNDER A 7.02 MONITOR.
; IT WILL BE REMOVED WITH THE NEXT RELEASE OF TOPS-10.
;
;FORMAT:
; EACH WORD IS A 0-3 CHARACTER ASCIZ (7-BIT) STRING, WHICH IS THE
; FALLBACK REPRESENTATION OF THE CORRESPONDING 8-BIT CHARACTER.
; THE DEFINITION OF THESE FALLBACK REPRESENTATIONS IS CURRENTLY
; TAKEN FROM DEC STANDARD 169, UNTIL THE INTERNATIONAL STANDARD
; IS FINALLY ACCEPTED.
;
; INDEX BY THE 8-BIT ASCII CHARACTER FOR WHICH THE FALLBACK REPRESENTATION
; IS DESIRED.
;SOME HELPER MACROS
DEFINE ONE41 < BYTE (7) <.-CHAR8> >
DEFINE UPCASE < BYTE (7) <<.-CHAR8>&137> >
DEFINE ESCSEQ < BYTE (7) .CHESC, <<.-CHAR8>^!300> >
CHAR8:
REPEAT "`"+1,< ONE41 > ;0-140
REPEAT ^D26,< UPCASE > ;LOWER CASE ALPHABET
REPEAT 5,< ONE41 > ;REMAINDER OF 7-BIT SET
REPEAT ^D32,< ESCSEQ> ;8-BIT CONTROL CHARACTERS
EXP 0 ;RESERVED 240
ASCIZ \!\ ;SP03 241
ASCIZ \C\ ;SC04 242
ASCIZ \L\ ;SC02 243
EXP 0 ;RESERVED 244
ASCIZ \Y\ ;SC05 245
EXP 0 ;RESERVED 246
ASCIZ \SC\ ;SM24 247
ASCIZ \O\ ;SC01 250
ASCIZ \(C)\ ;SM52 251
ASCIZ \A\ ;SM21 252
ASCIZ \<<\ ;SP17 253
EXP 0 ;RESERVED 254
EXP 0 ;RESERVED 255
EXP 0 ;RESERVED 256
EXP 0 ;RESERVED 257
ASCIZ \O\ ;SM19 260
ASCIZ \+\ ;SA02 261
ASCIZ \2\ ;NS02 262
ASCIZ \3\ ;NS03 263
EXP 0 ;RESERVED 264
ASCIZ \U\ ;SM17 265
ASCIZ \PR\ ;SM25 266
ASCIZ \.\ ;SM26 267
EXP 0 ;RESERVED 270
ASCIZ \1\ ;NS01 271
ASCIZ \O\ ;SM20 272
ASCIZ \>>\ ;SP18 273
ASCIZ \1/4\ ;NF04 274
ASCIZ \1/2\ ;NF01 275
EXP 0 ;RESERVED 276
ASCIZ \?\ ;SP16 277
ASCIZ \A\ ;LA14 300
ASCIZ \A\ ;LA12 301
ASCIZ \A\ ;LA16 302
ASCIZ \A\ ;LA20 303
ASCIZ \A\ ;LA18 304
ASCIZ \A\ ;LA28 305
ASCIZ \AE\ ;LA52 306
ASCIZ \C\ ;LC42 307
ASCIZ \E\ ;LE14 310
ASCIZ \E\ ;LE12 311
ASCIZ \E\ ;LE16 312
ASCIZ \E\ ;LE18 313
ASCIZ \I\ ;LI14 314
ASCIZ \I\ ;LI12 315
ASCIZ \I\ ;LI16 316
ASCIZ \I\ ;LI18 317
EXP 0 ;RESERVED 320
ASCIZ \N\ ;LN20 321
ASCIZ \O\ ;LO14 322
ASCIZ \O\ ;LO12 323
ASCIZ \O\ ;LO16 324
ASCIZ \O\ ;LO20 325
ASCIZ \O\ ;LO18 326
ASCIZ \OE\ ;LO52 327
ASCIZ \O\ ;LO62 330
ASCIZ \U\ ;LU14 331
ASCIZ \U\ ;LU12 332
ASCIZ \U\ ;LU16 333
ASCIZ \U\ ;LU18 334
ASCIZ \Y\ ;LY18 335
EXP 0 ;RESERVED 336
ASCIZ \SS\ ;LS61 337
ASCIZ \A\ ;LA13 340
ASCIZ \A\ ;LA11 341
ASCIZ \A\ ;LA15 342
ASCIZ \A\ ;LA19 343
ASCIZ \A\ ;LA17 344
ASCIZ \A\ ;LA27 345
ASCIZ \AE\ ;LA51 346
ASCIZ \C\ ;LC41 347
ASCIZ \E\ ;LE13 350
ASCIZ \E\ ;LE11 351
ASCIZ \E\ ;LE15 352
ASCIZ \E\ ;LE17 353
ASCIZ \I\ ;LI13 354
ASCIZ \I\ ;LI11 355
ASCIZ \I\ ;LI15 356
ASCIZ \I\ ;LI17 357
EXP 0 ;RESERVED 360
ASCIZ \N\ ;LN19 361
ASCIZ \O\ ;LO13 362
ASCIZ \O\ ;LO11 363
ASCIZ \O\ ;LO15 364
ASCIZ \O\ ;LO19 365
ASCIZ \O\ ;LO17 366
ASCIZ \OE\ ;LO51 367
ASCIZ \O\ ;LO61 370
ASCIZ \U\ ;LU13 371
ASCIZ \U\ ;LU11 372
ASCIZ \U\ ;LU15 373
ASCIZ \U\ ;LU17 374
ASCIZ \Y\ ;LY17 375
EXP 0 ;RESERVED 376
EXP 0 ;RESERVED 377
SUBTTL Miscellaneous routines -- CTXINI/CTXUUO - Execute context UUOs
CTXINI: MOVE T2,[Z.CTXB,,Z.CTXB+1] ;SET UP BLT
SETZM Z.CTXB ;CLEAR FIRST WORD
BLT T2,Z.CTXE-1 ;CLEAR CONTEXT DATA STORAGE
MOVEI T2,CTXBLK ;POINT TO UUO BLOCK
TLZ T1,(CT.LEN) ;CLEAR OUT JUNK
TLO T1,.CTMAX ;INCLUDE UUO BLOCK LENGTH
MOVEM T1,.CTFNC(T2) ;SAVE
MOVEI T1,CTXDLN ;DATA BUFFER LENGTH
MOVEM T1,.CTDBL(T2)
MOVEI T1,CTXDAT ;DATA BUFFER ADDRESS
MOVEM T1,.CTDBA(T2)
POPJ P, ;RETURN
CTXUUO: MOVEI T1,CTXBLK ;SET UP UUO AC
CTX. T1, ;SET QUOTAS
CAIN T1,CTXBLK ;AC CHANGED (UUO NOT IMPLEMENTED)?
JRST .POPJ1## ;RETURN
MOVE T2,T1 ;COPY AC
MOVEI T1,CTXDAT ;PERHAPS TEXT IN DATA BUFFER
TXNE T2,CT.ETX ;ERROR TEXT RETURNED?
JRST CTXERR ;YES
MOVEI T1,[ASCIZ /Context-run failed; error code = /]
TXNE T2,CT.RUN ;RUN UUO ERROR?
JRST CTXERR ;YES
MOVEI T1,[ASCIZ /Unknown CTX. UUO failure/]
SETZ T2, ;CLEAR JUNK LEFT IN THE AC
CTXERR: WARN CTX,<>,,E.CTX
POPJ P, ;RETURN
E.CTX: PUSH P,T2 ;PRESERVE ERROR AC
PUSHJ P,.TSTRG## ;PRINT TEXT
POP P,T2 ;GET AC BACK
TXNN T2,CT.RUN ;RUN UUO ERROR?
POPJ P, ;NO
LDB T1,[POINTR T2,CT.ERR] ;GET ERROR CODE
PJRST .TOCTW## ;PRINT IT AND RETURN
SUBTTL Miscellaneous routines -- CTYCHK - Check CTY status
CTYCHK: TLZ F,FL.CTY ;INIT CTY FLAG
MOVE T1,[%CNFLN] ;GETTAB ARGUMENT
GETTAB T1, ;GET FRCLIN LINE NUMBER
POPJ P, ;CAN'T
MOVE T2,[%CNPTY] ;NOW MUST GET CTY LINE NUMBER
GETTAB T2, ; FROM THE MONITOR
POPJ P, ;CAN'T
HLRZS T2 ;PUT IN RH FOR COMPARE
HRRZ T3,TTBITS ;GET OUR UDX
TRZ T3,.UXTRM ;CONVERT TO A LINE NUMBER
CAIL T3,(T1) ;WITHIN THE RANGE
CAIL T3,(T2) ; OF ONE OF THE CTYS?
POPJ P, ;NO
TLO F,FL.CTY ;REMEMBER FOR LATER
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- DAYTIM - Print time, date, and weekday
DAYTIM: MSTIME T1, ;GET TIME OF DAY
IDIVI T1,^D60000 ;TO MINUTES
IDIVI T1,^D60 ;NOW BREAK IN MINS AND HRS
PUSH P,T2 ;SAVE MINUTES
MOVEI T2,"0" ;ZERO FILL
PUSHJ P,.TDEC2## ;TYPE HOURS
PUSHJ P,.TCOLN## ;TYPE A COLON
POP P,T1 ;MINUTES
MOVEI T2,"0" ;ZERO FILL
PUSHJ P,.TDEC2## ;TYPE
MOVEI T1,[ASCIZ / /] ;THREE SPACES
PUSHJ P,.TSTRG## ;PRINT THEM
PUSHJ P,.TDATN## ;AND CURRENT DATE
MOVEI T1,[ASCIZ / /] ;THREE SPACES
PUSHJ P,.TSTRG## ;PRINT THEM
MOVE T1,SAVEDA ;DAY OF WEEK
MOVE T1,WEEKDA(T1) ;POINT TO ASCIZ TEXT
PUSHJ P,.TSTRG## ;TYPE DAY OF WEEK
PJRST .TCRLF## ;END LINE WITH A CRLF AND RETURN
WEEKDA: [ASCIZ /Wednesday/]
[ASCIZ /Thursday/]
[ASCIZ /Friday/]
[ASCIZ /Saturday/]
[ASCIZ /Sunday/]
[ASCIZ /Monday/]
[ASCIZ /Tuesday/]
SUBTTL Miscellaneous routines -- TRMCLS - Clear screen function
IFE CLSDEF,< ;MAKE /NOCLEAR THE DEFAULT
TRMCLS: SKIPG U.CLEA ;WAS /CLEAR GIVEN?
POPJ P, ;NO - RETURN
>
IFN CLSDEF,< ;MAKE /CLEAR THE DEFAULT
TRMCLS: SKIPN U.CLEA ;WAS /NOCLEAR GIVEN?
POPJ P, ;YES - RETURN
>
MOVE T1,TTBITS ;GET TTY BITS
TXNN T1,GL.ITY ;PTY?
TLNE F,FL.BAT ;OR BATCH?
POPJ P, ;YES, FORGET IT
DMOVE T1,[EXP <2,,T2>,<.TOTRM>]
SETO T3, ;THIS TERMINAL
TRMOP. T1, ;GET THE TERMINAL TYPE
POPJ P, ;ERROR
MOVSI T2,-CLSMAX ;SET UP AN AOBJN POINTER
CAME T1,CLSTRM(T2) ;MATCH?
AOBJN T2,.-1 ;LOOP
JUMPG T2,.POPJ## ;POSITIVE: NO MATCH
PUSH P,T2 ;SAVE THE TERMINAL TYPE INDEX
PUSHJ P,.TOOUT## ;FORCE OUT THE LAST OUTPUT
MOVEI T2,.TOSOP ;FUNCTION
SETO T3, ;THIS TERMINAL
TRMCL1: MOVE T1,[2,,T2] ;LENGTH,,ADDRESS
TRMOP. T1, ;OUTPUT COMPLETE?
JRST TRMCL2 ;YES - HANG UP THE PHONE
MOVEI T1,1 ;SLEEP TIME
SLEEP T1, ;ZZZZZZ
JRST TRMCL1 ;TRY AGAIN
TRMCL2: DMOVE T1,[EXP <3,,T2>,<.TOOSU+.TOSET>]
SETZ T4, ;
TRMOP. T1, ;CLEAR CTRL/O
JFCL ;OH WELL, WE TRIED
POP P,T1 ;RESTORE THE TERMINAL TYPE INDEX
MOVE T1,CLSOUT(T1) ;GET THE CHARACTER SEQUENCE
PUSHJ P,.TSTRG## ;WRITE THIS STRING
PJRST .TOOUT## ;FORCE OUT THE LAST OUTPUT AND RETURN
DEFINE CLSMAC,<
X DAS21, CLS100
X VK100, CLS100
X VT05, CLS05
X VT06, CLS05
X VT50, CLS52
X VT52, CLS52
X VT61, CLS52
X VT100, CLS100
X VT101, CLS100
X VT102, CLS100
X VT103, CLS100
X VT125, CLS100
X VT180, CLS100
X VT185, CLS100
X VT220, CLS100
X VT240, CLS100
X VT241, CLS100
> ;END DEFINE CLSMAC
;NOW GENERATE THE TABLE OF TERMINAL NAMES
DEFINE X(A,B),<
XLIST
SIXBIT /A/
LIST
> ;END DEFINE X
CLSTRM: CLSMAC
CLSMAX==.-CLSTRM
;NOW GENERATE THE TABLE OF CHARACTER STRING ADDRESSES
DEFINE X(A,B),<
XLIST
EXP B
LIST
> ;END DEFINE X
CLSOUT: CLSMAC
CLS05: BYTE (7) .CHCRB,.CHDEL,.CHDEL,.CHDEL,.CHDEL
BYTE (7) .CHCUN,.CHDEL,.CHDEL,.CHDEL,.CHDEL,0
CLS52: BYTE (7) .CHESC,"H",.CHESC,"J",0
CLS100: BYTE (7) .CHESC,"[","H",.CHESC,"[","J",0
SUBTTL Miscellaneous routines -- DELTMP - Delete TMP files
DELTMP: SKIPN U.TEMP ;WANT TO DELETE TMP FILES?
POPJ P, ;NOPE
PUSHJ P,.SAVE2## ;SAVE P1 AND P2
MOVE T1,[DELSPC,,WILDBK] ;SET UP BLT
BLT T1,WILDBK+.FXLEN-1 ;COPY THE FILESPEC
MOVE T1,THSJOB ;GET OUR JOB NUMBER
PUSHJ P,.MKPJN## ;MAKE CCL REPRESENTATION
HRLM T1,WILDBK+.FXNAM ;SET FILE NAME
MOVX T1,FX.NOM!FX.PRT ;/OKNONE AND /OKPROT
IORM T1,WILDBK+.FXMOD;FORCE SWITCH TO BE
IORM T1,WILDBK+.FXMOM; SET ON ALL CALLS TO WILD
MOVEM PP,WILDBK+.FXDIR ;SET PPN IN BLOCK
SETOM WILDBK+.FXBFR ;NO /BEFORE
SETOM WILDBK+.FXSNC ;NO /SINCE
SETZM WILDPT ;CLEAR MEMORY FOR FIRST CALL
SETZB P1,P2 ;CLEAR FILES DELETED AND BLOCKS FREED
DELTM1: PUSHJ P,INIFIL ;INIT STORAGE FOR FILE I/O
MOVE T1,[FO.ASC+FO.PRV+.FODLT] ;DELETE USING PRIVS
MOVEM T1,FOP+.FOFNC
MOVEM PP,FOP+.FOPPN ;IN BEHALF PPN
MOVE T1,[4,,[[WILDBK],,0
OPN,,LEB
.FXLEN,,.RBMAX
IOC,,WILDPT]]
PUSHJ P,.LKWLD## ;LOOK FOR FILE
JRST DELTM2 ;ALL DONE
PUSHJ P,DELFIL ;DELETE THE FILE
JRST DELTM1 ;FAILED
ADD P2,T1 ;COUNT THE BLOCKS FREED
AOJA P1,DELTM1 ;COUNT THE FILE DELETED AND LOOP
DELTM2: SKIPE T1,P1 ;GET FILES DELETED
INFO DTF,<Deleted >,,E.DTF
POPJ P, ;RETURN
E.DTF: MOVE T1,P1 ;GET FILE COUNT
PUSHJ P,.TDECW## ;PRINT IT
MOVEI T1,[ASCIZ / TMP file/] ;ASSUME ONLY ONE
PUSHJ P,.TSTRG## ;PRINT TEXT
MOVEI T1,[ASCIZ /s; /]
CAIE P1,1 ;CHECK IT
MOVEI T1,[ASCIZ /; /]
PUSHJ P,.TSTRG## ;PRINT TEXT
MOVE T1,P2 ;GET BLOCK COUNT
PUSHJ P,.TDECW## ;PRINT BLOCKS FREED
MOVEI T1,[ASCIZ / blocks freed/]
PJRST .TSTRG## ;PRINT TEXT AND RETURN
; SCAN BLOCK FOR DSK:*.TMP[,,*,*,*,*,*]/PHYSICAL/OKNONE/OKPROT
DELSPC: EXP <'DSK '> ;.FXDEV
EXP <' ???'> ;.FXNAM
XWD 777777,0 ;.FXNMM
XWD 'TMP',-1 ;.FXEXT
<FX.DIR!FX.PHY!FX.NOM!FX.PRT> ;.FXMOD
<FX.DIR!FX.PHY!FX.NOM!FX.PRT> ;.FXMOM
EXP <0,,0>,-1 ;.FXDIR/.FXDIM
EXP <'* '>,0 ;SFD #1
EXP <'* '>,0 ;SFD #2
EXP <'* '>,0 ;SFD #3
EXP <'* '>,0 ;SFD #4
EXP <'* '>,0 ;SFD #5
BLOCK .FXLEN-<.-DELSPC>
SUBTTL Miscellaneous routines -- DETJOB - Report detached jobs
DETJOB: SKIPN JOBCNT ;HAVE ANY JOBS?
POPJ P, ;NO
PUSHJ P,.TNEWL## ;START OFF WITH A NEW LINE
MOVE T1,JOBCNT ;GET COUNT OF JOBS
PUSHJ P,.TDECW## ;PRINT NUMBER
MOVE T2,JOBCNT ;GET COUNT AGAIN
MOVEI T1,[ASCIZ / detached jobs logged in under /]
CAIN T2,1 ;ONLY ONE?
MOVEI T1,[ASCIZ / detached job logged in under /]
PUSHJ P,.TSTRG## ;PRINT IT
MOVE T1,PP ;GET TARGET PPN
PUSHJ P,.TPPNW## ;PRINT IT
PUSHJ P,.TCOLN## ;PRINT A COLON
PUSHJ P,.TCRLF## ;TERMINATE LINE
PUSHJ P,MAPINI ;INIT JOBMAP POINTER
DETJO1: PUSHJ P,MAPNXT ;GET THE NEXT JOB
POPJ P, ;DONE
PUSHJ P,DETSTS ;PRINT SOME INFO
JRST DETJO1 ;LOOK FOR ANOTHER JOB
SUBTTL Miscellaneous routines -- DETSTS - Print detached job status
DETSTS: PUSHJ P,.SAVE1## ;SAVE P1
MOVEI P1,(T1) ;COPY JOB NUMBER
MOVEI T1,[ASCIZ/ Job /]
PUSHJ P,.TSTRG## ;PRINT TEXT
MOVEI T1,(P1) ;GET JOB NUMBER
PUSHJ P,.TDECW## ;PRINT IT
PUSHJ P,.TSPAC## ;SPACE
HRLZI T1,(P1) ;GET JOB NUMBER
HRRI T1,.GTPRG ;GET PROGRAM NAME
GETTAB T1, ;ASK MONITOR
MOVEI T1,0 ;NOT TODAY
PUSHJ P,.TSIXN## ;PRINT PROGRAM NAME
MOVN T1,P1 ;GET NEGATIVE JOB NUMBER
JOBSTS T1, ;FIND STATE
PJRST .TCRLF## ;CAN'T--FINISH LINE
TXNE T1,JB.URN ;RUNNING?
SKIPA T1,[[ASCIZ/ running/]]
MOVEI T1,[ASCIZ/ stopped/]
PUSHJ P,.TSTRG## ;PRINT STATE
PJRST .TCRLF## ;PRINT A CRLF AND RETURN
SUBTTL Miscellaneous routines -- ERRMSG - Error message handler
ERRMSG: MOVEM T1,ERRACS+1 ;SAVE T1
MOVE T1,[2,,ERRACS+2];SETUP BLT
BLT T1,ERRACS+16 ;EXCLUDE F(0) AND P(17)
HRRZ P1,(P) ;GET ADDRESS OF ARGS FROM CALL
POP P,(P) ;GET EXTRA PUSHJ OFF THE STACK
PUSHJ P,.VERBO## ;GET VERBOSITY BITS
MOVE P2,1(P1) ;GET FLAGS
PUSH P,T1 ;SAVE THEM FOR LATER
PUSHJ P,.TNEWL## ;TYPE A CRLF IF NEEDED
TXNE P2,EF.REQ ;REQUE BATCH JOB?
MOVE T1,["?",,[ASCIZ/?(5)/]]
TXNE P2,EF.SYS ;SYSTEM FAILURE
MOVE T1,["?",,[ASCIZ/?(4)/]] ;YES--DATA FOR THAT
TXNE P2,EF.ERR ;FATAL ERROR
MOVE T1,["?",,[ASCIZ/?(3)/]]
TXNE P2,EF.WRN ;WARNING?
MOVE T1,["%",,[ASCIZ/%/]]
TXNE P2,EF.INF ;INFORMATIONAL
MOVE T1,["[",,[ASCIZ/[/]]
TLNN F,FL.BAT ;BATCH JOB?
JRST [HLRZ T1,T1 ;NO--PUT CHAR IN RH
PUSHJ P,.TCHAR## ;TYPE IT
JRST ERMSG1] ;CONTINUE
HRRZ T1,T1 ;CLEAR LH
PUSHJ P,.TSTRG## ;TYPE THE MESSAGE
ERMSG1: MOVE T1,(P) ;GET VERBOSITY BITS
TXNN T1,JWW.PR ;/MESSAGE:PREFIX?
JRST ERMSG2 ;NO
HRRZ T1,(P1) ;GET PREFIX
HRLI T1,'LGN' ;INCLUDE OUR NAME
PUSHJ P,.TSIXN## ;TYPE IN SIXBIT
ERMSG2: PUSHJ P,.TSPAC## ;PRINT A SPACE
POP P,T1 ;GET VERBOSITY BITS
TXNN T1,JWW.FL ;/MESSAGE:FIRST?
JRST ERMSG3 ;NO
HRRZ T1,1(P1) ;GET TEXT ADDRESS
PUSHJ P,.TSTRG## ;YES--PRINT THE STRING
HLRZ T1,(P1) ;GET MORE ADDRESS
JUMPE T1,ERMSG3 ;NONE
PUSH P,P2 ;SAVE FLAGS
PUSH P,P1 ;SAVE ADDRESS OF ARGS
PUSH P,T1 ;SAVE IT
MOVE 16,[ERRACS+1,,1];RESTORE ACS
BLT 16,16 ;..
PUSHJ P,@(P) ;CALL CONTINUATION ROUTINE
POP P,(P) ;FIX STACK
POP P,P1 ;RESTORE ADDRESS OF ARGS
POP P,P2 ;RESTORE FLAGS
ERMSG3: TXNE P2,EF.WTO ;WTO THIS ERROR?
PUSHJ P,ERRWTO ;YES--DO IT NOW
TXNE P2,EF.INF ;INFORMATION?
PUSHJ P,.TRBRK## ;YES
PUSHJ P,.TCRLF## ;CRLF
ERMSGX: TXNE P2,EF.FMT ;FORMAT ERROR? (LET HIM RETRY)
JRST ERMSG6 ;YES
TXNE P2,EF.ERR!EF.SYS!EF.REQ ;FATAL?
JRST ERMSG4 ;YES--GO FLUSH USER
MOVE 16,[ERRACS+1,,1];RESTORE ACS
BLT 16,16 ;..
POPJ P, ;AND RETURN
ERMSG4: PUSHJ P,.TCRLF## ;DO A CRLF
TXNE P2,EF.SIL!EF.FMT ;SUPRESS NOTICE.TXT OR FORMAT ERROR?
JRST ERMSG5 ;YES
MOVE T1,[SIXBIT /LOGIN/]
SETNAM T1, ;CLEAR JACCT
MOVX T1,CM.ATT!CM.LOG ;BITS TO TEST
TDNE T1,COMIDX ;ATTACH OR LOGIN COMMANDS?
PUSHJ P,NOTICE ;YES--PRINT NOTICE.TXT
PUSHJ P,STRMES ;AND DO /STR IF DESIRED
ERMSG5: PJRST FLUSH ;AND DIE
ERMSG6: PUSHJ P,.CLRBF## ;CLEAR TYPE-AHEAD
MOVSI P2,(CM.LOG) ;BIT TO TEST
TLNN F,FL.BAT ;BATCH?
TDNN P2,COMIDX ;LOGIN COMMAND?
PJRST FLUSH ;GIVE UP NOW
SOSG P2,LOGTRY ;ANOTHER CHANCE??
PJRST FLUSH ;NO, BYE-BYE
JRST RESTAR ;TRY AGAIN
; ROUTINE TO SEND ERROR TEXT TO OPR. CALLED ONLY BY ERRMSG.
ERRWTO: MOVE T1,[LGELEN,,LGETXT] ;LENGTH,,ADDRESS OF "TYPE" TEXT
TXNE P2,EF.ACF ;ACCESS FAILURE?
MOVE T1,[LGALEN,,LGATXT] ;YES--USE SPECIAL "TYPE" TEXT
PUSHJ P,WTOINI ;INIT WTO FACILITIES
HRRZ T1,1(P1) ;GET TEXT ADDRESS
PUSHJ P,.TSTRG## ;STORE IN WTO BUFFER
HLRZ T1,(P1) ;GET MORE ADDRESS
JUMPE T1,ERRWT1 ;NONE
PUSH P,P2 ;SAVE FLAGS
PUSH P,T1 ;SAVE IT
MOVE 16,[ERRACS+1,,1];RESTORE ACS
BLT 16,16 ;..
PUSHJ P,@(P) ;CALL CONTINUATION ROUTINE
POP P,(P) ;FIX STACK
POP P,P2 ;RESTORE FLAGS
PUSHJ P,.TSTRG## ;STORE IN WTO BUFFER
ERRWT1: TXNE P2,EF.ACF ;ACCESS FAILURE?
PUSHJ P,ERRACF ;YES--APPEND LOTS OF JUNK
PUSHJ P,WTOSND ;SEND TO OPR
CAIA ;FAILED
POPJ P, ;OK
ERRWO: TXNE P2,EF.ACF ;ACCESS FAILURE?
POPJ P, ;RETURN QUIETLY
MOVEI T1,[ASCIZ/; Please call the operator/]
PJRST .TSTRG## ;THE TEXT W/O THE WTO
LGETXT: ASCIZ/LOGIN error/ ;NORMAL ERROR "TYPE" TEXT
LGELEN==.-LGETXT
LGATXT: ASCIZ/LOGIN access failure/ ;ACCESS ERROR "TYPE" TEXT
LGALEN==.-LGATXT
ERRACF: PUSHJ P,.TCRLF## ;START WITH A CRLF
MOVEI T1,[ASCIZ /Job /]
PUSHJ P,.TSTRG##
MOVE T1,THSJOB ;GET OUR JOB NUMBER
PUSHJ P,.TDECW##
MOVEI T1,[ASCIZ / on /]
PUSHJ P,.TSTRG##
MOVE T1,MYTTY ;GET OUR TTY NAME
PUSHJ P,.TSIXN##
MOVEI T1,[ASCIZ / executing a /]
PUSHJ P,.TSTRG##
HRRZ T1,COMIDX ;GET INVOKING COMMAND INDEX
MOVE T1,COMLST(T1) ;AND ASSOCIATED NAME
PUSHJ P,.TSIXN##
MOVEI T1,[ASCIZ / command/]
PUSHJ P,.TSTRG##
PUSHJ P,.TCRLF##
MOVEI T1,[ASCIZ /Target PPN: /]
PUSHJ P,.TSTRG##
MOVE T1,PP
PUSHJ P,.TPPNW##
SKIPE NEWTTY ;HAVE A NEW TTY?
PUSHJ P,[MOVEI T1,[ASCIZ / New terminal: /]
PUSHJ P,.TSTRG##
MOVE T1,NEWTTY
PJRST .TSIXN##]
MOVEI T1,[ASCIZ / Name: /]
PUSHJ P,.TSTRG##
MOVEI T1,USERID
PUSHJ P,.T8STR##
PUSHJ P,.TCRLF##
MOVEI T1,[ASCIZ /Accounting PPN: /]
PUSHJ P,.TSTRG##
MOVE T1,AENTRY+.AEPPN
PUSHJ P,.TPPNW##
MOVEI T1,[ASCIZ / Name: /]
PUSHJ P,.TSTRG##
MOVEI T1,AENTRY+.AENAM
PUSHJ P,.T8STR##
PJRST .TCRLF##
SUBTTL Miscellaneous routines -- FAILUR - Check for access failures
FAILUR: MOVE T1,LOGTRY ;GET ATTEMPTS AT LOGGING IN
CAIL T1,RETRYN ;BELOW THE UNCONDITIONAL FAILURE THRESHOLD?
TDZA T1,T1 ;YES
MOVNI T1,1 ;ELSE ACCESS WILL NEVER BE GRANTED NOW
MOVEM T1,FAILFL ;SET FLAG ACCORDINGLY
JUMPE T1,.POPJ## ;RETURN IF A REASONABLE NUMBER OF FAILURES
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- GENTIM - Generate day-of-week and times data
GENTIM: TLZ F,FL.WKD ;CLEAR WEEKDAY FLAG
PUSHJ P,.GTNOW## ;GO GET TODAYS DATE
HLRZ T1,T1 ;SAVE THE DAY
IDIVI T1,7 ;FIGURE OUT THE DAY
CAIL T2,3 ;SATURDAY??
CAILE T2,4 ;OR SUNDAY??
TLO F,FL.WKD ;NO--FLAG AS WEEKDAY
MOVEM T2,SAVEDA ;SALT AWAY
MSTIME T1,
IDIV T1,[EXP ^D1000*^D60*^D60]
MOVSI T2,400000 ;MAKE A BIT FOR THE CURRENT HOUR
TLNN F,FL.WKD ;WEEKDAY?
MOVEI T2,4000 ;NO. USE LOW 12 BITS
TLNN F,FL.WKD ;WEEKDAY?
ASH T1,-1 ;NO. USE TWO-HOUR SHIFTS
MOVNS T1
LSH T2,0(T1) ;PUT BIT IN TUNE WITH TIME
MOVEM T2,NOWBIT ;SAVE.
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- ISBATC - Determine if a batch job
; SUBROUTINE TO DETERMINE IF JOB NUMBER IN T1 IS A BATCH JOB
; CALL: MOVE T1, JOB
; PUSHJ P,ISBATC
; <NON-SKIP> ;NOT A BATCH JOB
; <SKIP> ;A BATCH JOB
ISBATC: PUSH P,T1 ;SAVE JOB NUMBER
HRLZS T1 ;PUT IN LH
HRRI T1,.GTLIM ;GETTAB TABLE
GETTAB T1, ;READ LIMIT WORD
SETZ T1, ;ASSUME NOT
TXNE T1,JB.LBT ;A BATCH JOB?
AOS -1(P) ;YES
POP P,T1 ;RESTORE JOB NUMBER
POPJ P, ;AND RETURN
SUBTTL Miscellaneous routines -- ISOPSR - Determine if a subjob of OPSER
; CALL: PUSHJ P,ISOPSR
; <NON-SKIP> ;NOT AN OPSER SUBJOB
; <SKIP> ;SUBJOB OF OPSER
ISOPSR: SETO T1, ;THIS JOB
CTLJOB T1, ;WHO CONTROLS ME?
POPJ P, ;I DUNNO
MOVE T2,T1 ;REMEMBER CNTRL JOB NO.
TRMNO. T1, ;WHERE'S HIS TTY AT?
POPJ P, ;DUNNO
GETLCH T1 ;WHAT KIND OF TERMINAL
TXNE T1,GL.ITY ;PTY?
POPJ P, ;YES--PROBABLY BATCON
HRLZ T1,T2 ;GET JOB NO.
HRRI T1,.GTPRG ;SET UP FOR GETTAB
GETTAB T1, ;GET PROGRAM NAME
POPJ P, ;A REAL LOSER
CAMN T1,[SIXBIT /OPSER/]
AOS (P) ;YES
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- KSYCHK - Check pending KSYS
KSYCHK: MOVE T1,[%NSKTM] ;FIND OUT IF SYSTEM IS DOWN
GETTAB T1,
SETZ T1,
JUMPE T1,.POPJ## ;RETURN IF KSYS NOT SET
JUMPG T1,KSYCH1 ;JUMP IF SYSTEM GOING DOWN SOON
MOVE T1,TTBITS ;GET TTY BITS
TLNN F,L.OPR!L.SOPR ;IF OPR OR SUB OF OPR OR 1,2
TXNN T1,GL.REM!GL.DSL ;OR LOCAL TTY
POPJ P, ;THEN LET HIM IN ANYWAY
STOP TIO,<Timesharing is over>
KSYCH1: CAIGE T1,^D24*^D60 ;OVER A DAY TO GO?
INFO TCI,<Timesharing will cease in >,,E.TCI
POPJ P, ;RETURN
E.TCI: PUSH P,T1 ;SAVE MINUTES TILL KSYS
IDIVI T1,^D60 ;GET HOURS
MOVE T4,T2 ;SAVE REMAINDER (MINUTES)
JUMPE T1,E.TCI1 ;SEE IF HOURS NONZERO
PUSHJ P,.TDECW## ;YES. PRINT HOURS
MOVEI T1,[ASCIZ/ hours /]
PUSHJ P,.TSTRG##
E.TCI1: MOVE T1,T4 ;GET MINUTES
PUSHJ P,.TDECW##
MOVEI T1,[ASCIZ/ minutes at /]
PUSHJ P,.TSTRG## ;TYPE
MSTIME T1, ;GET NOW
IDIVI T1,^D60*^D1000 ;MAKE MINUTES
POP P,T2 ;RESTORE KSYS TIMER
ADD T1,T2 ;COMBINE
CAILE T1,^D24*^D60 ;WRAP AROUND?
SUBI T1,^D24*^D60 ;YES--FIX UP
IMULI T1,^D60*^D1000 ;BACK INTO MILLISECONDS FOR SCAN
PJRST .TTIME## ;TYPE AND RETURN
SUBTTL Miscellaneous routines -- LGLACT/LGLRMK - Check strings
; CHECK ACCOUNT AND REMARK STRINGS FOR LEGAL CHARACTERS
LGLACT: TDZA T4,T4 ;ACCOUNT ENTRY
LGLRMK: MOVEI T4,1 ;REMARK ENTRY
MOVE T2,[POINT 7,.NMUL##] ;BYTE POINTER TO STORAGE
MOVEI T3,.AACLC ;MAXIMUM LENGTH
LGLXXX: ILDB T1,T2 ;GET A CHARACTER
JUMPE T1,.POPJ## ;RETURN IF END OF STRING
CAIGE T1,176 ;RANGE
CAIGE T1," " ; CHECK
PUSHJ P,LGLXX1 ;NO GOOD
SOJGE T3,LGLXXX ;LOOP FOR ALL
SKIPN T4 ;SKIP IF REMARK STRING
FATAL ATL,<Account string too long>,EF.FMT
MOVEI T1,.CHNUL ;GET A NUL
IDPB T1,T2 ;TERMINATE STRING
POPJ P, ;AND RETURN
LGLXX1: SKIPN T4 ;SKIP IF REMARK STRING
FATAL ICA,<Illegal character >,EF.FMT,E.ICA
MOVEI T1,"\" ;REPLACE BAD CHARACTER WITH A BACKSLASH
DPB T1,T2 ;UPDATE STRING
POPJ P, ;RETURN
E.ICA: PUSH P,T1 ;SAVE BAD CHARACTER
MOVEI T1,"""" ;GET QUOTES
PUSHJ P,.TCHAR## ;PRINT THEM
POP P,T1 ;GET BAD CHARACTER BACK
PUSHJ P,.TFCHR## ;PRINT FUNNY CHARACTER
MOVEI T1,"""" ;GET QUOTES AGAIN
PUSHJ P,.TCHAR## ;PRINT THEM
MOVEI T1,[ASCIZ / in account string/]
PJRST .TSTRG## ;PRINT TEXT AND RETURN
SUBTTL Miscellaneous routines -- LOGJOB - LOGIN the job
LOGJOB: SETOM CCWAIT ;DISABLE CONTROL-C
MOVE T1,[-5,,LGNBLK] ;SET UP UUO AC
LOGIN T1, ;LOG THE JOB IN
SKIPN T1,AENTRY+.AEPGR ;FORCING PROGRAM-TO-RUN?
PJRST CTLCOK ;NO--LET CONTROL-C THROUGH AND RETURN
ADDI T1,AENTRY ;INDEX INTO PROFILE
SKIPN 1(T1) ;A FILE NAME THERE?
PJRST CTLCOK ;NO--RELEASE CONTROL-C INTERLOCK AND RETURN
MOVEI T2,RUNBLK ;POINT TO RUN UUO BLOCK
SKIPN T3,0(T1) ;GET DEVICE
MOVSI T3,'SYS' ;DEFAULT
MOVEM T3,.RNDEV(T2)
MOVE T3,1(T1) ;FILE NAME
MOVEM T3,.RNNAM(T2)
HLLZ T3,2(T1) ;EXTENSION
MOVEM T3,.RNEXT(T2)
MOVSI T3,3(T1) ;START OF PPN/PATH SPEC
HRRI T3,RUNPTH+.PTPPN ;MAKE A BLT POINTER
BLT T3,RUNPTH+.PTMAX-1 ;COPY
MOVEI T3,RUNPTH ;POINT TO PATH BLOCK
SKIPE .PTPPN(T3) ;HAVE A PPN?
MOVEM T3,.RNPPN(T2) ;POINT RUN UUO BLOCK AT IT
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- MAILCH - Check for mail
MAILCH: TLNN F,FL.WLD ;WILD PROGRAMMER?
SKIPE UFDNDL ;NO DELETE ON FOR SOME UFD?
POPJ P, ;YES--DON'T CHECK FOR MAIL
SKIPE U.MAIL ;USER REQUEST MAIL CHECKING?
TLNE F,FL.BAT ;YES--BUT NOT FOR BATCH
POPJ P, ;RETURN
PUSHJ P,INIFIL ;INITIALIZE I/O DATA STORAGE
MOVE T1,[MAILDV] ;DEVICE
MOVEM T1,OPN+.OPDEV
MOVE T1,[MAILFN] ;FILE NAME
MOVEM T1,LEB+.RBNAM
MOVSI T1,(MAILEX) ;FILE EXTENSION
MOVEM T1,LEB+.RBEXT
MOVE T1,[MAILPP] ;PPN
CAMN T1,[EXP -1] ;USE PPN FROM ACCOUNTING ENTRY?
MOVE T1,AENTRY+.AEPPN ;YES
MOVEM T1,LEB+.RBPPN
OPEN IOC,OPN ;OPEN A CHANNEL
POPJ P, ;ASSUME NO NEW MAIL
LOOKUP IOC,LEB ;LOOKUP THE FILE
JRST MAIL1 ;NOT THERE
MOVX T1,RB.DEC ;BIT TO TEST
TDNN T1,LEB+.RBTYP ;ARE THE RDH WORDS VALID?
JRST MAIL1 ;NO
LDB T1,[POINTR LEB+.RBTYP,RB.DTO] ;GET DATA "OTS" CODE
LDB T2,[POINTR LEB+.RBFFB,RB.ACW] ;GET APPLICATION BITS
CAIN T1,.RBOMS ;WAS FILE WRITTEN BY THE DEC-10 MAILER (MS)?
TRNN T2,MAILBT ;DOES NEW MAIL EXIST?
JRST MAIL1 ;NO
INFO YHM,<You have new mail; to receive it, type MAIL>,,
MAIL1: RELEAS IOC, ;RELEASE THE CHANNEL
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- MAPJOB - Map all jobs with same PPN
MAPJOB: PUSH P,T1 ;SAVE SUBROUTINE
MOVE T1,[JOBMAP,,JOBMAP+1] ;SET UP BLT
SETZM JOBMAP ;CLEAR FIRST WORD
BLT T1,JOBMAP+<^D512/^D36>-1 ;CLEAR ENTIRE BIT MAP
SETZM JOBCNT ;INIT COUNT OF JOBS
MOVE T1,[%NSHJB] ;ARGUMENT
GETTAB T1, ;HIGHEST JOB LOGGED IN
MOVEI T1,^D511 ;ASSUME THE MAX
MAPJO1: CAMN T1,THSJOB ;THIS JOB?
JRST MAPJO2 ;YES--IGNORE IT
HRLZ T2,T1 ;GET JOB NUMBER
HRRI T2,.GTPPN ;GETTAB TABLE NUMBER
GETTAB T2, ;READ PPN
JRST MAPJO2 ;DON'T CARE ABOUT THIS ONE
CAMN T2,PP ;SAME PPN?
PUSHJ P,@(P) ;CALL SUBROUTINE TO VALIDATE JOB
JRST MAPJO2 ;IGNORE THIS ONE
MOVE T2,T1 ;GET JOB NUMBER
IDIVI T2,^D36 ;COMPUTE WORD IN BIT MAP
MOVNS T3 ;NEGATE
MOVSI T4,400000 ;GET A BIT
LSH T4,(T3) ;POSITION IT
IORM T4,JOBMAP(T2) ;INDICATE THIS JOB HAS SAME PPN
AOS JOBCNT ;COUNT THE JOB
MAPJO2: SOJG T1,MAPJO1 ;LOOP FOR ALL JOBS
POP P,(P) ;PRUNE STACK
PJRST MAPINI ;RESET POINTERS AND RETURN
; ROUTINE TO RESET POINTERS INTO THE BIT MAP. MUST BE CALLED
; PRIOR TO CALLING MAPNXT.
MAPINI: MOVSI T1,-<^D512/^D36> ;AOBJN POINTER
MOVEM T1,JOBPTR ;SAVE
POPJ P, ;RETURN
; ROUTINE TO RETURN THE NEXT JOB FROM THE BIT MAP
MAPNXT: MOVE T1,JOBPTR ;GET POINTER TO MAP
MAPNX1: MOVE T2,JOBMAP(T1) ;GET A WORD
JFFO T2,.+2 ;FIND FIRST BIT
JRST MAPNX2 ;WORD EMPTY?
HRRZS T2,T1 ;ISOLATE MAP WORD
IMULI T1,^D36 ;36 JOBS PER WORD ARE MAPPED
ADDI T1,(T3) ;T1=JOB NUMBER FROM MAP
MOVNS T3 ;NEGATE
MOVSI T4,400000 ;GET A BIT
LSH T4,(T3) ;POSITION
ANDCAM T4,JOBMAP(T2) ;CLEAR THE BIT
MOVEM T1,JOBNUM ;SAVE LAST JOB NUMBER FOUND
JRST .POPJ1## ;RETUR
MAPNX2: AOBJP T1,.POPJ## ;ADVANCE POINTER
MOVEM T1,JOBPTR ;SAVE
JRST MAPNX1 ;TRY THE NEXT WORD
SUBTTL Miscellaneous routines -- NEWPPN/OLDPPN - Change PPN
NEWPPN: SKIPA T1,PPN ;NEW PPN
OLDPPN: MOVE T1,HLPPPN ;OLD PPN
TLNE F,FL.LGN ;LOGGED IN?
POPJ P, ;THEN NOTHING TO DO
HRRZ T2,T1 ;GET PROGRAMMER NUMBER
CAIN T2,UNIPRG ;GENERATING A UNIQUE PROGRAMMER NUMBER?
HRRI T1,0 ;YES
MOVEM T1,.MYPPN## ;UPDATE SCAN
TRNE T1,-1 ;A REAL PPN?
CHGPPN T1, ;YES
JFCL ;SHOULDN'T FAIL
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- CHKLPN - check Logged-in PPN
;THIS ROUTINE CHECKS TO SEE IF THE LOGGED-IN PPN MATCHES THE
;CURRENT PPN. IF THEY DO, ALL IS FINE. IF NOT, ATTEMPT TO
;USE CHGPPN TO GO BACK HOME. IF CHGPPN FAILS, OR THE LOGGED-IN PPN
;IS ZERO, ASSUME THAT THE MONITOR DOESN'T KNOW .GTLPN AND PUNT.
CHKLPN: SETZM PRVPPN ;CLEAR PREVIOUS-PPN HOLDER
SKIPE T1,LPNPPN ;GET LOGGED-IN PPN - IS IT NONZERO?
CAMN T1,PPN ;YES - IS IT SAME AS CURRENT PPN?
POPJ P, ;YES, OR .GTLPN NOT IN MONITOR - GIVE UP
CHGPPN T1, ;NO - TRY TO CHANGE IT
POPJ P, ;FAILED..OH WELL, WE TRIED - GIVE UP
MOVE T2,PPN ;GET OLD PPN
MOVEM T2,PRVPPN ;STORE IT AWAY
MOVEM T1,PPN ;MAKE OUR IDEA OF PPN MATCH MONITOR'S...
MOVE PP,T1 ;...
MOVEM T1,.MYPPN## ;ALSO TEACH SCAN ABOUT THE CHANGE SO THAT
;HE'LL FIND SWITCH.INI IN THE RIGHT PLACE
POPJ P, ;GO BACK
;TYPLPN DISPLAYS THE "PIVOTING BACK" MESSAGE".
TYPLPN: SKIPE U.NMSG ;ARE WE BEING QUIET?
SKIPN PRVPPN ;DID WE ACTUALLY GO ANYWHERE?
POPJ P, ;NO - DONT SAY ANYTHING
INFO PBT,<Pivoting back to >,,TYPL.1
TYPL.0: POPJ P, ;ALL DONE
TYPL.1: MOVE T1,LPNPPN ;GET WHERE WE'RE GOING
PUSHJ P,.TPPNW## ;TYPE THAT
MOVEI T1,[ASCIZ / from /] ;GET 'FROM' STRING
PUSHJ P,.TSTRG## ;TYPE THAT TOO
MOVE T1,PRVPPN ;GET SAVED COPY OF WHERE WE WERE
PJRST .TPPNW## ;TELL THE USER AND RETURN
SUBTTL Miscellaneous routines -- OTHJOB - Report other jobs same PPN
OTHJOB: TLNE F,FL.WLD ;WILDCARD PPN?
POPJ P, ;YES--BETTER NOT BE ANY OTHERS
MOVEI T1,.POPJ1## ;ALL MATCHES SUCCEED
PUSHJ P,MAPJOB ;BUILD A BIT MAP OF OTHER JOBS
SKIPN T1,JOBCNT ;FOUND ANY JOBS?
POPJ P, ;NO
INFO JSP,<Other jobs same PPN>,,E.JSP
POPJ P, ;RETURN
E.JSP: MOVE T1,PPN ;GET PPN
CAMN T1,ALPPPN ;IS IT [1,2]?
POPJ P, ;YES--SKIP THIS STUFF
PUSHJ P,.TCOLN## ;TYPE A COLON
TRZ F,R.COMA ;CLEAR COMMA FLAG
E.JSP1: PUSHJ P,MAPNXT ;GET NEXT JOB NUMBER
POPJ P, ;DONE
CAMN T1,THSJOB ;THIS JOB?
JRST E.JSP1 ;YES--IGNORE IT
PUSH P,T1 ;SAVE JOB NUMBER
TROE F,R.COMA ;COMMA TYPED YET?
PUSHJ P,.TCOMA## ;TYPE A COMMA
POP P,T1 ;RESTORE JOB NUMBER
PUSHJ P,.TDECW## ;PRINT IT
JRST E.JSP1 ;LOOP FOR ALL JOBS
SUBTTL Miscellaneous routines -- PTHCHK - Check a path spec
PTHCHK: SKIPN .FXDEV(T1) ;DID USER TYPE ANYTHING?
JRST .POPJ1## ;NO--CHECK NO FURTHER
MOVX T2,FX.NDV ;BIT TO TEST
TDNN T2,.FXMOD(T1) ;NO DEVICE (SCAN DEFAULTED TO 'DSK')?
POPJ P, ;BAD PATH SPEC
SKIPN .FXNAM(T1) ;FILE NAME IS ILLEGAL
SKIPE .FXEXT(T1) ;EXTENSION IS ILLEGAL
POPJ P, ;GIVE UP
MOVSI T3,-.FXLND ;ENTRIES IN A FULL PATH SPEC
ADD T3,T1 ;BASE ADDR OF PATH SPEC
PTHCH1: SKIPN .FXDIR(T3) ;WAS A DIRECTORY GIVEN?
JRST PTHCH2 ;NO, WE'VE REACHED END OF LIST
AOSE .FXDIM(T3) ;YES, WERE WILD CARDS GIVEN?
JRST .POPJ## ;YES, MUSTN'T DO THAT
AOJ T3,
AOBJN T3,PTHCH1 ;LOOP TO CHECK ENTIRE PATH
PTHCH2: HLLZ T2,.FXDIR(T1) ;GET PROJECT NUMBER
SKIPN T2 ;ZERO?
HLLM PP,.FXDIR(T1) ;YES--DEFAULT IT
HRRZ T2,.FXDIR(T1) ;GET PROGRAMMER NUMBER
SKIPN T2 ;ZERO?
HRRM PP,.FXDIR(T1) ;YES--DEFAULT IT
JRST .POPJ1## ;GIVE GOOD RETURN
SUBTTL Miscellaneous routines -- PRTPLR - Pluralize strings
;SUBROUTINE TO PLURALIZE SUCCESS OR FAILURE COUNT MESSAGE
;CALL: MOVEI T1,SUCCESS_OR_FAILURE_COUNT
; MOVEI T2,STRING_TO_PLURALIZE
; PUSHJ P,PRTPLA(S)
; RETURN HERE
PRTPLA: SKIPA T3,[[ASCIZ /'s/]]
PRTPLS: MOVEI T3,[ASCIZ /s/]
PUSH P,T1 ;SAVE NUMBER
PUSH P,T3 ;SAVE SUFFIX
PUSH P,T2 ;SAVE STRING
CAIE T1,0 ;ZERO?
CAIN T1,1 ;ONE?
SKIPA T1,PLSTAB(T1) ;YES
JRST PRTPL1 ;ONWARD
PUSHJ P,.TSTRG## ;PRINT TEXT
JRST PRTPL2 ;ENTER COMMAN CODE
PRTPL1: PUSHJ P,.TDECW## ;PRINT A NUMBER
PRTPL2: PUSHJ P,.TSPAC## ;SPACE OVER
POP P,T1 ;GET STRING
PUSHJ P,.TSTRG## ;PRINT IT
POP P,T1 ;GET TEXT BACK
POP P,T2 ;GET NUMBER BACK
CAIE T2,1 ;ONLY ONE?
PJRST .TSTRG## ;YES
POPJ P, ;RETURN
PLSTAB: [ASCIZ /no/]
[ASCIZ /one/]
SUBTTL Miscellaneous routines -- PRTPPN - Print a PPN
;SUBROUTINE TO PRINT A PPN
;CALL: MOVEI T1,PPN
; PUSHJ P,PRTPPN
; RETURN HERE
PRTPPN: PUSH P,T1 ;SAVE PPN
MOVEI T1,"[" ;START OF PPN
PUSHJ P,.TCHAR## ;PRINT IT
HLRZ T1,(P) ;GET PROJECT NUMBER
CAIN T1,777777 ;DEFAULT?
JRST PRTPM ;YES
PUSHJ P,.TOCTW## ;PRINT IT
JRST PRTPP2 ;ONWARD
PRTPM: MOVEI T1,"%" ;DEFAULT INDICATOR
PUSHJ P,.TCHAR## ;PRINT IT
PRTPP2: PUSHJ P,.TCOMA## ;SEPERATOR
POP P,T1 ;GET PPN BACK
HRRZS T1 ;ISOLATE PROGRAMMER NUMBER
CAIN T1,777776 ;UNIQUE?
JRST PRTPP3 ;YES
CAIN T1,777777 ;DEFAULT?
JRST PRTPP4 ;YES
PUSHJ P,.TOCTW## ;PRINT IT
PUSHJ P,.TRBRK## ;PRINT TRAILING RIGHT BRACKET
POPJ P, ;RETURN
PRTPP3: SKIPA T1,["#"] ;UNIQUE
PRTPP4: MOVEI T1,"%" ;DEFAULT
PUSHJ P,.TCHAR## ;PRINT CHARACTER
PUSHJ P,.TRBRK## ;PRINT TRAILING RIGHT BRACKET
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- PRTUSR - Print a PPN and name
PRTUSR: HLRZ T1,AENTRY+.AEPPN ;GET PROJECT NUMBER
CAIN T1,777777 ;DEFAULT?
JRST PRTUS1 ;YES
MOVEI T3,6 ;FIELD WIDTH
PUSHJ P,.TOCTJ## ;PRINT IT
JRST PRTUS2 ;ONWARD
PRTUS1: MOVEI T1,[ASCIZ / %/]
PUSHJ P,.TSTRG## ;PRINT DEFAULT INDICATOR
PRTUS2: PUSHJ P,.TCOMA## ;SEPERATE
HRRZ T1,AENTRY+.AEPPN ;GET PROGRAMMER NUMBER
CAIN T1,777776 ;UNIQUE?
JRST PRTUS3 ;YES
CAIN T1,777777 ;DEFAULT?
JRST PRTUS4 ;YES
PUSHJ P,.TOCTW## ;PRINT PROGRAMMER NUMBER
HRLO T1,AENTRY+.AEPPN ;GET PROGRAMMER NUMBER AGAIN
JFFO T1,.+1 ;AND COUNT OF LEADING ZEROS
MOVEI T1,(T2) ;COPY BACK
IDIVI T1,3 ;COMPUTE NEEDED TRAILING SPACES
PUSHJ P,.TSPAN## ;PRINT THEM
JRST PRTUS5 ;ONWARD
PRTUS3: SKIPA T1,[[ASCIZ /# /]]
PRTUS4: MOVEI T1,[ASCIZ /% /]
PUSHJ P,.TSTRG## ;PRINT TEXT
PRTUS5: MOVEI T1,2 ;TWO
PUSHJ P,.TSPAN## ;SPACES
MOVEI T1,AENTRY+.AENAM ;POINT TO USER NAME
PJRST .T8STR## ;PRINT IT AND RETURN
POPJ P, ;RETURN
SUBTTL Miscellaneous routines -- PPNCHK - Check for illegal PPNs
PPNCHK: MOVSI T2,-PPNLEN ;AOBJN POINTER
PPNCH1: MOVE T1,@PPNTAB(T2) ;GET A PPN
TLNE F,FL.WLD ;WILDCARDED PPN?
CAIE T1,UNIPRG ;UNIQUE PROGRAMMER?
SKIPA ;NO
JRST PPNCH2 ;LET 10,# THROUGH
TLNN T1,-1 ;HAVE A PROJECT NUMBER
HLL T1,PP ;NO--INCLUDE OURS
CAMN T1,PP ;A MATCH?
FATAL MLP,<May not LOGIN using >,EF.FMT,.TPPNW##
PPNCH2: AOBJN T2,PPNCH1 ;LOOP THROUGH TABLE
POPJ P, ;RETURN
PPNTAB: EXP [XWD 0,UNIPRG] ;[*,#]
EXP [XWD 0,DEFPRG] ;[*,777777]
EXP MFDPPN ;[1,1]
EXP QUEPPN ;[3,3] (SEE OLD REACT.MAC)
PPNLEN==.-PPNTAB ;LENGTH OF TABLE
SUBTTL Miscellaneous routines -- QUEERR - Process QUEUE. UUO errors
QUEERR: PUSH P,T1 ;SAVE T1
MOVE T1,[PUSHJ P,ERRMSG] ;INSTRUCTION TO CALL ERROR HANDLER
MOVEM T1,QERBLK+0
SETZM QERBLK+1 ;XWD MOR,'PFX'
MOVE T1,[EF.ERR+QERTXT] ;TYP!FLG![ASCIZ\TXT\]
MOVEM T1,QERBLK+2
POP P,T1 ;GET UUO AC BACK
TXNE T1,QU.RBT!QU.RBR;RESPONSE BLOCK RETURNED?
JRST QUEER1 ;YES
MOVE T2,T1 ;COPY ERROR CODE
CAIL T2,QUEELN ;KNOWN ERROR CODE?
MOVEI T2,0 ;NO
XCT QUEETB(T2) ;ISSUE APPROPRIATE MESSAGE (NEVER RETURNS)
QUEER1: MOVEI T4,3 ;MUST EAT THE FIRST THREE CARACTERS
ADJBP T4,[POINT 7,RSPBLK] ; OF THE SIX CHARACTER PREFIX
SETZ T2, ;CLEAR RESULT
MOVEI T3,3 ;CHARACTER COUNT
QUEER2: ILDB T1,T4 ;GET A CHARACTER
SUBI T1," " ;MAKE SIXBIT
LSH T2,6 ;MAKE ROOM
IOR T2,T1 ;INCLUDE CHARACTER
SOJG T3,QUEER2 ;LOOP
MOVEM T2,QERBLK+1 ;SAVE
ILDB T1,T4 ;POINT PAST THE SPACE
MOVE T2,[POINT 7,QERTXT] ;BYTE POINTER TO STORAGE
MOVEI T3,^D20*5 ;CHARACTER COUNT
QUEER3: ILDB T1,T4 ;GET A CHARACTER
CAIE T1,.CHLFD ;LINE FEED?
CAIN T1,.CHCRT ;CARRIAGE RETURN?
MOVEI T1,.CHNUL ;YES--WE DON'T DO MULTI-LINE STUFF
IDPB T1,T2 ;PUT A CHARACTER
SKIPE T1 ;DONE?
SOJG T3,QUEER3 ;LOOP THROUGH RESPONSE BUFFER
PUSHJ P,QERBLK ;GENERATE ERROR MESSAGE (NEVER RETURN)
QUEETB: STOP (UQE,<Unknown QUEUE. UUO error >,,E.QUE)
STOP (IAL,<Illegal argument list>,,)
STOP (IFC,<Illegal function code>,,)
STOP (NFC,<No monitor free core>,,)
STOP (ADC,<Address check>,,)
FATAL (CNR,<Component not running; no system pid>,,)
FATAL (EFO,<Fatal error returned from component>,,)
FATAL (IMO,<Invalid message from component>,,)
STOP (NPV,<Not privileged>,,)
FATAL (NRA,<No response from [SYSTEM]ACCOUNTING>,,)
QUEELN==.-QUEETB
E.QUE: PUSH P,T1 ;SAVE ERROR CODE
MOVEI T1,"(" ;TYPE LEFT
PUSHJ P,.TCHAR## ; PARANTHESIS
POP P,T1 ;GET ERROR CODE BACK
PUSHJ P,.TOCTW## ;TYPE IT
MOVEI T1,")" ;TYPE RIGHT
PJRST .TCHAR## ; PARANTHESIS AND RETURN
SUBTTL Old LOGIN cruft
NOTBAT: PUSHJ P,.SAVE1## ;SAVE P1
MOVNI T1,1 ;-1 FOR OUR TTY
GETLCH T1 ;READ TTY BITS
TXNE T1,GL.CNE!GL.HDP!GL.LCP ;SOME FLAVOR OF NO ECHO?
TXO T1,GL.HDP ;CALL IT HALF DUPLEX
MOVEM T1,TTBITS ;SAVE
PUSHJ P,FNDCTL ;FIND CONTROLLING JOB NUMBER
JRST TTYDET ;CAN'T
JRST BJSJ ;BATCH JOB SUBJOB
HRLZ T1,T3 ;T1=SIXBIT LINE NUMBER
CAME T3,[SIXBIT/CTY/] ;SKIP IF ATTACHED CTY
CAMN T3,SAVOPR ;IS IT THE OPR?
TLO F,L.SOPR ;FLAG SUBJOB OF OPR.
SETZ T3,
MOVE T4,[POINT 6,T1]
JUMPN T1,ISPTY1 ;JUMP IF NOT CTY
MOVX T3,%CNPTY
GETTAB T3,
SETO T3,
HLRES T3 ;T3=OFFSET FOR FIRST PTY
SUBI T3,1 ;-1=LINE NUMBER OF CTY
JUMPGE T3,ISPTY2 ;JUMP IF HAVE CTY LINE NUMBER
MOVX T3,GL.CTY ;NO, FAKE TTBITS
JRST ISPTY3 ;WE KNOW ITS THE CTY
ISPTY1: ILDB P1,T4
JUMPE P1,ISPTY2 ;JUMP IF NO MORE CHARS
LSH T3,3
ADDI T3,-20(P1)
JRST ISPTY1
TTYDET: SKIPA T3,[GL.REM+GL.DSL] ;MAKE HIM NON-LOCAL
ISPTY2: GETLCH T3 ;GET LINE BITS FOR CONTROL JOB TTY
ISPTY3: TXNE T3,GL.CNE!GL.HDP!GL.LCP ;SOME FLAVOR OF NO ECHO?
TXO T3,GL.HDP ;CALL IT HALF DUPLEX
MOVEM T3,CNTLJT ;SAVE LINE BITS FOR CONTROL JOB TTY
MOVEM T2,CNTLJP ;SAVE CONTROLLER'S PPN
MOVE T1,TTBITS ;GET OUR TTY BITS
TXNN T1,GL.ITY ;PTY?
POPJ P, ;NO--DONE
TRO F,R.PTYJ ;MARK AS A PTY JOB
MOVE T1,[2,,[EXP .TOFSP,-1]]
TRMOP. T1, ;READ FULL SCNSER PTY STATUS
MOVEI T1,0 ;ASSUME NOT
SKIPN T1 ;WAS IT SET?
TXO T3,GL.HDP ;NO--THEN MUST ASSUME HDX
MOVEM T3,CNTLJT ;UPDATE BITS
POPJ P, ;RETURN
BJSJ: TDO F,[FL.BSJ,,R.PTYJ] ;SET BATCH PTY
MOVEM T2,CNTLJP ;CONTROLLING PPN=PPN OF BATCH JOB
MOVX T3,GL.REM ;PRETEND REMOTE
MOVEM T3,CNTLJT ;SAVE FAKE TTY BITS
POPJ P, ;RETURN
;ROUTINE TO FIND JOB'S ULTIMATE CONTROLLER FOR PURPOSES OF ACCESS CHECKING
;STOP SCANNING IF REACH: [1,2] JOB, TOP LEVEL JOB, DETACHED JOB, OR BATCH JOB
;CALL: PUSHJ P,FNDCTL
; CPOPJ IF CAN'T FIND JOB (ASSUME WE'RE DETACHED)
; CPOPJ1 IF BATCH JOB SUBJOB (ASSUME REMOTE)
; CPOPJ2 WITH AC'S SET UP AS FOLLOWS:
; T1=CONTROLLING JOB NUMBER
; T2=CONTROLLING JOB'S PPN
; T3=CONTROLLING JOB'S PHYSICAL TTY NAME
FNDCTL: SETO T1, ;FIRST, GET IMMEDIATE CONTROLLING JOB
CTLJOB T1, ;..
SKIPA ;ASSUME WE'VE BECOME DETACHED
JUMPGE T1,FNDCT1
MOVE T1,THSJOB ;GET OUR JOB NUMBER
TLNN F,FL.LGN ;ARE WE LOGGED IN?
TDZA T2,T2 ;NO
GETPPN T2, ;YES--GET OUR PPN
JFCL
GETLIN T3, ;GET OUR TTY NAME
TLNN T3,-1 ;ATTACHED?
POPJ P, ;NO
JRST CPOPJ2 ;RETURN
FNDCT1: HRLZ T3,T1 ;GET THIS JOB'S TTY DDB ADDRESS
HRRI T3,.GTTTY ;..
GETTAB T3, ;..
JRST CPOPJ
PEEK T3, ;GET PHYSICAL TTY NAME
;REMOVED 3 INSTRUCTIONS
PUSH P,T1 ;SAVE T1
MOVE T1,T2 ;SAVE LAST PPN IN CASE SON-OF-OPR
HRLZ T2,(P) ;GET THIS JOB'S PPN (JOB # ON STACK)
HRRI T2,.GTPPN ;..
GETTAB T2,
SETZ T2,
CAMN T2,ALPPPN ;HAVE WE HIT A [1,2] JOB YET?
JRST SONOPR ;YES: WE'RE SON-OF-OPR
HRRZ T1,(P) ;GET JOB NO. BACK AGAIN
PUSHJ P,ISBATC ;IS THIS JOB A BATCH JOB?
JRST NOTBSJ
POP P,T1 ;FIX UP STACK
JRST CPOPJ1 ;WE'RE A BATCH JOB SUBJOB
NOTBSJ: MOVE T1,(P) ;RESTORE T1 FOR A BIT
CTLJOB T1, ;ANOTHER LEVEL?
JRST TPOPJ ;RESTORE T1 AND RETURN
AOJE T1,TOPLVL ;IF T1=-1 WE'VE HIT TOP LEVEL
TLO F,L.MANY ;FLAG MORE THAN ONE SUPERIOR
POP P,T3 ;ADJUST STACK
SOJA T1,FNDCT1 ;GO THRU NEXT LEVEL
SONOPR: TLO F,L.SOPR ;REMEMBER WE'RE SPAWN OF OPR
MOVE T2,T1 ;USE LAST NON-[1,2] PPN AS CONTROLLER
TLNN F,L.MANY ;UNLESS [1,2] IS IMMEDIATE CONTROLLER
MOVE T2,ALPPPN ;IN WHICH CASE USE [1,2]
TOPLVL: POP P,T1 ;JOB # WE WANT IS ON STACK
CPOPJ2: AOS (P)
CPOPJ1: AOSA (P)
TPOPJ: POP P,T1 ;RESTORE T1
CPOPJ: POPJ P,
; INIT QUEUE. UUO ARGUMENT AND RESPONSE BLOCKS
; CALL: MOVE T1, FLAGS AND FUNCTION CODES
; MOVE T2, NODE
; MOVE T3, RESPONSE BLOCK LENGTH,,ADDRESS
; MOVE T4, TIMEOUT IN SECONDS
; PUSHJ P,QUEINI
; <RETURN>
;
; ON RETURN, T1 WILL POINT TO THE FIRST FREE WORD IN THE QUEUE. UUO BLOCK
QUEINI: PUSHJ P,.SAVE1## ;SAVE P1
LDB P1,[POINT 9,MONVER,11] ;GET MONITOR VERSION
CAIGE P1,703 ;QUEUE. UUO SUPPORT TIMEOUT?
SETZ T4, ;NO
MOVE P1,[QUEBLK,,QUEBLK+1] ;SET UP BLT
SETZM QUEBLK ;CLEAR FIRST WORD
BLT P1,QUEBLK+QUELEN-1 ;CLEAR ENTIRE QUEUE. UUO BLOCK
MOVE P1,[RSPBLK,,RSPBLK+1] ;SET UP BLT
SETZM RSPBLK ;CLEAR FIRST WORD
BLT P1,RSPBLK+RSPLEN-1 ;CLEAR ENTIRE RESPONSE BLOCK
MOVE P1,[DATBLK,,DATBLK+1] ;SET UP BLT
SETZM DATBLK ;CLEAR FIRST WORD
BLT P1,DATBLK+DATLEN-1 ;CLEAR ENTIRE BLOCK
MOVEI P1,QUEBLK ;POINT TO QUEUE. UUO BLOCK
SKIPE T3 ;RESPONSE BLOCK GIVEN?
TXO T1,QF.RSP ;YES--TELL THE MONITOR
SKIPE T4 ;SETTING A TIMEOUT VALUE?
TXO T1,<INSVL. (.QUTIM+1,QF.HLN)> ;YES
MOVEM T1,.QUFNC(P1) ;STORE FUNCTION CODE
MOVEM T2,.QUNOD(P1) ;STORE OPR NODE
MOVEM T3,.QURSP(P1) ;STORE RESPONSE BLOCK POINTER
SKIPE T4 ;TIMING THIS REQUEST?
MOVEM T4,.QUTIM(P1) ;SET TIMEOUT VALUE
MOVEI T1,.QUTIM+1(P1) ;POINT TO FIRST FREE WORD IN BLOCK
SKIPN T4 ;BUT MUST ADJUST FIRST FREE OFFSET
SOS T1 ;IF NOT TIMING THE REQUEST
POPJ P, ;RETURN
SUBTTL Low segment variables
PDPLST: IOWD PDLSIZ,PDL
KLGMSG: ASCIZ /
.KJOB
./
CRLFPD: ASCIZ /
./
XLIST
LIT
LIST
RELOC 0
ZZBEG:! ;START OF BLT TO ZERO
Z.XITB:! ;START OF PROGRAM EXIT DATA TO BE PRESERVED
RUNBLK: BLOCK 6 ;RUN UUO BLOCK
RUNPTH: BLOCK .PTMAX ;PLACE FOR RUN PATH BLOCK
Z.XITE:! ;END OF PROGRAM EXIT DATA TO BE PRESERVED
INTBLK: BLOCK 4 ;CONTROL-C INTERCEPT BLOCK
CCWAIT: BLOCK 1 ;IF 0 DO CONTROL-C WHEN TYPED. IF -1 WAIT.
CCTYPE: BLOCK 1 ;-1 IF CONTROL-C TYPED.
PSIBLK:! ;INTERRUPT VECTOR FOR PSI
DETINB: BLOCK .PSVIS+1 ;INTERRUPT CELL FOR ATTACH/DETACH
DETFLG==DETINB+.PSVIS ;FLAG FOR DETACHED JOB
HELP: BLOCK 1 ;POINTER TO HELP STRING
IPCFLG: BLOCK 1 ;IPCF FLAGS
FMPID: BLOCK 1 ;MY PID
TOPID: BLOCK 1 ;SENDER'S PID
IPCPTR: BLOCK 1 ;POINTER TO MESSAGE
IPCMSG: BLOCK 1 ;FUNCTION FOR [SYSTEM]IPCF TO DO
IPCJOB: BLOCK 1 ;JOB TO DO IT TO
IPCQTA: BLOCK 1 ;IPCF QUOTA
NODBLK:! ;START OF NODE. UUO BLOCK
NODLEN: BLOCK 1 ;LENGTH OF NODE UUO ARGUMENT BLOCK
NODLOC: BLOCK 2 ;NODE NUMBER
NODDEV: BLOCK 2 ;NUMBER OF DEVICES,,DEVICE TYPE
RDUFLG: BLOCK 1 ;RECOMPUTING DISK USAGE TYPEOUT FLAG
CONFIG: BLOCK 5 ;CONFIGURATION NAME
PTHBUF: BLOCK .PTMAX ;PATH. UUO BLOCK
UFDFSN: BLOCK 1 ;FILE STRUCTURE NAME
UFDARG: BLOCK .UFSIZ ;ARGS TO .UFD IN UFDSET.MAC
PDL: BLOCK PDLSIZ ;PUSH DOWN LIST
AENTRY: BLOCK .AEMAX ;DATA FROM ACCT.SYS
GOBBLK: BLOCK .DFGST+1 ;GOBSTR UUO BLOCK
MONVER: BLOCK 1 ;MONITOR VERSION
MFDPPN: BLOCK 1 ;PPN FOR MFD
SYSPPN: BLOCK 1 ;PPN FOR SYS
HLPPPN: BLOCK 1 ;PPN FOR LOGGED OUT JOBS
QUEPPN: BLOCK 1 ;PPN FOR SPOOLED OUTPUT
ALPPPN: BLOCK 1 ;PPN FOR FULL FILE ACCESS
UFDPRT: BLOCK 1 ;STANDARD UFD PROTECTION
LOGTRY: BLOCK 1 ;TRIES AT LOGGING IN
TTBITS: BLOCK 1 ;TELETYPE DESCRIPTOR
STATES: BLOCK 1 ;SYSTEM STATES
STATS2: BLOCK 1 ;SECOND STATES WORD
JIFFIE: BLOCK 1 ;CLOCK TICKS PER SECOND
IAMLGO: BLOCK 1 ;0 IF LOGIN, -1 IF LOGOUT (BEFORE 7.04)
PRGNAM: BLOCK 1 ;NAME OF THIS PROGRAM
JLOGTM: BLOCK 1 ;JOB LOGGED IN TIME
BATLIM: BLOCK 1 ;BATCH LIMIT WORD
FRCLIN: BLOCK 1 ;LINE NUMBER OF FRCLIN
ENQLOK: BLOCK 1 ;NON-ZERO IF OUTSTANDING LOCKS
KCTNUM: BLOCK 1 ;KILO-CORE-TICKS
DSKRDS: BLOCK 1 ;DISK READS
DSKWTS: BLOCK 1 ;DISK WRITES
TOTBLK: BLOCK 1 ;TOTAL BLOCKS
RUNTIM: BLOCK 1 ;RUN TIME
LOCSTA: BLOCK 1 ;LOCAL STATION NUMBER
JOBSTA: BLOCK 1 ;JOB'S STATION NUMBER
CURDTM: BLOCK 1 ;CURRENT DATE/TIME
XPDDTM: BLOCK 1 ;UNIVERSAL DATE/TIME EXPIRATION DATE
L.OJCS: BLOCK 1
L.MXJB: BLOCK 1
L.HJIU: BLOCK 1
LPNPPN: BLOCK 1 ;LOGGED-IN PPN
PRVPPN: BLOCK 1 ;PREVIOUS PPN (AFTER PIVOTING BACK)
NOWBIT: BLOCK 1 ;TIME OF DAY AS A BIT
SAVEDA: BLOCK 1 ;SAVED DATE
MYTTY: BLOCK 1 ;NAME OF MY TTY
NEWTTY: BLOCK 1 ;NEW TTY FOR REATTACH
TTYUDX: BLOCK 1 ;UDX OF MY TTY
UFDDAT: BLOCK 1 ;DATE OF MOST RECENT UFD
UFDTIM: BLOCK 1 ;AND ITS TIME
UFDNDL: BLOCK 1 ;0 IF UFD CAN BE RENAMED, -1 IF IT CAN NOT
THSJOB: BLOCK 1 ;THIS JOB NUMBER
DEVPTR: BLOCK 1 ;POINTER TO DEVTAB
MONLNO: BLOCK 1 ;LINE NUMBER FOR USAGE ACCOUNTING
MONNOD: BLOCK 1 ;NODE NAME FOR USAGE ACCOUNTING
MONTDE: BLOCK 1 ;TERMINAL DESIGNATOR FOR USAGE ACCOUNTING
QTACNT: BLOCK 1 ;COUNTER FOR QTATAB ENTRY
QTANUM: BLOCK 1 ;NUMBER OF ACTUAL QTATAB ENTRIES
;*** DO NOT SEPARATE ***
QTAUUO: BLOCK .FSDSO ;STRUUO DEFINE STRUCTURE BLOCK
QTATAB: BLOCK STRMAX*.DFJBL ;TABLE OF STRS TO RECOMPUTE
;*** END OF DO NOT SEPARATE ***
LSTSTR: BLOCK 1 ;LAST STR FOR /QUOTA
STRMSK: BLOCK 1 ;STR MASK FOR /QUOTA
BATSTR: BLOCK 1 ;STRUCTURE FOR BATCH DELETION
BATPPN: BLOCK 1 ;DIRECTORY FOR BATCH DELETION
BATTOT: BLOCK 1 ;TOTAL NUMBER OF BLOCKS
BATNQC: BLOCK 1 ;TOTAL BLOCKS UNCHECKED (NQC)
BATDFL: BLOCK 1 ;NUMBER OF FILES DELETED
BATQTO: BLOCK 1 ;QUOTA OUT
WILDBK: BLOCK .FXLEN ;WILD BLOCK
WILDPT: BLOCK 1 ;WILD POINTER
WLDARG: BLOCK 4 ;ARGBLOCK FOR WILD
Z.CTXB:! ;START OF CONTEXT DATA TO ZERO
CTXBLK: BLOCK .CTMAX ;UUO ARGUMENT BLOCK
CTXDAT: BLOCK CTXDLN ;DATA BUFFER
Z.CTXE:! ;END OF CONTEXT DATA TO ZERO
IO.ZB:! ;START OF I/O DATA STORAGE TO ZERO
FOP: BLOCK .FOMAX ;FILOP BLOCK
OPN==FOP+.FOIOS
LEB: BLOCK .RBMAX ;LOOKUP/ENTER BLOCK
PTH: BLOCK .PTMAX ;PATH BLOCK
RFS: BLOCK .FOFMX ;RETURNED FILESPEC BLOCK
RNB: BLOCK 4 ;RENAME BLOCK
IO.ZE:! ;END OF I/O DATA STORAGE TO ZERO
;***START OF BLOCK SET TO 0 ON CALLS TO SCAN
Z.STRT: BLOCK 0 ;START OF BLT
NOTSPC: BLOCK .FXLEN ;/NOTE SPEC
LIBSPC: BLOCK .FXLEN ;/LIB SPEC
TYPSPC: BLOCK .FXLEN ;TEMP FOR TYPE
U.PATH: BLOCK .FXLEN ;AREA FOR USER'S PATH SPEC
DEVTAB: BLOCK DVICES*2 ;TABLE OF DEV PHYS AND LOG NAMES
U.SPL: BLOCK 1 ;SPOOL REQUEST
U.WAT: BLOCK 1 ;WATCH REQUEST
U.DPRI: BLOCK 1 ;DISK PRIORITY
Z.END:! ;END OF BLT
;***START OF BLOCK SET TO -1 ON CALLS TO SCAN
OOBEG:! ;START OF BLT FOR SCAN
U.ATT: BLOCK 1 ;ATTACH ASK OR IGNORE
U.BINT: BLOCK 1 ;BATCH OPERATOR INTERVENTION
U.BNAM: BLOCK 1 ;BATCH JOB NAME
U.BSEQ: BLOCK 1 ;BATCH SEQUENCE NUMBER
U.BSTR: BLOCK 1 ;BATCH STREAM NUMBER
U.BREQ: BLOCK 1 ;BATCH REQUEST ID
U.ACTS: BLOCK 10 ;ACCOUNT STRING
U.RMRK: BLOCK 10 ;REMARK STRING
U.TIME: BLOCK 1 ;TIME LIMIT REQUEST
U.CORE: BLOCK 1 ;CORE LIMIT
U.NAME: BLOCK 2 ;/NAME
U.NEW: BLOCK 1 ;NEW BIT
U.NOTC: BLOCK 1 ;/NOTICE
U.NWAT: BLOCK 1 ;/NOWATCH
U.PASS: BLOCK 1 ;/PASSWORD
U.DFER: BLOCK 1 ;DEFERRED SPOOLING BIT
U.SYS: BLOCK 1 ;SYS BIT
U.DFUL: BLOCK 1 ;DISK FULL CONDTION
U.LIMI: BLOCK 1 ;1 IF /NOGUIDELINE, 0 IF /GUIDELINE
U.GUID: BLOCK 1 ;1 IF /GUIDELINE, 0 IF /NOGUIDELINE
U.CPPL: BLOCK 1 ;CURRENT PHYSICAL PAGE LIMIT
U.CVPL: BLOCK 1 ;CURRENT VIRTUAL PAGE LIMIT
U.SFDC: BLOCK 1 ;IF SFD CREATION IS DESIRED
U.SFDP: BLOCK 1 ;PROTECTION FOR CREATED SFD'S
U.UFDP: BLOCK 1 ;PROTECTION FOR CREATED UFD'S
U.DFPR: BLOCK 1 ;DEFAULT FILE PROTECTION
U.DFBU: BLOCK 1 ;DEFAULT BUFFERS COUNT
U.DFBB: BLOCK 1 ;DEFAULT BIGBUF
U.BYPA: BLOCK 1 ;BYPASS ACCOUNTING FILES
U.MAIL: BLOCK 1 ;MAILCHECK SWITCH
U.MODE: BLOCK 1 ;ATTACH MODE (MONITOR=0, USER=1)
U.SCAN: BLOCK 1 ;SCAN SWITCH FOR PATH UUO
U.STR: BLOCK 1 ;STRUCTURE SWITCH
U.QTA: BLOCK 1 ;FOR RECOMPUTING DISK USAGE ON STRS IN JSL
U.STA: BLOCK 1 ;STATION NUMBER
U.CLEA: BLOCK 1 ;CLEAR SCREEN
U.DISC: BLOCK 1 ;DISCONNECT LINE
U.KJOB: BLOCK 1 ;TYPE OF KJOB (BATCH, FAST)
U.NMSG: BLOCK 1 ;NO NOT PRINT KJOB MESSAGES
U.TEMP: BLOCK 1 ;DO NOT CHECK FOR .TMP FILES
U.ALTM: BLOCK 1 ;ALTMODE CONVERSION
U.BLNK: BLOCK 1 ;DO NOT TYPE BLANK LINES
U.CRLF: BLOCK 1 ;FREE CRLF AT RIGHT MARGIN
U.DBRK: BLOCK 1 ;DEBREAK (2741 TERM.)
U.DISP: BLOCK 1 ;DISPLAY MODE
U.ECHO: BLOCK 1 ;COMMAND LEVEL ECHO
U.LCP: BLOCK 1 ;LOCAL COPY
U.8BIT: BLOCK 1 ;EIGHTBIT
U.ESCA: BLOCK 1 ;ESCAPE CHARACTER
U.FILL: BLOCK 1 ;FILLER CLASS
U.FFHO: BLOCK 1 ;HOME ON FF
U.FFSI: BLOCK 1 ;SIMULATE FF WITH LF'S
U.FFST: BLOCK 1 ;STOP ON FF'S
U.FORM: BLOCK 1 ;TTY HAS FORM FEEDS
U.GAG: BLOCK 1 ;ALLOW SENDS ONLY AT MON. MODE OR RIGHT MARGIN
U.LC: BLOCK 1 ;TTY HAS LOWER CASE
U.LENG: BLOCK 1 ;TTY PAGE LENGTH
U.PAGE: BLOCK 1 ;^S-^Q MODE
U.PGSZ: BLOCK 1 ;PAGE SIZE
U.QUOT: BLOCK 1 ;QUOTE
U.RSPD: BLOCK 1 ;RECEIVE SPEED
U.RTC: BLOCK 1 ;/RTCOMPATABILITY
U.SBEL: BLOCK 1 ;TTY SBELL
U.SETT: BLOCK 1 ;/SETTTY /NOSETTY
U.SPED: BLOCK 1 ;XMIT/RCV SPEED
U.STOP: BLOCK 1 ;TTY STOP N
U.SSTO: BLOCK 1 ;TTY SSTOP N
T.STOP: BLOCK 1 ;TTY STOP BIT (NOT SET BY SCAN)
T.SSTO: BLOCK 1 ;TTY SSTOP BIT (NOT SET BY SCAN)
U.TABS: BLOCK 1 ;TTY HAS HARDWARE TABS
U.TAPE: BLOCK 1 ;XON STARTS PTR
U.TIDY: BLOCK 1 ;TTY IS TIDY
U.TTDE: BLOCK 1 ;DEFER TTY OUTPUT
U.TYPE: BLOCK 1 ;/TYPE
U.UC: BLOCK 1 ;TTY HAS UPPER CASE
U.UNPA: BLOCK 1 ;UNPAUSE CHARACTER
U.WDTH: BLOCK 1 ;CARRIAGE WIDTH
U.XONX: BLOCK 1 ;TTY XONXOFF
U.XSPD: BLOCK 1 ;XMIT SPEED
OOMAX:! ;END OF BLT FOR SCAN
;***END OF BLOCK SET TO -1 ON CALLS TO SCAN
RPERCT: BLOCK 1 ;FLAG FOR FILES FOUND WITH ERRORS
LSTPPN: BLOCK 1 ;LAST ACCESS PPN
LSTACC: BLOCK 1 ;LAST ACCESS UDT
LSTFLG: BLOCK 1 ;LAST ACCESS FLAGS
PASSWD: BLOCK .APWLW ;PASSWORD
NEWPSW: BLOCK .APWLW ;NEW PASSWORD
CHKPSW: BLOCK .APWLW ;CHECK PASSWORD
QUEBLK: BLOCK QUELEN ;QUEUE. UUO ARGUMENT BLOCK
RSPBLK: BLOCK RSPLEN ;QUEUE. UUO RESPONSE BLOCK
DATBLK: BLOCK QUELEN ;QUEUE. UUO DATA BLOCK
USERID: BLOCK .AANLW ;USER NAME
QERBLK: BLOCK 3 ;QUEUE. UUO ERROR BLOCK
QERTXT: BLOCK ^D20+1 ;QUEUE. UUO ERROR TEXT
TDATE: BLOCK 1 ;TODAY'S DATE
SAVOPR: BLOCK 1 ;PLACE TO SAVE NAME OF OPR'S TTY
SAOFST: BLOCK 1 ;STARTING ADDRESS OFFSET FOR SCAN
COMIDX: BLOCK 1 ;INVOKING COMMAND BIT,,INDEX
COMNAM: BLOCK 1 ;INVOKING COMMAND NAME (FOR OPTION SCANNING)
PMTFLG: BLOCK 1 ;REPROMPT FLAG
REPARS: BLOCK 1 ;REPARSE FLAG
FAILFL: BLOCK 1 ;LOGIN FAILURE FLAG
CNTLJT: BLOCK 1 ;CONTROLLING JOB'S LINE CHARACTERISTICS
CNTLJP: BLOCK 1 ;CONTROLLING JOB'S PPN
ATTJBN: BLOCK 1 ;JOB NUMBER TO ATTACH
ATTSTS: BLOCK 1 ;JOBSTS RESULT FOR ATTACH
ATTUAC: BLOCK 1 ;ATTACH UUO AC
INISCN: BLOCK 1 ;-1 IF IN .OSCAN
TRNCNT: BLOCK 1 ;COUNT OF TRANSLATIONS
JOBCNT: BLOCK 1 ;COUNT OF JOBS IN JOBMAP
JOBPTR: BLOCK 1 ;AOBJN POINTER TO JOBMAP
JOBNUM: BLOCK 1 ;LAST JOB NUMBER FOUND BY MAPNXT
JOBMAP: BLOCK <^D512/^D36> ;BIT MAP OF OTHER JOBS SAME PPN
TRNBLK: BLOCK .CHDB2+1 ;CHTRN. UUO ARGUMENT BLOCK
ERRACS: BLOCK 20 ;SAVED AC'S DURING ERROR PROCESSOR
Z.BWTO:! ;START OF WTO AREA TO ZERO
WTOTYP: BLOCK 1 ;LENGTH,,ADDRESS OF "TYPE" TEXT
WTOSAV: BLOCK 1 ;SAVED CHARACTER TYPER
WTOPTR: BLOCK 1 ;BYTE POINTER
WTOCTR: BLOCK 1 ;BYTE COUNTER
WTOBFC: BLOCK <WTOCHN/5>+1 ;STORAGE FOR WTO TO CTY TEXT
WTOBFO: BLOCK <WTOCHN/5>+1 ;STORAGE FOR WTO TO OPR TEXT
WTOBLK: BLOCK .QUARV+3 ;WTO MESSAGE BLOCK
WTOLEN==.-WTOBLK ;LENGTH OF BUFFER
Z.EWTO:! ;END OF WTO AREA TO ZERO
;***ARGUMENT BLOCK FOR LOGIN UUO****
LGNBLK:! ;START OF LOGIN UUO BLOCK
PPN: BLOCK 1 ;USERS PPN
PRIVWD: BLOCK 1 ;PRIV WORD
NAME: BLOCK 1 ;FIRST HALF OF USER NAME
NAME2: BLOCK 1 ;SECOND HALF OF USER NAME
CHGNO: BLOCK 1 ;CHARGE NUMBER
;;***END OF LOGIN WORD
ZZMAX:! ;END OF BLT TO ZERO
END START