Google
 

Trailing-Edge - PDP-10 Archives - de-10-omona-v-mc9 - login.mac
There are 15 other files named login.mac in the archive. Click here to see a list.
UNIVERSAL LGNUNV - Parameter file for LOGIN version 60 - July, 1975

	SUBTTL	Larry Campbell /TW/DJB/DAL/RCC/JSL/DAL/LC

;	LOGIN - The program for gaining access to the
;		DECsystem-10 Timesharing System




;COPYRIGHT (C) 1975,1977,1978 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;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.

	SEARCH	C,SCNMAC

	.REQUEST SCN7,WILD,HELPER,FACTOR

	SALL

	TWOSEG

	VWHO==0
	VLOGIN==60
	VMINOR==1
	VEDIT==634

	VWORD==BYTE (3)VWHO(9)VLOGIN(6)VMINOR(18)VEDIT

	LOC	137
	EXP	VWORD

;CONDITIONAL ASSEMBLY SWITCHES

ND FACTSW,1		;DO ACCOUNTING
ND SUPNOT,1		;SUPPRESS NOTICE.TXT IF / IN PPN
ND FASTLG,1		;INCLUDE DIRECTORY OF ACCT.SYS IN HI SEG
ND FAILOG,1		;LOG LOGIN/ATTACH FAILURES IN FACT FILE
IFE FACTSW,<FAILOG==0>	;NO POINT IF NO FACT FILE
ND TTYSLP,2		;NO. OF MINS TO SLEEP AWAITING TTY INPUT BEFORE DYING
ND PDLSIZ,60		;DEPTH OF STACK
ND SETTTY,1		;INCLUDE CODE TO SET TTY CHARACTERISTICS
ND FTTASK,0		;[436] CODE TO ASK COST CENTER AND TASK
ND DVICES,20		;[470] NUMBER OF DEVICES ASSIGNABLE BY /ASSIGN
ND BATMAX,0		;[505] INCLUDE CODE TO CHECK BATMAX (REQUIRES
			;[505] EDIT 1055 OF BATCON)
ND NCRYPT,0		;[557] PASSWORD ENCRYPTION
ND PSWCHG,0		;[557] ALLOW USER TO CHANGE OWN PASSWORD



IF1,<
DEFINE	LGNDCL,<
	.XCREF
	LALL
;
;(C) Copyright 1969,1970,1971,1972,1973,1974,1975 Digital Equipment Corp.
;						Maynard, Mass.
	TWOSEG
	RELOC	400000
	IFNDEF	BIGLST,<SALL>
	LOWVAR
	GLOBS
	.CREF
>>

;***	TEMPORARY UNTIL IN C.MAC	***
	OPDEF	ENQC.	[CALLI 153]
	OPDEF	SCHED.	[CALLI 150]
	.STDFR==31		;[365] SETUUO CODE FOR DEFERRED SPOOLING
	.SPALL==37		;[371] BITS IN SPOOL WORD WHICH
				;[371] REPRESENT REAL DEVICES
	ST%GLX==1000		;[374] BIT IN SECOND STATES WORD MEANING
				;[374] SUPPORT FOR GALAXY-10
	ST%SCD==200		;[425] MONITOR HAS NEW SCHEDULER
	ST%NCS==1B16		;[632] ON IF NOT CLASS SYSTEM SCHEDULER
	.NDRCI==5		;[633] REQUEST NODE CONFIGURATION INFORMATION
	.STDEF==33		;[620] SETUUO CODE FOR DEFAULT STUFF
	ST.PRT==0		;[620] CODE FOR DEFAULT FILE PROTECTION
;***	TEMPORARY UNTIL IN C.MAC	***


	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%GLX (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.

;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 P.LGBT

;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 SCHEDULAR CLASS QUOTAS IF 6.03 SCHEDULAR
;	RUNNING IN WMU MODE

;633)	LOCATE USER AT CENTRAL SITE IF LOGGING IN ON A NODE WITHOUT
;	AN LPT (DN87)
;634)	PUT IN SUPPORT FOR BACKGROUND BATCH FOR THE NEW CLASS SCCHEDULER

;***END OF REVISION HISTORY

;THIS PATCH WILL ALLOW YOU TO DEBUG LOGIN UNDER NORMAL TIMESHARE
; THE PATCH IS EXECUTED VIA FILDDT AND CAUSES YOUR TERMINAL TO 
; RUN LOGIN FROM HAKPPN WHILE ALL OTHER TERMINALS USE SYSPPN. 

;THIS PATCH REFERS TO THE 5.06 MONITOR
;PATLOG IS DEFINED TO BE SOMETHING YOU CAN OVERWRITE.

	REPEAT 0,<
PATLOG/	0	HAKPPN:	10,,251
PATLOG+1/	0	DSKB:	$"/DSKB/
PATLOG+2/	0	LOGHAK:	 CAIN U,777777
LOGHAK+1/	0	PUSHJ P,.+2
LOGHAK+2/	0	JRST MSTART
LOGHAK+3/	0	LGHAK1:	PUSHJ P,SAVE1
LGHAK1+1/	0	MOVE P1,SGANAM(R)
LGHAK1+2/	0	CAME P1,LOGTXT
LGHAK1+3/	0	POPJ P,
LGHAK1+4/	0	MOVE P1,JBTSTS(J)
LGHAK1+5/	0	TLNE P1,JLOG
LGHAK1+6/	0	POPJ P,
LGHAK1+7/	0	MOVE P1,DSKB
LGHAK1+10/	0	MOVEM P1,SGADEV(R)
LGHAK1+11/	0	MOVE P1,HAKPPN
LGHAK1+12/	0	MOVEM P1,SGAPPN(R)
LGHAK1+13/	0	POPJ P,

COMCON$:	
SGSET1+3/	JRST MSTART	JRST LOGHAK
GJOB2+15/	SETZM 0(P)	JFCL 0
CLOGIN+1/	JRST LOGDET	JRST RUNAME

.C0JOB/	P2	$Q<JOBNO:	
TTYTAB+JOBNO/	%ERCAL+473	
$Q+DDBLDB/	REFSTR+413	$Q<LDB:	
LOGHAK/	CAIN U,-1	CAIN U,LDB

>>> ;END REPEAT 0
;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
ERR.SF==2	;SEMI FATAL
ERR.FT==3	;FATAL
ERR.SS==4	;STOP SCHEDULING (E.G. NO ACCT.SYS)
ERR.RQ==5	;[477] REQUE JOB AND QUIT SCHEDULING FOR A WHILE

;SEE SUBROUTINE ERRLIN

;AC ASSIGNMENTS

F=0	;FLAGS

T1=1	;TEMP AC'S
T2=2
T3=3
T4=4

P1=5	;PRESERVED
P2=6	; ..
N=7	;NUMBERS INPUT
C=10	;CHARACTERS (THIS AC IS READ-ONLY, EDIT 102)
E1=11	;TEMP FOR ERROR MESSAGE TYPEOUT
PP=12	;PROJECT PROGRAMMER PAIR
M=13	;MESSAGE ADDRESSES
CH=14	;CHARACTER FOR TYPE-OUT OR ANALYSIS
EF=15	;FLAGS FOR ERROR MESSAGES
WD=16	;WORDS
P=17	;PUSHDOWN POINTER

;MAY NEED TO RE-ARRANGE AC'S FOR SCAN/WILD COMPATIBILITY

;IO CHANNELS

;0	;USED BY SCAN & WILD
TTY==1	;TELETYPE
UFD==2	;FOR DISK IO
USR==3	;FOR CHECKING USER FILES
US1==4	;THESE TWO USED BY UFDSET
FCT==6	;FOR THE FACT FILE
	SUBTTL	Parameters

;ALL RIB ERROR BITS:
SHFWAT==^D12	;BITS TO SHIFT WATCH BITS TO POSITION FOR SET UUO
;FLAGS - LH OF F

L.PEND==1	;STUFF IN TTY OUTPUT BUFFER
L.MANY==2	;ON IF MORE THAN ONE CONTROLLING JOB IN CHAIN
FL.WKD==4	;ON IF THIS IS A WEEKDAY
FL.FDX==10	;ON IF THIS IS A FULL-DUPLEX LINE
FL.RAS==20	;READ ACCOUNT FILE SYNC (I.E., TO RD 1ST WD)
L.WRTL==40	;SET IF WRITE LOCK FOR STR
FL.ACC==200	;SET IF READING ACCT.SYS, NOT IF AUXACC.SYS
FL.BSJ==1000	;SET IF BATCH JOB SUBJOB
FL.ERR==2000	;SET TO WATCH FOR ERRORS IN UFD SCAN
FL.BAT==4000	;SET IF THIS JOB IS A BATCH JOB
L.NCR==10000	;SET IF NO CREATE FOR AN STR
L.OPR==20000	;SET IF MY TTY IS OPR OR CTY
L.SOPR==40000	;SET IF I AM ON PTY UNDER OPR, CTY OR A 1,2 JOB
FL.ATT==100000	;SET IF ATTACH COMMAND
FL.WLD==200000	;WILD CARD PROGRAMER

;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.FMT==4	;WHEN SET, ANY PPN ERROR IS FORMAT ONLY
R.PTYJ==10	;PTY JOB
R.COMA==20	;[440] COMMA HAS BEEN TYPED WHEN TELLING OTHER JOBS
R.2MNY==40	;[470] TOO MANY DEVICES MESSAGE HAS BEEN TYPED
R.EOL==100	;[473] END OF LINE SEEN WHILE DOING /ASSIGN
R.UIB==200	;[514] UFD INTERLOCK WAS BUSY TOO LONG & WE'RE
		;[514] GETTING IMPATIENT
R.UIBM==400	;[514] WE HAVE ALREADY TYPED A WAIT PLS MSG FOR THIS STR
R.DBUG==1000	;[626] WE'RE BEING DEBUGGED
R.NXSW==2000	;[627] NEXT SWITCH SEEN (DURING /ASSIGN PROCESSING)

;SPECIAL PPN CHARACTERS

UNISYM=="#"	;CHARACTER FOR CREATE UNIQUE PPN
UNIPRG==777776	;INTERNAL VALUE FOR UNIQUE PPN

;PARAMETERS

TRANSZ==10	;MAX SIZE OF FACT.SYS ENTRY
MAXENT==20	;MAX SIZE OF ENTRY IN ACCT.SYS

ACC506==2	;VERSION NUMBER OF OLD ACCT.SYS
ACC601==3	;VERSION NUMBER OF NEW ACCT.SYS
ACC602==4	;[356] VERSION NUMBER OF ACCT.SYS FOR 6.02
AC1FOR==0	;FORMAT VERSION NUMBER FOR AUXACC.SYS

FBMTRY==^D10	;TIMES TO RETRY TO ENTER OR RENAME UFD
IFNDEF	RP.NQC,<	
RP.NQC=2000	;DO NOT INCLUDE FILES WITH THIS BIT SET IN
		; .RBSTS IN LOGGED OUT QUOTA CHECK
>
SCDSIZ==^D1024/4 ;[425] SIZE OF SCHEDULER CLASS TABLE

.RBTIM==35	;[540] UNIVERSAL DATE-TIME IN RIB
;WORDS IN ACCT.SYS ENTRY

PPWRD==0	;PROJECT, PROGRAMMER NUMBER
CODWRD==1	;CODE
PRVWRD==2	;PRIVILEGE BITS
NM1WRD==3	;1ST HALF OF USERS NAME
NM2WRD==4	;2ND HALF OF USERS NAME
TIMWRD==5	;LEGAL LOGIN TIMES
VMPWRD==6	;VM PARAMETERS IN LH
		;IPCF PARAMETERS IN RH
PROWRD==7	;USER PROFILE BITS
RCNWRD==11	;NAME OF CUSP TO RUN
RCDWRD==12	;DEVICE FROM WHICH TO RUN CUSP
RCPWRD==13	;DIRECTORY FROM WHICH TO RUN CUSP
CRGWRD==14	;CHARGE NUMBER
XPDWRD==15	;EXPIRATION DATE
;BITS IN LH USER PROFILE WORD

P.SPCR==10000		;SPOOL CDR
P.SPCP==4000		;SPOOL CDP
P.SPTP==2000		;SPOOL PTP
P.SPPL==1000		;SPOOL PLT
P.SPLP==400		;SPOOL LPT
P.WVER==200		;WATCH VERSION
P.WMTA==100		;WATCH MTA

;BITS IN RH USER PROFILE WORD

P.PWBT==1		;PASSWORD REQUIRED FOR BATCH
P.PWTS==2		;PASSWORD REQUIRED FOR TIMESHARING
P.NMBT==4		;NAME REQUIRED FOR BATCH
P.NMTS==10		;NAME REQURED FOR TS
P.LGBT==20		;MAY LOGIN UNDER BATCH
P.LGBS==40		;MAY LOGIN AS BATCH SUBJOB
P.LGRM==100		;MAY LOGIN AT REMOTE (HARDWIRED) TTY
P.LGDS==200		;MAY LOGIN AT DATA SET TTY
P.LGRO==400		;MAY LOGIN AT REMOTE OPR OR CTY
P.LGLC==1000		;MAY LOGIN AT LOCAL TTY
;NOTE MAY ALWAYS LOGIN AT LOCAL OPR OR CTY

MAXFS==9	;MAXIMUM NUMBER OF FILE STRUCTURES PER USER

AC1BLK==5	;NUMBER OF WORDS PER BLOCK IN AUXACC.SYS ENTRIES

EXLLEN==.RBUSD+1  ;LENGTH OF ARGUMENT LIST FOR EXTENDED LOOKUP/ENTER/RENAME

	SUBTTL	Message macros


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	;[477] TRY AGAIN LATER (LOGMAX EXCEEDED)

;SUPER FATAL ERROR -- NEVER RETURNS
	DEFINE	STOP(PX,TEXT),<
	.ERR.	EF.SYS,PX,<TEXT>
>

;FATAL ERROR (HOWEVER, SYSTEM IS STILL OK)
	DEFINE	FATAL(PX,TEXT),<
	.ERR.	EF.ERR,PX,<TEXT>
>

;WARNING MESSGAE
;CALL WITH:
;	WARN	PREFIX,<TEXT>
;	  RETURN HERE TO SKIP REST OF MESSAGE
;	RETURN HERE TO PRINT REST OF MESSAGE
;NOTE: IF THE INSTRUCTION FOLLOWING THE WARN MACRO IS A JFCL A
;	CRLF WILL BE APPENDED TO THE MESSAGE
	DEFINE	WARN(PX,TEXT),<
	.ERR.	EF.WRN,PX,<TEXT>
>

;[477] SEMI-FATAL ERROR--BATCON SHOULD REQUE JOB AND STOP SCHEDULING
;[477] FOR A LITTLE WHILE
;[477] CALL WITH:
;[477]		REQUE	PREFIX,<TEXT>
;[477]		  NEVER RETURN
	DEFINE	REQUE(PX,TEXT),<
	.ERR.	EF.REQ,PX,<TEXT>
>

;INFORMATION MESSAGE (PRINTED IN [])
;CALL WITH:
;	INFO	PREFIX,<TEXT>
;	  <<SAME AS WARN>>
	DEFINE	INFO(PX,TEXT),<
	.ERR.	EF.INF,PX,<TEXT>
>

	DEFINE	.ERR.	(FLGS,PX,TXT),<
LGN'PX:	MOVEI	E1,''PX''	;LOAD UP SIXBIT PREFIX
;**	MOVE	EF,[FLGS![ASCIZ \TXT\]]	;LOAD TEXT POINTER AND FLAGS
	MOVEI	EF,[ASCIZ \TXT\] ;POINTER TO TEXT
	TXO	EF,FLGS		;TURN OF FLAGS
	PUSHJ	P,ERRMSG	;PRINT THE MESSAGE
>
> ;END IF1
	SUBTTL	Inter-module globals

IF1,<
	DEFINE	GLOBS,<
GLOB <.POPJ,.POPJ1,.TNEWL,ACCT,AD.YN,ALAST,CLRRIB>	;[613]
GLOB <W.ACCT,W.AUX,W.SCED>		;[540]
GLOB <BADFOR,BADFRA,BADNAM,BDFRMS>
GLOB <DAYMES,DECPR2,DSKFER,DSKFPA,ENTPTH>
GLOB <ERRLIN,ERRMSG,ETOLO,FLUSH,FRUN,GET2WD,GETCOD>
GLOB <GETNAM,GIVNBR,HELPR,ISBATC,LAST>
GLOB <LOKBLK,LOKBLN,LOGBLN,LOGBLK,MSG,NOATT,NOMFDP>
GLOB <NOREMT,NOSYS,NOSYS1,NEWLIN,DIEMSG>
GLOB <NOTSMS,NOTSAT,NOTSM1,NOTSM2,NOTSM3,NOTSM4,NOTSM5,NOTSM6>
GLOB <PPERR,PPERR1,PRVSET,PSWOK,PTHERR,RDACCT,RDUFD>
	IFN	PSWCHG,<
GLOB <WTUFD>
	>;END	PSWCHG
GLOB <SNOOZE,SPACE,SPLBTS,STYO,TOLO>
GLOB <TOLO1,TRANSZ,TRYAGN,TTYGET,TTYGO,TYI,TYO>
GLOB <USRSET,POSTMS,WATBTS,WTCHDA>	;[472]
GLOB <ACCTA,CODGET,FLUSHX,LOGIN3,CRLFPD,A2MANY>	;[517]
GLOB <SCDTBL,SCDBLT,BLDSCD,LOK,UNLOCK>		;[425] SCHED STUFF
IFN FASTLG,<GLOB <ENTSIZ,DACCFL,DLOCK,DAUXFL,DACCL,PDACC,NEWACT,EQACT>>

;STUFF IN LGNLOW
GLOB <PDPLST,LGIARG,FCTAHD,FCTHED,FCTFMD,FCTWD,FCTFWD>
	>>
	SUBTTL	Storage definitions
;MACRO TO DEFINE COMMON LOWSEG FOR ALL MODULES
IF1,<
	DEFINE	LOWVAR,<
LBLOCK	LASTX,10	;;LAST PIECE OF CODE
LBLOCK	INTBLK,4	;;CONTROL-C INTERCEPT BLOCK
LWORD	CCWAIT,		;;IF 0 DO CONTROL-C WHEN TYPED.
			;;IF -1 WAIT FOR CRTITICAL CODE TO COMPLETE
LWORD	CCTYPE,		;;-1 IF CONTROL-C TYPED.
LWORD	SAVERG,		;;USED TO SAVE A REGSTER BY LGNDSK
LWORD	HELP,		;;POINTER TO HELP STRING
LWORD	HPOS,		;;POSITION ON LINE
LBLOCK	WILDBK,.FXLEN	;;BLOCK USED BY WILD
LBLOCK	JUNK,4		;;[422] PLACE TO THROW AWAY SHORT LOOKUP BLOCK
LBLOCK	UFDBUF,200	;;[571] BUFFER FOR READING UFD'S
LBLOCK	PTHBUF,11	;;
LBLOCK	CHRBUF,.DCSAJ+1	;;BUFFER FOR DSKCHR
LBLOCK	SRCBUF,EXLLEN	;;
LBLOCK	SECBUF,.RBTIM+1	;;[540]
LWORD	UFDFSN,		;;FILE STRUCTURE NAME
LWORD	UFDMTP,		;;
LWORD	UFDDMJ,		;;
LWORD	UFDDMP,		;;
LBLOCK	UFDDMF,MAXFS*3+1;;[371]
LBLOCK	DATEMP,2	;;
LBLOCK	FCTDAT,TRANSZ	;;
LBLOCK	RDHED,2		;;
IFN PSWCHG,<		;;[557]
LBLOCK	WTHED,2		;;[557] I/O CMD LIST FOR WRITING ACCT.SYS
LWORD	SAVBLK,		;;[610] BLOCK CONTAINING OUR PSWD
LWORD	SAVPOS,		;;[610] PTR TO WORD WITHIN BLK CONTAINING PSWD
>			;;[557] END IFN PSWCHG
LWORD	FL2741,		;;-1 IF THIS IS A 2741
LBLOCK	TOB,3		;;TTY OUTPUT BUFFER
LBLOCK	TIB,3		;;TTY INPUT BUFFER
LBLOCK	PDL,PDLSIZ+1	;;PUSH DOWN LIST
LWORD	MFDPPN,		;;PPN FOR MFD
LWORD	ALPPPN,		;;ALL PRIVS
LWORD	UFDPRT,		;;[557] STANDARD UFD PROTECTION
LBLOCK	ENTRY,MAXENT	;;DATA FROM ACCT.SYS
LWORD	LOGTRY,		;;TRIES AT LOGGING IN
LWORD	TTBITS,		;;TELETYPE DESCRIPTOR
LWORD	STATES,		;;SYSTEM STATES
LWORD	STATS2,		;;[374] SECOND STATES WORD

IFN FTTASK,<		;;[436] LOWSEG STUFF FOR ACCOUNTING MODULE
LBLOCK	BUFBEG,^D20	;;[436] ..
LBLOCK	TTY.IB,^D30	;;[436] ..
LBLOCK	IBUFH,3		;;[436] ..
LWORD	TTY.IC,		;;[436] ..
LWORD	BUFEND,		;;[436] ..
LWORD	PSAVE,		;;[436] ..
>;[436] END IFN FTTASK


IFE FASTLG,<
LWORD	NEWACT,		;;-1 IF NEW ACCT.SYS, 0 IF OLD
> ;END FASTLG

LWORD	NOWBIT,		;;TIME OF DAY AS A BIT

IFE FASTLG,<
LWORD	ENTSIZ,		;;SIZE OF AN ACCT.SYS ENTRY
>

LWORD	ACCTLN,		;;LENGTH OF ACCT.SYS IN BLOCKS
LWORD	ACCKNT,		;;NUMBER OF BLOCKS READ ON ACCT.SYS
LWORD	SAVEDA,		;;SAVED DATE
LWORD	SYSPPN,		;;[1,4]
LWORD	MYTTY,		;;NAME OF MY TTY
LWORD	TTYUDX,		;;UDX OF MY TTY
LWORD	RECFLG,		;;
LWORD	UFDDAT,		;;DATE OF MOST RECENT UFD
LWORD	UFDTIM,		;;AND ITS TIME
LWORD	UFDNDL,		;;0 IF UFD CAN BE RENAMED, -1 IF IT CAN NOT
LWORD	THSJOB,		;;THIS JOB NUMBER
LBLOCK	DEVTAB,DVICES*2	;;[470] TABLE OF DEV PHYS AND LOG NAMES
LWORD	DEVPTR,		;;[470] POINTER TO DEVTAB
LWORD	WLDPNT,		;;TEMP FOR WILD LOOKUPS
LBLOCK	NOTSPC,.FXLEN	;;/NOTE SPEC
LBLOCK	LIBSPC,.FXLEN	;;/LIB SPEC
LBLOCK	TYPSPC,.FXLEN	;;TEMP FOR TYPE
LBLOCK	U.PATH,.FXLEN	;;AREA FOR USER'S PATH SPEC
LBLOCK	PTHSPC,.FXLEN	;;[457] /PATH SWITCH AREA
LWORD	U.SPL,		;;SPOOL REQUEST
LWORD	U.WAT,		;;WATCH REQUEST
;***START OF BLOCK SET TO -1 ON CALLS TO SCAN
LWORD	U.TIME,		;;TIME LIMIT REQUEST
LWORD	U.CORE,		;;CORE LIMIT
LBLOCK	U.NAME,2,	;;/NAME
LWORD	U.NEW,		;;NEW BIT
LWORD	U.NOTC,		;;[450] /NOTICE
LWORD	U.NWAT,		;;[336] /NOWATCH
LWORD	U.DFER,		;;[365] DEFERRED SPOOLING BIT
LWORD	U.SYS,		;;SYS BIT
LWORD	U.DFUL,		;;DISK FULL CONDTION
LWORD	U.LIMI,		;;1 IF /NOGUIDELINE, 0 IF /GUIDELINE
LWORD	U.GUID,		;;1 IF /GUIDELINE, 0 IF /NOGUIDELINE
LWORD	U.CPPL,		;;CURRENT PHYSICAL PAGE LIMIT
LWORD	U.CVPL,		;;CURRENT VIRTUAL PAGE LIMIT
LWORD	U.SFDP,		;;[550] PROTECTION FOR CREATED SFD'S
LWORD	U.UFDP,		;;[554] PROTECTION FOR CREATED UFD'S
LWORD	U.DFPR,		;;[620] DEFAULT FILE PROTECTION
IFN PSWCHG,<		;;[557] IF ALLOWING PASSWORD CHANGING
LWORD	U.NPSW,		;;[557] NEW PASSWORD
>			;;[557] END IFN PSWCHG


IFN	SETTTY,<
LWORD	U.ALTM,		;;[344] ALTMODE CONVERSION
LWORD	U.BLNK,		;;[344] DO NOT TYPE BLANK LINES
LWORD	U.CRLF,		;;[344] FREE CRLF AT RIGHT MARGIN
LWORD	U.DBRK,		;;[344] DEBREAK (2741 TERM.)
LWORD	U.ECHO,		;;[344] GUESS
LWORD	U.FILL,		;;[344] FILLER CLASS
LWORD	U.FORM,		;;[344] TTY HAS FORM FEEDS
LWORD	U.GAG,		;;[344] ALLOW SENDS ONLY AT MON. MODE OR RIGHT MARGIN
LWORD	U.LC,		;;[344] TTY HAS LOWER CASE
LWORD	U.PAGE,		;;[344] ^S-^Q MODE
LWORD	U.PGSZ,		;;[344] PAGE SIZE
LWORD	U.RSPD,		;;[344] RECEIVE SPEED
LWORD	U.RTC,		;;[423] /RTCOMPATABILITY
LWORD	U.SETT,		;;[344] /SETTTY /NOSETTY
LWORD	U.SPED,		;;[344] XMIT/RCV SPEED
LWORD	U.TABS,		;;[344] TTY HAS HARDWARE TABS
LWORD	U.TAPE,		;;[344] XON STARTS PTR
LWORD	U.WDTH,		;;[344] CARRIAGE WIDTH
LWORD	U.XSPD,		;;[344] XMIT SPEED
	>		;;[344] END IFN SETTTY

LWORD	U.SCAN,		;;SCAN SWITCH FOR PATH UUO
LWORD	U.STR,		;;STRUCTURE SWITCH
LWORD	U.QTA,		;;NAME OF STRUCTURE TO RECOMP
LWORD	U.STA,		;;STATION NUMBER
;***END OF BLOCK SET TO -1 ON CALLS TO SCAN
LWORD	U.DPRI,		;;DISK PRIORITY
LWORD	RPERCT,		;;FLAG FOR FILES FOUND WITH ERRORS
LWORD	SAVKNT,		;;TEMP FOR BUILDING AUX DIR
LWORD	CODE,		;;PASSWORD
LWORD	TDATE,		;;[477] TODAY'S DATE
LWORD	SAVOPR,		;;PLACE TO SAVE NAME OF OPR'S TTY
LWORD	SAOFST,		;;STARTING ADDRESS OFFSET FOR SCAN
LWORD	SVPROT,		;;USED TO SAVE UWP
LWORD	CNTLJT,
LWORD	CNTLJP,		;;
LWORD	ATTJOB,
;;***ARGUMENT BLOCK FOR LOGIN UUO****
LWORD	PPN,		;;USERS PPN
LWORD	PRIVWD,		;;PRIV WORD
LWORD	NAME,		;;FIRST HALF OF USER NAME
LWORD	NAME2,		;;SECOND HALF OF USER NAME
LWORD	CHGNO,		;;CHARGE NUMBER
;;***END OF LOGIN WORD
LBLOCK	ZZMAX,0		;;
>

DEFINE	LWORD(A),<	EXTERNAL A>
DEFINE	LBLOCK(A,B),<	EXTERNAL A>

> ;END IF1


	PRGEND
	TITLE	LOGIN - Initialization for LOGIN

	SEARCH	C,SCNMAC,LGNUNV

	LGNDCL

;START HERE

