.TITLE HELLO -- LOGON PROCEDURE FOR RSX11D .IDENT /JRBARR/ .MCALL SMACIT SMACIT ;SET UP SUPERMAC MACROS .MCALL QIOW$,DIR$,EXIT$S,GMCR$,CALL,RETURN,FDBDF$,FDOP$A .MCALL FINIT$,FSRSZ$,GCMLD$,GCMLB$,GCML$,MRKT$,CMKT$ .MCALL RQST$,GTIM$,VSDR$ ; ; INTERNAL MACROS ; .MACRO .ENB MOV (SP)+,PSEXP .ENDM .ENB ; ; EQUATED SYMBOLS ; SPACE=40 SYLUN=4 TILUN=5 PSEXP=177776 ;PROCESOR STATUS WORD UPAR2=177644 ;USER PAGE ADDRESS 2 UPDR2=177604 ;USER PAGE DESCRIPTOR 2 H.PD2=6 H.PA2=26 ; ; LOCAL PURE DATA ; .PSECT PURE,RW CTL: .BYTE -4,40 ;READ ALL ATTRIBUTES .WORD ATTBFR .WORD 0 PWD: .ASCII /PASSWORD>/ PRMTLN=.-PWD SYSPSW: .ASCIZ /I AM NOT A TURKEY/ SYS: .ASCII /SYSTEM PASSWORD>/ SYSSIZ=.-SYS GDBYE: .ASCII /YOU BLEW IT --- GOOD-BYE/ GDBYEL=.-GDBYE BADPWD: .ASCII /HEL -- ILLEGAL PASSWORD/ LENG1=.-BADPWD SYNMSG: .ASCII /HEL -- SYNTAX ERROR/ SYNLN=.-SYNMSG RDFAIM: .ASCII /HEL -- READ FAILURE ON DIRECTORY ENTRY/ RDFAIL=.-RDFAIM .EVEN RDFAID: QIOW$ IO.WVB,TILUN,1,,IOSB,, DIRFLM: .ASCII /HEL -- DIRECTIVE FAILURE/ DIRFLL=.-DIRFLM BDPRSM: .ASCII /HEL -- NON-EXISTENT ACCOUNT/ BDPRSL=.-BDPRSM .EVEN DIRFLD: QIOW$ IO.WVB,TILUN,1,,IOSB,, BDPRSD: QIOW$ IO.WVB,TILUN,1,,IOSB,, RDATTR: QIOW$ IO.RAT,4,1,,IOSB,, PRTPWD: QIOW$ IO.WVB,TILUN,1,,IOSB,, SYNERR: QIOW$ IO.WVB,TILUN,1,,IOSB,, ILLPWD: QIOW$ IO.WVB,TILUN,1,,IOSB,, RQTPWD: QIOW$ IO.RLB+16.,6,1,,IOSB,, RQTPSW: QIOW$ IO.RLB+16.,6,1,,IOSB,, SYSPWD: QIOW$ IO.WVB,TILUN,1,,IOSB,, GOODBY: QIOW$ IO.WVB,TILUN,1,,IOSB,, CANMKT: CMKT$ KILQIO: QIOW$ IO.KIL,TILUN,2,,KIIOSB RQSTD: RQST$ ...MCR GTIM: GTIM$ TIME SNDRR: VSDR$ LOGGER,,,1,1,SNDBUF,12. BYE: .RAD50 /BYE/ HEL: .RAD50 /HEL/ ; ; LOCAL IMPURE DATA ; FSRSZ$ 1 .PSECT ,RW ATTBFR: .BLKB 40 FDB: FDBDF$ FDOP$A SYLUN DSP: .WORD 0,0,0,0,0,0 BUFFER: .BLKB 6. SNDBUF: ACTION: .RAD50 /HEL/ SETUIC: .WORD 0 ;HOLDS LOGON PPN DEVICE: .WORD 0 ;ASCII DEVICE NAME OF TERMINAL UNIT: .WORD 0 ;BINARY UNIT NUMBER OF TERMINAL TIME: .BLKW 8. ;GET TIME PARAMETERS DECNUM: .WORD 0 LGMSK: .WORD 0 ;MASK FOR LOGON ATTRIBUTES IOSB: .WORD 0,0 KIIOSB: .WORD 0,0 MRKTIM: MRKT$ 2,10.,2,KILRQT CMDBLK: GCMLB$ ,HEL,MCRLN,TILUN MCRLN: .BLKW 41. SYSPW: .BLKW 41. .PAGE .PSECT PURE,RW HELLO: FINIT$ REPEAT LET MRKTIM+M.KTMG := #10. ;SET TIMEOUT VALUE IN SECONDS DIR$ #MRKTIM ;ISSUE MARK TIME ON.NOERROR GCML$ #CMDBLK ;GET MCR LINE ON.NOERROR DIR$ #CANMKT ;GET RID OF MARKTIME ON.NOERROR LET R2 := G.CMLD(R0) ;MCR COMMAND LINE LENGTH ELSE JUMPTO CALMCR END ELSE JUMPTO CALMCR END ELSE JUMPTO CALMCR END UNTIL R2 NE #0 ;WE GOT A COMMAND LINE LET R2 := G.CMLD+2(R0) ;STARTING ADDRESS OF COMMAND LINE LET DSP+6 := R2 ;SAVE IT FOR LATER IFB (R2)+ NE #'[ THEN JUMPTO SYN LET DECNUM := #8. CALL GETNUM ;CONVERT OCTAL GROUP NUMBER TO BINARY IF R1 EQ #0 OR #177400 SET.IN R1 THEN JUMPTO SYN FI LET SETUIC+1 :B= R1 ;SAVE BINARY GROUP CODE IFB R5 NE #54 THEN JUMPTO SYN CALL GETNUM ;CONVERT OCTAL PROGRAMMER CODE TO BINARY IF R1 EQ #0 OR #177400 SET.IN R1 THEN JUMPTO SYN FI LET SETUIC :B= R1 ;SAVE BINARY PROGRAMMER CODE IFB R5 NE #'] THEN JUMPTO SYN LET DSP+4 := R2 - DSP+6 ;COMPUTE LENGTH OF UIC STRING ;MUST NOW CHANGE THE UIC UNDER WHICH HELLO IS RUNNING TO BE THE ;UIC WHICH THE USER WANTS TO LOGON TO. THIS IS NECESSARY ;TO ENSURE THAT HELLO HAS ACCESS RIGHTS TO THE PASSWORD IT NEEDS ;TO READ TO ACCOMPLISH THE LOGON. LET R0 := .CRTSK ;ADDRESS OF OUR ATL NODE LET R2 := A.TI(R0) ;PUD ADDRESS OF REQUESTOR IF #10 SET.IN U.C3(R2) AND #UT.LG OFF.IN U.TF(R2) THEN ;DIAL UP LINE DIR$ #SYSPWD ON.ERROR THEN JUMPTO CALMCR IF IOSB LT #0 THEN JUMPTO CALMCR LET MRKTIM+M.KTMG := #20. DIR$ #MRKTIM ON.ERROR THEN JUMPTO CALMCR DIR$ #RQTPSW ON.ERROR THEN JUMPTO CALMCR IF IOSB LT #0 THEN JUMPTO CALMCR DIR$ CANMKT IFB IOSB EQ #IE.ABO THEN JUMPTO CALMCR LET R5 := #0 WHILEB SYSPSW(R5) NE #0 IFB SYSPSW(R5) NE SYSPW(R5) THEN JUMPTO BADSPW LET R5 := R5 + #1 END FI $PUSH #77406,A.HA(R0) ;SET UP MAPPING REQUIREMENTS CALL ..SPD2 ;MAP INTO TASK HEADER BY APR 2 LET 40000+H.UIC := SETUIC CALL ..SPD2 ;MAP BACK TO USER SPACE CMP (SP)+,(SP)+ ;CLEAN THE STACK LET R0 := #FDB ;ADDRESS OF FILE DESCRIPTOR BLOCK LET R1 := #FDB+F.FNB ;ADDRESS OF FILE NAME BLOCK IN FDB LET R2 := #DSP ;DIRECTIVE STATUS BLOCK LET R3 := #0 CALL .PARSE ON.ERROR THEN GOTO ERR3 DIR$ #RDATTR ON.ERROR THEN GOTO ERR1 IF IOSB LT #0 THEN GOTO ERR2 IFB SETUIC+1 HI #10 THEN LET LGMSK := LGMSK OFF.BY #UT.PR ELSE LET LGMSK := LGMSK SET.BY #UT.PR FI IFB ATTBFR+32 NE #0 THEN DIR$ #PRTPWD ON.ERROR THEN GOTO CALMCR IF IOSB LT #0 THEN GOTO CALMCR LET MRKTIM+M.KTMG := #10. DIR$ #MRKTIM ON.ERROR THEN GOTO CALMCR DIR$ #RQTPWD ON.ERROR THEN GOTO CALMCR IF IOSB LT #0 THEN GOTO CALMCR DIR$ #CANMKT IFB IOSB EQ #IE.ABO THEN GOTO CALMCR LET R5 := #0 WHILEB ATTBFR+32(R5) NE #0 AND R5 LE #6 IFB ATTBFR+32(R5) NE MCRLN(R5) THEN GOTO BADPSW LET R5 := R5 + #1 END FI LET R4 := .CRTSK ;PASSWORD IS VALID SO PUT LET R5 := A.TI(R4) ;UIC INTO TI PUD ASSOCIATED IF #UT.LG SET.IN U.TF(R5) THEN $PUSH SETUIC LET SETUIC := U.UI(R5) LET ACTION := BYE CALL LOGIT LET ACTION := HEL $POP SETUIC FI LET U.UI(R5) := SETUIC ;WITH THIS TI LET U.TF(R5) := U.TF(R5) SET.BY #UT.LG OFF.BY #UT.PR SET.BY LGMSK CALL LOGIT ;INFORM LOGGER TASK OF LOGON CALMCR: LET R5 := .CRTSK LET R5 := A.RQ(R5) IF S.TN+2(R5) NE RQSTD+R.QSTN+2 THEN DIR$ #RQSTD FI GOTO EXIT .PAGE SYN: DIR$ #SYNERR GOTO CALMCR ERR1: DIR$ #DIRFLD GOTO EXIT ERR2: DIR$ #RDFAID GOTO EXIT ERR3: IFB #IE.NSF NE F.ERR(R0) THEN GOTO ERR2 DIR$ #BDPRSD GOTO EXIT BADPSW: DIR$ #ILLPWD GOTO EXIT EXIT: EXIT$S KILRQT: DIR$ #KILQIO GOTO CALMCR BADSPW: DIR$ #GOODBY LET R0 := .CRTSK ;ATL ADDRESS LET A.TF(R0) := A.TF(R0) OFF.BY #AF.GC GOTO EXIT .PAGE ; GETNUM ; ; ; ROUTINE TO DECODE A NUMBER ; ; CALLING SEQUENCE: ; 'DECNUM' -- 8. (IF OCTAL) OR 10. (IF DECIMAL) ; R2 -- BUFFER POINTER ; CALL GETNUM ; ; ; ERROR RETURN GOES DIRECTLY TO 'SYNERR' ; ; OUTPUT: ; R1 -- RETURNED VALUE ; R5 -- TERMINATOR ; ; PROCEDURE GETNUM LET R4 := #6 LET R1 := #0 THRU R4 LET R5 :B= (R2)+ ;PICK UP A CHARACTER IF R5 LE #57 THEN RETURN FI IF R5 GT #67 THEN IF DECNUM NE #10. OR R5 GT #70 THEN RETURN FI FI CLC LET R1 := R1 * DECNUM ;COMPUTE NEW NUMBER ON.ERROR TST (SP)+ GOTO SYN END LET R5 := R5 OFF.BY #177760 ;MAKE OCTAL OR DECIMAL NUMBER LET R1 := R1 + R5 ;AND ADD IT IN TO SUM END ENDPROCEDURE GETNUM .PAGE ; ; LOGIT ; ; ROUTINE TO REQUEST LOGGER TO RECORD LOGON ; ; PROCEDURE LOGIT DIR$ #GTIM ;GET TIME DATA LET R0 := .CRTSK ;OUR ATL POINTER LET R0 := A.TI(R0) ;PUD POINTER LET DEVICE := U.DN(R0);ASCII DEVICE NAME LET UNIT :B= U.UN(R0) ;BINARY UNIT NUMBER DIR$ #SNDRR ;SEND LOGGER A PACKET ENDPROCEDURE LOGIT .PAGE ; ..SPD2 ; ; CALLING SEQUENCE: ; MOV PAGE DESCRIPTOR -(SP) ; MOV PAGE ADDRESS REGISTER -(SP) ; CAL ..SPD2 ; ; EXIT CONDITIONS: ; ; STACK CONTAINS OLD PAGE AND ADDRESS DESCRIPTIONS ; ; SPECIAL CONSEIDERATIONS -- PAGE DESCRIPTOR 2 MUST BE RESTORED IF IT ; REFERENCES SYSTEM COMMON AREA ; ; PROCEDURE ..SPD2 $PUSH UPDR2,UPAR2 ;SAVE CURRENT ADDRESS REGISTERS $PUSH R4 LET R4 := .CRTSK ;PICK UP THE CURRENT TASK POINTER $PUSH PSEXP ;SAVE OLD PS LET PSEXP := #144340 LET UPDR2 := #77406 ;SET UP TO LOOK AT TASK HEADER MFPI A.HA(R4) ;GET TASK HEADER BASE ADDRESS $POP UPAR2 ;MOVE INTO PAR LET 40000+H.PA2 := 12(SP) LET 40000+H.PD2 := 14(SP) .ENB LET UPAR2 := 10(SP) LET UPDR2 := 12(SP) $POP R4 ;RESTORE REGISTERS $POP 4(SP),4(SP) ;SAVE OLD PDR'S ENDPROCEDURE ..SPD2 .END HELLO