LOGIN::	TDZA	17,17		;CLEAR AC17 ON A NORMAL START
	MOVEI	17,1		;SETUP A 1 ON A CCL START
	SETZB	0,LASTX		;PREPARE TO CLEAR CORE
	MOVEI	16,1		;CLEAR THE AC'S
	BLT	16,16		; ..
	MOVE	T1,[LASTX,,LASTX+1] ;CLEAR OUT THE LOWSEG
	BLT	T1,ZZMAX	; ..
	MOVEM	17,SAOFST	;SAVE STARTING OFFSET
	MOVE	T1,[3,,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
	INIT	TTY,IO.SUP	;TURN OFF ECHOING IN CASE FULL DUPLEX
	SIXBIT	/TTY/		;AND THE TELETYPE
	XWD	TOB,TIB
	  LOGOUT		;FORGET IT IF NO TTY
	INIT	UFD,.IODMP	;GET A DISK IN DUMP MODE
	SIXBIT	/SYS/		;LOOKUP ACCOUNTING FILES IN SYS
	XWD	0,0		;NO HEADERS
	  LOGOUT		;THIS IS ALSO UNFIXABLE
	MOVE	P,PDPLST	;GET THE PUSHDOWN STACK
	SETZ	F,		;ALL FLAGS OFF
	SETOM	RECFLG		;SET FLAG FOR RECOMP MESSAGE
	PJOB	T1,		;GET JOB NUMBER
	MOVEM	T1,THSJOB	;[351] SAVE JOB NUMBER
	SKIPE	.JBDDT##	;IS DDT LOADED?
	JRST	LOGIN2		;YES--LET IT GO
	MOVN	T1,T1		;MAKE NEGATIVE
	JOBSTS	T1,		;READ JOB STATUS
	  JRST	LOGIN2		;ASSUME OK IF NO JOB STATUS
	TXNE	T1,JB.UJC	;IF JACCT IS CLEAR THERE IS NO HARM TRYING
	TXNN	T1,JB.ULI	;IF JACCT IS SET JLOG MUST BE CLEAR
	JRST	LOGIN2		;OK--EITHER NO PRIVS ON LOGGED OUT
	FATAL	KOD,<Please KJOB or DETACH>
LOGIN2:	TXNE	T1,JB.UJC	;[541] JACCT?
	  JRST	LGIN2A		;[541] YES
	WARN	IDJ,<I do not have JACCT.>
	  JFCL			;[541] 
	TRO	F,R.DBUG	;[626] SET DEBUG FLAG; WE'RE BEING DEBUGGED

LGIN2A:	MOVNI	T3,1		;GET THE TTY CHARACTERISTICS
	GETLCH	T3
	CAMN	T3,[-1]		;IF A NOOP, ASSUME HDX
	MOVX	T3,GL.HDP
	MOVEM	T3,TTBITS
	MOVEM	T3,CNTLJT
	TXNN	T3,GL.ITY!GL.HDP!GL.LCP!GL.PTM	;SKIP IF HALF DUPLEX
	TLO	F,FL.FDX	;SET FULL DUPLEX FLAG
	INBUF	TTY,1
	OUTBUF	TTY,1
	MOVX	T1,%CNSTS	;MAGIC CODES FOR LOC STATES IN SYS
	GETTAB	T1,		;GET TABLE ENTRY
	  SETZ	T1,		;ZERO IF ERROR RETURN
	MOVEM	T1,STATES	;SAVE FOR LATER
	MOVX	T1,%CNST2	;[374] GET SECOND STATES WORD
	GETTAB	T1,		;[374] ..
	  SETZ	T1,		;[374] ..
	MOVEM	T1,STATS2	;[374] SAVE FOR A RAINY DAY
	MOVX	T1,%CNOPR	;GET OPR DEVICE NAME
	GETTAB	T1,		; FROM MONITOR
	  MOVSI T1,(SIXBIT /CTY/)	;ASSUME CTY IF IT WONT TELL US
	MOVEM	T1,SAVOPR	;STORE FOR LATER USE
	GETLIN	T1,		;GET MY TTY NAME
	MOVEM	T1,MYTTY	;SAVE IT
	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	;[351] GET OUR JOB NUMBER
	TRMNO.	T3,		;[345] GET TTY UDX
	  SETZ	T3,		;[345] SO WHAT?
	MOVEM	T3,TTYUDX	;[345] SALT AWAY FOR TRMOP. STUFF
	JUMPE	T3,NT2741	;[546] NOT A 2741
	MOVE	T1,[2,,T2]	;[546] ARG POINTER FOR TRMOP.
	MOVX	T2,.TO2741	;[546] READ THE 2741 BIT
	TRMOP.	T1,		;[546] ..
	  SETZ	T1,		;[546] ASSUME NOT 2741
	SKIPE	T1		;[546] IS THIS A 2741?
	SETOM	FL2741		;[546] YES - SET THE FLAG


NT2741:	SETOM	U.TIME		;[350] SET SCAN SWITCH BLOCK TO -1
	MOVE	T1,[XWD U.TIME,U.TIME+1]
	BLT	T1,U.STA	;[350]
	MOVEI	T1,^D5		;LET THE GUY TRY 5 TIMES
	MOVEM	T1,LOGTRY
	MOVX	T1,%LDFFA	;PPN THAT HAS THE PRIVS
	GETTAB	T1,		;GET IT FROM MONITOR
	  MOVE	T1,[1,,2]	;DEFAULT
	MOVEM	T1,ALPPPN	;SAVE IT FOR LATER
	MOVX	T1,%LDMFD	;GET THE MFD PPN
	GETTAB	T1,		; FROM THE MONITOR
	  MOVE	T1,[1,,1]	;DEFAULT
	MOVEM	T1,MFDPPN	;STORE FOR LATER USE
	MOVSI	T1,(SIXBIT .SYS.)
	DEVPPN	T1,		;GET PPN FOR SYS
	  MOVE	T1,[1,,4]	;[361] DEFAULT
	MOVEM	T1,SYSPPN
	MOVX	T1,%LDUFP	;[557] GET STANDARD UFD PROTECTION
	GETTAB	T1,		;[557] ..
	  MOVSI	T1,775000	;[557] EH?
	ROT	T1,^D9		;[557] RIGHT-JUSTIFY IT
	MOVEM	T1,UFDPRT
	DATE	T1,
	MOVEM	T1,TDATE	;[557] SAVE FOR LATER

	PJRST	LGNSCN##	;GO OFF TO COMMAND SCANNER

	PRGEND	LOGIN
	TITLE	LGNSCN - Command scanner for LOGIN

	SEARCH	C,SCNMAC,LGNUNV
	LGNDCL

LGNSCN::MOVEI	T1,[ASCIZ /
LOGIN/]
	MOVEM	T1,HELP
	TRO	F,R.FMT		;NOTE THAT ERRORS ARE FORMAT ONLY
	MOVE	T1,[XWD 6,SCIBLK]
	PUSHJ	P,.ISCAN##	;CALL SCAN TO GET COMMAND
	JUMPLE	T1,LOGDIS	;IF R, RUN, OR LOGIN

;HERE IF ATTACH

	SETZ	T1,		;NO SWITCHES ON ATTACH
	PUSHJ	P,.PSCAN##	;GO SET UP FOR PARTIAL SCAN
	  PJRST	FLUSH		;SHOULD NEVER HAPPEN
	MOVEI	T1,[ASCIZ /
JOB NUMBER/]
	MOVEM	T1,HELP
	PUSHJ	P,.DECNW##	;READ JOB NUMBER TO BE ATTACHED TO
	MOVEM	N,ATTJOB	;SAVE JOB NUMBER
	TLO	F,FL.ATT	;NOTE ATTACH
	SETOM	NOWBIT		;CAN ALWAYS ATTACH
ATTD1:	JUMPLE	C,FLUSH		;MUST BE POSITIVE NUMBER
	CAIN	C,"["		;SKIP IF NOT YET TO PPN
	JRST	ATTD2		;READ PPN
	PUSHJ	P,TYI		;READ NEXT CHAR
	JRST	ATTD1		;AND LOOP TILL [
ATTD2:	PUSHJ	P,.OCTNW##	;READ PROJECT NUMBER
	TLNN	N,-1		;ONLY 6 DIGITS
	CAIE	C,","		;MUST END WITH COMMA
	JRST	PPERR
	JUMPE	N,PPERR		;MUST BE SOMETHING THERE
	HRLZ	PP,N		;SAVE PROJECT NUMBER
	PUSHJ	P,.OCTNW##	;READ PROGRAMMER NUMBER
	JUMPE	N,PPERR		;MUST BE SOMETHING THERE
	TLNE	N,-1		;BUT NOT TOO MUCH
	JRST	PPERR
	HRR	PP,N		;SAVE PROGRAMMER NUMBER
	MOVEM	PP,PPN		;STORE PPN
	MOVEI	N,.GTPPN	;CHECK TO SEE THAT THIS
	HRL	N,ATTJOB	; JOB HAS THE PPN HE
	GETTAB	N,		; CLAIMED IT DOES. THE MONITOR
	  SETZ	N,		; MAKES THIS CHECK BUT LOGIN
	CAME	N,PPN		; COULD HAVE A BUG WHICH WOULD
	JRST	NOATT		; ZAP A USER.
ATTD3:	JUMPLE	C,NOJBMS	;OK, PROCEED WITH ATTACH
	PUSHJ	P,TYI		;NO, IGNORE REST OF LINE
	JRST	ATTD3
	SUBTTL	Type first message, check states bits

;HERE TO TYPE JOB NUMBER, MONITOR NAME, AND TTY NUMBER

LOGDIS:	MOVE	T1,STATES
	TXNN	T1,ST%IMG	;SKIP IF NEW SCANNER SERVICE
	JRST	ONTTY		;OLD SCANNER SERVICE TYPES THIS FOR US

	MOVEI	M,[ASCIZ .JOB .]
	PUSHJ	P,MSG
	MOVE	T1,THSJOB	;GET JOB NUMBER
	PUSHJ	P,.TDECW##
	PUSHJ	P,SPACE
	MOVNI	T3,5
CONFLP:	MOVEI	T1,.GTCNF
	HRLI	T1,5(T3)
	GETTAB	T1,		;GET NEXT WORD OF MONITOR NAME
	  JRST	ONTTY
	MOVEI	M,T1
	SETZ	T2,
	PUSHJ	P,MSG
	AOJL	T3,CONFLP
	PUSHJ	P,SPACE
ONTTY:	MOVE	T1,MYTTY	;GET TTY NAME
	PUSHJ	P,.TSIXN##	;PRINT IT
	PUSHJ	P,.TCRLF##

NOJBMS:	MOVE	T3,TTBITS
	MOVE	T2,STATES	;GET STATES WORD
	TXNN	T3,GL.ITY	;[605] PTY?
	  JRST	TTYGO		;[605] NO: NO SPECIAL CHECKS THEN

	TRO	F,R.PTYJ	;MARK AS A PTY JOB
	MOVE	T1,THSJOB	;[607] GET OUR JOB NUMBER
	PUSHJ	P,ISBATC	;SEE IF WE'RE A BATCH JOB
	  JRST	NOTBAT		;[605] NO
	TLO	F,FL.BAT!L.SOPR	;REMEMBER THIS IS A BATCH JOB

	IFN FTTASK,<		;[436] ONLY GIVE BATCH JOBS ONE TRY
	SETZM	LOGTRY		;[436] SINCE THE TASK QUESTIONS MAY
	>;END IFN FTTASK	;[436] CONFUSE BATCON

	JRST	TTYGO		;[605] TRUST BATCON AND SKIP CHECKS

;[605] HERE IF NON-BATCH PTY JOB TO CHECK SUPERIOR JOBS

NOTBAT:	PUSHJ	P,FNDCTL	;FIND CONTROLLING JOB NUMBER
	 JRST	TTYDET		;CAN'T
	  JRST	BJSJ		;BATCH JOB SUBJOB
	MOVEM	T2,CNTLJP	;SAVE CONTROLLER'S PPN
	HRLZ	T1,T3		;T1=SIXBIT LINE NUMBER
	CAIE	T1,0		;SKIP IF 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	WD,T4
	JUMPE	WD,ISPTY2	;JUMP IF NO MORE CHARS
	LSH	T3,3
	ADDI	T3,-20(WD)
	JRST	ISPTY1

TTYDET:	SKIPA	T3,[GL.REM+GL.DSL]	;MAKE HIM NON-LOCAL

ISPTY2:	GETLCH	T3		;GET LINE BITS FOR CONTROL JOB TTY
ISPTY3:	MOVEM	T3,CNTLJT	;SAVE LINE BITS FOR CONTROL JOB TTY
	JRST	TTYGO		;GO DO THE ACCOUNTING

BJSJ:	TLO	F,FL.BSJ	;REMEMBER WE'RE A BATCH JOB SUBJOB
	MOVEM	T2,CNTLJP	;CONTROLLING PPN=PPN OF BATCH JOB
	MOVX	T3,GL.REM	;PRETEND REMOTE
	MOVEM	T3,CNTLJT	;SAVE FAKE TTY BITS
	JRST	TTYGO		;GO DO CHECKING
;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,		;..
	  JRST	CPOPJ		;ASSUME WE'VE BECOME DETACHED
	JUMPL	T1,CPOPJ	;DITTO

FNDCT1:	HRLZ	T3,T1		;GET THIS JOB'S TTY DDB ADDRESS
	HRRI	T3,.GTTTY	;..
	GETTAB	T3,		;..
	  JRST	CPOPJ
	PEEK	T3,		;GET PHYSICAL TTY NAME
	JUMPE	T3,CPOPJ
	TLNN	T3,-1
	  JRST	CPOPJ		;IF WE CAN
	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	CPOPJ
	AOJE	T1,TOPLVL	;IF T1=-1 WE'VE HIT TOP LEVEL
	TLO	F,L.MANY	;FLAG MORE THAN ONE SUPERIOR
	SUBI	T1,1		;CORRECT FOR AOJE
	POP	P,T2		;ADJUST STACK
	JRST	FNDCT1		;AND 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:	AOS	(P)
CPOPJ:	POPJ	P,
;SUBROUTINE TO PARSE THE LOGIN COMMAND LINE
;CALL WITH:
;	PUSHJ	P,PARSE
;	RETURN HERE IF OK
;
PARSE::	TLZ	F,FL.WLD	;[355]
	TRZ	F,R.EOL		;[604] CLEAR FLAGS WHICH NEED IT
	SETZM	U.PATH		;[376] CLEAR OUT PATH SPECS
	MOVE	T1,[XWD U.PATH,U.PATH+1] ;[376]
	BLT	T1,U.PATH+.FXLEN*2-1 ;[457]
	SETOM	U.TIME		;[355] CLEAR OUT SWITCH BLOCK
	MOVE	T1,[XWD U.TIME,U.TIME+1]	;[355]
	BLT	T1,U.STA	;[355]
	MOVE	T1,[LOGBLN,,LOGBLK]	;SETUP UP TO DO A PARTIAL
	PUSHJ	P,.PSCAN##	; SCAN.
	  PUSHJ	P,GIVNBR	;GIVE # PROMPT
	MOVE	T1,[IOWD DVICES*2+1,DEVTAB] ;[470] INIT PTR TO DEV TABLE
	MOVEM	T1,DEVPTR	;[470] ..
	SETZB	PP,RDHED	;[451] THIS IS A GOOD IDEA
LOOP:	PUSHJ	P,.TIAUC##	;[330] GET NEXT CHAR
	JUMPLE	C,PARSE		;[506] ALLOW BLANK LINES
	CAIN	C," "		;[330] EAT SPACES
	JRST	LOOP		;[330]
	CAIL	C,"0"		;[330] NOT SPACE OR BRACKET - IS IT
	CAILE	C,"7"		;[330] AN OCTAL DIGIT?
	  JRST	PTHSWT		;[446] NO - GO GET PPN, PATH, & SWITCHES
	PUSHJ	P,.REEAT##	;[446] BACK UP TO FIRST DIGIT
	PUSHJ	P,.OCTNW##	;[447] GET PROJ NO (DON'T HAVE 1ST DIGIT YET)
	JUMPL	C,[JUMPE N,PARSE ;IGNORE BLANK LINES
		   JRST  PPERR]	;INVALID ENTRY
	CAIE	C,"/"		;SLASH BREAK?
	CAIN	C,","		;ORDINARY COMMA BREAK?
	SKIPN	N		;NON-ZERO NUMBER
	JRST	PPERR		;NO GOOD
	TLNE	N,-1		;ALSO ONLY 6 DIGITS
	JRST	PPERR
	HRLZ	PP,N		;PUT IN AC PP

	PUSHJ	P,.TIAUC##	;LOOK AT NEXT CHAR
	CAIE	C,UNISYM	;WANT UNIQUE PPN?
	JRST	GPRGMN		;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
GPRGMN:	PUSHJ	P,.OCTNC##	;COLLECT PROGRAMMER, 1ST CHAR IN CH
	JUMPE	N,PPERR		;THIS SHOULD CATCH FORMAT ERRORS
	TLNE	N,-1		;..
	JRST	PPERR		;NO GOOD.
	HRR	PP,N		;MAKE AN XWD
	JUMPLE	C,NOSWIT	;[442] NO PATH OR SWITCES IF EOL FOUND
PTHSWT:	PUSHJ	P,.REEAT##	;[325] BACK UP ONE CHARACTER
;HERE HANDLE PATH DEFINITION AND LOGIN SWITCHES

	PUSHJ	P,.FILIN##	;[434] 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
NOSWIT:	SKIPN	PP		;[447] NON-PATH PPN TYPED?
	  MOVE	PP,U.PATH+.FXDIR;[447] NO - GET PATH PPN
	TLNE	PP,-1		;[447] MAKE SURE BOTH HALVES
	 TRNN	PP,-1		;[447] ARE NON-ZERO
	  JRST	PPERR		;[447] NOPE - COMPLAIN
	MOVEM	PP,PPN		;[447] YES - SALT PPN AWAY FOR LOGIN UUO
	SETSTS	TTY,IO.SUP	;[447] TURN OFF ECHOING
	OUTPUT	TTY,		;[456] MAKE SURE SCNSER KNOWS ABOUT IT

	MOVEI	T1,U.PATH	;[457] GET ADDR OF PATH SPEC TO CHECK
	PUSHJ	P,CHKPTH	;[457] MAKE SURE IT'S A NICE PATH SPEC
	  JRST	PTHERR		;[457] NO - BOMB HIM
	MOVEI	T1,PTHSPC	;[457] GET ADDR OF PATH SWITCH SPEC
	MOVE	T4,PTHSPC+.FXDIR;[474] DON'T WANT CHKPTH TO DEFAULT THIS
	PUSHJ	P,CHKPTH	;[457] MAKE SURE IT'S OK
	  JRST	PTHERR		;[457] BAD BOY
	MOVEM	T4,PTHSPC+.FXDIR;[474] GET DESIRED PATH PPN BACK


	SKIPN	U.PATH+.FXDIR+2	;[457] WERE SFD'S TYPED WITHOUT /PATH?
	  JRST	.POPJ		;[457] NO - ALL IS OK
	SKIPN	PTHSPC+.FXDIR+2	;[457] YES - WAS AN SFD TYPED IN /PATH?
	  JRST	.POPJ		;[457] NO - STILL OK
	JRST	PTHERR		;[457] YES - THAT IS A CONFLICT - COMPLAIN
;[457] ROUTINE TO CHECK LEGALITY OF PATH SPEC (NO WILDCARDS ALLOWED)
;[457] CALL:	MOVE	T1,ADDRESS-OF-PATH-SPEC
;[457]		PUSHJ	P,CHKPTH
;[457]		  BAD PATH
;[457]		OKAY
;[457] THIS ROUTINE ALSO PLUGS IN LOGGED-IN PPN IF NO PPN GIVEN

CHKPTH:	MOVSI	T2,'DSK'	;FORCE DEFAULT OF DSK
	SKIPN	.FXDEV(T1)	;DEFAULT SUPPLIED BY SCAN
	  MOVEM	T2,.FXDEV(T1)	;STORE CORRECTED DEVICE
	MOVE	T3,.FXDEV(T1)	;GET THE DEVICE NEME
	DEVCHR	T3,		;GET ITS DEVICE TYPE
	TXNE	T3,DV.DSK	;MUST BE A DISK
	 SKIPE	.FXNAM(T1)	;NOR FILE NAME
	  JRST	.POPJ		;BOMB HIM ON THAT
	SKIPE	.FXEXT(T1)	;CAN'T EVEN GIVE EXT
	  JRST	.POPJ
	MOVSI	T3,-.FXLND	;ENTRIES IN A FULL PATH SPEC
	ADD	T3,T1		;[457] BASE ADDR OF PATH SPEC
PTHCHK:	SKIPN	.FXDIR(T3)	;WAS A DIRECTORY GIVEN?
	  JRST	.PLUS5		;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,PTHCHK	;LOOP TO CHECK ENTIRE PATH
.PLUS5:	HLLZ	T2,.FXDIR(T1);DID HE GIVE A PROJ?
	SKIPN	T2
	  HLLM	PP,.FXDIR(T1);NO--JAM IT IN
	HRRZ	T2,.FXDIR(T1);DID HE GIVE A PROG. NO.
	SKIPN	T2
	  HRRM	PP,.FXDIR(T1);NO--GO DO THE DEFAULT
	JRST	.POPJ1		;[457] GIVE GOOD RETURN
;HERE TO GET NAME

GETNAM:	MOVEI	T1,[ASCIZ /your name/]
	MOVEM	T1,HELP
	MOVE	T1,U.NAME	;GET THE USER NAME
	MOVE	T2,U.NAME+1	;GET THE SECOND HALF
	CAME	T1,[-1]		;NAME GIVEN?
	JRST	GETNM1		;YES--DO NOT NEED TO ASK
	MOVE	T1,ENTRY+NM1WRD	;[462] PICK UP NAME FROM ACCT.SYS
	MOVE	T2,ENTRY+NM2WRD	;[462] ..
	JUMPN	T1,.+3		;[462] IS THERE ONE?
	 TLNE	F,FL.ATT	;[462] NO - ARE WE ATTACHING?
	  JRST	GETNM1		;[462] YES - DON'T ASK, THEN
	SETZ	T1,		;NO SWITCHES ON NAME
	MOVEI	M,[ASCIZ .Name: .]
	PUSHJ	P,MSG		;[443] PROMPT
	SETSTS	TTY,0		;TURN ON ECHO
	OUTPUT	TTY,		;[456] CAUSE SCNSER TO SEE NEW STATUS
	PUSHJ	P,GET2WD	;GET NAME
	SETSTS	TTY,IO.SUP	;NO ECHO NOW
	OUTPUT	TTY,		;[456] HEY, SCNSER...
GETNM1:	MOVEM	T1,NAME
	MOVEM	T2,NAME2
	MOVE	T3,ENTRY+PROWRD	;GET PROFILE WORD
	TRNN	T3,P.NMTS	;IS NAME REQUIRED?
	SKIPE	ENTRY+NM1WRD	;SKIP IF ACCT.SYS = 0
	JRST	GETCOD		;GO COLLECT PASSWORD
	MOVEM	T1,ENTRY+NM1WRD	;NO--FORCE A VALID NAME BY
	MOVEM	T2,ENTRY+NM2WRD	; OVERWRITING NAME IN ACCT.SYS ENTRY
	TRNN	T3,P.PWTS 	;NEED PASSWORD
	JRST	PSWOK		;NO--CHARGE AHEAD
;HERE TO GET PASSWORD

GETCOD:	MOVEI	T1,[ASCIZ /a valid password/]	;HELP
	MOVEM	T1,HELP		; TEXT FOR TIMEOUT
	PUSHJ	P,CODGET
	PUSHJ	P,.TCRLF##
	MOVEM	T1,CODE		;SAVE THE PASSWORD TO INCLUDE IN FACT FILE
	JUMPN	T2,TRYAGN	;CAN'T BE MORE THE 6 LETTERS
	SKIPN	ENTRY+NM1WRD	;[355] ASSUME OK IF NAME IN FILE IS ZERO
	JRST	NAMEOK
	MOVE	T1,ENTRY+PROWRD	;[355] GET PROFILE WORD
	TRNN	T1,P.NMTS	;[355] NAME REQUIRED?
	JRST	NAMEOK		;[355] NO -- PROCEED
	MOVE	T1,ENTRY+NM1WRD	;YES. CHECK THE NAME.
	MOVE	T2,ENTRY+NM2WRD
	CAMN	T1,NAME		;..
	CAME	T2,NAME2	;SECOND HALF
	JRST	BADNAM
NAMEOK:	MOVE	P1,CODE		;[557] GET PASSWORD TYPED
	IFN	NCRYPT,<	;[557] IF ENCRYPTING
	PUSHJ	P,ENCODE##	;[557] THEN ENCRYPT IT
	>			;[557] END IFN NCRYPT
	CAME	P1,ENTRY+CODWRD	;[557] DOES PASSWORD MATCH?
	  JRST	TRYAGN		;NO. HE LOSES.
	IFN	PSWCHG,<	;[557] IF ALLOWING PSWD CHANGES
	SKIPG	U.NPSW		;[557] USER WANT TO CHANGE HER PSWD?
	  JRST	PSWOK		;[557] NO - SKIP THIS STUFF
NOWAY:	MOVEI	T1,[ASCIZ /a new password/]
	MOVEM	T1,HELP		;[557] HELP TEXT FOR TIMEOUT
	MOVEI	M,[ASCIZ /New password: /]
	PUSHJ	P,MSG		;[557] PROMPT
	SETSTS	TTY,0		;[557] TURN ON ECHO
	OUTPUT	TTY,		;[557] TYPE THE PROMPT
	PUSHJ	P,GET2WD	;[557] GET THE ANSWER
	SKIPN	P1,T1		;[557] MAKE SURE NON-NULL
	  JRST	NOWAY		;[557] NULL PSWD IS A NO-NO
	JUMPN	T2,NOWAY	;[557] PASSWORD TOO LONG
	IFN	NCRYPT,<	;[557] ENCRYPTING PSWDS?
	PUSHJ	P,ENCODE##	;[557] YES - MUNGE IT
	>			;[557] END IFN NCRYPT
	MOVEM	P1,ENTRY+CODWRD	;[557] REPLACE OLD PSWD WITH NEW
	PUSHJ	P,WTUFD		;[557] WRITE THE BLOCK TO ACCT.SYS
	>			;[557] END IFN PSWCHG
	JRST	PSWOK		;[557] AND KEEP ON TRUCKIN'
;SUBROUTINE TO SCAN OFF DISK PRIORITY
;
SWDSKP:	PUSHJ	P,.OCTNW##	;READ THE NUMBER
	CAML	N,[-3]		;TOO SMALL
	CAILE	N,3		;TOO BIG
	JRST	SDSKPE		;YES--ERROR
	MOVEM	N,U.DPRI	;STORE THE ANSWER
	PJRST	.SWDON##	;RETURN

SDSKPE:	M.FAIO	<Invalid argument to /DSKPRI:>


;[470] SUBROUTINE TO STORE ARGS TO /ASSIGN:PHYS:LOG
;
ASSIGN:	TRZ	F,R.NXSW	;[627] CLEAR NEXT-SWITCH-SEEN FLAG
	AOS	(P)		;[470] SKIP RETURN TO BYPASS .SWDPB
	PUSHJ	P,.+1		;[470] DO THIS TWICE - ONCE FOR PHYS
				;[470] NAME, ONCE FOR LOG NAME
	TRNE	F,R.EOL		;[473] EOL SEEN YET?
	  POPJ	P,		;[473] YES-SCAN BARFS IF WE CALL .SIXSW
	MOVE	T1,DEVPTR	;[470] GET POINTER TO TABLE
	AOBJP	T1,A2MANY	;[470] TOO MANY /ASSIGN SWITCHES
	SETZ	T2,		;[627] ZAP T2 IN CASE NO LOGICAL NAME
	TRNE	F,R.NXSW	;[627] ARE WE ABOUT TO READ THE NEXT SWITCH?
	  JRST	ASIGN1		;[627] YES - DON'T!
	PUSH	P,T1		;[470] SAVE T1 OVER .SIXQW
	PUSHJ	P,.SIXSW##	;[470] GET SIXBIT STRING
	CAIN	C,"/"		;[627] NEXT SWITCH?
	  PUSHJ	P,[TRO	  F,R.NXSW	;[627] REMEMBER TO STOP NOW
		   PJRST  .REEAT##]	;[627] BACK UP OVER /
	SKIPG	C		;[473] EOL YET?
	  PUSHJ	P,[TRO	  F,R.EOL	;[627] EOL - REMEMBER IT
		   PJRST  .REEAT##]	;[627] AND MAKE SURE SCAN SEES IT
	POP	P,T1		;[470] GET T1 BACK AGAIN
	MOVE	T2,.NMUL##	;[470] PICK UP ARG FROM SCAN
ASIGN1:	MOVEM	T2,(T1)		;[627] STORE AWAY IN TABLE
	MOVEM	T1,DEVPTR	;[470] SAVE POINTER TO TABLE
	POPJ	P,		;[470] RETURN
;SUBROUTINE TO READ /NAME SWITCH
;CALL WITH:
;	PUSHJ 	P,NAMESW
;	RETURN HERE
;
NAMESW:	PUSHJ	P,.SIXQW##	;READ THE STRING
	MOVE	T1,U.NAME	;[442] SEE IF SOMETHING THERE ALREADY
	CAME	T1,[-1]		;[442] IS THERE?
	  JRST	.POPJ		;[442] YES - LEAVE IT ALONE
	MOVE	T1,.NMUL##	;GET FIRST 2 WORDS OF ANSWER
	MOVE	T2,.NMUL##+1
	MOVEM	T1,U.NAME	;[442] SAVE IN SWITCH AREA
	MOVEM	T2,U.NAME+1	;[442]  ..
	JRST	.POPJ1		;SKIP-RETURN TO BYPASS .SWDPB
;SUBROUTINE TO ASK FOR AND READ PASSWORD
;VALUES	T1=SIXBIT PASSWORD

CODGET:	SKIPE	FL2741		;[546] IS THIS A 2741?
	  JRST	PW2741		;[546] YES - DO 2741 THINGS
	TLNE	F,FL.FDX	;SKIP IF NOT FDX LINE
	JRST	FDXCOD		;YES.
	MOVEI	T3,3		;THREE OVERLAYS
MASKLP:	PUSHJ	P,PRMASK	;PRINT THE MASK
	MOVX	T1,.CHCRT	;JUST A CR
	PUSHJ	P,.TCHAR##	;TYPE IT
	SOJG	T3,MASKLP	;GO BACK 3 TIMES
	PUSHJ	P,GET2WD	;COLLECT THE PASSWORD
	MOVEI	CH,"*"		;MASK FOR DISPLAY TERMINALS
	MOVEI	N,6		;COUNT
	PUSHJ	P,TYO		;PRINT ENOUGH TO ERASE PASSWORD
	SOJG	N,.-1		;LOOP
	POPJ	P,		;EASY
PW2741:	MOVEI	T1,[ASCIZ "Password: #$%&*@"]
	PUSHJ	P,PBACK6	;SEND 6 BACKSPACES
	PUSHJ	P,PRMASK	;PRINT A MASK
	PUSHJ	P,BACK6		;SEND 6 BACKSPACES
	PUSHJ	P,PRMASK	;PRINT A MASK
	PUSHJ	P,BACK6		;BACKSPACE OVER IT
	MOVEI	T1,[ASCIZ "######"] ;MAKE IT BLACK
	PUSHJ	P,PBACK6	; ..
	MOVEI	T1,[ASCIZ "@@@@@@"] ; ..
	PUSHJ	P,PBACK6
	PJRST	GET2WD		;READ PASSWORD

PBACK6:	PUSHJ	P,.TSTRG##	;TYPE STRING IN T1
BACK6:	MOVEI	T1,[BYTE (7)10,10,10,10,10,10,0]
	PJRST	.TSTRG##	;TYPE 6 BACKSPACES


;ROUTINE TO PRINT A MASK
PRMASK:	TIMER	T1,		;MUST MAKE MASK
	ADDB	T1,MSKMEM	;PROTECT AGAINST FAST SYSTEM
	TRO	T1,1		;FOR RANDOM NUMBERS
	MOVNI	T2,6		;6 CHARS LONG
MASK1:	IMULI	T1,-3		;RANDOM CHAR
	HRRZ	N,T1
	IDIVI	N,76		;NO SPACE OR QUEST MK
	MOVEI	CH,41(N+1)	;THE CHAR
	PUSHJ	P,TYO		;OUTPUT IT
	AOJL	T2,MASK1	;MAKE A LINE
	POPJ	P,0		;RETURN

FDXCOD:	MOVEI	M,[ASCIZ /Password: /]	;REQUEST CODE
	PUSHJ	P,MSG		;..
	PJRST	GET2WD

LOGBLK:	IOWD	LOGSWL,LOGSWN
	XWD	LOGSWD,LOGSWM
	XWD	0,LOGSWP
	SIXBIT	/LOGIN/		;[320] TYPE HLP:LOGIN.HLP ON /HELP
LOGBLN==.-LOGBLK

SCIBLK:	IOWD	COMLEN,COMLST
	XWD	SAOFST,'LGI'
	XWD	TTYGET,STYO
	XWD	0,0
	XWD	0,FLUSH	
	EXP	FS.ICL

COMLST:	SIXBIT	/LOGIN/
	SIXBIT	/ATTACH/
COMLEN==.-COMLST

LOKBLK:	XWD	[WILDBK],0
	XWD	JUNK,SECBUF	;[422] THROW AWAY 4-WORD LOOKUP BLK SO
	XWD	.FXLEN,.RBSTS+1	;[422] IT WON'T OVERWRITE AUXACC.SYS DATA
	XWD	0,WLDPNT
LOKBLN==.-LOKBLK


;TABLES TO DRIVE SCAN

DM	COR,^D0,^D262143,^D262143	;[551]
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

IFN	SETTTY,<
DM	FLL,3,0,2		;[344] DEFAULTS FOR TTY CHAR. SWITCHES
DM	PSZ,77,77,77
DM	WTH,^D200,^D80,^D132
	>			;[344] END IFN SETTTY

	DEFINE SWTCHS,<
SP	ASSIGN,<*F,DEVTAB>,ASSIGN,,FS.VRQ	;[470]
SP	CORE,<*F,U.CORE>,.SWCOR##,COR,FS.VRQ
SN	DEFER,<*F,U.DFER>,
SP	DEFPROT,<*F,U.DFPR>,.SWOCT##,,FS.VRQ	;[620]
SL	DSKFUL,<*F,U.DFUL>,DSKF,DSKFPA
SP	DSKPRI,<*F,U.DPRI>,SWDSKP,DPR,FS.VRQ
SN	GUIDELINE,<*F,U.GUID>
SP	LIB,<*F,LIBSPC>,.SWFIL##,FIL,FS.VRQ
SN	LIMIT,<*F,U.LIMIT>
SP	LOCATE,<*F,U.STA>,.SWOCT##,LOC,FS.VRQ
SP	NAME,<*F,U.NAME>,NAMESW,,FS.VRQ
SP	NEW,<*F,U.NEW>,.SWDEC##,YN
SS	NOLIB,<*F,LIBSPC+.FXDIR>,0
SS	NONEW,<*F,U.NEW>,0
SS	NOSCAN,<*F,U.SCAN>,0
SS	NOSTR,<*F,U.STR>,0
SS	NOSYS,<*F,U.SYS>,0
SP	NOTE,<*F,NOTSPC>,.SWFIL##,FIL,FS.VRQ
SL	NOTICE,<*F,U.NOTC>,NOTC,0,FS.VRQ	;[450] /NOTICE:
SS	NOWATCH,<*F,U.NWAT>,0
IFN	PSWCHG,<				;[557]
SP	PASSWORD,<*F,U.NPSW>,.SWDEC##,YN	;[557]
	>					;[557] END IFN PSWCHG
SP	PATH,<*F,PTHSPC>,.SWFIL##,FIL,FS.VRQ	;[456] /PATH SWITCH
SP	*PHYSICAL,<*F,U.CPPL>,.SWCOR##,COR,FS.VRQ
SP	QUOTA,<*F,U.QTA>,.SIXSW##,QTA
SP	SCAN,<*F,U.SCAN>,.SWDEC##,YN
SP	SFDPROT,<*F,U.SFDP>,.SWOCT##,,FS.VRQ
SL	SPOOL,<*F,U.SPL>,SPOL,0,FS.OBV
SP	STR,<*F,U.STR>,.SWDEC##,YN
SP	SYS,<*F,U.SYS>,.SWDEC##,YN
SP	TIME,<*F,U.TIME>,.SWDEC##,TIM,FS.VRQ
SP	UFDPROT,<*F,U.UFDP>,.SWOCT##,,FS.VRQ	;[553]
SP	VIRTUAL,<*F,U.CVPL>,.SWCOR##,COR,FS.VRQ
SL	WATCH,<*F,U.WAT>,WTCH,0,FS.OBV



IFN	SETTTY,<		;[344] TTY CHARACT. SWITCHES
SN	ALTMODE,<*F,U.ALTM>,
SN	BLANK,<*F,U.BLNK>,
SN	CRLF,<*F,U.CRLF>,
SN	DEBREAK,<*F,U.DBRK>,
SN	ECHO,<*F,U.ECHO>,
SP	FILL,<*F,U.FILL>,.SWOCT##,FLL,FS.VRQ
SN	FORM,<*F,U.FORM>,
SN	GAG,<*F,U.GAG>,
SN	LC,<*F,U.LC>,
SN	PAGE,<*F,U.PAGE>,
SP	PAGESIZE,<*F,U.PGSZ>,.SWDEC##,PSZ,FS.VRQ
SL	RCVSPEED,<*F,U.RSPD>,SPED,0,FS.VRQ
SN	RTCOMP,<*F,U.RTC>,
SN	SETTTY,<*F,U.SETT>,
SL	SPEED,<*F,U.SPED>,SPED,0,FS.VRQ
SN	TABS,<*F,U.TABS>,
SN	TAPE,<*F,U.TAPE>,
SP	WIDTH,<*F,U.WDTH>,.SWDEC##,WTH,
SL	XMTSPEED,<*F,U.XSPD>,SPED,0,FS.VRQ
	>			;[344] END IFN SETTTY

>
	DOSCAN(LOGSW)		;EXPAND TABLES
KEYS	DSKF,<ERROR,PAUSE>
KEYS	SPOL,<LPT,PLT,PTP,CDP,CDR>
KEYS	WTCH,<MTA,VERSION,WRITE,READ,WAIT,RUN,DAY>
KEYS	NOTC,<ALWAYS,SOMETIMES,NEVER>

IFN	SETTTY,<
KEYS	SPED,<50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,EXTA,EXTB>
	>			;[344] END IFN SETTTY

	WCHLSH==:^D17-WTCHDA	;AMOUNT TO SHIFT BITS RETURNED BY
				; SCAN FOR SETUUO

;LOWSEG STORAGE FOR LGNSCN
	RELOC
MSKMEM:	BLOCK	1	;MEMORY FOR MASK PRINTER
	RELOC
	PRGEND
	TITLE	LGNACT - Accounting module for LOGIN

	SEARCH	C,SCNMAC,LGNUNV

	LGNDCL

;ENTER HERE WITH	T3=TTBITS FOR TTY OR CONTROL JOB TTY

TTYGO:	MOVE	T2,STATES	;GET STATES BITS
	TLNE	F,L.OPR!L.SOPR	;OPER OR HIS SUB?
	JRST	PPNGO		;[505] YES. OK TO GO
	TXNN	T2,ST%NLG	;NO LOGIN?
	JRST	SYSAVL		;NO--SYSTEM IS AVAIL
	STOP	SNA,<System not available>
SYSAVL:	TXNE	T3,GL.DSL!GL.REM	;NON-LOCAL?
	TXNN	T2,ST%NRL	;AND STATES SAYS LOCAL ONLY?
	JRST	NOTRMT		;NO. OK
	FATAL	NRU,<No remote users. Try again later.>
NOTRMT:	TLNE	F,FL.ATT	;[555] SKIP IF LOGIN, NOT IF ATTACH
	  JRST	PPNGO		;[555] DON'T NEED TO CHECK LOGMAX FOR ATTACH
	PUSH	P,T2		;SAVE STATES WORD
	TLNE	F,FL.BAT	;[505] BATCH JOB?
	  JRST	BACHEK		;[505] YES - DO BATCH CHECKING
	MOVX	T1,%CNLNM	;NUMBER OF JOBS NOW
	GETTAB	T1,		;GET FROM MONITOR
	  JRST	NT2MNY		;IF IT FAILS ASSUME OK
	MOVX	T2,%CNLMX	;GET MAXIMUM
	GETTAB	T2,		; ..
	  JRST	NT2MNY		;ALL IS WELL IF FAILS
	SUB	T2,T1		;GET NUMBER OF FREE JOB SLOTS
	JUMPGE	T2,NT2MNY	;JUMP IF NOT OVER LIMIT
	FATAL	JCE,<Job capacity exceeded>

BACHEK:	IFN	BATMAX,<	;[505] CHECK BATMAX??
	MOVX	T1,%CNBNM	;[505] GET BATNUM
	GETTAB	T1,		;[505] FROM MONITOR
	  JRST	NT2MNY		;[505] ..
	MOVX	T2,%CNBMX	;[505] GET BATMAX
	GETTAB	T2,		;[505] FROM MONITOR
	  JRST	NT2MNY		;[505] ..
	CAMGE	T1,T2		;[505] BATNUM .GT. BATMAX?
	  JRST	NT2MNY		;[505] NO - ALL'S WELL
	REQUE	JCX,<Job capacity exceeded>
	>			;[556] END IFN BATMAX

	IFE	BATMAX,<	;[505] IF NO BATMAX CHECKING
	JRST	NT2MNY		;[505] ASSUME OK
	>			;[556] END IFE BATMAX

NT2MNY:	POP	P,T2		;RESTORE STATES
	TLNE	F,FL.BAT	;BATCH JOB?
	JRST	PPNGO1		;YES, CHECKING ALREADY DONE
	TXNN	T2,ST%BON	;NO. BATCH ONLY ONES ALLOWED?
	JRST	PPNGO		;NO
	FATAL	OBU,<Only batch users may LOGIN.>
PPNGO:	MOVX	T1,%NSKTM	;FIND OUT IF SYSTEM IS DOWN
	GETTAB	T1,
	  SETZ	T1,
	JUMPE	T1,PPNGO1	;OK TO GO
	JUMPG	T1,PPNGO3	;JUMP IF SYSTEM GOING DOWN SOON
	TLNN	F,L.OPR!L.SOPR	;[606] IF OPR OR SUB OF OPR OR 1,2
 	 TXNN	T3,GL.REM	;[606] OR LOCAL TTY
	  JRST	PPNGO1		;[606] THEN LET HIM IN ANYWAY
	STOP	TIO,<Timesharing is over>
PPNGO3:	CAIL	T1,^D24*^D60	;OVER A DAY TO GO?
	JRST	PPNGO1		;YES--SKIP WARNING
	INFO	TCI,<Timesharing will cease in >
	  JRST	PPNGO1
	IDIVI	T1,^D60
	MOVE	T4,T2		;SAVE REMAINDER (MINUTES)
	JUMPE	T1,PPNGO2	;SEE IF HOURS NONZERO
	PUSHJ	P,.TDECW##	;YES. PRINT HOURS
	MOVEI	M,[ASCIZ . hours .]
	PUSHJ	P,MSG
PPNGO2:	MOVE	T1,T4		;GET MINUTES
	PUSHJ	P,.TDECW##
	MOVEI	M,[ASCIZ \ minutes.]
\]
	PUSHJ	P,MSG
;FALL INTO PPNGO1
;HERE TO BEGIN CHECKING PPN

PPNGO1:	TLNE	F,FL.ATT	;[555] LOGIN OR ATTACH?
	  JRST	ATTCHK		;[555] ATTACH


;HERE TO COMPUTE BIT IN TIMES WORD TO CHECK

	MOVE	T1,STATES	;[354] GET STATES WORD
	TXNN	T1,ST%NOP	;[354] IS THERE AN OPERATOR?
	JRST	LOGIN3		;[354,360] YES -- PROCEED
	INFO	NOC,<No operator coverage.>
	  JFCL			;[432] DO A CRLF

LOGIN3:	MOVE	P,PDPLST	;[565] RE-INIT STACK
	TLZ	F,FL.WKD+FL.RAS	;TRY AGAIN ENTRY
	PUSHJ	P,.GTNOW##	;GO GET TODAYS DATE
	HLRZ	T1,T1		;SAVE THE DAY
	IDIVI	T1,7		;FIGURE OUT THE DAY
	CAIL	T2,3		;[316] SATURDAY??
	CAILE	T2,4		;[316]  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.

	PUSHJ	P,PARSE##	;GO PARSE LOGIN LINE
ATTCHK:	TRZ	F,R.FMT		;FROM NOW ON, ERRORS ARE REAL, NOT FORMAT
	MOVX	T1,ST%IMG
	TDNN	T1,STATES	;SKIP IF NEW SCANNER SERVICE
	TLNE	PP,-2		;SKIP IF  PROJ 1
	JRST	CHECKS		;NOT PROJ 1, GO AHEAD
	MOVX	T1,GL.ITY
	TDNE	T1,TTBITS	;DONT ALLOW PROJ 1 ON PTY
	JRST	NOREMT		;IN OLD SCANNER
CHECKS:	CAME	PP,SYSPPN	;SYSPPN CAN ALWAYS LOGIN
	CAME	PP,MFDPPN	;BUT IF MFDPPN IS NOT SYSPPN,
	JRST	STACCT
	JRST	NOMFDP		;DONT ALLOW MFDPPN
	SUBTTL	Search ACCT.SYS

;HERE TO SEARCH ACCT.SYS FOR USER'S ENTRY

STACCT:	PUSHJ	P,CLRRIB	;[540] CLEAR EXTENDED LOOKUP BLOCK
	MOVE	T1,[SIXBIT /ACCT/]	;LOOK FOR THE SYSTEM FILE
	MOVEM	T1,SECBUF+.RBNAM	;[540] PUT INTO LOOKUP BLOCK
	MOVSI	T1,(SIXBIT /SYS/)	;[540] GET EXTENSION
	MOVEM	T1,SECBUF+.RBEXT	;[540] STUFF IT
	MOVE	T1,SYSPPN	;[540] GET SYS: PPN
	MOVEM	T1,SECBUF+.RBPPN;[540] STUFF IT
	MOVEI	T1,.RBTIM	;[540] GET ARGUMENT COUNT
	MOVEM	T1,SECBUF+.RBCNT;[540] ..
	SETZM	ENTRY		;[540] CLEAR ENTRY IN CASE NO ACCT.SYS
	MOVE	T4,[XWD ENTRY,ENTRY+1]
	BLT	T4,ENTRY+MAXENT-1
	LOOKUP	UFD,SECBUF	;[540] TRY TO READ IT
	  JRST	NOSYS		;CANT. GO DIE.
	MOVE	T1,SECBUF+.RBSIZ;[540] GET NO. OF WORDS WRITTEN
	ADDI	T1,^D127	;[540] COUNT 1 FOR LAST PARTIAL BLOCK
	IDIVI	T1,^D128	;[540] CONVERT TO BLOCKS
	MOVEM	T1,ACCTLN	;ALWAYS SAVE BLOCKS
	SETZM	ACCKNT		;CLEAR COUNT OF READS ON ACCT.SYS
	TLO	F,FL.ACC	;SET FLAG TO NOTE READING ACCT.SYS

;HERE TO FIND DIRECTORY OF ACCT.SYS, IF ANY,
;	AND BUILD IT IN THE HI SEGMENT IF NONE.
IFN	FASTLG,<
	MOVE	T2,SECBUF+.RBTIM;[540] GET CREATION DATE-TIME
	CAME	T2,W.ACCT	;[540] COMPARE WITH LAST DATE-TIME
	  JRST	REBILD		;[540] IF CHANGED, REBUILD TABLE
	SKIPE	DACCFL		;IF TABLE NOT BUILT
	CAME	T1,DACCL	;OR LENGTHS DIFFER
	JRST	REBILD		;BUILD TABLE IMMEDIATELY
	PUSHJ	P,SNOOZE	;ELSE SLEEP
	JRST	LUKUPP		;UNTIL TABLE FINISHED
				;OR WE GET IMPATIENT
REBILD:	SETZM	RDHED		;[444] FORCE NEXT READ TO INPUT
	PUSHJ	P,LOK		;[444] LOCK OUT CTRL-C, WRITE-ENABLE HI SEG
	SETOM	SCDBLT		;[463] INVALIDATE SCHED. TABLE
	SETOM	DACCFL		;INDICATE BUILD-IN-PROGRESS
	AOSG	DLOCK		;CHECK LOCK
	JRST	BDACCT		;GO BUILD TABLE
	PUSHJ	P,SNOOZE	;IN-PROGRESS, WAIT AWHILE
	JRST	RSPROT		;GOT BUILT WHILE WE WAITED
				;FALL OUT HERE IF NO ACTION IN 10 SECS
BDACCT:	MOVE	T1,ACCTLN	;LENGTH OF ACCT.SYS
	MOVEM	T1,DACCL	;SAVE IN HI-SEG
	LSH	T1,1		;DOUBLE BECAUSE WE NEED 2 DIRECTORIES
	SKIPN	WD,PDACC	;UNLESS WE'VE DONE THIS BEFORE,
	HLRZ	WD,.JBHRL	;[424]  GET HIGHEST WE GOT
	TRO	WD,400000	;[424]
	MOVEM	WD,PDACC	;SETUP POINTER TO DIRECTORIES
	ADDI	T1,(WD)		;THAT'S HOW MUCH WE NEED NOW
	HRRZ	WD,.JBHRL
	CAIG	T1,(WD)		;DO WE NEED MORE?
	JRST	COREOK		;NO, DON'T BOTHER THE MONITOR
	HRLZS	T1		;SETUP TO GET MORE
	CORE	T1,
	  JRST	NOSYS		;FATAL ERROR-INSUFFICIENT CORE
COREOK:	PUSHJ	P,RDUFD		;GET FORMAT WORD
	  JRST	NOSYS		;WHA???
	HRRZM	WD,ENTSIZ	;SAVE SIZE OF ENTRIES IN ACCT.SYS
	HLRZS	WD		;GET FORMAT IN RIGHT
	CAIL	WD,ACC506	;[356] IS THIS ACCT.SYS A FORMAT
	CAILE	WD,ACC602	;[356] WE KNOW ABOUT?
	JRST	BADFOR		;[356] NO -- CROAK
	CAIL	WD,ACC602	;[356] SETTING 6.02 STUFF?
	SETOM	EQACT		;[356] YES -- SET FLAG TO REMEMBER
	CAIL	WD,ACC601	;IS THIS THE NEW FORMAT
	SETOM	NEWACT		;YES--SET THE FLAG
	MOVEI	T1,200		;BLOCK LENGTH
	IDIV	T1,ENTSIZ	;OVER ENTRY SIZE IS ENTRIES PER BLOCK
				;B GETS REMAINDER
	HRRZ	T1,PDACC	;GET ADDR OF TABLE
	MOVEI	T3,1		;FIRST WORD OF BLOCK IS ALREADY USED
NXTABC:	MOVE	PP,UFDBUF(T3)	;GET FIRST PPN OF THIS BLOCK
	MOVEM	PP,0(T1)	;STORE IN TABLE
	SUB	T3,T2		;POINT TO FIRST PPN IN NEXT BLOCK
	JUMPGE	T3,.+2		;DON'T LET IT GO NEGATIVE
	ADD	T3,ENTSIZ	;KEEP RESULT MODULO ENTSIZE
	SETZM	RDHED		;FORCE A READ
	PUSHJ	P,RDUFD
	  JRST	.+2		;ALL DONE-EOF
	AOJA	T1,NXTABC	;LOOK FOR PPN IN THIS BLOCK
	SETZB	T1,DAUXFL	;FORCE REBUILD OF AUX TABLE
	HRLOM	T1,DACCFL	;SET TABLE-FINISHED SW
	SETOM	DLOCK		;UNLOCK THE CODE
	MOVE	T1,SECBUF+.RBTIM;[540] GET CREATION DATE-TIME OF ACCT.SYS
	MOVEM	T1,W.ACCT	;[540] SAVE IN HI-SEG
RSPROT:	PUSHJ	P,UNLOCK	;[444] UNLOCK CTRL-C
;HERE TO FIND USER'S PPN IN TABLE

LUKUPP:	MOVE	PP,PPN		;GET USER'S PPN
	TRNE	PP,1B18		;WILD PPN?
	HRRI	PP,UNIPRG	;YES--LOOK FOR RIGHT GUY
	MOVN	T1,DACCL	;LENGTH OF TABLE
	HRLZ	T1,T1		;[371] FOR AOBJN LOOP
	HRR	T1,PDACC	;GET ADDR OF TABLE
	CAML	PP,0(T1)	;SCAN FOR HIGHER PPN
	AOBJN	T1,.-1		;CONTINUE SEARCH IF NOT
	JUMPL	T1,NLSTPP	;IS THIS THE LAST ENTRY IN THE TABLE?
	SKIPN	-1(T1)		;IF SO, IS PPN REACT'S TRAILING ZERO?
	SOJ	T1,		;YES TO BOTH. MUST BE IN PRECEDING BLOCK
NLSTPP:	HRRZ	T1,T1		;[371] DISCARD COUNTER IN A LEFT
	SUB	T1,PDACC	;GET OFFSET WITHIN TABLE
	SOJL	T1,PPERR1	;BEWARE THE RIDICULOUS
	HRRZM	T1,ACCKNT	;SET POINTER INTO ACCT.SYS
	USETI	UFD,1(T1)	;SETUP FOR DESIRED BLOCK

;	FIND THE ADDRESS OF THE FIRST PPN IN THIS BLOCK

	MOVE	T4,ENTSIZ	;JUST TO HAVE IT THERE
	HRRZ	T2,T1		;COPY BLOCK COUNT
	ASH	T2,7		;TIMES 200 (BLOCK LENGTH)
	IDIV	T2,T4
	MOVN	T2,T3		;NEGATIVE REMAINDER
	AOJGE	T2,.+2		;ALLOW ONE FOR FORMAT WORD
	ADD	T2,T4		;GET POINTER INTO BLOCK
	MOVNI	T3,177(T4)	;-(BLOCK LEN + ENTSIZ - 1)
	IDIV	T3,T4		;T3 GETS -(NO OF ENTRIES/BLOCK)
	SETZM	RDHED		;FORCE A READ
	PUSHJ	P,RDUFD		;GET THE RIGHT BLOCK
	  JRST	PPERR1		;I HOPE IT'S HIS FAULT
	MOVE	WD,UFDBUF(T2)	;GET FIRST PPN OF BLOCK
	ADD	T1,PDACC	;POINT DIRECTLY TO TABLE ENTRY
	CAME	WD,0(T1)	;CHECK TABLE ACCURACY
	JRST	BADTAB		;IT LIED--REBUILD IT
	HRLI	T2,-200(T2)	;REMAINING COUNT IN BLOCK
	HRRI	T2,UFDBUF-1(T2)	;MAKES IOWD FOR FIRST PPN OF BLOCK
	MOVEM	T2,RDHED	;THAT ENABLES USE OF RDUFD, WHICH
				;MASKS BLOCK BOUNDARIES
>;*** END OF CONDITIONAL ON FASTLG
;HERE TO FIND USER'S ENTRY (IF ANY)

RDACCT:	MOVN	T1,ENTSIZ	;GET SIZE AS A COUNT
	HRLZS	T1		;FOR AOBJN
RDACT1:	PUSHJ	P,RDUFD		;GET A WORD
	  JRST	PPERR1		;GOT TO EOF
	MOVEM	WD,ENTRY(T1)	;STORE IN TEMP BLOCK
	IFN	PSWCHG,<	;[610] IF ALLOWING /PASSWORD
	HRRZ	T2,T1		;[624] STRIP OFF COUNT
	CAIE	T2,CODWRD	;[624] DID WE JUST READ THE PSWD?
	  JRST	RDACT2		;[610] NO
	HRRZ	T2,RDHED	;[610] YES: GET PTR TO WORD WITHIN BLOCK
	MOVEM	T2,SAVPOS	;[610] SAVE FOR LATER
	MOVE	T2,ACCKNT	;[610] PICK UP BLOCK THIS IS IN
	MOVEM	T2,SAVBLK	;[610] AND REMEMBER FOR LATER
RDACT2:	>			;END IFN PSWCHG
	AOBJN	T1,RDACT1	;GET REST OF ENTRY
	MOVE	T1,ENTRY+PPWRD	;CHECK FOR THE PPN
	HLRZ	T2,T1		;PROJ. IN FILE
	HLRZ	T4,PPN		;PROJ SUPPLIED
	CAMLE	T2,T4		;PASSED IT YET?
	JRST	PPERR1		;YES. NOT THERE.
	CAMN	T1,PPN		;IS THIS IT?
	JRST	PPNHIT		;YES. LOOK AT ENTRY
	CAME	T2,T4		;SAME PROJECT
	JRST	NXTPP		;NO. DON'T LOOK FOR #
	MOVE	WD,PPN		;PICK UP PPN
	TRNN	WD,1B18		;WILD ENTRY?
	JRST	NXTPP		;NO. GO ON.
	HRRZI	T1,(T1)		;COPY PROG NBR.
	CAIN	T1,UNIPRG	;MATCH WILD NO
	JRST	PPNHIT		;YES. LOOK AT ENTRY
IFE	FASTLG,<
	JRST	RDACCT		;GO FOR NEXT
NXTPP==	RDACCT	>
IFN	FASTLG,<
NXTPP:	AOJL	T3,RDACCT	;MORE IN THIS BLOCK?

;	WE HAVE NOW READ AN ENTIRE BLOCK WITHOUT FINDING THIS PPN
;	EITHER THE TABLE WAS INCORRECT, OR PPN DOESN'T EXIST
;	ACCKNT HAS BEEN INCREMENTED AT LEAST ONCE SINCE STORING
;	AND TWICE IF WE HAVE READ INTO NEXT BLOCK

	MOVE	T1,ACCKNT	;GET TABLE POINTER
	ADD	T1,PDACC	;ADDRESS THE TABLE
	MOVE	T1,-1(T1)	;GET FIRST PPN THIS BLOCK
	CAMN	T1,ENTRY+PPWRD
	JRST	PPERR1		;IF MATCH, TABLE IS OK, SO PPN IS BAD
	PUSHJ	P,RDUFD		;HOWEVER, OUR ESTIMATE OF ENTRIES/BLOCK
	  JRST	PPERR1		;  MAY BE OFF BY 1, SO CHECK THE NEXT
	MOVE	T1,ACCKNT	;READ MAY HAVE INCREMENTED BLOCK NO
	ADD	T1,PDACC	;POINT INTO TABLE AGAIN
	CAMN	WD,-1(T1)	;IS TABLE CORRECT FOR THIS BLOCK?
	JRST	PPERR1		;PPN IS WRONG
BADTAB:	USETI	UFD,1		;PREPARE TO SCAN ENTIRE FILE
	JRST	REBILD		;AND BUILD A NEW TABLE
>;*** END OF CONDITIONAL ON FASTLG
	SUBTTL	Check ACCT.SYS entry
;HERE TO DECIDE IF USER MAY LOGIN

PPNHIT:	HLRZ	T1,ENTRY+XPDWRD	;GET EXPIRATION DATE OF PPN
	CAML	T1,TDATE	;[477] SKIP IF DATE L TODAY
	JRST	NOTEXP		;PPN IS OK
	FATAL	PHE,<PPN has expired>
NOTEXP:	MOVE	T3,ENTRY+PROWRD
	MOVE	T1,TTBITS
	TXNN	T1,GL.ITY	;SKIP IF PTY
	JRST	ASKLOK		;SEE IF MAY LOGIN AT THIS TERMINAL
	TLNE	F,FL.BSJ	;SKIP IF NOT BATCH JOB SUBJOB
	 TRNE	T3,P.LGBS	;SKIP IF MAY NOT LOGIN AS SUBJOB
	  SKIPA			;[603] OK
	   JRST	NOLGTS
	TLNE	F,FL.BAT	;[603] BATCH JOB?
	 TRNE	T3,P.LGBT	;[603] YES - ALLOWED TO BE ONE?
	  SKIPA			;[603] NOT BATCH OR BATCH & ALLOWED TO BE
	   JRST	NOLGTS		;[603] BATCH & SHOULDN'T BE - COMPLAIN
	TLNE	F,FL.BAT	;[603] BATCH JOB?
	  JRST	CHEKIT		;[603] YES - CHECK TIMES TO LOG IN
	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
	JRST	PSWOK
	MOVE	T1,CNTLJT	;GET LINE BITS FOR CONTROL JOB
ASKLOK:	TLNE	F,L.OPR!L.SOPR	;OK IF OPR OR SUB OF OPR OR 1,2
	JRST	LOGOK
	MOVEI	T2,P.LGLC	;LOCAL BIT
	TXNE	T1,GL.REM	;SKIP IF NOT REMOTE HARDWIRED TTY
	MOVEI	T2,P.LGRM	;REMOTE BIT
	TXNE	T1,GL.DSL	;SKIP IF NOT DATA SET TTY
	MOVEI	T2,P.LGDS
	TDNN	T2,T3		;SKIP IF MAY LOGIN AT THIS TERMINAL
	JRST	NOLGTS
CHEKIT:	MOVE	T2,ENTRY+TIMWRD	;[603] PICK UP TIME TO LOGIN WORD
	TDNE	T2,NOWBIT	;IS HE ALLOWED NOW?
	JRST	LOGOK		;YES
	FATAL	SOT,<PPN not valid for this time of day>

LOGOK:	TLNE	F,FL.BAT	;[603] BATCH JOB?
	  JRST	PSWOK		;[603] YES - NO PSWD CHECKING, THEN
	SKIPN	ENTRY+NM1WRD	;DO WE HAVE A DEFAULT NAME IN
				; ACCT.SYS
	JRST	GETNAM		;YES--HAVE HIM TYPE HIS NAME
	TRNN	T3,P.PWTS	;SKIP IF PASSWORD REQUIRED
	JRST	PSWOK		;NO, DONT ASK
	TRNN	T3,P.NMTS	;SKIP IF NAME REQUIRED
	JRST	GETCOD		;NO, GET PASSWORD
	JRST	GETNAM		;[323] YES, GET NAME AND PASSWORD

NOLGTS:	MOVEI	M,NOTSMS
	TLNE	F,FL.ATT	;SKIP IF LOGIN, NOT IF ATTACH
	MOVEI	M,NOTSAT	;MAY NOT ATTACH HERE MESSAGE
	MOVEI	CH,ERR.FT	;[612] FATAL ERROR
	PUSHJ	P,ERRLIN	;TYPE BEGINNING OF LINE
	MOVEI	M,NOTSM1	;LOCAL MESSAGE
	TRNE	T2,P.LGRM	;SKIP IF NOT REMOTE HARDWIRED TTY
	MOVEI	M,NOTSM2	;REMOTE MESSAGE
	TRNE	T2,P.LGDS	;SKIP IF NOT DATA SET TTY
	MOVEI	M,NOTSM3	;DATA SET MESSAGE
	TRNE	T2,P.LGRO	;SKIP IF NOT REMOTE CTY OR OPR
	MOVEI	M,NOTSM4	;REMOTE CTY OR OPR MESSAGE
	TLNE	F,FL.BSJ	;SKIP IF NOT BATCH JOB SUBJOB
	MOVEI	M,NOTSM5	;SUBJOB MESSAGE
	TLNE	F,FL.BAT	;[603] BATCH JOB?
	  MOVEI	M,NOTSM6	;[603] YES - GET RIGHT MESSAGE
	PUSHJ	P,MSG
	JRST	FLUSH
	SUBTTL	Write FACT file entry

ACCT:	RELEAS	UFD,0		;MAKE WAY FOR LATER IO

	IFN FACTSW,<
	PUSHJ	P,ACCTA		;PUT IN ACCOUNTING DATA
	MOVE	P2,FCTWD	;GET CONTROL WORD

	IFN 	FTTASK,<	;[436] TASK DATA MUST GO IN FACT FILE
	TLNE	F,FL.ATT	;[436] SKIP IF LOGIN
	  JRST	NOTASK		;[436] NO TASK DATA IF ATTACH
	MOVE	T1,PPN		;[436] GET PPN
	CAMN	T1,ALPPPN	;[436] SKIP IF NOT GOD PPN
	  JRST	NOTASK		;[436] GOD GETS COMPUTER TIME FREE
	MOVEI	T1,3		;[436] INCREASE FCTDAT
	ADDM	T1,FCTDAT	;[436] TO ACCOMODATE EXTRA DATA
	MOVE	P2,[XWD -6,FCTDAT] ;[436] 
NOTASK:	>			;[436] END IFN FTTASK

	PUSHJ	P,.FACTR##	;[571] STICK IT INTO FACT.SYS
	TLNE	F,FL.ATT	;SKIP IF LOGIN, NOT IF ATTACH
	JRST	LAST		;NEED NO MORE FOR ATTACH
	SKIPE	PTHSPC+.FXDIR	;[467] WAS THERE A /PATH SWITCH?
	  JRST	NOZAP		;[467] YES - LEAVE IT ALONE
	SETZM	PTHSPC		;[467] NO - CLEAR OUT /PATH SPEC
	MOVE	T1,[PTHSPC,,PTHSPC+1]	;[467] AREA SO .OSCAN WILL
	BLT	T1,PTHSPC+.FXLEN-1	;[470] FILL IT IN
NOZAP:	TXZ	F,R.EOL		;CLEAR END-OF-SWITCH-LINE BIT
	MOVE	T1,[XWD LOGBLN,LOGBLK]	;[442] POINTER TO SWITCH TABLE
	TLNN	F,FL.WLD	;[442] FUNNY PPN'S GET NO SWITCH.INI
	PUSHJ	P,.OSCAN##	;[442] READ SWITCH.INI
	MOVE	T1,ENTRY+NM1WRD	;[442] GET USER NAME
	MOVE	T2,ENTRY+NM2WRD	;[442] FROM ACCT.SYS
	MOVE	T3,U.NAME	;[442] GET NAME FROM SWITCHES
	AOSN	T3		;[442] NAME GIVEN IN SWITCH?
	  JRST	ACCT3		;[442] NO - USE ACCT.SYS VALUE
	MOVE	T1,U.NAME	;[442] YES - PICK UP NAME
	MOVE	T2,U.NAME+1	;[442] FROM SWITCHES
ACCT3:	MOVEM	T1,NAME		;[442] STORE NAME AWAY
	MOVEM	T2,NAME2	;[442] FOR LOGIN UUO
	SKIPE	U.PATH+.FXDIR+2	;[457] WERE SFD'S TYPED WITHOUT /PATH?
	  JRST	NOBLT		;[457] YES - USE THEM
	CAME	PP,U.PATH+.FXDIR ;[506] IS PATH PPN .NE. LOGGED-IN PPN?
	  JRST	NOBLT		;[506] YES - USE IT
	MOVE	T1,[PTHSPC,,U.PATH]	;[457] NO - BLT IN THE PATH SPEC
	BLT	T1,U.PATH+.FXLEN-1	;[457] TYPED IN THE /PATH SWITCH
NOBLT:	JRST	LAST



ACCTA:	MOVE	T1,MYTTY	;[351] TTY LINE NAME
	TLNE	T1,-1		;[421] DO WE HAVE A LINE?
	  JRST	ACCTA1		;[421] YES -- NOT DETACHED
	MOVNI	T1,2		;DET BECOMES -2
	JRST	ACCTA4
ACCTA1:	HRLZ	T4,T1		;D=LINE NUMBER
	JUMPE	T4,ACCTA3	;JUMP IF CTY
	MOVE	T3,[POINT 6,T4]
	SETZ	T1,
ACCTA2:	ILDB	T2,T3		;GET NEXT CHAR OF LINE NUMBER
	JUMPE	T2,ACCTA4	;JUMP IF NO MORE CHARS
	IMULI	T1,10		;CONVERT TO BINARY
	ADDI	T1,-20(T2)	;FROM OCTAL SIXBIT
	JRST	ACCTA2
ACCTA3:	SETO	T1,		;CTY BECOMES -1
ACCTA4:	LSH	T1,6		;SHIFT LEFT 6 BITS
	ANDI	T1,777700	;JUST 12 BITS
	TLNN	F,FL.ATT	;SKIP IF ATTACH, NOT IF LOGIN
	JRST	ACCTA5		;LOGIN
	IOR	T1,FCTAHD	;ATTACH HEADER
	MOVE	T2,ATTJOB	;TARGET JOB
	JRST	ACCTA6		;GO STORE THEM
ACCTA5:	IOR	T1,FCTHED	;LOGIN HEADER
	MOVE	T2,THSJOB	;GET JOB NUMBER
ACCTA6:	MOVEM	T1,FCTDAT	;PUT IN ENTRY
	DPB	T2,[POINT 9,FCTDAT,17]
	MOVE	T1,PPN
	MOVEM	T1,FCTDAT+1	;PROJ PROG NO. TO FACT ENTRY
	MOVSI	T1,(1B8)	;TURN ON BIT IN TYPE CODE
	IORM	T1,FCTDAT	; ..
	PUSHJ	P,.GTNOW##	;GET TODAYS DATE
	MOVEM	T1,FCTDAT+2	;STORE IN FACT FILE ENTRY

	POPJ	P,		;RETURN TO WRITE IT

> ;END FACTSW


	IFN	NCRYPT,<	;[557] IF ENCRYPTING PSWDS

;ROUTINE TO HASH-CODE THE PASSWORD FOR GREATER SECURITY
;HASHING FUNCTION IS NON-INVERTIBLE
;CALL:	MOVE	P1,[PASSWORD]
;	PUSHJ	P,ENCODE##
;	RETURN HERE WITH HASHED PASSWORD IN P1

ENCODE:	MOVE	T2,P1		;GET PSWD IN T2
	MOVE	T1,T2		;AND T2
	HRRZ	T4,PPN		;GET PROGRAMMER NUMBER
	IDIVI	T2,(T4)		;DIVIDE INTO PASSWORD
	MOVM	T3,T3		;GET ABS(REMAINDER)
	MOVE	T4,T3		;COPY FOR A LOOP COUNTER
FOO:	MUL	T1,T1		;SQUARE THE PASSWORD
	ROTC	T1,^D18		;GET MIDDLE 36 BITS OF RESULT
	JUMPN	T1,.+2		;MAKE SURE NON-ZERO
	MOVE	T1,T2		;IF ZERO, PICK UP PSWD AGAIN
	SOJG	T4,FOO		;DO THIS A LARGE (RANDOM) NO. OF TIMES
	XOR	T1,P1		;MUNGE IT STILL MORE
	IDIVI	T3,^D35		;DIVIDE LOOP COUNTER
	ROT	T1,1(T4)	;ROTATE T1 BY REMAINDER
	MOVE	P1,T1		;COPY FINAL RESULT BACK TO P1
	POPJ	P,		;ALL DONE!
	>			;[557] END IFN NCRYPT
	PRGEND
	TITLE	LGNDSK - Directory logic for LOGIN

	SEARCH	C,SCNMAC,LGNUNV
	LGNDCL

	SUBTTL	Turn on echo, diddle some bits

;HERE IF ALL TYPEINS NEEDED TO LOGIN ARE VALIDATED

PSWOK:	TLNE	F,FL.FDX	;SKIP IF HALF DUPLEX
	SETSTS	TTY,0
	OUTPUT	TTY,		;CLEMENTS SAYS THIS WILL BRING BACK ECHOING
	TLNE	F,FL.ATT	;ENOUGH IF ATTACH
	JRST	ACCT		;DONT NEED TO SET UP UFD'S, ETC.
	MOVE	T1,ENTRY+PRVWRD	;AND PRIV WD
	MOVEM	T1,PRIVWD	;STORE PRIV WORD
	MOVE	T1,ENTRY+CRGWRD
	MOVEM	T1,CHGNO	;CHARGE NUMBER
	CLOSE	UFD,0		;NOW CLEAR SOME IO
	SETZB	T3,RDHED	;..
	SUBTTL	Build scheduler table

	MSTIME	T1,
	TRZ	T1,7B20		;CLEAR A DIGIT
	TRO	T1,1B18		;SET FIRST DIGIT TO 4
	TLNE	F,FL.WLD	;WILD CARD?
CHKWLD:	HRRM	T1,PPN		;YES--STORE FUNNY PPN
	MOVE	T1,PPN		;PPN
	MOVEM	T1,.MYPPN##	;TELL SCAN NEW PPN
	CHGPPN	T1,		;CHANGE TO OUR PPN NOW
	  JRST	NOTHER		;NOT IMPLEMENTED
	GETPPN	T1,		;DONT CARE ABOUT OTHER USERS,
	  JRST	NOTHER		;BUT WOULD TELL IF OTHERS SAME PPN
	TLNE	F,FL.WLD	;IS THIS SUPPOSED TO BE UNIQUE?
	AOJA	T1,CHKWLD	;YES, TRY ANOTHER
	INFO	JSP,<Other jobs same PPN>
	  CAI			;[440] NON-JFCL NO-OP
	MOVE	T1,PPN		;[445] GET PPN
	CAMN	T1,ALPPPN	;[445] IS IT [1,2]?
	  JRST	ALLDON		;[445] YES - SKIP THIS STUFF
	MOVEI	M,[ASCIZ /:/]	;[445] PRINT A COLON
	PUSHJ	P,MSG		;[445] ..
	MOVX	T1,%NSHJB	;[501] GET HGHJOB
	GETTAB	T1,		;[440] WITH A GETTAB
	  JRST	ALLDON		;[440] NOT LIKELY, BUT . .
	MOVN	T1,T1		;[440] NEGATE IT
	HRLZ	P2,T1		;[440] MAKE P2 AN AOBJN POINTER
	AOS	P2		;[440] DON'T BOTHER WITH THE NULL JOB
JOBLUP:	HRRI	T1,.GTPPN	;[440] CODE FOR JBTPPN TABLE
	HRL	T1,P2		;[440] GET JOB NUMBER TO TRY
	GETTAB	T1,		;[440] GET HIS PPN
	  SETZ	T1,		;[440] AGAIN NOT LIKELY, BUT
	CAME	T1,PPN		;[440] IS HE UNDER THIS GUY'S PPN?
	  JRST	LUPER		;[440] NO - KEEP LOOKING
	HRRZ	T2,P2		;[440] GET JOB NUMBER
	CAMN	T2,THSJOB	;[440] THIS JOB?
	  JRST	LUPER		;[440] YES - HE KNOWS ABOUT THIS ONE
	TRON	F,R.COMA	;[440] COMMA TYPED YET?
	  JRST	.+3		;[440] NO - DON'T TYPE ONE
	MOVEI	M,[ASCIZ /,/]	;[440] TYPE A COMMA
	PUSHJ	P,MSG		;[440] ..
	HRRZ	T1,P2		;[440] GET JOB NUMBER
	PUSHJ	P,.TDECW##	;[440] LET SCAN DO THE TYPING
LUPER:	AOBJN	P2,JOBLUP	;[440] KEEP CHECKING

ALLDON:	MOVEI	M,[ASCIZ /]/]	;[440] PRINT CLOSING BRACKET
	PUSHJ	P,MSG		;[440] ..
	PUSHJ	P,NEWLIN	;[440] DO CRLF



NOTHER:	SKIPL	EQACT		;[425] 6.02-STYLE ACCT.SYS?
	JRST	CHECK1		;[425] NO
	MOVE	T1,STATS2	;[425] GET 2ND STATES WORD
	TXNN	T1,ST%NCS	;[632] SKIP THIS IF 6.03 SCHEDULAR IN NEW CLASS MODE
	TXNN	T1,ST%SCD	;[425] DOES MONITOR HAVE SCHED. UUO?
	JRST	CHECK1		;[425] NO -- DON'T WASTE TIME HERE
	PUSHJ	P,CLRRIB	;[540] CLEAR LOOKUP BLOCK
	MOVEI	T1,.RBTIM	;[540] GET ARGUMENT COUNT
	MOVEM	T1,SECBUF+.RBCNT;[540] STUFF IT
	MOVE	T1,[SIXBIT .SCDMAP.]
	MOVEM	T1,SECBUF+.RBNAM;[540] STUFF INTO LOOKUP BLOCK
	MOVSI	T1,(SIXBIT .SYS.)
	MOVEM	T1,SECBUF+.RBEXT;[540]
	MOVE	T1,SYSPPN	;[540] GET A GOOD PPN
	MOVEM	T1,SECBUF+.RBPPN;[540] AND USE IT
	SETZM	RDHED		;[425] FORCE FIRST READ TO INPUT
	LOOKUP	UFD,SECBUF	;[425] IS IT THERE?
	  JRST	[WARN CFS,<Can't find SCDMAP.SYS.  Please call the operator.>
		  JFCL
		JRST	NSCHED]	;[425] CAN'T GET AT SCDMAP.SYS
	SKIPE	SCDBLT		;[540] HAS TABLE BEEN BUILT YET?
	  JRST	BILDIT		;[540] NO - BUILD IT
	MOVE	T1,SECBUF+.RBTIM;[540] YES - SEE WHEN SCDMAP WAS CREATED
	CAMN	T1,W.SCED	;[540] SAME ONE?
	  JRST	CHECK1		;[540] YES - USE CURRENT TABLE
BILDIT:	SKIPL	BLDSCD		;[540] IS BUILD IN PROGRESS?
	  JRST	BUILD		;[556] NO - BUILD IT NOW
	PUSHJ	P,ZZZZ		;[540] YES - TAKE A NAP
	  JRST	CHECK1		;[540] TABLE BUILT BY SOMEONE ELSE

BUILD:	MOVE	T2,DACCL	;[556] GET SIZE OF ACCT.SYS
	LSH	T2,1		;[425] DOUBLE IT BECAUSE 2 TABLES
	ADD	T2,PDACC	;[425] ADD BASE ADDRESS OF TABLES
	ADDI	T2,SCDSIZ	;[425] ADD SIZE OF SCHED. TABLE
	HRRZ	T1,.JBHRL	;[425] GET HIGHEST ADR IN HI SEG
	CAMG	T2,T1		;[425] ENOUGH ROOM?
	  JRST	ENUF		;[425] YES -- PLOW ON
	HRLZ	T1,T2		;[425] NO -- SET UP TO EXPAND HI SEG
	CORE	T1,		;[425] GET BIGGER
	  JRST	LGNCUF		;[516] CORE UUO FAILED
ENUF:	PUSHJ	P,LOK		;[444] WRITE-ENABLE HI SEG, LOCK OUT CTRL-C
	SUBI	T2,SCDSIZ	;[425] MAKE BASE ADDRESS OF TABLE
	MOVEM	T2,SCDTBL	;[425] SAVE ADDR OF SCHED CLASS TABLE
	HRLI	T2,-SCDSIZ	;[425] MAKE AN AOBJN POINTER
	SETOM	BLDSCD		;[425] FLAG BUILD IN PROGRESS

SCDLUP:	PUSHJ	P,RDUFD		;[425] GET A WORD
	  JRST	[WARN PEF,<Premature EOF reading SCDMAP.SYS.  Please call the operator.>
		  JFCL
		JRST	RSCHED]	;[425] 
	MOVEM	WD,(T2)		;[425] STORE WORD IN TABLE
	AOBJN	T2,SCDLUP	;[425] AND GO AGAIN

	SETZM	BLDSCD		;[425] FLAG BUILD NOT IN PROGRESS
	SETZM	SCDBLT		;[425] FLAG TABLE BUILT
	CLOSE	UFD,0		;[425] ALL DONE
	MOVE	T1,SECBUF+.RBTIM;[540] GET CREATION DATE-TIME OF SCDMAP
	MOVEM	T1,W.SCED	;[540] SAVE IN HI-SEG
	PUSHJ	P,UNLOCK	;[444] UNLOCK THIS CODE
	JRST	CHECK1		;[425] GO DO AUXACC.SYS STUFF

RSCHED:	CLOSE	UFD,0
	SETZM	BLDSCD		;[425] FLAG BUILD NOT IN PROGRESS
	SETOM	SCDBLT		;[425] FLAG TABLE NOT BUILT
	PUSHJ	P,UNLOCK	;[444] UNLOCK THIS CODE
NSCHED:	MOVX	T1,ST%SCD	;[516] SOMETHING BROKE SO PRETEND
	ANDCAM	T1,STATS2	;[425] NO SCHED. UUO
	JRST	CHECK1		;[425] MOVE ON

ZZZZ:	MOVEI	T1,^D60		;[425] WAIT ONE MIN. THEN REBUILD
	SKIPL	SCDBLT		;[433] TABLE BUILT YET?
	POPJ	P,		;[425] YES -- NON-SKIP RETURN
	MOVEI	T2,1		;[425] SLEEP ONE SECOND
	SLEEP	T2,
	SOJG	T1,ZZZZ+1	;[425] WAIT ONE MINUTE
	AOS	(P)		;[425] THEN SKIP RETURN TO 
	POPJ	P,		;[425] REBUILD TABLE

	SUBTTL	Search AUXACC.SYS

CHECK1:	IFN FTTASK,<		;[436] CALL EXTERNAL MODULE TO ASK FOR
	PUSHJ	P,TSKCHK##	;[436] AND VALIDATE TASK DATA
	  JRST	TRYAGN		;[436] ERROR RETURN - TRY AGAIN
	>			;[436] END OF IFN FTTASK

	PUSHJ	P,CLRRIB	;[540] CLEAR LOOKUP BLOCK
	MOVEI	T1,.RBTIM	;[540] GET ARG COUNT
	MOVEM	T1,SECBUF+.RBCNT;[540] SALT AWAY
	MOVE	T1,[SIXBIT .AUXACC.]
	MOVEM	T1,SECBUF+.RBNAM;[540] SET UP NAME
	MOVSI	T1,(SIXBIT .SYS.)
	MOVEM	T1,SECBUF+.RBEXT;[540] AND EXTENSION
	MOVE	T1,SYSPPN	;[540] GET SYS: PPN
	MOVEM	T1,SECBUF+.RBPPN;[540] ..
	SETZM	RDHED		;[540]
	LOOKUP	UFD,SECBUF	;[540] LOOK FOR AUXACC.SYS
	  JRST	NOAUXA		;NOPE
	TLZ	F,FL.ACC	;NOTE READING AUXACC.SYS NOW
IFN	FASTLG,<
	SKIPN	DAUXFL		;[540] AUX TABLE BUILT YET?
	  JRST	BLDAUX		;[540] NO - BUILD IT NOW
	MOVE	T1,SECBUF+.RBTIM;[540] CREATION DATE-TIME OF AUXACC
	CAMN	T1,W.AUX	;[540] CHANGED SINCE LAST TIME?
	  JRST	LUKAUX		;[540] NO - WE'RE ALL SET
>;END FASTLG COND
BLDAUX:	PUSHJ	P,RDUFD		;[540] READ 1ST WORD, CONTAINS FORMAT VERSION NUMBER
	  JRST	NOAUXA		;NOT THERE?
	HLRZ	WD,WD		;[403] WD=FORMAT VERSION NUMBER
	CAIN	WD,AC1FOR
	  JRST	AXFMOK
	STOP	BFA,<Bad format in AUXACC.SYS.  Please call the operator.>
	  JFCL
AXFMOK:	IFE	FASTLG,<
	HLRE	T1,T4
	JUMPGE	T1,.+2		;IF +, NO OF BLOCKS, ELSE WORDS
	IDIV	T1,[-^D128]	;APPROXIMATION OF POSITION IN FILE BASED
	IMUL	T1,ACCKNT	;ON POSITION OF USER IN ACCT.SYS
	IDIV	T1,ACCTLN	;BLOCKS READ IN ACCT*LENGTH AUXACC/LENGTH ACCT
	SKIPN	T1
	MOVEI	T1,1		;A MUST BE AT LEAST 1
	CAIN	T1,1
	JRST	ACC1A
	SETZM	RDHED		;IF NOT 1ST BLOCK, FORCE NEW INPUT
	>			;[556] END OF IFE FASTLG
	IFN	FASTLG,<
	PUSHJ	P,LOK		;[444] LOCK OUT OTHER MODIFIERS
	MOVE	T1,ACCKNT	;ACCT.SYS POSITIION
	MOVEM	T1,SAVKNT	;PROTECT TEMPORARILY
	SETZM	ACCKNT
	TLO	F,FL.ACC	;LIES: IT ENABLES COUNTING ON AUXACC
	MOVN	T1,DACCL	;LENGTH OF ACCT.SYS
	HRLZ	T1,T1		;[403] FOR AOBJN
	ADD	T1,PDACC	;[403] SETUP POINTER
	MOVE	T2,DACCL	;[403] FOR AUXACC.SYS TABLE
	HRLI	T2,T1		;INDIRECT POINTER TO DACC+DACCL 
				;INDEXED BY A
;STILL IN FASTLG COND
AUXSCN:	PUSHJ	P,RDUFD
	  JRST	AUXEND		;END OF FILE
	AOJN	WD,AUXSCN	;SCAN FOR -1 (BEGIN OF ENTRY FLAG)
	PUSHJ	P,RDUFD		;GET AND IGNORE ENTRY LENGTH
	  JRST	AUXEND
	PUSHJ	P,RDUFD		;GET PPN
	  JRST	AUXEND
AUXSC1:	CAMGE	WD,0(T1)	;[403] IS THIS PPN .GE. THAT IN DACC TABLE?
	JRST	AUXSCN		;NO, GO GET NEXT
	MOVE	T3,ACCKNT	;[403] PICK UP CURRENT BLOCK NO
	MOVEM	T3,@T2		;[403] STORE IN FREE TABLE LOCATION
	AOBJN	T1,AUXSC1	;[403] GO FOR MORE IF ROOM
AUXDUN:	TLZ	F,FL.ACC	;DISABLE BLOCK COUNTING
	MOVE	T1,SAVKNT	;GET POINTER INTO ACCT.SYS
	MOVEM	T1,ACCKNT	;RESTORE COUNTER
	SETOM	DAUXFL		;INDICATE TABLE OK
	MOVE	T1,SECBUF+.RBTIM;[540] GET CREATION DATE-TIME OF AUXACC
	MOVEM	T1,W.AUX	;[540] SAVE IN HI SEG
	PUSHJ	P,UNLOCK	;[444] UNLOCK THE HI SEG
LUKAUX:	MOVE	T1,ACCKNT	;WHERE WERE WE IN ACCT.SYS?
	ADD	T1,DACCL	;CORRECT ADDRESS IN AUX TABLE
	ADD	T1,PDACC	;POINT INTO TABLE
	MOVE	T1,0(T1)	;PICK UP AUX BLOCK
	AOJLE	T1,LGNHMU	;[511] SHOULDN'T NEVAH BE NEG
	>			;[556] END IFN FASTLG
ACC1E:	USETI	UFD,(T1)
	SETZM	RDHED		;FORCE READ OF THAT BLOCK
ACC1A:	PUSHJ	P,RDUFD		;NOW TRY TO FIND START OF ENTRY
	  JRST	BACKUP		;TOO FAR, BACK UP 1
	AOJN	WD,ACC1A	;ALL ONES (-1) STARTS ENTRY
	PUSHJ	P,RDUFD		;READ LENGTH OF ENTRY
	  JRST	BACKUP
	MOVNI	P2,-1(WD)
	PUSHJ	P,RDUFD		;READ PPN
	  JRST	BACKUP
	CAMLE	WD,PPN		;PASSED USER?
	JRST	BACKUP		;YES, BACK UP 1 BLOCK
ACC1F:	CAME	WD,PPN		;THIS USER?
	JRST	SKACC1		;NO, READ FORWARD TO FIND HIM
ACC1G:	JUMPGE	P2,NOSTR	;JUMP IF NO STR'S FOR THIS USER
	MOVEM	P2+1,SAVERG	;SAVE RANDOM REGISTER
	IDIVI	P2,AC1BLK	;DIVIDE BY SIZE OF EACH BLOCK IN ENTRY
	MOVE	P2+1,SAVERG	;RESTORE REG WIPED BY DIVIDE
	TRZ	F,R.ACRE!R.ASTR	;CLEAR ANY CREATE AND ANY STR FLAGS
ACC1B:	PUSHJ	P,RDUFD		;READ NEXT FILE STRUCTURE NAME
	  JRST	ACC1J
	MOVE	M,WD		;M=STR NAME FOR UFDSET
	PUSHJ	P,RDUFD		;RESERVED QUOTA
	  JRST	ACC1J
	MOVE	T2,WD		;T2=RESERVED QUOTA FOR UFDSET
	PUSHJ	P,RDUFD		;FIRST COME, FIRST SERVED QUOTA
	  JRST	ACC1J
	MOVE	T3,WD		;T3=FCFS QUOTA FOR UFDSET
	PUSHJ	P,RDUFD		;LOGGED-OUT QUOTA
	  JRST	ACC1J
	MOVE	T4,WD		;D=LOGGED OUT QUOTA FOR UFDSET
	PUSHJ	P,RDUFD		;BITS ABOUT FILE STRUCTURE
	  JRST	ACC1J
	MOVE	T1,[XWD 1,M]
	DSKCHR	T1,		;SEE IF STR IS IN SYSTEM
	  JRST	ACC1H		;NO, DO NOT PUT IN SEARCH LIST
	TXNE	T1,DC.SAF	;SKIP IF NOT SINGLE ACCESS
	JRST	ACC1H		;CANT BE FOR US YET SO DONT INCLUDE THIS STR
	TLZ	F,L.WRTL+L.NCR
	TXNE	WD,DF.SWL	;SKIP IF NOT READ ONLY
	TLO	F,L.WRTL
	TXNE	WD,DF.SNC	;NO SKIP IF NO CREATE
	TLO	F,L.NCR
	TLNN	F,L.WRTL!L.NCR	;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
	  JRST	.+2		;DIDN'T MAKE IT
	TRO	F,R.ASTR	;DID-SET SOME-STR FLAG
	TLZ	F,FL.ATT	;CLEAR ATTACH FLAG
	MOVSI	T1,RP.BDA+RP.BFA+RP.CRH+RP.FRE+RP.FWE+RP.FCE
	TDNN	T1,SRCBUF+.RBSTS	;SKIP IF ERRORS
	JRST	ACC1H		;NONE TODAY THANK YOU
	WARN	FEE,< >
	  JRST	ACC1H
	MOVE	T1,UFDFSN	;FILE STRUCTURE NUMBER
	PUSHJ	P,.TSIXN##	;PRINT IT OUT
	MOVEI	M,[ASCIZ . file errors exist
.]
	PUSHJ	P,MSG
ACC1H:	AOJL	P2,ACC1B	;LOOP FOR ALL STRS IN ENTRY
	TRZN	F,R.ASTR	;[613] ARE ANY STR'S DEFINED IN SEARCH LIST?
	JRST	NOSTR		;NO, WARN SO
	TRNE	F,R.ACRE	;ARE ANY CREATES ALLOWED?
	JRST	ACCT
	WARN	NCR,<Search list does not allow creates>
	  JFCL
	JRST	ACCT
NOSTR:	WARN	SLE,<Search list is empty>
	  JFCL
	JRST	ACCT
ACC1J:	STOP	XRE,<Format or read error in AUXACC.SYS.  Please call the operator.>

;[516] WARNING -- THE FOLLOWING TWO ERROR MACROS ARE REFERENCED
;[516] BY THE LABELS GENERATED BY THE ERROR MACROS AND NOT
;[516] BY FLOWING INTO THEM.

	STOP	CUF,<CORE UUO failed.  Please call the operator.>

	STOP	HMU,<High segment messed up.  Please call the operator.>

IFN	FASTLG,<
AUXEND:	MOVE	WD,ACCKNT	;AT END OF FILE, FORCE LAST BLOCK
	MOVEM	WD,@T2
	JRST	AUXDUN		;AND PROCEED>
BACKUP:	SOJE	T1,SKACC2	;BACK UP BLOCK COUNTER AND STOP READING IF BEGINNING
	JRST	ACC1E		;READ NEXT PREVIOUS BLOCK IN UFD

SKACC1:	PUSHJ	P,RDUFD		;SKIP FORWARD TO USER
	  JRST	NOINAU		;EOF - NOT THERE
	AOJN	WD,SKACC1	;SEARCH FOR -1 FLAG--START OF ENTRY
	PUSHJ	P,RDUFD		;READ NUMBER OF WORDS THAT FOLLOW
	  JRST	NOINAU
	MOVNI	P2,-1(WD)	;-LENGTH - USED AT ACC1G
	PUSHJ	P,RDUFD		;READ PPN
	  JRST	NOINAU
	CAMG	WD,PPN		;PAST USER?
	JRST	ACC1F		;NO - KEEP LOOKING FOR HIM
SKACC2:	HLLO	T3,PPN		;T3=PROJ,-1=DEFAULT
	CAMLE	WD,T3		;PAST DEFAULT?
	JRST	NOINAU		;YES - NOT THERE
	CAMN	WD,T3		;AT DEFAULT?
	JRST	ACC1G		;YES - USE THIS
	HRLZ	T2,PPN		;PROG NO TO T2 LEFT
	JUMPGE	T2,ACC1F	;KEEP LOOKING UNLESS WILD PROG NO
	HRRI	T3,UNIPRG	;COMPARE AGAINST WILD CARD
	CAME	WD,T3		;ONE OF THOSE?
	JRST	ACC1F		;KEEP LOOKING
	JRST	ACC1G		;GOT IT


NOAUXA:	TLNE	F,L.OPR!L.SOPR	;[577] OPR OR SON-OF-OPR?
	  JRST	NOAUX1		;[577] YES - LET HIM IN ANYWAY
	STOP	CRA,<Can not read AUXACC.SYS>
NOAUX1:	WARN	CRX,<Can not read AUXACC.SYS>
	  JFCL
	JRST	NOSTR		;[577] TELL HIM NO S.L.
NOINAU:	WARN	NXE,<No entry in AUXACC.SYS>
	  JFCL
	JRST	ACCT
	SUBTTL	Subroutine to set up a UFD

;SUBROUTINE TO SET UP A UFD FOR USE  
;ARGS:	T2=RESERVED QUOTA
;	T3=FIRST COME FIRST SERVED QUOTA
;	T4=LOGGED OUT QUOTA
;	M=NAME OF STR
;	IO=ADDRESS OF ROUTINE TO TYPE A CHAR
;	CH=ACCUMULATOR TO CONTAIN CHAR TO BE TYPED
;	F=FLAG REGISTER
;	  L.WRTL=BIT IN LH OF F = 1 IF USER REQUESTS WRITE LOCK
;	  L.NCR=BIT IN LH F = 1 IF USER REQUESTS NO CREATE SET
;	  L.SIN=BIT IN LH F = 1 IF SINGLE ACCESS REQUESTED
;	  L.FRE1=AVAILABLE BIT IN LH OF F
;	  L.FRE2=AVAILABLE BIT IN LH OF F
;	P=PUSH DOWN LIST POINTER
;
;IF T4=-1 ASSUME NO UFD DESIRED - PERFORM OTHER OPERATIONS
;
;	USR=FREE I/O CHANNEL
;	US1=FREE I/O CHANNEL
;
;CALL	PUSHJ	P,UFDSET
;ERROR	DONT PROCEED (MESSAGE TYPED)
;OK	STR IS IN SEARCH LIST (WARNING MAY BE TYPED)
;
;ASSUMES SYMBOLS FOR AC'S ABOVE DEFINED, LOCATIONS .POPJ, .POPJ1 DEFINED
;
;USES U AND UU MACROS TO RESERVE STORAGE FOR EITHER HIGH OR LOW
;SEGMENT OPERATION.
;
;ROUTINES DEFINED HERE:
;
;MSG:	 TYPES STRING OF ASCII CHARS TO FIRST NULL
;SIXMSG:	 TYPES CONTENTS OF M AS SIXBIT CHARS
;CRLF:	 TYPES CARRIAGE RETURN LINE FEED
;OCTPRT: TYPES CONTENTS OF N AS OCTAL NUMBER
;MPOPJ:	 POP P,M FOLLWED BY POPJ P,
;R.USR:	 READS NEXT WORD FROM CHANNEL USR INTO A (BUFFER HEADER RH.USR, BUFFER B.USR)
;ADDSTR: ADD FILE STRUCTURE TO SEARCH LIST
;DISSTR: DELETE FILE STRUCTURE FROM SEARCH LIST

MNTSUB==1		;DECLARE IN CASE DISMOUNT SUBROUTINE ALSO APPEARS
UFDGIL==^D180		;[514] TIMES TO TRY TO GET UFD INTERLOCK
UFDALC==0		;BLOCKS TO ALLOCATE FOR UFDS (0=STANDARD)
RACEY==2		;VALUE OF LEVEL D FIELD IN STATES WORD FOR MONITORS
			;WHICH INCLUDE RACE CONDITION IMPROVEMENTS
RESRVD==0		;NON ZERO WHEN RESERVED QUOTA IMPLEMENTED
	DEFINE	UFDSEM(PREFIX,TEXT),<
	XLIST
LGN'PREFIX:	MOVEI	M,[ASCIZ "LGN'PREFIX TEXT for "]
	PJRST	UFDSMP
	LIST
	SALL
>
	EXTERN	.JBFF

UFDSET:	TXZ	F,R.UIB!R.UIBM	;[514] CLEAR UFD INTERLOCK FLAGS
	JUMPE	M,.POPJ1	;[572] LEAVE IF BLANK STR NAME
	PUSHJ	P,.SAVE2##	;SAVE P1 AND P2
	MOVEM	M,UFDFSN	;SAVE NAME OF STR
	MOVE	N,T2		;N=RESERVED QUOTA
	MOVE	M,T3		;M=FCFS QUOTA
	MOVE	CH,T4		;CH=LOGGED OUT QUOTA
	MOVEI	P2,UFDGIL	;NUMBER OF TIMES TO TRY FOR UFD INTERLOCK
	TLNE	F,FL.BAT	;[575] BATCH JOB?
	  LSH	P2,1		;[575] YES: DOUBLE OUR PATIENCE
UFDSTA:	MOVEI	T2,.FSULK	;USER-MODE UFD INTERLOCK FUNCTION
	PUSHJ	P,STUFC1	;TEST/SET UFD INTERLOCK
	  JRST	STUFBS		;BUSY, SLEEP AND RETRY
	MOVE	T2,UFDFSN
	MOVEI	T1,.IODMP
	MOVEI	T3,0
	OPEN	USR,T1		;INIT THIS FILE STRUCTURE
	  JRST	UFDSE2		;HOW CAN THIS BE?
	AOJE	CH,UFDOK	;JUMP IF NO UFD OPERATIONS DESIRED
	SUBI	CH,1		;NO, RESTORE LOGGED OUT QUOTA
	PUSHJ	P,SETEXL	;SET UP SRCBUF FOR EXTENDED LOOKUP OF UFD
	SETZB	T3,SRCBUF+4	;CLEAR REST OF LOOKUP BLOCK
	MOVE	T1,[XWD SRCBUF+4,SRCBUF+5]
	BLT	T1,SRCBUF+EXLLEN-1
	SETZ	T2,		;CLEAR FLAG FOR FIRST TRY
UFDERT:	LOOKUP	USR,SRCBUF	;LOOKUP UFD
	  SKIPA	T1,SRCBUF+.RBEXT	;GET ERROR CODE IN A
	JRST	UFDEX		;UFD EXISTS, LOOK AT IT
	TRNE	T1,-1		;SKIP IF NO UFD
	JRST	UFDSE3		;THERE'S SOMETHING WRONG WITH THIS UFD
				;FALL THROUGH TO BUILD UFD
;HERE IF MUST CREATE A UFD

	SETOM	CCWAIT		;DO NOT ALLOW CONTROL-C AFTER WE
				; WRITE A UFD. THAT WOULD LEAVE
				; JUNK ON THE DISK
	JUMPN	T2,UFDENT	;JUMP IF NOT FIRST TIME
	MOVEM	N,SRCBUF+.RBQTR	;STORE RESERVED QUOTA
	MOVEM	M,SRCBUF+.RBQTF	;AND FCFS
	MOVEM	CH,SRCBUF+.RBQTO	;AND LOGGED OUT QUOTA
IFN RESRVD,<ADD	M,N	;LOGGED IN QUOTA=FCFS+RESERVED>
	JUMPE	M,UFDOK		;NO UFD IF LOGGED IN QUOTA = 0
UFDENT:	PUSHJ	P,SETEXL	;SET UP FOR EXTENDED ENTER OF UFD
	MOVE	T1,[EXP RP.LOG+RP.DIR]	;SET DIRECTORY BIT AND LOGGED IN BIT
	MOVEM	T1,SRCBUF+.RBSTS
	MOVEI	T1,UFDALC	;BLOCKS TO ALLOCATE FOR UFD
	MOVEM	T1,SRCBUF+.RBALC
	MOVEI	T2,FBMTRY	;TIMES TO RETRY IF BUSY
	ENTER	USR,SRCBUF	;TRY TO CREATE A UFD
	  JRST	UFDSE1		;IDENTIFY ENTER FAILURE
	USETO	USR,2		;WRITES BLOCK 1 WITH ZEROS
	CLOSE	USR,		;AN EMPTY UFD
	SKIPN	UFDDAT		;IF UFD DATE UNSPECIFIED,
	AOS	UFDDAT		;MAKE IT NON-ZERO FOR DAYMES
	JRST	UFDOK		;ALL SET
;HERE IF UFD ALREADY EXISTS

UFDEX:	TLNE	F,FL.WLD
	JRST	RETRYA
	MOVEM	N,SRCBUF+.RBQTR	;STORE RESERVED QUOTA
	MOVEM	M,SRCBUF+.RBQTF	;AND FCFS
	MOVEM	CH,SRCBUF+.RBQTO	;AND LOGGED OUT QUOTA
;***NOTE: THE QUOTAS IN M AND CH ARE USED AT UFDEXB
	MOVE	T1,SRCBUF+.RBSTS	;LOOK AT STATUS
	TRNE	T1,RP.NDL	;IS THIS UN-DELETABLE?
	JRST	[SETOM UFDNDL	;SET FLAG FOR LATER
		 JRST  UFDOK]	;GIVE UP ON RECOMP STUFF
	LDB	T1,[POINTR(SRCBUF+.RBPRV,RB.CRD)] ;DATE
	LDB	T2,[POINTR(SRCBUF+.RBPRV,RB.CRT)] ;AND TIME OF UFD
	LDB	T3,[POINTR(SRCBUF+.RBEXT,RB.CRX)] ;REST OF DATE
	LSH	T3,^D12		;SHIFT IT OVER
	IORI	T1,(T3)		;OR INTO RESULT
	CAMGE	T1,UFDDAT	;OLD?
	JRST	UFDEXA		;YES.
	CAME	T1,UFDDAT	;SAME?
	JRST	UFDEXB		;NO. NEW. UPDATE.
	CAMGE	T2,UFDTIM	;SAME DATE. TIME OLD?
	JRST	UFDEXA		;NO.
UFDEXB:	MOVEM	T1,UFDDAT	;STORE NEWEST TIME
	MOVEM	T2,UFDTIM	;AND DATE
UFDEXA:	CAME	M,CH		;LOGGED-IN = LOGGED-OUT?
	JRST	UFDEXC		;NO--SEE IF WE NEED TO RECOMP
	CAME	M,[377777,,777777] ;BOTH INFINITE
	JRST	UFDEXC		;NO--SEE IF WE NEED TO RECOMP
	SKIPE	T1,U.QTA	;PICK UP QUOTA SWITCH -- SKIP IF ALL
	CAMN	T1,UFDFSN	;SKIP IF NOT THIS STR
	JRST	UFDEXC		;HE SAID /QUOTA:STR FOR THIS STR DO IT
	MOVE	T1,SRCBUF+.RBSTS ;TURN ON LOGGED IN BIT
	TXO	T1,RP.LOG	; FOR THIS STR BUT
	JRST	UFDEX2		; DO NOT RECOMP
UFDEXC:	MOVE	T1,SRCBUF+.RBSTS	;STATUS BITS
	TLZ	F,FL.ERR	;CLEAR ERROR-IN-FILES BIT
	TLNE	T1,RP.ERR	;ANY ERROR BITS SET FOR FILES IN THIS UFD?
	TLO	F,FL.ERR	;YES, SET FLAG AND LOOK FOR THEM
	SKIPE	T2,U.QTA	;PICK UP QUOTA SWITCH (SKIP IF ALL)
	CAMN	T2,UFDFSN	;NOT ALL--DO THIS STR?
	  JRST	UFDEX6		;[547] RECOMPUTE THIS STRUCTURE
	CAML	CH,SRCBUF+.RBUSD	;IF USED IS OVER LOGGED-OUT QUOTA,
	SKIPGE	SRCBUF+.RBUSD	;OR THE USED COUNT .LT. 0,
	TXO	T1,RP.LOG	; SIMULATE CRASH/REENTRY
	TXON	T1,RP.LOG	;SKIP IF LOGGED IN BIT ALREADY ON
	JRST	UFDEX2		;NO, GO SET IT AND PROCEED
	TRNE	F,R.DBUG	;[626] DEBUGGING?
	  JRST	UFDEX2		;[626] YES - NEVER RECOMPUTE UNLESS ASKED
	OTHUSR	T2,		;OTHER USERS THIS PPN
	  JRST	[CAMN T2,PPN	;CLAIMED NO SEE IF UUO IN
		 JRST UFDEX6	;UUO EXISTS--NO OTHER USERS
		 JRST .+1]	;DO NOT KNOW
	MOVX	T2,%NSHJB
	GETTAB	T2,
	  MOVEI	T2,100		;ASSUME 64
	MOVNI	T2,-1(T2)
	HRLZS	T2		;LH T2=-NUMBER OF REAL JOBS
UFDEX1:	MOVEI	T1,1(T2)	;T1=NEXT JOB NUMBER
	CAMN	T1,THSJOB	;IS IT THIS ONE?
	JRST	UFDEX4		;YES, DONT BOTHER
	MOVEM	T1,CHRBUF+.DFGJN
	MOVE	T1,UFDFSN
	MOVEM	T1,CHRBUF+.DFGNM	;NAME OF STR
	MOVE	T1,PPN
	MOVEM	T1,CHRBUF+.DFGPP
	MOVEI	T1,CHRBUF
	GOBSTR	T1,		;SEE IF STR IS IN THAT JOB'S SEARCH LIST
	  JRST	UFDEX4		;NOT IN THIS JOBS LIST OR NOT OUR PPN
	JRST	UFDEX5		;OK IS IN SOMEBODY ELSES SEARCH LIST SAME PPN
UFDEX4:	AOBJN	T2,UFDEX1	;LOOP FOR ALL JOBS
;HERE TO LOOKUP ALL FILES AND RECOMPUTE .RBUSD
; ALSO LOOK FOR ANY FILES WITH ERRORS, AND PRINT MESSAGE WHEN FOUND

UFDEX6:	SETZM	WILDBK		;CLEAR WILD FILE LOOKUP SPECIFICATION AREA
	MOVE	T1,[XWD WILDBK,WILDBK+1]
	BLT	T1,WILDBK+.FXLEN-1
	MOVSI	T1,(FX.DIR!FX.PHY!FX.NOM!FX.PRT)	;/OKNONE, DIR SPECIFIED
	MOVEM	T1,WILDBK+.FXMOD	;SETUP MOD WORD
	TLO	T1,(FX.STR)	;NOTE STR SW SET OFF
	MOVEM	T1,WILDBK+.FXMOM	;MOD WORD MASK
	MOVE	T1,PPN	;GET USER'S PPN
	MOVEM	T1,WILDBK+.FXDIR	;THAT'S NOT WILD
	SETOM	WILDBK+.FXDIM
	MOVE	T2,UFDFSN	;FILE STRUCTURE NAME
	MOVEM	T2,WILDBK+.FXDEV	;THAT'S FIXED, TOO
	SETZM	WLDPNT		;WILD INITIALIZE FLAG
	MOVSI	T1,'*  '	;SET UP TO STORE STAR IN
	MOVEM	T1,WILDBK+.FXNAM; FILE NAME
	MOVEM	T1,WILDBK+.FXEXT; EXTENSION
	MOVEM	T1,WILDBK+.FXDIR+2 ; AND 5 SFD'S
	MOVEM	T1,WILDBK+.FXDIR+4 ;  ..
	MOVEM	T1,WILDBK+.FXDIR+6 ;  ..
	MOVEM	T1,WILDBK+.FXDIR+10 ; ..
	MOVEM	T1,WILDBK+.FXDIR+12 ; ..
	SETOM	WILDBK+.FXBFR		;NO /BEFORE
	SETOM	WILDBK+.FXSNC		;NO /SINCE
	SETZB	T1,T3
	MOVEM	T2,CHRBUF	;SAVE STR NAME FOR DSKCHR
	OPEN	US1,T1		;OPEN FILE STRUCTURE
	  JRST	UFDSE2
	SETZM	SRCBUF+.RBQTR	;CLEAR NQC COUNTER
	SETZM	SRCBUF+.RBUSD	;CLEAR USED WORD
	SETOM	RPERCT		;INIT ERROR COUNTER
	MOVE	T1,[XWD .DCUFT+1,CHRBUF]
	DSKCHR	T1,		;GET CURRENT UFBTAL
	  JRST	UFDS9A
	AOSE	RECFLG		;FIRST STR TO RECOMP?
	JRST	LOKALL
	INFO	RDU,<Recomputing disk usage>
	  JFCL
	OUTPUT	TTY,		;[461] THIS MAY TAKE A WHILE, SO SAY
				;[461]  SOMETHING TO KEEP HIM PATIENT
;LOOP OVER ALL FILES ON THIS STR UNDER THIS UFD

LOKALL:	MOVE	T1,[XWD LOKBLN,LOKBLK]
	PUSHJ	P,.LKWLD##	;GET NEXT FILE SETUP FOR LOOKUP
	  JRST	UFDSUM		;THAT IS ALL
	LOOKUP	US1,SECBUF	;LOOKUP FILE
	  JRST	[PUSHJ	P,E.DFL##	;REPORT LOOKUP ERROR
		JRST	LOKALL]	;AND PROCEED
	MOVE	T1,SECBUF+.RBALC	;GET BLOCKS ALLOCATED FOR THIS FILE
	ADDM	T1,SRCBUF+.RBUSD	;COUNT FOR ALL FILES
	MOVE	T4,SECBUF+.RBSTS	;PICK UP STATUS INFO
	TXNE	T4,RP.NQC	;NOT QUOTA CHECKED
	ADDM	T1,SRCBUF+.RBQTR	;YES--COUNT UP 
	TRNN	T4,RP.ERR	;ANY ERROR BITS SET?
	JRST	LOKALL		;NO
	AOSE	RPERCT		;IS THIS THE FIRST ONE WITH ERRORS?
	JRST	NFSTER		;NO
LGNFEA:	MOVEI	M,[ASCIZ /%LGNFEA /]
	PUSHJ	P,MSG
	MOVE	T1,UFDFSN	;YES--GET FILE STRUCTURE NAME
	PUSHJ	P,.TSIXN##	;PRINT IT
	MOVEI	M,[ASCIZ / FILE ERRORS ARE:
/]
	PUSHJ	P,MSG		;PRINT BASIC WARNING

DEFINE	ERRBIT	(BIT,MSG),<
	MOVEI	T1,[ASCIZ /MSG/]
	XLIST
	TRNE	T4,BIT
	PUSHJ	P,ERRFIL
	LIST
	SALL
>

LGNFED:NFSTER:	ERRBIT	RP.BDA,<%LGNFED damage>
LGNFEC:	ERRBIT	RP.CRH,<%LGNFEC close after crash>
LGNFER:	ERRBIT	RP.BFA,<%LGNFER error restoring>
LGNHRE:	ERRBIT	RP.FRE,<%LGNHRE hard read errror>
LGNHWE:	ERRBIT	RP.FWE,<%LGNHWE hard write error>
LGNSDC:	ERRBIT	RP.FCE,<%LGNSDC software detected checksum error>
	JRST	LOKALL

;SUBROUTINE TO REPORT ERROR IN A FILE.
;ARGS: T1=POINTER TO MESSAGE
;MUST PRESERVE T4
;
ERRFIL:	PUSHJ	P,.TSTRG##	;TYPE MESSAGE
	MOVEI	T1,[ASCIZ / IN/];SET UP NOISE WORD
	PUSHJ	P,.TSTRG##	;SEND IT OUT
	PUSH	P,T4		;SAVE T4
	PUSHJ	P,.TFILE##	;TYPE OUT SPEC
	POP	P,T4		;RESTORE T4
	POPJ	P,		;RETURN
;GIVE SUMMARY OF QUOTAS
UFDSUM:	SKIPN	SRCBUF+.RBUSD	;ANY USED?
	JRST	UFDRER		;NO--SKIP MESSAGE
LGNQTA:	MOVEI	T1,[ASCIZ .[LGNQTA .]
	PUSHJ	P,.TSTRG##
	MOVE	T1,UFDFSN
	PUSHJ	P,.TSIXN##
	MOVEI	T1,[ASCIZ . IN:.]
	PUSHJ	P,.TSTRG##
	MOVE	T1,SRCBUF+.RBQTF
	PUSHJ	P,.TDECW##
	MOVEI	T1,[ASCIZ . OUT:.]
	PUSHJ	P,.TSTRG##
	MOVE	T1,SRCBUF+.RBQTO
	PUSHJ	P,.TDECW##
	MOVEI	T1,[ASCIZ . USED:.]
	PUSHJ	P,.TSTRG##
	MOVE	T1,SRCBUF+.RBUSD ;BLOCKS IN USE
	PUSHJ	P,.TDECW##	;PRINT IN DECIMAL
	MOVEI	T1,[ASCIZ .]
.]
	PUSHJ	P,.TSTRG##
;HERE WHEN LOOKED AT ALL FILES UNDER THIS UFD ON THIS STR

UFDRER:	CLOSE	US1,
	OUTPUT	TTY,		;[460] KEEP YOUR PANTS ON, GUY...
	AOSE	RPERCT		;FIND ANY DISK ERRORS?
	JRST	UFDNCE		;ERRS FOUND, DO NOT CLEAR ERROR BITS
	MOVE	T1,[RP.ERR,,RP.ERR]	;BITS TO BE CLEARED
	ANDCAM	T1,SRCBUF+.RBSTS	;ZAP THEM OUT
UFDNCE:	MOVX	T1,RP.LOG		;[515] MAKE SURE RP.LOG GETS SET
	IORM	T1,SRCBUF+.RBSTS	;[515] ..
	SKIPGE	CCTYPED		;[566] CONTROL-C TYPED?
	 ANDCAM	T1,SRCBUF+.RBSTS;[566] YES - CLEAR RP.LOG
	MOVE	T2,CHRBUF+.DCUFT	;PREVIOUS UFBTAL
	CAMN	T2,[XWD 400000,0]	;IF NO PREVIOUS REFERENCES, UFBTAL CHANGED
	JRST	UFDEX3		;SO WE CANT DO ANYTHING ABOUT IT
	MOVE	T1,[XWD .DCUFT+1,CHRBUF]
	DSKCHR	T1,		;GET NEW UFBTAL
	  JRST	UFDS9A
	SUB	T2,CHRBUF+.DCUFT	;OLD-NEW=-DIFFERENCE FREE
	ADDM	T2,SRCBUF+.RBUSD	;=DIFFERENCE ALLOCATED
	JRST	UFDEX3		;ALL SET


UFDEX2:	MOVEM	T1,SRCBUF+.RBSTS	;MAKE SURE LOGGED IN BIT IS ON
UFDEX5:	LDB	T1,[POINTR(STATES,ST%TDS)]	;LEVEL D FIELD IN STATES WORD
	CAIL	T1,RACEY	;IF LESS THAT RACE CONDITION STUFF, DONT
	SETOM	SRCBUF+.RBUSD	;USE MONITOR'S COPY OF UFBTAL TO COMPUTE .RBUSD
UFDEX3:	MOVEI	T2,FBMTRY	;TIMES TO RETRY IF BUSY
	PUSHJ	P,SETEXL	;[613] SET UP SRCBUF FOR EXTENDED RENAME
	MSTIME	T1,
	IDIVI	T1,^D60000	;IN MINUTES
	DATE	T2,
	PUSH	P,T2		;SAVE T2
	DPB	T1,[POINT 11,T2,23]	;PUT IN TIME IN MINUTES
	DPB	T2,[POINT 23,SRCBUF+.RBPRV,35]	;PUT DATE AND TIME IN RIB
	POP	P,T2		;RESTORE DATE
	LSH	T2,-^D12	;SHIFT OFF 12 BITS
	DPB	T2,[POINTR(SRCBUF+.RBEXT,RB.CRX)] ;STORE IN RIB
	SETOM	CCWAIT		;DO NOT ALLOW HIM TO CONTROL-C OUT
				; AFTER WE SET THE LOGGED-IN BIT.
	RENAME	USR,SRCBUF
	  SKIPA	T1,SRCBUF+.RBEXT
	SKIPE	SECBUF		;DID WE RECOMP?
	SETZM	SRCBUF+.RBSTS	;YES--THE WE GAVE ERROR LIST
	JRST	UFDOK
LGNULF:
UFDSE3:	MOVEI	M,[ASCIZ .%LGNULF .]
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ . UFD LOOKUP failure .]
	PUSHJ	P,UFDSER	;TYPE ERROR LINE
	  JRST	UFDERT		;[476] RETRY LOOKUP
	JRST	UFDOK

LGNUEF:
UFDSE1:	MOVEI	M,[ASCIZ .%LGNUEF .]
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ . UFD ENTER failure .]
	PUSHJ	P,UFDSER	;TYPE ERROR LINE
	  JRST	UFDERT		;RETRY ENTER
LGNNUC:	MOVEI	M,[ASCIZ .%LGNNUC No UFD created
.]
	PUSHJ	P,MSG		;TELL POOR USER WE CANT MAKE A UFD
;HERE TO EXIT FROM SUBROUTINE

UFDOK:	PUSHJ	P,ADDSTR	;ADD STR TO JOBS SEARCH LIST

;HERE TO CLEAR UFD INTERLOCK

	PUSHJ	P,STUFCL	;CLEAR UFD INTERLOCK
	JRST	.POPJ1		;ALL DONE

UFDSER:	HRRZS	T1,SRCBUF+.RBEXT	;ERROR CODE
	CAIN	T1,3		;SKIP IF NOT FILE BEING MODIFIED
	SOJG	T2,UFDSR1	;JUMP IF CAN STILL RETRY
	MOVE	T1,UFDFSN	;GET FILE STRUCTURE NAME
	PUSHJ	P,.TSIXN##	;PRINT NAME OF STR
	PUSHJ	P,MSG		;IDENTIFY FAILURE
	HRRZ	T1,SRCBUF+.RBEXT	;ERROR CODE
	PUSHJ	P,.TOCTW##	;PRINT IT IN OCTAL
	PUSHJ	P,.TCRLF##
	JRST	.POPJ1
UFDSR1:	MOVEI	T1,1
	SLEEP	T1,
	POPJ	P,


;[444] ROUTINE TO WRITE-ENABLE HI SEG AND LOCK OUT ANY OTHER JOBS
;[444] WHICH MIGHT TRY TO MODIFY IT.  ALSO LOCKS OUT CONTROL-C
;[444] SO USER CAN'T LEAVE HI SEG IN FUNNY STATE

LOK:	SETOM	CCWAIT		;[444] LOCK OUT CONTROL-C
	SETZ	T1,		;[444] WRITE-ENABLE HI SEG
	SETUWP	T1,		;[444] ..
	  JRST	LGNCUH		;[444] A FATE TOO EVIL TO CONSIDER
	MOVEM	T1,SVPROT	;[444] SAVE OLD HI SEG PROT CODE
	POPJ	P,		;[444] RETURN

;[444] ROUTINE TO UNDO EVERYTHING THE ABOVE ROUTINE DID

UNLOCK:	MOVE	T1,SVPROT	;[444] GET OLD HI SEG PROT CODE
	SETUWP	T1,		;[444] RESTORE IT
	  JRST	LGNCLH		;[444] PRETEND THIS DIDN'T REALLY HAPPEN
	PJRST	CTLCOK##	;[444] GO ENABLE CONTROL-C AGAIN

	STOP	CUH,<Can't unlock high segment.  Please call the operator.>

	STOP	CLH,<Can't lock high segment.  Please call the operator.>
 
;HERE WHEN UFD INTERLOCK IS BUSY - SLEEP AND RETRY

STUFBS:	TLNE	F,FL.WLD
	JRST	RETRYB
	MOVEI	T1,1
	SLEEP	T1,
	CAILE	P2,UFDGIL/3	;[556] WAITING LONG?
	JRST	STUFB1		;NO--JUST SLEEP
	TXOE	F,R.UIBM	;[514] TYPED UIB MESSAGE YET?
	  JRST	STUFB3		;[514] YES - SKIP IT
	PUSH	P,N		;[574] SAVE REGISTERS WIPED
	PUSH	P,M		;[574] BY MESSAGE STUFF
	PUSH	P,CH		;[574] ..
	WARN	UIB,<UFD Interlock busy for >
	  CAI
	MOVE	T1,UFDFSN	;[514] GET F.S. NAME
	PUSHJ	P,.TSIXN##	;[514] TYPE IT
	MOVEI	M,[ASCIZ /.  Wait please . . .
/]
	PUSHJ	P,MSG		;[514] KEEP HIM PATIENT
	OUTPUT	TTY,		;[514] ...
	POP	P,CH		;[574] RESTORE REGISTERS
	POP	P,M		;[574] ..
	POP	P,N

STUFB3:	OTHUSR	T1,		;OTHER USERS SAME PPN
	  PUSHJ	P,STUFCL	;NO. CLEAR INTERLOCK. NOTE: IF
				; OTHUSR IS NOT IMPLEMENTED THEN
				; NEITHER IS THE INTERLOCK.
STUFB1:	SOJG	P2,UFDSTA
	TXOE	F,R.UIB		;[514] IMPATIENT YET?
	  JRST	STUFB2		;[514] YES - GET TOUGH
	MOVEI	P2,UFDGIL	;[514] RESET COUNTDOWN TIMER
	JRST	STUFB1		;[514] IF AT FIRST U DON'T SUCCEED ...

STUFB2:	TLNN	F,FL.BAT	;[575] BATCH JOB?
	  JRST	STUFB4		;[575] NO: ITS OK TO BE TOUGH
	IFN	BATMAX,<	;[575] ONLY BATCON V. 100 AND UP KNOW
				;[575]  ABOUT REQUEUE ERRORS
	REQUE	UBT,<UFD Interlock busy too long.>
	  JFCL
	>			;[575] END IFN BATMAX
	IFE	BATMAX,<	;[575] IF OLD BATCON,
	FATAL	UBT,<UFD Interlock busy too long.>
	  JFCL			;[575] JUST FLUSH THE JOB AWAY
	>			;[575] END IFE BATMAX
STUFB4:
	PUSHJ	P,STUFCL	;[514] THROW THAT CLOWN OFF THE UFD
	JRST	UFDSTA		;[514] PROCEED

UFDSE2:	PUSHJ	P,STUFCL
	UFDSEM	OFF,<OPEN failure>




;SUBROUTINE TO TEST/SET OR CLEAR UFD INTERLOCK
;ENTER AT STUFCL TO CLEAR
;ENTER AT STUFC1 WITH T2=FUNCTION
;RETURN POPJ IF FAILED
;RETURN .POPJ1 IF OK

STUFCL:	PUSHJ	P,STUFC0
	  JFCL
	PJRST	CTLCOK##	;[520] ENABLE CTRL-C
STUFC0:	MOVEI	T2,.FSUCL
STUFC1:	LDB	T1,[POINTR(STATES,ST%TDS)]	;LEVEL D FIELD IN STATES WORD
	CAIGE	T1,RACEY	;SKIP IF INCLUDES RACE CONDITION STUFF
	JRST	.POPJ1		;NO, PRETEND WORKS
	MOVE	T1,[XWD 3,T2]
	MOVE	T3,UFDFSN
	MOVE	T4,PPN
	STRUUO	T1,
	  POPJ	P,
	SETOM	CCWAIT		;[520] LOCK OUT CTRL-C
	PJRST	.POPJ1

;SUBROUTINE TO SET UP HEADER FOR EXTENDED LOOKUP/ENTER/RENAME OF UFD

SETEXL:	MOVEI	T1,EXLLEN-1	;LENGTH OF ARG LIST
	MOVEM	T1,SRCBUF
	MOVE	T1,PPN	;NAME IS USER'S PPN
	MOVEM	T1,SRCBUF+.RBNAM
	MOVSI	T1,(SIXBIT .UFD.)	;EXT IS UFD
	MOVEM	T1,SRCBUF+.RBEXT
	MOVE	T1,MFDPPN	;DIRECTORY IS MFD
	MOVEM	T1,SRCBUF+.RBPPN
	SKIPGE	T1,U.UFDP	;[554] /UFDPROT SPECIFIED?
	  POPJ	P,		;[616] NO - ALL DONE
	ANDI	T1,777		;[554] MASK OUT JUNK
	LSH	T1,^D27		;[554] SLING OVER TO RIGHT PLACE
	MOVEM	T1,SRCBUF+.RBPRV;[554] PUT INTO ENTER BLOCK

	POPJ	P,


;[540] SUBROUTINE TO ZERO EXTENDED LOOKUP BLOCK

CLRRIB:	SETZM	SECBUF		;[540] CLEAR A WORD
	MOVE	T1,[SECBUF,,SECBUF+1]	;[540] 
	BLT	T1,SECBUF+.RBTIM;[540] SPREAD IT AROUND
	POPJ	P,		;[540] ALL DONE!
;THIS ROUTINE ADDS FILE STRUCTURE NAMED IN UFDFSN TO THE
; FILE STRUCTURE SEARCH LIST.

ADDSTR:	PUSHJ	P,.SAVE1##	;SAVE P1
	SETZB	P1,UFDDMF	;SET FLAG TO REMEMBER
	MOVEI	T1,.FSDSL
	MOVEM	T1,UFDMTP	;SET FUNCTION TO DEFINE SEARCH LIST
	SETOB	T2,UFDDMJ	;START JOBSTR WITH -1
	SETOM	UFDDMP		;CLEAR JOB AND PPN SO USES VALUES FOR THIS JOB
	TLZ	F,L.PEND	;BORROW THIS BIT TO MEAN FILE STRUCTURE THERE
MAKSRC:	MOVE	T1,[XWD 3,T2]
	JOBSTR	T1,		;GET USER'S NEXT FILE STRUCTURE
	  JRST	UFDSE8		;SYSTEM PROBLEM
	JUMPE	T2,MAKSR2	;MOUNT STOPS AT FENCE
	AOJE	T2,MAKSR2	;JUMP IF END OF LIST
	SOS	T2
	MOVEM	T2,UFDDMF+1(P1)
	JUMPE	T2,MAKSR1	;DONT DSKCHR THE FENCE
	MOVE	T1,[XWD 1,T2]
	DSKCHR	T1,		;GET CURRENT STATUS OF THIS FILE STRUCTURE
	  JRST	UFDSE9		;CANT FAIL
	MOVE	T2,UFDDMF+1(P1)	;GET BACK FILE STRUCTURE NAME
	CAME	T2,UFDFSN	;AND SEE IF WE ALREADY EXIST
	JRST	MAKSR1		;NO
	TLO	F,L.PEND
	MOVE	T1,T4
	LSH	T1,-4		;ROTATE A TO MATCH UP D.SWL AND L.WRTL
	XOR	T1,F		;COMPARE WRITE LOCK STATES
	TLNN	T1,L.WRTL	;SKIP IF DIFFERENT
	JRST	.POPJ		;NO CHANGE
	TLC	T4,(DF.SWL)
	SETZ	T3,
MAKSR1:	MOVEM	T3,UFDDMF+2(P1)	;SAVE PROJECT,PROGRAMMER NUMBER
	MOVEM	T4,UFDDMF+3(P1)	;SAVE WRITE PROTECT REQUEST
	ADDI	P1,3
	JRST	MAKSRC		;LOOP FOR ALL USER'S FILE STRUCTURES
UFDSE8:	UFDSEM	JUF,<System error - JOBSTR UUO failed>
UFDS9A:	PUSHJ	P,STUFCL
UFDSE9:	UFDSEM	DUF,<System error - DSKCHR UUO failed>

MAKSR2:	TLZE	F,L.PEND
	JRST	MAKSR3		;DONT ADD FILE STRUCTURE 
MAKSRA:	SKIPN	UFDDMF+1(T2)	;T2 STARTS AT 0 FROM ABOVE
	JRST	MAKSRB		;THE FENCE IS A 0
	ADDI	T2,3
	CAIE	T2,(P1)		;IF END, NO FENCE
	JRST	MAKSRA
	JRST	MAKSR4		;OK TO PROCEED
MAKSRB:	MOVE	T3,P1		;IF FENCE, MUST MOVE EVERYTHING DOWN 1 ENTRY
MAKSRL:	CAIG	T2,(T3)		;SKIP IF MORE
	JRST	MAKSR4
	MOVE	T1,UFDDMF(T3)
	MOVEM	T1,UFDDMF+3(T3)
	SOJA	T3,MAKSRL
MAKSR4:	MOVE	T1,UFDFSN
	MOVEM	T1,UFDDMF+1(T2)	;ADD NEW FILE STRUCTURE
	SETZB	T1,UFDDMF+2(T2)
	TLNE	F,L.WRTL
	TXO	T1,DF.SWL	;A SET TO 0 ABOVE
	TLNE	F,L.NCR
	TXO	T1,DF.SNC
	MOVEM	T1,UFDDMF+3(T2)
	ADDI	P1,3
MAKSR3:	MOVEI	T1,UFDMTP
	HRLI	T1,4(P1)	;LENGTH OF ARGUMENT LIST
	STRUUO	T1,
	  JRST	LGNCAS
	POPJ	P,
LGNCAS:	JUMPE	T1,STUFCL	; IF NOT IMPLEMENTED IGNORE ERROR
	PUSH	P,T1		;[466] SAVE ERROR CODE
	MOVEI	M,[ASCIZ "LGNCAS Can not add "]
	PUSHJ	P,UFDSMB
	MOVEI	M,[ASCIZ " to search list -- code="]
	PUSHJ	P,MSG
	PUSHJ	P,STUFCL
	POP	P,T1		;[466] RESTORE ERROR CODE
	PUSHJ	P,.TOCTW##	;PRINT THE ERROR CODE
	PJRST	.TCRLF##		;RETURN

UFDSMB:	PUSH	P,M		;SAVE MESSAGE ADDR
	MOVEI	CH,"?"
	PUSHJ	P,TYO
	TLNN	F,FL.BAT	;IS THIS A BATCH JOB?
	JRST	UFDSMC		;NO
	MOVEI	M,[ASCIZ .(1) .]
	PUSHJ	P,MSG		;PRINT ERROR SEVERITY
UFDSMC:	POP	P,M		;RESTORE TEXT OF MESSAGE
	PUSHJ	P,MSG
	MOVE	T1,UFDFSN	;GET STRUCTURE NAME
	PJRST	.TSIXN##	;PRINT IT


UFDSMP:	PUSHJ	P,UFDSMB
	PJRST	.TCRLF##
RETRYA:	PUSHJ	P,STUFCL
RETRYB:	AOS	PPN
	CLOSE	UFD,
	JRST	CHECK1

;SUBROUTINE TO SLEEP A WHILE OR UNTIL DACCFL IS SET POS

SNOOZE:	MOVE	T2,ACCTLN	; SET SLEEP TIME
	LSH	T2,-3		;   TO FILE LENGTH/8
	CAILE	T2,^D60		;IS SLEEP TIME OVER 60 SECONDS?
	MOVEI	T2,^D60		;YES--CHOP DOWN TO 60
SNOOZ1:	IFN	FASTLG,<
	SKIPLE	DACCFL		;IS DIRECTORY THERE?
	POPJ	P,		;YES, NON-SKIP RETURN
	>			;[556] END IFN FASTLG

	MOVEI	T1,1		;SETUP FOR THE LITTLE SLEEP
	SLEEP	T1,
	SOJG	T2,SNOOZ1	;KEEP YOUR PANTS ON
	AOS	0(P)		;FOR A WHILE, THEN
	POPJ	P,		;RETURN IMPATIENT
MSG:	HRLI	M,(POINT 7,)	;CREATE A BYTE POINTER
MSGL:	ILDB	CH,M		;LOAD UP M
	JUMPE	CH,.POPJ	;RETURN ON NULL
	PUSHJ	P,TYO		;TYPE THE CHAR
	JRST	MSGL
	SUBTTL	Subroutine to create a path

;ARGS:	U.PATH=PATH DESIRED
;	UFDFSN=STR NAME
;CALL WITH:
;	PUSHJ	P,ENTPTH
;	RETURN HERE ALWAYS (PTHBUF SET UP FOR PATH. UUO)

ENTPTH:	PUSHJ	P,.SAVE2##	;SAVE P1 AND P2
	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
	MOVE	T1,U.PATH+.FXDIR;GET 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>		;[573] INIT MAX LOOP CNTR
ENTPTL:	SKIPN	(P2)		;ANOTHER SFD GIVEN?
	POPJ	P,		;NO. DONE
	MOVEI	T1,17		;MODE
	MOVE	T2,UFDFSN	;STR NAME
	SETZM	T3		;NO BUFFERS
	OPEN	USR,T1		;OPEN STR
	  POPJ	P,		;A FATE TOO EVIL TO CONSIDER
	MOVE	T1,(P2)		;GET NAME OF SFD
	MOVSI	T2,'SFD'	;EXTENSION IS SFD
	SKIPGE	T3,U.SFDP	;[550] /SFDPROT SPECIFIED?
	  SETZM	T3		;[550] NO - ASSUME STANDARD
	ANDI	T3,777		;[550] MASK OUT JUNK
	LSH	T3,^D27		;[550] SLING OVER TO LEFT HALF
	MOVEI	T4,PTHBUF	;PATH POINTER
	SETZM	(P1)		;MAKE END OF LIST
	ENTER	USR,T1		;TRY TO ENTER SFD
	  SKIPA			;CAN NOT--SEE WHY
	JRST	ENTPT1		;WE WON.
	HRRZ	T3,T2		;GET ERROR CODE
	CAIE	T3,ERFBM%	;IS FILE BEING MODIFIED?
	CAIN	T3,ERCSD%	;OR DOES IT EXIST YET?
	JRST	ENTPT1		;MODIFIED OR EXITSING -- ALL OK
	PUSH	P,T3		;SAVE T3
	CAIN	T3,ERLVL%	;LEVEL ERROR?
LGNSND:	SKIPA	T1,[[ASCIZ /%LGNSND SFD's nested too deeply(/]]
LGNSEF:	MOVEI	T1,[ASCIZ /%LGNSEF SFD enter failure (/]
	PUSHJ	P,.TSTRG##	;TYPE THE STRING
	POP	P,T1		;RESTORE NUMBER
	PUSHJ	P,.TOCTW##	;TYPE CODE
	MOVEI	T1,[ASCIZ /) /] ;LOAD UP A DELIMITER
	PUSHJ	P,.TSTRG##	;TYPE IT OUT
	MOVE	T1,UFDFSN	;LOAD UP STR NAME
	PUSHJ	P,.TSIXN	;TYPE IT OUT
	MOVEI	T1,":"		;LOAD UP A :
	PUSHJ	P,.TCHAR##	;TYPE IT OUT
	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
	
	MOVE	T1,U.PATH+.FXDIR;GET THE PPN
	PUSHJ	P,.TXWDW##	;TYPE IT OUT
	MOVEI	P2,PTHBUF+.PTPPN+1	;POINT TO SFD LIST
ENTSFE:	MOVE	T1,(P2)		;LOAD UP SFD NAME
	JUMPE	T1,ENTPTX	;ZERO IS END OF LIST
	MOVEI	T1,","		;TYPE A COMMA
	PUSHJ	P,.TCHAR##	; ..
	MOVE	T1,(P2)		;GET SFD NAME
	PUSHJ	P,.TSIXN##	;TYPE THAT OUT
	AOJA	P2,ENTSFE	;LOOP FOR ALL SFD'S
ENTPTX:	MOVEI	T1,"]"		;LOAD UP A SQUARE BRACKET
	PUSHJ	P,.TCHAR##	;TYPE THE SQUARE BRACKET
	PJRST	.TCRLF##	;TYPE A CRLF AND EXIT

ENTPT1:	MOVEM	T1,(P1)		;STORE T1 (SFD NAME FROM ABOVE)
				; SO SFD'S NEST CORRECTLY.
	ADDI	P2,2		;POINT TO NEXT NAME
	CLOSE	USR,0		;[454] CLOSE OUT THE SFD
	AOBJN	P1,ENTPTL	;[573] LOOP OVER THE PATH
;[614] ENTPT1+4			/LC
	POPJ	P,

	PRGEND
	TITLE	LGNSET - Module to set up user profile for LOGIN

	SEARCH	C,SCNMAC,LGNUNV
	LGNDCL

	SUBTTL	Set user profile -- privileged SETUUO's

;ROUTINE TO DO PRIVILEGED SETUUO'S
;ARGS:	U.TIME,U.SPL,U.CORE,U.DFER
;
;CALL WITH:
;	PUSHJ	P,PRVSET
;	RETURN HERE
;
PRVSET:	SKIPGE	T1,U.TIME	;WANT TIME LIMIT SET?
	JRST	PRSET1		;NO--CHECK SPOOL
	HRLI	T1,.STTLM	;YES--SET UP ENTIRE ARGUMENT
	MOVE	T2,['STL',,[ASCIZ .time limit.]]
	PUSHJ	P,SETIT		;DO THE SET UUO
PRSET1:	HRROI	T1,.GTSPL	;[364] GET SPOOL BITS FOR JOB TO SEE
	GETTAB	T1,		;[364] IF SYSTEM HAS SPOOLING. IF NOT,
	  JRST	NSPOOL		;[364] DON'T TRY TO SET SPOOL BITS.
	LDB	T1,SPLBTS	;GET SPOOL BITS FROM ACCT.SYS 
	IOR	T1,U.SPL	;OR IN ONES REQUESTED BY  USER
	HRLI	T1,.STSPL	;COMPLETE ARGUMENT
	MOVE	T2,['SSB',,[ASCIZ .spool bits.]]
	TRZ	T1,-.SPALL-1	;[365,371] CLEAR BITS WHICH AREN'T DEVICES
	PUSHJ	P,SETIT		;GO SET IT
	MOVE	T1,STATS2	;[374] GET SECOND STATES WORD
	TXNN	T1,ST%GLX	;[374] CAN WE SUPPORT GALAXY-10?
	JRST	NSPOOL		;[374] NO -- DON'T TRY, THEN
	SKIPGE	T1,U.DFER	;[365] WAS THERE A /DEFER SWITCH?
	JRST	NSPOOL		;[365] NO -- SAVE A UUO
	HRLI	T1,.STDFR	;[365] SETUUO CODE FOR DEFERRED SPOOLING
	MOVE	T2,['SDS',,[ASCIZ .deferred spooling bit.]]
	PUSHJ	P,SETIT		;[365] DO THE SETUUO

NSPOOL:	LDB	T2,[POINT 9,ENTRY+VMPWRD,8]	;[521] GET PHYS. LIMIT
	LSH	T2,^D9		;[551] CONVERT TO WORDS
	SKIPG	T1,U.CORE	;[551] GET /CORE ARG IF ONE
	JRST	PRST1B		;[551] NO ARG--USE PHYS. LIMIT
	CAIL	T1,1000		;[551] IS ARG ALREADY IN WORDS ?
	JRST	PRST1A		;[551] YES--SKIP ON
	CAILE	T1,^D256	;[551] IS ARG UNREASONABLE ?
	LSH	T1,^D9		;[551] YES--ASSUME HE MEANT P AND CONVERT
	CAIG	T1,^D256	;[551] IS ARG IN K ?
	LSH	T1,^D10		;[551] YES--CONVERT TO WORDS
PRST1A:	CAML	T1,T2		;[551] IS ARG < OR = PHYS. LIMIT
PRST1B:	MOVE	T1,T2		;[551] NO--USE PHYS. LIMIT FROM ACCT.SYS
	HRLI	T1,.STCLM	;SET UUO CODE FOR CORE
	MOVE	T2,['SCL',,[ASCIZ .core limit.]]
	PUSHJ	P,SETIT		;SET THE CORE LIMIT
	SKIPL	NEWACT		;[613] DO WE HAVE NEW ACCT.SYS?
	POPJ	P,0		;NO--ALL DONE
	MOVE	T1,STATS2	;[374] GET SECOND STATES WORD
	TXNN	T1,ST%VMS	;SKIP IF VM MONITOR
	JRST	PRSET3		;NOT VM DO NOT TRY UUO'S
	MOVE	T1,[.STUVM,,T3]	;LOAD POINTER TO STUFF
	LDB	T3,[POINT 9,ENTRY+VMPWRD,8] ;GET PHYSICAL LIM
	LDB	T4,[POINT 9,ENTRY+VMPWRD,17] ;GET VIRT LIM
	SKIPE	T3		;DO NOT TURN 0 INTO 1
	AOS	T3		;ELSE INCREMENT
	SKIPE	T4
	AOS	T4
	HRL	T3,T4		;MAKE XWD VIRT,,PHYS
	MOVE	T2,['SVM',,[ASCIZ /maximum virtual and physical limits/]]
	PUSHJ	P,SETIT		;GO DO THE SET
PRSET3:	SKIPL	EQACT		;[356] SET 6.02 STUFF?
	JRST	PRSET5		;[431] NO
	LDB	T1,[POINT 9,ENTRY+XPDWRD,35]	;[352] GET QUOTA
	HRLZ	T1,T1		;[426] PUT QUOTA IN LEFT HALF
	TLC	T1,777		;[446] SEE IF QUOTA=-1
	TLCE	T1,777		;[446] ..
	  JRST	PRSET4		;[430] YES -- DON'T DO ENQC.
	HRR	T1,THSJOB	;[426] AND JOB NUMBER IN RIGHT HALF
	MOVE	T2,[XWD 2,T1]	;[352] SET UP POINTER TO ARG
	ENQC.	T2,		;[352] DO IT UP
	 SKIPA			;[507] WOOPS - CHECK IT OUT
	  JRST	PRSET4		;[507] OK - KEEP ON TRUCKIN
	CAMN	T2,[XWD 2,T1]	;[507] AC UNCHANGED (UUO NOT IMPLEMENTED)?
	  JRST	PRSET4		;[507] YES - DON'T BOTHER USER THEN
	WARN	EUF,<ENQC. UUO failed.  Error code = >
	  CAI			;[507] NON-JFCL NO-OP
	MOVE	T1,T2		;[507] PICK UP ERROR CODE
	PUSHJ	P,.TOCTW##	;[507] SPIT IT OUT
	PUSHJ	P,.TCRLF##	;[507] ..
	PUSHJ	P,CALOPR	;[510] TELL USER TO CALL THE OPERATOR

PRSET4:	MOVE	T1,STATS2	;[425] GET 2ND STATES WORD
	TXNN	T1,ST%NCS	;[632] SKIP ON IF NOT CLASS SCHEDULER
	TXNN	T1,ST%SCD	;[425] DOES MONITOR HAVE SCHED. UUO?
	  JRST	PRSET5		;[425] NO -- SKIP THIS STUFF
	LDB	T1,[POINT 9,ENTRY+XPDWRD,26]	;[425] GET SCHED TYPE
	IDIVI	T1,4		;[425] GET INDEX INTO TABLE
	ADD	T1,SCDTBL	;[425] ADD TABLE BASE ADDRESS
	TLNE	F,FL.BAT	;[452] BATCH JOB?
	  ADDI	T1,SCDSIZ/2	;[452] YES - INDEX INTO BATCH PART OF TBL
	LDB	T4,BYTTAB(T2)	;[425] INDEX BYTE POINTER BY REMAINDER
				;[622]  TO GET CPU CLASS IN T4
	MOVX	T1,%SSMSI	;[622] NOW GETTAB THE MEDIUM-TERM
	GETTAB	T1,		;[622] SCHEDULING INTERVAL TO SEE
	  JRST	PRSET5		;[622] IF THE CLASS SCHEDULER IS RUNNING
	JUMPE	T1,PRST4B	;IF INTERVAL=0, CLASSES ARE DISABLED
	MOVX	T1,%SSSET	 ;CHECK NEW CLASS FLAG FOR CLASSES
	GETTAB	T1,		;SCHEDULING
	  SETO	T1,		;NOT NEW CLASS SCHEDULER
	JUMPE	T1,PRST4B	;SKIP CHECKS IF RUNNING ROUND ROBIN
	HRRZI	T1,.GTCQP	;NOW GETTAB CPU QUOTA FOR THIS CLASS
	HRL	T1,T4		;T4 HAS OUR CLASS
	GETTAB	T1,		;...
	  JRST	PRSET5		;MONITOR NOT BUILT FOR CLASS SCHEDULER
	TRNE	T1,-1		;IF PRIMARY PERCENTAGE NON-ZERO
	JRST	PRST4B		;WE'RE OK
	MOVX	T2,%SSBBQ	 ;CHECK FOR BACKGROUND BATCH
	GETTAB	T2,		;GET BB CLASS
	  SETO	T2,		;NO BACKGROUND BATCH
	CAMN	T2,T4		;IS THE USER IN BACKGROUND BATCH?
	JRST	PRST4B		;YES, HE IS OK
	JUMPL	T1,PRST4A	;GIVE ERROR IF FIXED SWAPIN BIT SET
	HRRZI	T1,.GTCQJ	;NOW GETTAB SECONDARY ALLOCATION
	HRL	T1,T4		;FOR THIS CLASS
	GETTAB	T1,		;...
	  JRST	PRST4B		;NOT NEW CLASS SCHEDULER
	JUMPN	T1,PRST4B	;[622] IF CLASS QUOTA NON-ZERO, WE'RE OK
PRST4A:	FATAL	CWR,<CPU class quota is zero: you would never run>
	  JFCL

PRST4B:	HRLI	T4,-1		;[425] -1 MEANS THIS JOB
	MOVE	T1,[1,,T2]	;[425] SET UP POINTER FOR SCHED. UUO
	MOVE	T2,[400005,,T3]	;[425] XWD FUNC, LOC OF ARG LIST
	MOVEI	T3,1		;[425] ONLY ONE ARGUMENT
	SCHED.	T1,		;[425] ZAP!
	  SKIPA			;[425] WOOPS
	JRST	PRSET5		;[425] ALL SET
	CAMN	T1,[1,,T2]	;[425] IF AC UNCHANGED, UUO NOT
	  JRST	PRSET5		;[425] IMPLEMENTED SO FORGET MESSAGE
	WARN	SCF,<SCHED. UUO failed.  Error code = >
	  CAI			;NON-JFCL NO-OP
	PUSHJ	P,.TOCTW##	;[425] TELL HIM ALL ABOUT IT
	PUSHJ	P,.TCRLF##
	PUSHJ	P,CALOPR	;[510] PLEASE CALL OPR
	JRST	PRSET5

BYTTAB:	POINT	9,(T1),8	;[425] BYTE PTR FOR REMAINDER=0
	POINT	9,(T1),17	;[425] REMAINDER=1
	POINT	9,(T1),26	;[425] T1 HAS ADDR OF WORD TO LOOK AT
	POINT	9,(T1),35

PRSET5:	MOVE	T1,STATS2	;[356,374] 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,ENTRY+VMPWRD	;GET IPCF QUOTAS
	MOVEM	T1,IPCQTA	;STORE IT AWAY
	MOVE	T1,THSJOB	;[351] 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>
	  POPJ	P,0		;ALL DONE
	JRST	IPCQER		;TELL HIM MORE

IPCSER:	WARN	EIS,<Error in send to [SYSTEM]IPCF>
	  POPJ	P,0		;ALL DONE
	JRST	IPCQER		;TELL HIME MORE
IPCRER:	CAIN	T1,IPCNP%	;QUEUE EMPTY?
	POPJ	P,0		;YES--ALL IS WELL
	WARN	EIR,<Error in receive from [SYSTEM]IPCF>
	  POPJ	P,0
IPCQER:	PUSHJ	P,.TCRLF##	;OUTPUT CRLF
	WARN	IQS,<IPCF quotas may not be set correctly>
	  JFCL
	PUSHJ	P,CALOPR	;[510] TELL USER TO CALL OPR
	POPJ	P,0		;RETURN

;[344] TABLES FOR ROUTINE TO DO TRMOP.S AND SET TERMINAL STUFF

IFN	SETTTY,<

	DEFINE X(TCODE,ARG,FLAGS),<
	XWD	ARG,FLAGS!TCODE+1000 >

;FLAGS
TF.CMP==1B18		;USE COMPLEMENT OF VALUE STORED BY SCAN

TTAB:	X .TOALT,U.ALTM,TF.CMP	;[472] TRMOP.S WHICH ARE DONE BEFORE
	X .TOBLK,U.BLNK,TF.CMP	;[472] PRINTING NOTICE.TXT
	X .TONFC,U.CRLF,TF.CMP
	X .TODBK,U.DBRK,0
	X .TOLCP,U.ECHO,TF.CMP
	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
TTLNTH=.-TTAB

PTAB:	X .TORSP,U.RSPD,0	;[472] TRMOP.S WHICH SHOULD BE DONE
	X .TOTSP,U.XSPD,0	;[472] AFTER PRINTING NOTICE.TXT
PTLNTH=.-PTAB			;[472]

	>		;[344] END IFN SETTTY

	SUBTTL	Set user profile -- non-privileged SETUUOs
 
;HERE AFTER LOGIN UUO IS DONE TO SET OPTIONAL STUFF
USRSET:	HRROI	T1,.GTWCH	;[446] TRY GETTAB TO GET THIS JOB'S
	GETTAB	T1,		;[446] WATCH BITS. IF GETTAB FAILS,
	  JRST	TINY		;[446] THIS MUST BE A 1040 MONITOR
	LDB	T1,WATBTS	;GET WATCH BITS
	LSH	T1,SHFWAT
	HRRZ	T2,U.WAT	;GET WATCH BITS
	LSH	T2,WCHLSH##	;SHIFT TO CORRECT PLACE
	IOR	T1,T2		;OR IN THE USER SETTINGS
	MOVE	T2,ENTRY+PROWRD	;GET THE PROFILE WORD
	TLNE	T2,P.WVER	;WANT TO WATCH VERSIONS?
	TRO	T1,(JW.WVR)	;YES--TURN ON VERSION WATCHING
	SKIPE	NEWACT		;IF OLD ACCT.SYS FORMAT
	TLNE	T2,P.WMTA	; OR USER WANTS MTA WATCHING
	TRO	T1,(JW.WMT)	; TURN ON WATCH MTA
	MOVE	T2,.FLVRB##	;[455] GET /VERBOSITY FROM SCAN
	LSH	T2,^D6		;[542] SHIFT OVER TO RIGHT PLACE
	ANDI	T2,700		;[542] THROW AWAY GARBAGE BITS
	IOR	T1,T2		;[455] OR INTO WATCH BITS
	HRLI	T1,.STWTC	;SET WATCH FUNCTION
	MOVE	T2,['SWB',,[ASCIZ .watch bits.]]
	SKIPE	U.NWAT		;[336] SKIP THE SETUUO IF /NOWATCH
	PUSHJ	P,SETIT		;DO THE SET UUO
TINY:	SETOM	UFDFSN		;[446] START WITH FIRST STR
USRST1:	MOVE	T2,UFDFSN	;GET STR NAME
	MOVEI	T1,T2		;POINTER TO ARGUMENT BLOCK
	JOBSTR	T1,		;GET NEXT STR
	  JRST	USRST3		;SKIP ALL THE STR STUFF
	JUMPE	T2,USRST2	;JUMP IF WE ARE UP TO FENCE
	AOJE	T2,USRST2	;[427] OR END OF LIST IN ONE-STR SYSTEMS
	SOS	T2		;[427] ACCOUNT FOR AOJE
	MOVEM	T2,UFDFSN	;SAVE STR NAME
	PUSHJ	P,ENTPTH	;CREATE SFD'S AS NEEDED
	JRST	USRST1		;LOOP OVER ALL ACTICE STRS
USRST2:	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
	  JFCL			;WHO CARES?
	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,USRS2A	;JUMP IF NOSYS
	MOVX	T1,PT.SSY	;ELSE ADD SYS BIT
	IORM	T1,PTHBUF+.PTSWT ; INTO ARGUMENT
USRS2A:	SKIPGE	T1,U.NEW	;WAS /NEW GIVEN
	MOVEI	T1,AD.YN	;NO--SUPPLY ABSENT DEFAULT
	JUMPE	T1,USRS2B	;JUMP IF NONEW
	MOVX	T1,PT.SNW	;SET THE NEW BIT IN
	IORM	T1,PTHBUF+.PTSWT ; PATH. UUO ARGUMENT BLOCK
USRS2B:	SKIPN	T1,LIBSPC+.FXDIR ;GET LIB PPN
	JRST	USRS2C		;JUMP IF NONE
	TLNN	T1,-1		;[567] IS PROJECT # ZERO?
	  HLL	T1,PP		;[567] YES - USE USER'S
	TRNN	T1,-1		;[567] ZERO PROGRAMMER NO.?
	  HRR	T1,PP		;[567] 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
USRS2C:	MOVE	T1,[.PTMAX,,PTHBUF] ;DO THE PATH UUO
	PATH.	T1,		; ..
	  JFCL			; ..
USRST3:	SKIPGE	T2,U.DFUL	;GET DISK FULL SWITCH
	JRST	USRST4		;JUMP IF NOT GIVEN
	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
	MOVE	T2,['SDF',,[ASCIZ .disk full.]]
	PUSHJ	P,SETIT		;GO SET IT

USRST4:	SKIPN	T1,U.DPRI	;GET DISK PRIORITY
	JRST	USRST5		;NONE SPECIFIED
	HRLI	T1,-2
	MOVE	T2,[.DUPRI,,T1]	;ARG POINTER
LGNSDP:	MOVEI	M,[ASCIZ /%LGNSDP can not set disk priority.
/]
	DISK.	T2,		;DO THE UUO
	  PUSHJ	P,MSG		;GIVE THE WARNING
USRST5:	SKIPL	T1,U.STA	;[633] GET STATION
	JRST	LGNLUF		;[633] ONE WAS SPECIFIED, USE IT
	MOVEI	T1,.GTLOC	;[633] GETTAB FOR NODE NUMBER OF CENTRAL SITE
	GETTAB	T1,		;[633] GET CENTRAL SITE NODE NUMBER
	  JRST	USRS5A		;[633] MONITOR MUST NOT SUPPORT NETWORKS
	HRROI	T2,.GTLOC	;[633] THIS JOB'S LOCATION
	GETTAB	T2,		;[633] GET THAT
	  JRST	USRS5A		;[633] NO NETWORK SOFTWARE
	CAMN	T1,T2		;[633] ALREADY LOCATED AT THE CENTRAL SITE?
	JRST	USRS5A		;[633] YES, NO POTENTIAL PROBLEMS THEN
	MOVEM	T2,NODLOC	;[633] STORE THIS JOB'S LOCATION IN NODE BLOCK
	MOVEI	T2,4		;[633] LENGTH OF THE ARGUMENT BLOCK
	MOVEM	T2,NODLEN	;[633] STORE IN NODE UUO ARGUMENT BLOCK
	MOVEI	T2,.TYLPT	;[633] DEVICE TYPE
	MOVEM	T2,NODDEV	;[633] STORE THAT IN THE ARGUMENT BLOCK
	MOVE	T2,[.NDRCI,,NODBLK];[633] NODE UUO ARGUMENT
	NODE.	T2,		;[633] GET NODE CONFIGURATION INFORMATION
	  JRST	USRS5A		;[633] NOT IMPLEMENTED?
	HLRZ	T2,NODDEV	;[633] NUMBER OF LPT'S AT THIS NODE
	JUMPN	T2,USRS5A	;[633] JUMP IF THERE ARE SOME
;[633] IF NO LPT'S, LOCATE JOB AT CENTRAL SITE
LGNLUF:	MOVEI	M,[ASCIZ /%LGNLUF LOCATE UUO failed.
/]
	LOCATE	T1,
	  PUSHJ	P,MSG		;GIVE THE MESSAGE

USRS5A:	MOVE	T1,[.STDEF,,T2]	;[620] SETUUO FOR DEFAULTS
	HRRZI	T2,ST.PRT	;[620] FUNCTION CODE FOR FILE PROTECTION
	AOSN	U.DFPR		;[620] SWITCH SPECIFIED?
	  JRST	USRST6		;[620] NO - SKIP THE SETUUO
	SOS	U.DFPR		;[620] COMPENSATED FOR AOSN
	SKIPGE	T3,U.DFPR	;[620] GET SWITCH VALUE
	  JRST	USRS5B		;[620] CAN'T BE NEGATIVE
	CAILE	T3,777		;[620] RANGE CHECK IT
	  JRST	USRS5B		;[620] BAD
	SETUUO	T1,		;[620] SET IT
	  JFCL			;[620] PROBABLY NOT IMPLEMENTED
	JRST	USRST6		;[620] OK

USRS5B:	WARN	BVD,<Bad argument to /DEFPROT switch>
	  JFCL
;HERE TO SET CURRENT VM LIMITS
USRST6:	MOVE	T1,STATS2	;GET SECOND STATES WORD
	TXNN	T1,ST%VMS	;DO WE HAVE VM?
	JRST	USRST7		;NO--TRY NEXT THING
	MOVEI	T3,0		;PRESET ANSWER TO ZERO
	SKIPGE	T1,U.CVPL	;GET CURRENT VIRT LIMIT
	JRST	USRS6A		;NONE SUPPLIED
	PUSHJ	P,FIXPGS	;CONVERT TO PAGES
	HRL	T3,T1		;USER SUPPLIED ONE -- USE IT
USRS6A:	SKIPGE	T1,U.CPPL	;GET CURRENT PHYS LIMIT
	JRST	USRS6B		;NONE SUPPLIED--LEAVE ZERO
	PUSHJ	P,FIXPGS	;MAKE SURE WE HAVE PAGES
	HRR	T3,T1		;USER SPECIFIED ONE -- USE IT
USRS6B:	JUMPE	T3,USRST7	;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
	MOVE	T2,['SCV',,[ASCIZ /current virtual and physical limits/]]
	PUSHJ	P,SETIT		;DO THE SETUUO

USRST7:	IFN	SETTTY,<	;[344]
	SKIPN	U.SETT		;[344] DID HE SAY /NOSETTY?
	JRST	USRST8		;[344] YES -- SKIP THE WHOLE BIT
	SKIPG	T1,U.SPED	;[344] DID HE SAY /SPEED:N?
	JRST	.+3		;[344] NOPE
	MOVEM	T1,U.RSPD	;[344] YES -- SET BOTH RCV AND XMIT
	MOVEM	T1,U.XSPD	;[344] SPEED TO N
	MOVE	T1,[-TTLNTH,,TTAB] ;[472] TABLE OF PRE-NOTICE TRMOP.S
	PUSHJ	P,DOTRMP	;[472] DO THE TRMOP.S
	>			;[472] END IFN SETTTY


USRST8:	MOVEI	P1,DEVTAB	;[470] MAKE PTR TO LIST
	HLRE	T1,DEVPTR	;[470] GET -NUMBER OF WORD PAIRS LEFT
	ADDI	T1,DVICES*2	;[470] MAKE +NUMBER OF PAIRS USED
	JUMPL	T1,USRS8C	;[470] NO /ASSIGN SWITCH TYPED
	CAILE	T1,DVICES*2	;[470] TOO MANY?
	  MOVEI	T1,DVICES*2	;[631] YES - USE MAX
	LSH	T1,-1		;[470] HALVE BECAUSE WORD PAIRS
	MOVN	P2,T1		;[470] MAKE AOJL COUNTER
USRS8A:	SETZB	T1,T3		;[470] SET UP OPEN BLOCK
	MOVE	T2,(P1)		;[470] GET PHYSICAL NAME
	OPEN	UFD,T1		;[470] OPEN ON SOME RANDOM CHANNEL
	  JRST	NDEV		;[470] LOSE
	AOS	P1		;[470] BUMP POINTER
	MOVEI	T1,UFD		;[470] CHANNEL NUMBER
	SKIPN	T2,(P1)		;[470] PICK UP LOGICAL NAME
	  JRST	.+3		;[470] NONE - KEEP GOING
	DEVLNM	T1,		;[470] ASSIGN LOGICAL NAME
	  JRST	NODEV		;[470] LOST
	MOVE	T1,THSJOB	;[470] SET ASSCON BY REASSI
	MOVEI	T2,UFD		;[470] CHANNEL NUMBER
	REASSI	T1,		;[470] ZAP!
USRS8B:	CLOSE	UFD,		;[470] TIDY UP
	AOS	P1		;[470] BUMP POINTER
	AOJLE	P2,USRS8A	;[502] LOOP THRU DEVICE LIST

USRS8C:	POPJ	P,		;[470] ALL DONE


NODEV:	SOS	P1		;[470] DROP BACK TO POINT AT PHYS NAME
NDEV:	WARN	CAD,<Could not assign device >
	  CAI			;[470]
	MOVE	T1,(P1)		;[470] GET PHYSICAL NAME
	PUSHJ	P,.TSIXN##	;[470] TYPE IT
	AOS	P1		;[472] BUMP POINTER
	SKIPN	(P1)		;[472] LOGICAL NAME SPECIFIED?
	  JRST	USRS8D		;[472] NO - DON'T TALK ABOUT IT
	MOVEI	M,[ASCIZ / logical name /]	;[470]
	PUSHJ	P,MSG		;[470]
	MOVE	T1,(P1)		;[470] GET LOGICAL NAME
	PUSHJ	P,.TSIXN##	;[470] TYPE IT
USRS8D:	PUSHJ	P,NEWLIN	;[470] CRLF
	JRST	USRS8B		;[470] KEEP ON TRUCKIN

;[472] ROUTINE TO DO POST-NOTICE TRMOP.S
POSTMS:	IFN	SETTTY,<	;[472]
	OUTPUT	TTY,		;[475] SPIT OUT SOME BYTES
	SKIPN	U.SETT		;[472] DID HE SAY /NOSETTTY?
	  POPJ	P,		;[556] YES- SKIP IT
	PUSHJ	P,WAITO		;[472] WAIT UNTIL OUTPUT BUFFER EMPTY
	MOVE	T1,[-PTLNTH,,PTAB] ;[472] TABLE OF POST-NOTICE TRMOP.S
	PUSHJ	P,DOTRMP	;[472] DO THEM UP
	>			;[472] END IFN SETTTY
	POPJ	P,		;[472]

	IFN SETTTY,<		;[556]
DOTRMP:	MOVE	P1,[XWD 3,T2]	;[472] SET UP ARG POINTER
TLOOP:	SETZ	P2,		;[344] CLEAR FLAGS
	HLRZ	T4,(T1)		;[344] GET ADDR OF ARG FOR TRMOP.
	MOVE	T4,(T4)		;[344] GET ACTUAL ARGUMENT
	JUMPL	T4,LEAVE	;[344] IF -1, SCAN DIDN'T TOUCH IT
	HRRZ	T2,(T1)		;[344] GET TRMOP. FUNCTION CODE & FLAGS
	TRZE	T2,TF.CMP	;[344] CLEAR FLAGS OUT OF T2 SO IT
	TRO	P2,TF.CMP	;[344] WILL BE A REAL TRMOP. CODE
	MOVE	T3,TTYUDX	;[344] GET TTY UDX
	TRNE	P2,TF.CMP	;[344] COMPLEMENT ARGUMENT?
	TRC	T4,1		;[344] YUP
	TRMOP.	P1,
	  JRST	WHA		;[344] OOPS -- CHECK IT OUT
LEAVE:	AOBJN	T1,TLOOP	;[344] GO ROUND AGAIN
FORGET:	POPJ	P,		;[475] ALL DONE
	>			;[470] END IFN SETTTY

	IFN	SETTTY,<	;[556]
;[344] HERE IF TRMOP. UUO FAILS
WHA:	CAIN	P1,TOPRC%	;[344] NOT PRIVILEGED?
	JRST	IGNORE		;[344] ACT LIKE IT DIDN'T HAPPEN
	JUMPE	P1,IGNORE	;[344] IF FUN. NOT IMPLEMENTED, IGNORE
	CAMN	P1,[XWD 3,T2]	;[344] IF UUO NOT IMPLEMENTED, FORGET
	JRST	FORGET		;[475] THE WHOLE THING
	PUSH	P,T1		;[375] WATCH OUT FOR T1
	MOVEI	M,[ASCIZ /%LGNTUF TRMOP. UUO failed.  Function code = /]
	PUSHJ	P,MSG		;[375] TELL HIM WHAT HAPPENED
	MOVE	T1,(P)		;[375] GET T1 AGAIN FOR ABOUT 1 MSEC.
	HRRZ	T1,(T1)		;[375] GET FUNCTION CODE WHICH LOST
	TRZ	T1,TF.CMP	;[472] USER DOESN'T CARE ABOUT FLAG
	PUSHJ	P,.TOCTW##	;[375] PRINT IT
	PUSHJ	P,.TCRLF##	;[375]
	POP	P,T1		;[375] AND GET T1 BACK AGAIN

IGNORE:	MOVE	P1,[XWD 3,T2]	;[344] RESTORE POINTER
	JRST	LEAVE		;[344] AND RETURN

;[367] ROUTINE TO SLEEP UNTIL FINISHED OUTPUTTING ON TTY
WAITO:	MOVEI	P1,^D120	;[475] WAIT FOR TTY OUTPUT FOR 2 MIN.
WAITO1:	MOVE	T1,[XWD 2,T2]	;[553] SET UP POINTER FOR TRMOP.
	MOVEI	T2,.TOSOP	;[367] SKIP IF OUTPUT BUFFER NON-EMPTY
	MOVE	T3,TTYUDX	;[367] OUR UNIVERSAL I/O INDEX
	TRMOP.	T1,		;[367] IF OUTPUT BUFFER EMPTY OR TRMOP.
	  POPJ	P,		;[367] FAILS, ASSUME OK AND RETURN
	MOVEI	T4,1		;[367] SLEEP FOR ONE SECOND
	SLEEP	T4,
	SOJG	P1,WAITO1	;[553] IF STILL PATIENT, KEEP SLEEPING
	POPJ	P,		;[475] WAITED TOO LONG - GIVE UP

	>			;[357] END IFN SETTTY

	SUBTTL	Set user parameters -- subroutines

;SUBROUTINE TO DO A SET UUO
;CALL WITH:
;	T1 = SET UUO ARGUMENT
;	LH(T2) =  3 LETTER CODE IN SIXBIT
;	RH(T2) = ADDRESS OF ASCIZ STRING
;	PUSHJ	P,SETIT
;	RETURN HERE IN ALL CASES
SETIT:	SETUUO	T1,		;SET THE PARAMETER
	  SKIPA			;LOST--PRINT MESSAGE
	POPJ	P,0		;WORKED--RETURN
	PUSH	P,T2		;SAVE T2
	PUSHJ	P,NEWLIN	;START WITH CLEAN LINE
	MOVEI	T1,[ASCIZ .%LGN.] ;PRINT PREFIX
	PUSHJ	P,.TSTRG##	; ..
	HLLZ	T1,(P)		;COPY 3 LETTER CODE
	PUSHJ	P,.TSIXN##	;PRINT THAT OUT
	MOVEI	T1,[ASCIZ . SET UUO failed attempting to set .]
	PUSHJ	P,.TSTRG##	;TYPE THE FIRST STUFF
	HRRZ	T1,(P)		;COPY REST OF STRING
	PUSHJ	P,.TSTRG##	;PRINT IT
	POP	P,T2		;CLEAN UP STACK
	PJRST	.TCRLF##	;ADD A CRLF
;SUBROUTINE TO CONVERT CORE ARGUMENT TO PAGES
;CALL WITH:
;	MOVE	T1,ANSWER-FROM-.SWCOR
;	PUSHJ	P,FIXPGS
;	RETURN HERE # OF PAGES IN T1
;USES NO AC'S
FIXPGS:	CAIG	T1,^D512	;JUST A NUMBER?
	IMULI	T1,^D1024	;YES--CONVERT TO WORDS
	LSH	T1,-9		;CONVERT TO PAGES
	POPJ	P,0		;RETURN


;[510] SUBROUTINE TO TELL USER TO CALL THE OPERATOR IF SOMETHING
;[510] IS TERRIBLY WRONG

CALOPR:	WARN	CTO,<Please call the operator>
	  JFCL
	POPJ	P,
;LOWSEG STUFF FOR LGNSET
	XLIST
	LIT
	LIST

	RELOC
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:
NODLEN:	BLOCK	1		;[633] LENGTH OF NODE UUO ARGUMENT BLOCK
NODLOC:	BLOCK	1		;[633] NODE NUMBER
	BLOCK	1		;[633] RESERVED ARGUMENT
NODDEV:	BLOCK	1		;[633] NUMBER OF DEVICES,, DEVICE TYPE
	PRGEND
	TITLE	LGNIO - Input output module for LOGIN

	SEARCH	C,SCNMAC,LGNUNV
	LGNDCL

;SUBROUTINE TO INPUT CHARS TO 1ST NON-SIXBIT CHAR - SAVE 2 WORDS OF CHARS
;VALUES	T1,T2=SIXBIT CHARS
;	CH=TERMINATING CHAR
;	FL.BRK BIT IN LH F=1 IF TERMINATING CHAR IS A BREAK CHAR

GET2WD:	PUSHJ	P,.SAVE1##	;SAVE P1
	SETZB	T1,T2
	CLOSE	TTY,0		;[456] DUMP OUT TTY BUFFER
	MOVE	P1,[POINT 6,T1]
GETNL:	PUSHJ	P,.TICHE##	;GET A CHAR. WITH THE RIGHT
				; AMOUNT OF CONVERSION.
	JUMPLE	C,DONIT		;[456] JUMP IF END OF LINE
	CAIL	C,"A"+40	;CONVER LOWER CASE
	CAILE	C,"Z"+40	; TO UPPER CASE
	SKIPA
	SUBI	C,40	
	MOVEI	CH,-40(C)	;CONVERT TO SIXBIT
	CAME	P1,[600,,T2]	;POINTER EXPIRED
	IDPB	CH,P1		;NO--STASH AWAY
	JRST	GETNL		;GET THE NEXT CHAR

DONIT:	INIT	TTY,IO.SUP	;[456] RE-INIT TTY
	SIXBIT	/TTY/		;[456] ..
	XWD	TOB,TIB		;[456] ..
	  LOGOUT		;[456] THIS IS IMPOSSIBLE
	POPJ	P,		;[456] RETURN
;SUBROUTINE TO DETERMINE IF JOB NUMBER IN T1 IS A BATCH JOB
;ARGS	T1=JOB NUMBER
;RETURN	.POPJ IF JOB IS NOT BATCH
;	.POPJ1 IF JOB IS BATCH

ISBATC:	HRLZ	T4,T1
	HRRI	T4,.GTLIM	;[602] GETTAB INDEX FOR JBTLIM
	GETTAB	T4,		;[602] GET BITS
	  SETZ	T4,
	TXNN	T4,JB.LBT	;[602] BATCH JOB?
	  POPJ	P,		;[602] NO
	JRST	.POPJ1		;[602] YES - SKIP RETURN

;[333] SUBROUTINE TO DETERMINE WHETHER THIS JOB IS A SUBJOB OF OPSER.
;[333] RETURN	POPJ IF NOT
;[333]		POPJ1 IF IT IS

ISOPSR:	SETO	T1,		;[333,340] THIS JOB
	CTLJOB	T1,		;[333] WHO CONTROLS ME?
	  POPJ	P,		;[333] I DUNNO
	MOVE	T2,T1		;[404] REMEMBER CNTRL JOB NO.
	TRMNO.	T1,		;[333] WHERE'S HIS TTY AT?
	  POPJ	P,		;[333,340] DUNNO
	GETLCH	T1		;[333,341] WHAT KIND OF TERMINAL
	TXNE	T1,GL.ITY	;[333] PTY?
	POPJ	P,		;[333,340] YES--PROBABLY BATCON
	HRLZ	T1,T2		;[337,340,404] GET JOB NO.
	HRRI	T1,.GTPRG	;[333] SET UP FOR GETTAB
	GETTAB	T1,		;[333] GET PROGRAM NAME
	  POPJ	P,		;[333] A REAL LOSER
	CAME	T1,[SIXBIT /OPSER/]
	POPJ	P,
	JRST	.POPJ1
GIVNBR:	TLNE	F,FL.BAT	;ARE WE A BATCH JOB?
	JRST	LGNEIB		;YES--NEVER SAY # TO BATCON
	PUSHJ	P,NEWLIN	;GIVE A CRLF
	MOVEI	CH,"#"		;PROMPT CHAR FOR PPN
	PUSHJ	P,ECHOON	;TYPE AND ENABLE ECHO
	MOVEI	CH,[ASCIZ /PROJECT-PROGRAMMER NUMBER/]
	MOVEM	CH,HELP		;STORE REASON FOR WAITING
	POPJ	P,		;RETURN
ECHOON:	PUSHJ	P,TYO		;[456] TYPE NUMBER SIGN
	CLOSE	TTY,0		;[456] DUMP TTY BUFFER
	INIT	TTY,0		;[456] RE-INIT WITH ECHO ON
	SIXBIT 	/TTY/		;[456] ..
	XWD	TOB,TIB		;[456] ..
	  LOGOUT		;[456] THIS IS A NO-NO
	POPJ	P,		;[456] RETURN

STYO:	SKIPA	CH,T1		;CHARACTER OUTPUT FOR SCAN & WILD
SPACE:	MOVEI	CH,40
TYO:	PUSHJ	P,TTYOUT	;[456] OUTPUT THE CHAR
	CAIN	CH,.CHCRT	;CARRAGE RETURN?
	SETZM	HPOS		;YES--BACK TO START OF LINE
	CAIL	CH," "		;CONTROL CHARACTER?
	AOS	HPOS		;NO--UPDATE POSITION
	POPJ	P,0		;RETURN

TYI:	PUSHJ	P,.TIAUC##	;GET CHAR BY SCAN'S SUBROUTINE
	MOVE	CH,C		;[331] COPY CHAR
	POPJ	P,

	FATAL	EIB,<Error in BATCON - LOGIN aborted>

TTYOUT:	SOSG	TOB+2		;[456] CHOP BYTE COUNT
	  OUTPUT	TTY,	;[456] NO ROOM - MAKE SOME
	IDPB	CH,TOB+1	;[456] PUT A BYTE IN
	POPJ	P,		;[456] RETURN
;SUBROUTINE TO GET ONE CHAR AND BOMB USER FOR BEING
; SLOW.
;
;CALLED ONLY FROM SCAN -- MAY CHANGE NO AC'S

TTYGET:	PUSHJ	P,.SAVE2##	;SAVE P1 AND P2
	SKIPN	FL2741		;IS THIS A 2741?
	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]
	HIBER	P1,		;HIBER FOR 1 MIN.
	  JRST	TTGET2		;TINY MONITOR
	SKPINL
	  SKIPA
	JRST	TTGET2
	SOJG	P2,TTGET1	;LOOP FOR A WHILE
	PUSHJ	P,HELPR		;TELL HIM WHY WE LOST
	JRST	FLUSH		;GET RID OF HIM

TTGET2:	INCHWL	C		;GET A CHAR. INTO C
	CAIE	C,.CHCNC	;CONTROL-C?
	CAIN	C,.CHCNZ	;[343] OR CONTROL-Z?
	PJRST	RICC##		;YES--GO EXIT
	CAIN	C,.CHCRT	;IS IT A CARRAGE RETURN?
	SETZM	HPOS		;YES--UPDATE HORIZ. POSITION
	CAIL	C," "		;PRINTING CHARACTER?
	AOS	HPOS		;YES--UPDATE HORIZ POSITION
	POPJ	P,		;RETURN

;HERE IF USER DOES NOT TYPE ANYTHING WITHIN 2 MIN.
LGNWFS:
HELPR:	OUTSTR	[ASCIZ /
?LGNWFS  Waiting for /]
	OUTSTR	@HELP		;EXPLAIN THE LOSSAGE
LGNPSO:	OUTSTR	[ASCIZ /
?LGNPSO  Please start over
/]
	POPJ	P,

;SUBROUTINE TO TYPE A CRLF IF ONE IS NEEDED
NEWLIN:	SKIPN	HPOS		;IS A CRLF NEEDED?
	POPJ	P,0		;NO--JUST RETURN
	PJRST	.TCRLF##	;YES--GO TYPE ONE
	SUBTTL	LOGIN messages

	MSGOK==1		;FLAG TO TYPE MEESSAGE EVEN IF USER
				; HAS SEEN IT.
	FNAME==2		;FLAG TO REQUEST FILE NAME PRINTING
	STONLY==4		;[357] FLAG TO PRINT STR NAME ONLY

;HERE TO PRINT RANDOM FILES USER GETS ON LOGIN

DAYMES:	PUSHJ	P,.SAVE1##	;SAVE P1
	TLNN	F,FL.WLD	;WILD PPN
	JRST	ACCT2		;NO--HE KNOWS WHO HE IS
	INFO	LIA,<You are logged in as >
	 JRST	ACCT2
	HLRZ	N,PPN		;GET PROJECT
	PUSHJ	P,OCTPRT	;PRINT
	MOVEI	CH,","		;PRINT A ,
	PUSHJ	P,TYO		;DONE
	HRRZ	N,PPN		;GET PROGRAMMER
	PUSHJ	P,OCTPRT	;PRINT
	MOVEI	M,[ASCIZ .]
.]				;ADD IN A CLOSE BRACKET
	PUSHJ	P,MSG		;AND A CRLF
ACCT2:	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
	MOVE	N,T1		;HOURS
	PUSHJ	P,DECPR2
	POP	P,N		;MINUTES
	PUSHJ	P,DECPR2
	MOVEI	CH,11		;TAB
	PUSHJ	P,TYO
	MOVE	T1,TDATE	;[477] 
	IDIVI	T1,^D31		;THE USUAL DATE PRINTER
	MOVEI	N,1(T2)		;DAY OF MONTH
	PUSHJ	P,DECPR2
	IDIVI	T1,^D12		;MONTH AND YEAR
	MOVE	T2,MONTAB(T2)
	MOVEM	T2,DATEMP
	SETZM	DATEMP+1	;FOR ASCIZ, DDTOUT
	MOVEI	M,DATEMP
	PUSHJ	P,MSG
	MOVEI	N,^D64(T1)	;YEAR
	PUSHJ	P,DECPR2
	MOVEI	CH,11
	PUSHJ	P,TYO
	MOVE	T1,SAVEDA	;DAY OF WEEK
	MOVEI	M,WEEKDA(T1)
	PUSHJ	P,MSG		;TYPE DAY OF WEEK
	PUSHJ	P,.TCRLF##
	MOVEI	T1,2		;[454] GET DEFAULT FOR /NOTICE
	MOVE	P1,U.NOTC	;[453] GET SWITCH TYPED
	AOSN	P1		;[453] WAS A SWITCH TYPED?
	  MOVEM	T1,U.NOTC	;[453] NO - USE DEFAULT
	MOVEI	T1,NOTSPC	;[362] /NOTE FILESPEC
	MOVEI	P1,FNAME	;[362] PRINT FILE NAME
	PUSHJ	P,TYPE		;[362] TYPE IT
	PUSHJ	P,ISOPSR	;[333] IS THIS AN OPSER SUBJOB?

DIEMSG:	SKIPA	T1,[DAYSPC]	;[333,337] NO--PRINT NOTICE.TXT
	JRST	.+3		;[333] YES--DON'T PRINT IT
	MOVEI	P1,0		;FLAGS
	PUSHJ	P,TYPE		;GO PRINT IT
	SKIPG	U.STR		;/STR GIVEN
	POPJ	P,0		;NO--RETURN
	MOVEI	T1,STRSPC	;STR.TXT SPEC
	MOVEI	P1,MSGOK!FNAME!STONLY	;[357] OK TO TYPE MESSAGE
	PJRST	TYPE		;PRINT IT

;FILE SPEC 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>

;FILE SPEC 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>
;SUBROUTINE TO TYPE A FILE
;CALL WITH:
;	MOVEI	T1,ADDRESS-OF-SCAN-STYLE-FILESPEC
;	MOVEI	P1,FLAGS
;	PUSHJ	P,TYPE
;	RETURN HERE
TYPE:	SKIPN	.FXNAM(T1)	;[512] ANY NAME OR MASK SPECIFIED?
	  POPJ	P,		;[512] NO - SKIP IT
	HRLZ	T1,T1		;FLIP AROUND
	HRRI	T1,TYPSPC	;ADDRESS OF OUT SPEC
	BLT	T1,TYPSPC+.FXLEN-1 ;[436] COPY THE FILESPEC
	SETZM	WLDPNT		;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:	MOVE	T1,[4,,[[TYPSPC],,0
			UFDBUF,,SECBUF
			.FXLEN,,.RBPRV+1
			UFD,,WLDPNT]]
	MOVX	T2,.IOASC	;SET UP ASCII MODE
	MOVEM	T2,UFDBUF	; ..
	PUSHJ	P,.LKWLD##	;LOOK FOR FILE
	  POPJ	P,0		;ALL DONE
	MOVEI	T1,B.DC##	;SET UP ADDRESS OF BUFFER HEADER
	MOVEM	T1,UFDBUF+2	; ..
	OPEN	UFD,UFDBUF	;OPEN THE FILE
	  PJRST	E.DFO##		;CAN'T
	LOOKUP	UFD,SECBUF	;LOOKUP FILE
	JRST	[PUSHJ P,E.DFL## ;REPORT ERROR
		 JRST  TYPE1]	;LOOK FOR NEXT FILE
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
	LDB	T1,[POINTR(SECBUF+.RBPRV,RB.CRD)]
	LDB	T2,[POINTR(SECBUF+.RBEXT,RB.CRX)] ;GET TOP 3 BITS OF DATE
	LSH	T2,^D12		;MOVE OVER TO CORRECT PLACE
	IORI	T1,(T2)		;COMBINE
	CAMLE	T1,UFDDAT	;IS FILE NEWER THAN UFD?
	JRST	TYPE3		;YES--PRINT ANYWAY
	CAME	T1,UFDDAT	;SAME DAY?
	JRST	TYPE2		;NO--DISTINCTLY OLDER
	LDB	T2,[POINTR(SECBUF+.RBPRV,RB.CRT)]
	CAML	T2,UFDTIM	;IS MESSAGE NEWER THAN UFD
	JRST	TYPE3		;YES--GO PRINT
TYPE2:	MOVE	T1,U.NOTC	;[450] GET /NOTICE VALUE
	CAIL	T1,2		;[450,453] SOMETIMES OR NEVER?
	JRST	TYPE1		;[453] YES -LOOK FOR NEXT FILE
>
TYPE3:	OUTPUT	TTY,		;[465] KEEP USER PATIENT
	MOVE	T1,U.NOTC	;[450] GET /NOTICE VALUE
	CAIN	T1,3		;[450] NEVER PRINT?
	  JRST	TYPE1		;[450] YES - SKIP IT
	TXNE	P1,FNAME	;WANT TO SEE FILE NAME?
	PUSHJ	P,TYPFIL	;TYPE THE FILE SPEC
TYPE4:	PUSHJ	P,.NXDTW##	;GET A BYTE
	  JRST	TYPE1		;END OF FILE
	PUSHJ	P,.TCHAR##	;TYPE IT
	JRST	TYPE4
;SUBROUTINE TO TYPE A FILESPEC
;CALL WITH:
;	UFDBUF = OPEN BLOCK
;	SECBUF = LOOKUP BLOCK
;	PUSHJ	P,TYPFIL
;	RETURN HERE
TYPFIL:	PUSHJ	P,NEWLIN	;[377] DON'T DOUBLE-SPACE
	MOVE	T1,UFDBUF+1	;GET DEVICE NAME
	PUSHJ	P,.TSIXN##	;TYPE IT
	PUSHJ	P,.TCOLN##	;TYPE IT
	TXNE	P1,STONLY	;[357] ONLY WANT STR NAME?
	PJRST	.TSPAC##	;[357] YES -- FINISH UP
	MOVE	T1,SECBUF+.RBNAM ;GET FILE NAME
	PUSHJ	P,.TSIXN##	;TYPE IT
	MOVEI	T1,"."		;TYPE A DOT
	PUSHJ	P,.TCHAR##	;TYPE THE DOT
	HLLZ	T1,SECBUF+.RBEXT;TYPE THE EXTENSION
	PUSHJ	P,.TSIXN##	;TYPE EXTENSION
	MOVEI	T1,SECBUF+.RBPPN;POINT TO PPN
	PUSHJ	P,.TDIRB##	;PRINT IT
	PJRST	NEWLIN		;START A NEW LINE AND RETURN

	SUBTTL	I/O subroutines

OCTPRT:	PUSH	P,T1
	MOVE	T1,N
	PUSHJ	P,.TOCTW##
	POP	P,T1
	POPJ	P,

DECPR2:	MOVEI	CH,"0"		;IF NEED LEADING DIGIT
	CAIG	N,11
	PUSHJ	P,TYO		;TYPE A ZERO
	PUSH	P,T1
	MOVE	T1,N
	PUSHJ	P,.TDECW##
	POP	P,T1
	POPJ	P,

RDUFD:	SKIPGE	WD,RDHED
	JRST	RDUFD1		;ALREADY READING
	MOVE	WD,[IOWD 200,UFDBUF]
	MOVEM	WD,RDHED
	SETZM	RDHED+1
	TLNE	F,FL.ACC	;SKIP IF READING AUXACC.SYS
	AOS	ACCKNT		;KEEP COUNT OF BLOCKS READ ON ACCT.SYS
	IN	UFD,RDHED
	  JRST	RDUFD1		;[562] ALL SET
	STATO	UFD,IO.EOF	;[562] END OF FILE?
	  JRST	NOSYS		;[562] NO - ANYTHING ELSE IS FATAL
	POPJ	P,0		;YES. NONSKIP RETURN

RDUFD1:	AOBJN	WD,.+1		;NEXT WORD
	MOVEM	WD,RDHED
	MOVE	WD,0(WD)	;GET DATUM

IFE	FASTLG,<
	TLON	F,FL.RAS	;FIRST WORD?
	JRST	RDUFD2		;YES. GO MAKE SPECIAL CHECKS
>
IFN	FASTLG,<
	TLO	F,FL.RAS	;JUST SET IT, NO SKIP
>
	AOS	0(P)		;SKIP RETURN
	POPJ	P,0

	IFN	PSWCHG,<		;[557]

;ROUTINE TO UPDATE ACCT.SYS IN PLACE WITH NEW PASSWORD
;WE SIMPLY ENTER ACCT.SYS IN UPDATE MODE AND REWRITE
;THE RELEVANT BLOCK WITH THE NEW PASSWORD
;CAUTION - WTHED IS USED FOR TWO DIFFERENT THINGS:
;THE I/O CMD LIST FOR WRITING ACCT.SYS IF IT CAN BE ENTERED,
;OR THE NUMBER OF TIMES LEFT TO RETRY IF IT CAN'T

WTUFD:	MOVEI	T1,^D60		;[557] # OF TIMES TO RETRY
	MOVEM	T1,WTHED	;[557] SAVE IT AWAY
	PUSHJ	P,CLRRIB	;[557] CLEAR EXTENDED LOOKUP BLOCK
	MOVE	T1,[SIXBIT /ACCT/]
	MOVEM	T1,SECBUF+.RBNAM
	MOVSI	T1,(SIXBIT /SYS/)
	MOVEM	T1,SECBUF+.RBEXT
	MOVE	T1,SYSPPN
	MOVEM	T1,SECBUF+.RBPPN
	MOVEI	T1,.RBTIM	;[557] GET ARG COUNT
	MOVEM	T1,SECBUF+.RBCNT
	LOOKUP	UFD,SECBUF	;[557] LOOK IT UP
	  JRST	NOSYS		;[557] THIS IS FATAL
	MOVE	T1,W.ACCT	;[557] GET LAST CREATION DATE-TIME
	CAME	T1,SECBUF+.RBTIM;[557] CHANGED?
	   JRST	NOPE		;[557] YES - DON'T TRY ANYTHING THEN
	HLLZ	T1,SECBUF+.RBEXT
	MOVEM	T1,SECBUF+.RBEXT
	MOVSI	T1,777000	;[557] MASK ALL BUT PROTECTION BITS
	ANDM	T1,SECBUF+.RBPRV;[557] ..

AGAIN:	ENTER	UFD,SECBUF	;[557] TRY TO ENTER FOR UPDATE
	  JRST	ANALYZ		;[557] FIGURE OUT WHAT HAPPENED
	MOVE	T1,SAVBLK	;[624] GET DESIRED BLOCK NUMBER
	USETI	UFD,(T1)	;[557] SET UP TO READ IT
	MOVE	T1,[IOWD 200,UFDBUF]
	MOVEM	T1,WTHED	;[557] SET UP I/O CMD LIST
	SETZM	WTHED+1		;[557] ..
	IN	UFD,WTHED	;[557] READ THE BLOCK
	 SKIPA			;[557] OK
	  JRST	NOSYS		;[557] THIS SHOULD NEVER HAPPEN

;****STILL IN IFN PSWCHG

	MOVE	T2,SAVPOS	;[557] GET POINTER TO WORD WITHIN BLOCK
	MOVE	T1,(T2)		;[624] GET PSWD FROM FILE
	CAME	T1,CODE		;[557] SAME AS ONE WE LOGGED IN WITH?
	  JRST	NOPE		;[557] NO - DON'T TRY ANYTHING
	MOVE	T1,ENTRY+CODWRD	;[557] GET NEW PSWD
	MOVEM	T1,(T2)		;[624] REPLACE OLD ONE
	MOVE	T1,SAVBLK	;[624] GET BLOCK TO WRITE
	USETO	UFD,(T1)	;[557] SELECT IT
	OUT	UFD,WTHED	;[557] WRITE IT
	  JRST	WTUFD1		;[624] ALL SET
NOPE:	WARN	CCP,<Couldn't change password>
	  JFCL
WTUFD1:	CLOSE	UFD,0		;[624] FINISH UP AND
	POPJ	P,		;[557] RETURN


ANALYZ:	HRRZ	T1,SECBUF+.RBEXT;[557] GET ERROR CODE
	CAIE	T1,ERFBM%	;[557] FILE BEING MODIFIED?
	  JRST	NOPE		;[557] NO - GIVE UP
	SOSGE	WTHED		;[557] COUNT DOWN TIMER
	  JRST	NOPE		;[557] LOST PATIENCE
	MOVEI	T1,1		;[557] SLEEP FOR
	SLEEP	T1,		;[557] ONE SECOND
	JRST	AGAIN		;[557] KEEP GOING
	>			;[557] END IFN PSWCHG

IFE	FASTLG,<
RDUFD2:	HRRZM	WD,ENTSIZ	;SAVE SIZE OF ENTRIES
	HLRZS	WD
	CAIL	WD,ACC506	;[356] 
	CAILE	WD,ACC602	;[356] 
	JRST	BADFOR
	CAIN	WD,ACC601
	SETOM	NEWACT		;FLAG WE HAVE THE NEW FORMAT
	POP	P,0(P)		;REMOVE SUBR ENTRY
	JRST	RDACCT		;AND TRY AGAIN TO READ A BLOCK
>;*** END OF CONDITIONAL ON FASTLG
BADFRA:	MOVEI	CH,ERR.NF	;NON FATAL ERROR
	JRST	BADFR1

BADFOR:	MOVEI	CH,ERR.SS	;STOP SCHEDULING
BADFR1:	MOVEI	M,BDFRMS
	JRST	NOSYS1

MONTAB:	ASCII	/-Jan-/
	ASCII	/-Feb-/
	ASCII	/-Mar-/
	ASCII	/-Apr-/
	ASCII	/-May-/
	ASCII	/-Jun-/
	ASCII	/-Jul-/
	ASCII	/-Aug-/
	ASCII	/-Sep-/
	ASCII	/-Oct-/
	ASCII	/-Nov-/
	ASCII	/-Dec-/

WEEKDA:	ASCIZ	.Wed.
	ASCIZ	.Thur.
	ASCIZ	.Fri.
	ASCIZ	.Sat.
	ASCIZ	.Sun.
	ASCIZ	.Mon.
	ASCIZ	.Tue.

	PRGEND
	TITLE	LGNERR - Error messages and typeout for LOGIN

	SEARCH	C,SCNMAC,LGNUNV

	LGNDCL

	SUBTTL	Error conditions

LGNMLB:
NOMFDP:	MOVEI	M,[ASCIZ /LGNMLB May not login as MFD PPN
/]
	JRST	ERR1

LGNP1P:
NOREMT:	MOVEI	M,[ASCIZ /LGNP1P Project 1 may not be PTY
/]
	JRST	ERR1

LGNIPS:
PTHERR:	MOVEI	M,[ASCIZ /LGNIPS Invalid path specification
/]
	JRST	ERR1

LGNBPN:
PPERR:	MOVEI	M,[ASCIZ /LGNBPN Invalid format for project-programmer number
/]
	TRO	F,R.FMT
	JRST	ERR1

PPERR1:	PUSHJ	P,CODGET	;GET PSW TO MAKE IT LOOK GOOD
	PUSHJ	P,.TCRLF##
	MOVEM	T1,CODE		;SAVE THE PASSWORD HE TRIED
BADNAM:			;ALL SAME ERROR, SO DONT HELP HACKERS
LGNIET:
TRYAGN:	MOVEI	M,[ASCIZ /LGNIET INVALID ENTRY - Try again
/]
	MOVE	T1,TTBITS	;[625] GET BITS FOR CNTRLNG TTY
	TXNN	T1,GL.DSL!GL.ITY;[625] DATASET OR PTY?
	  JRST	ERR1		;[625] NO - DON'T SLEEP, THEN
	MOVEI	T1,3		;[625] YES - SLEEP TO MAKE IT HARD
	SLEEP	T1,		;[625] TO BREAK SECURITY
	JRST	ERR1		;[470]

A2MANY:	TROE	F,R.2MNY	;[470] TYPED MESSAGE ALREADY?
	  POPJ	P,		;[470] YES - DON'T BE A BLABBERMOUTH
	WARN	A2M,<Attempt to assign too many devices with /ASSIGN>
	  JFCL			;[470] 
	POPJ	P,		;[470] RETURN
ERR1:	PUSHJ	P,.CLRBF##	;CLEAR TYPE-AHEAD
	SETZM	TIB+2		;AND REST OF THIS BUFFER
	TLNE	F,FL.ATT	;NO SKIP IF ATTACH
IFE FAILOG,<JRST NOATT		;NO RETRIES FOR ATTACH>
IFN FAILOG,<JRST ERR2		;GO LOG THE FAILURE>
	SOSG	LOGTRY
	JRST	FLUSH
	MOVEI	CH,ERR.FT	;FATAL ERROR
	PUSHJ	P,ERRLIN
	TRZE	F,R.FMT		;NO SLEEP OR ERROR LOG IF SYNTAX ERROR
	JRST	LOGIN3		;[517] JUST RETRY
IFN	FAILOG,<
ERR2:	PUSHJ	P,ACCTA		;SETUP FACT FILE ENTRY FOR FAILURE
	MOVE	T1,FCTFMD	;MODIFY HEADER FOR FAILURE TYPE AND EXTENDED LEN
	ADDM	T1,FCTDAT
	MOVE	T1,CODE		;THIS IS THE PASSWORD HE TRIED
	MOVEM	T1,FCTDAT+3	;HANG ONTO IT
	MOVE	T1,CNTLJP	;THIS IS THE PPN OF THE CONTROL JOB
	MOVEM	T1,FCTDAT+4
	MOVE	P2,FCTFWD	;GET FAILURE HEADER WORD
	PUSHJ	P,.FACTR##	;[623] STICK THE WHOLE THING INTO FACT.SYS
	TLNE	F,FL.ATT	;ATTACH?
	JRST	NOATT		;YES, NO RETRIES
>;END OF CONDITIONAL ON FAILOG
	JRST	LOGIN3		;[517]

NOATT:	MOVEI	M,NOATMS	;CANT ATTACH MESSAGE
	PUSHJ	P,MSG		;COMPLAIN ABOUT ATTACH FAILING
	JRST	FLUSH		;AND GIVE UP
NOSYS:	TLNE	F,L.OPR!L.SOPR	;SKIP IF NOT OPR OR SON OF OPR
	JRST	PSWOK		;CTY OR OPR CAN LOGIN EVEN IF NO ACCT.SYS
	STOP	CAF,<Can't access system files.  Please call the operator.>
NOSYS1:	PUSHJ	P,ERRLIN

FLUSH:	CLRBFI			;CLEAR ANY TYPE-AHEAD
	MOVEI	M,KLGMSG	;TYPE KJOB TO INDICATE FLUSHED
	MOVN	T1,THSJOB	;[510] GET NEGATIVE JOB NUMBER
	JOBSTS	T1,		;[510] GET MY STATUS
	  SKIPA			;[510] EH?
	TXNN	T1,JB.ULI	;[510] LOGGED IN?
	PUSHJ	P,MSG		;[510] NO - TELL HIM WE LOGGED OUT
	MOVEI	CH,4		;TURN OFF TERMINALS THAT KNOW HOW
	PUSHJ	P,TYO
	JRST	FLUSHX		;GO CLEAR CORE AND KJOB
	SUBTTL	Error message printer

;CALLED ONLY BY MACROS
ERRMSG:	PUSHJ	P,.PSH4T##	;SAVE T1 THRU T4
	PUSHJ	P,NEWLIN	;GET START OF A NEW LINE
	TXNE	EF,EF.REQ	;[477] REQUE BATCH JOB?
	MOVE	T1,["?",,[ASCIZ .?(5).]]  ;[477] YES
	TXNE	EF,EF.SYS	;SYSTEM FAILURE
	MOVE	T1,["?",,[ASCIZ .?(4).]] ;YES--DATA FOR THAT
	TXNE	EF,EF.ERR	;FATAL ERROR
	MOVE	T1,["?",,[ASCIZ .?(3).]]
	TXNE	EF,EF.WRN	;WARNING?
	MOVE	T1,["%",,[ASCIZ .%(1).]]
	TXNE	EF,EF.INF	;INFORMATIONAL
	MOVE	T1,["[",,[ASCIZ .[.]]
	TLNN	F,FL.BAT	;[600] 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:	TLO	E1,'LGN'	;SET UP PREFIX
;***TEST FOR /VERB:PREFIX HERE
	MOVE	T1,E1		;COPY PREFIX
	PUSHJ	P,.TSIXN##	;TYPE IN SIXBIT
	PUSHJ	P,.TSPAC##	;PRINT A SPACE
;HERE TO PRINT ERROR LINE
ERMSG2:	;***TEST FOR /VERB:FIRST
	MOVEI	T1,(EF)		;COPY STRING POINTER
	PUSHJ	P,.TSTRG##	;PRINT THE STRING
	TXNE	EF,EF.ERR!EF.SYS!EF.REQ ;[503] IS THIS A FATAL ERROR?
	JRST	TNOTE		;[347] YES--GO FLUSH USER
	HLRZ	T1,@-4(P)	;GET RETURN INSTRICTION
	CAIN	T1,(JFCL)	;IS IT A JFCL?
	PUSHJ	P,[TXNE  EF,EF.INF	;NEED A CLOSE BRACKET
		   PUSHJ P,.TRBRK## ;YES--PUT IT ON
		   PJRST .TCRLF##];ADD A CRLF
	PUSHJ	P,.POP4T##	;RESTORE TEMPS
	PJRST	.POPJ1	;SKIP RETURN (INDICATING PRINT REST)

TNOTE:	PUSHJ	P,.TCRLF##	;[347] DO A CRLF
	PUSHJ	P,.TCRLF##	;[347] AND ANOTHER
	MOVE	T1,[SIXBIT /LOGIN/]	;[615]
	SETNAM	T1,		;[357] CLEAR JACCT
	PUSHJ	P,DIEMSG	;[621] TYPE MESSAGES OF THE DAY
	PJRST	FLUSH		;[347] AND DIE

;SUBROUTINE TO START AN ERROR LINE WITH ?(#) (# IF PTY)
;ARGS	M=ADDR OF ASCII TEXT
;	CH=ERROR CODE IF BATCH

ERRLIN:	HRLM	CH,(P)		;REMEMBER ERROR CODE
	MOVEI	CH,"?"		;START WITH QUESTION MARK
	PUSHJ	P,TYO		;TYPE IT
	MOVE	CH,TTBITS	;GET TTY CHARACTERISTICS
	TXNN	CH,GL.ITY	;SKIP IF PTY JOB
	PJRST	MSG		;NO, TYPE TEXT AND RETURN
	MOVEI	CH,"("		;PAREN FOR CONSISTENCY CHECKING
	PUSHJ	P,TYO		;TYPE IT
	HLRZ	CH,(P)		;RESTORE ERROR CODE.
	MOVEI	CH,"0"(CH)	;CONVERT TO ASCII
	PUSHJ	P,TYO
	MOVEI	CH,")"		;FINISH UP
	PUSHJ	P,TYO		;TYPE IT
	PJRST	MSG		;TYPE TEXT AND RETURN
	SUBTTL	Random messages

KLGMSG:	ASCIZ	/
.KJOB
./
CRLFPD:	ASCIZ	/
./
LGNCAJ:
NOATMS:	ASCIZ	/
?LGNCAJ  Can't ATTACH to job/
LGNMNL:
NOTSMS:	ASCIZ	/LGNMNL May not LOGIN /
LGNMNA:
NOTSAT:	ASCIZ	/LGNMNA May not ATTACH /
NOTSM1:	ASCIZ	/local
/
NOTSM2:	ASCIZ	/remote
/
NOTSM3:	ASCIZ	/data set
/
NOTSM4:	ASCIZ	/remote CTY or OPR
/
NOTSM5:	ASCIZ	/as a BATCH job subjob
/
NOTSM6:	ASCIZ	/as a BATCH job
/
LGNWFV:
BDFRMS:	ASCIZ	/LGNWFV Wrong Format Version Number in system files
?LGNCTO Please call the operator.
/
	SUBTTL	Data and storage

;STORAGE

WATBTS:	POINT	5,ENTRY+PROWRD,4
SPLBTS:	POINT	5,ENTRY+PROWRD,9
IFN	FASTLG,<
ENTSIZ:	16			;SIZE OF ACCT.SYS ENTRIES
DACCFL:	0			;DIRECTORY IS NOT BUILT
DLOCK:	-1			;AND NO-ONE IS BUILDING IT
DAUXFL:	0			;AUX TABLE MUST ALSO BE BUILT
DACCL:	0			;EXPECTED LENGTH OF ACCT.SYS = LENGTH OF TABLE
PDACC:	0			;ADDR OF DIRECTORY OF ACCT.SYS
NEWACT:	0			;-1 IF NEW ACCT.SYS 0 IF V2
EQACT:	0			;[504] -1 IF SETTING 6.02 STUFF

;THE FOLLOWING WORDS CONTAIN THE CREATION DATE-TIME OF
;THE ACCOUNTING FILES THE LAST TIME THEY WERE READ SO WE CAN
;TELL IF THEY HAVE CHANGED.
W.ACCT:	0			;[540] ACCT.SYS
W.AUX:	0			;[540] AUXACC.SYS
W.SCED:	0			;[540] SCDMAP.SYS
>;*** END OF CONDITIONAL ON FASTLG
SCDTBL::0			;[425] ADDR OF SCHED TABLE
BLDSCD::0			;[425] -1 MEANS SCHED TABLE BEING BUILT
SCDBLT::-1			;[425] -1 MEANS TABLE NOT YET BUILT
	PRGEND
	TITLE	LGNEND - Exit sequence for LOGIN

	SEARCH	C,SCNMAC,LGNUNV
	LGNDCL



;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
	SKIPL	CCWAIT		;DO WE WANT CONTROL-C HELD UP?
	JRST	CCEXIT		;NO--CHARGE AHEAD
	INFO	WFC,<Please wait for Control-C>
	  JFCL
	OUTPUT	TTY,		;SPIT IT OUT
	SETOM	CCTYPED		;SET THE FLAG
	POPJ	P,0		;RETURN

CCEXIT:	PUSHJ	P,.ISLGI##	;ARE WE LOGGED IN?
	AOJE	T1,.MNRET##	;IF NOT ALLOW SCAN TO SAY KJOB
	WARN	LAC,<LOGIN aborted by Control-C - job is LOGGED-IN>
	  JFCL
	JRST	CCLAST		;EXIT QUICKLY
LAST:	TLNE	F,FL.ATT	;SKIP IF LOGIN, NOT IF ATTACH
	JRST	ALAST		;FINISH UP ATTACH
	PUSHJ	P,PRVSET	;DO PRIV. SET UUOS

IFN FTTASK,<			;[543] CALL EXTERNAL MODULE TO SEE IF
	PUSHJ	P,RNMAIL##	;[543] USER HAS ANY MAIL
>;[543] END IFN FTTASK

	MOVE	T1,LGIARG	;NOW LOG THE GUY IN
	LOGIN	T1,
	  JFCL
	SKIPN	ENTRY+RCNWRD	;[563] UNLESS WE'RE GOING TO RUN A CUSP,
	  PUSHJ	P,CTLCOK	;[563] ALLOW CONTROL-C TO WORK AGAIN
	PUSHJ	P,USRSET	;[363] DO ORDINARY SETUUO'S (AND TRMOP.S)
	PUSHJ	P,DAYMES	;[472] PRINT OUT DAILY MESSAGES
	PUSHJ	P,POSTMS	;[472] DO POST-MESSAGE TRMOP.S (SPEED)
	OUTPUT	TTY,		;[510] DUMP TTY BUFFERS
	SKIPN	ENTRY+RCNWRD	;SKIP IF USER IS LOCKED INTO A PROGRAM
	PUSHJ	P,.RUNCM##	;PROCESS /RUN IF ANY
CCLAST:	CLOSE	TTY,0		;[510] CLOSE OUT TTY
	SKIPN	T4,ENTRY+RCNWRD	;SKIP IF RUN UUO TO BE EXECUTED
	JRST	NORUN		;NO, DONT SET IT UP
	SKIPN	T3,ENTRY+RCDWRD	;YES, SKIP IF DEVICE SPECIFIED
	MOVSI	T3,(SIXBIT .SYS.)	;NO, ASSUME SYS
	SETZB	P1,P2
	MOVE	N,ENTRY+RCPWRD	;PPN
NORUN:	SETZB	M,LASTX		;CLEAR CORE
	MOVE	WD,TOLO1
NORUN1:	MOVE	T1,[XWD LASTX,LASTX+1]
	SKIPN	.JBDDT##	;SKIP THIS IF DDT IS LOADED
	BLT	T1,@.JBREL
	SETZM	.JBSA		;CLEAR START ADDRESS SINCE PROG NO LONGER THERE
	MOVE	T1,[XWD TOLO,LASTX]
	BLT	T1,LASTX+ETOLO-TOLO	;TRANSFER TO LOW SEG
	MOVEM	WD,LASTX+TOLO1-TOLO
	JUMPE	T4,LASTX+FRUN-TOLO	;JUMP IF NO RUN UUO
	SETZB	T3+3,T3+5	;CLEAR UNUSED ARGS
	JRST	LASTX		;DO RUN UUO
;THE CODE ON THIS PAGE IS COPIED TO THE LOWSEG AND EXECUTED
; FROM THERE. THIS IS DONE WITHOUT BENIFIT OF RELOCATION
; SO BE CAREFUL

TOLO:	MOVEI	WD,T3
	RUN	WD,		;RUN CUSP
FRUN:	SETZ	T1,		;NO RUN UUO OR RUN UUO FAILED
	SETNAM	T1,		;CLEAR NAME
	HRLI	T1,1		;[576] GET RID OF HI SEG
	HRRI	T1,1		;[576] AND SHRINK LOW SEG TO 1K
	SKIPN	.JBDDT##
	CORE	T1,
	  JFCL
TOLO1:	MONRT.
ETOLO:	EXIT			;AND EXIT IN CASE OF CONTINUE
ALAST:	MOVEI	T1,.GTPPN	;GET PPN OF JOB THAT I AM ABOUT
	HRL	T1,ATTJOB	;  TO ATTACH TO
	GETTAB	T1,		;[157]
	  JRST	NOATT		;     CAN'T GET PPN, CAN'T ATTACH
	CAME	T1,PPN		;PPN'S DIFFER?
	  JRST	NOATT		;  YES, CAN'T ATTACH
	HRRZ	T1,ATTJOB	;[611] JOB NO. TO ATTACH TO
	TRMNO.	T1,		;[611] SEE OF SOMEONE ALREADY THERE
	  JRST	ALAST1		;[611] LOOKS OK SO FAR
	JRST	NOATT		;[611] DON'T DETACH - SQUATTER'S RIGHTS
ALAST1:	MOVN	T1,ATTJOB	;[611] DO MORE CHECKING ON JOB
	JOBSTS	T1,		;[611] ..
	  JRST	NOATT		;[611] FUNNY JOB NUMBER?
	JUMPGE	T1,NOATT	;[611] IF JNA NOT SET, DIE
ALAST2:	MOVEI	M,CRLFPD
	PUSHJ	P,MSG		;MAKE IT LOOK GOOD
	RELEASE	TTY,		;[461] CLOSE OUT TTY
	SETO	T1,		;[420] MAKE T1=-1
	GETLCH	T1		;[420] GET LINE NUMBER AND BITS
	CAME	T1,[-1]		;[420] IF GETLCH A NO-OP OR
	TRNN	T1,-1		;[420] LINE IS DETACHED, THEN
	  JRST	NOATT		;[420] ATTACH HAD BETTER LOSE
	TRZ	T1,600000	;[420] CLEAR UDX BITS
	MOVSI	T1,400000(T1)	;[420] SET UP LINE NO., MONITOR MODE
	HRR	T1,ATTJOB	;[420] GET JOB NUMBER
	ATTACH	T1,		;ATTACH JOB TO TTY
	  JRST	NOATT		;WOOPS, COULDNT!

FLUSHX:	CLOSE	TTY,0		;[456] FLUSH TTY BUFFER
	RESET			;TURN ON ECHOING
	SKIPE	T1,.JBDDT##	;SKIP IF NO DDT
	JRST	[OUTSTR [ASCIZ /DDT/]
		 JRST (T1)]
	SETZB	T4,LASTX	;CLEAR CORE IF UNSUCCESSFUL LOGIN
	MOVE	WD,[LOGOUT]	;KILL KJOB
	JRST	NORUN1

	PRGEND
	TITLE	LGNLOW - Low segment for LOGIN

	SEARCH	C,SCNMAC,LGNUNV
	GLOBS		;DECLARE GLOBALS

DEFINE	LWORD(A),<
A::	BLOCK	1
>

DEFINE	LBLOCK(A,B),<
A::	BLOCK	B
>

	TWOSEG
	RELOC	400000
IFN FACTSW,<
FCTAHD:	XWD	240000,3
FCTHED:	XWD	100000,3
FCTFMD:	XWD	20000,2		;MODIFIER FOR FAILURE-TYPE ENTRIES
;** DO NOT SEPARATE THESE TWO LINES **

FCTWD:	XWD	-3,FCTDAT
FCTFWD:	XWD	-5,FCTDAT	;APPEND CONTROL WORD FOR FAILURES
>

LGIARG:	XWD	PPN-CHGNO-1,PPN	;ARGUMENT TO LOGIN UUO
PDPLST:	IOWD	PDLSIZ,PDL

	RELOC
	LOWVAR
	END