ASMB,R,Q,C HED RSM 91750-16172 REV 2013 * (C) HEWLETT-PACKARD CO. 1980 NAM RSM,19,20 91750-16172 REV.2013 800314 RTE-IVB W/S.M. SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 2 EXT .CLGN,.CLGF,#DFUN,#PASS,#POOL,#RSAX EXT #RQUE,#LDEF,#RSM,#RPB,#NRVS,#MNUM EXT #SLAV,$OPSY,DTACH,$LIBR,$LIBX,#GETR EXT #NODE,#BREJ,$TIME,#QCLM EXT .DRCT,.LBT,.CBT,.MBT,.MVW,$CVT1 EXT EXEC,LUSES,IDRPD * RQB EQU #RPB * SUP * * NAME: RSM * SOURCE: 91750-18172 * RELOC: 91750-16172 * PGMR: JIM HARTSELL * * * IS THE DS/1000 REMOTE SESSION-MONITOR INTERFACE MODULE. * RUNS IN ALL SESSION-MONITOR NODES AND INSURES THAT REMOTE-USER * ACCESS TO THIS NODE FALLS UNDER THE SAME SYSTEM PROTECTION PROVIDED * BY THE SESSION MONITOR. * * THE FIRST REQUEST SENT FROM EACH REMOTE MASTER WILL TYPICALLY NOT * CONTAIN A DESTINATION SESSION ID IN THE HEADER. RETHREADS * THESE REQUESTS TO . IF THE REQUEST IS AN EXPLICIT LOG-ON REQUEST * (VIA SW/AT COMMANDS OR LOG-ON CALL), WILL CREATE * A SESSION FOR THE SPECIFIED USER-NAME. OTHERWISE, WILL CREATE A * SESSION FOR THE DEFAULT USER-NAME SPECIFIED DURING INITIALIZATION. * ALL SUBSEQUENT REQUESTS BY THE MASTER USER WILL CONTAIN THE IDENTIFIER * FOR THE SESSION AND WILL BE PASSED BY DIRECTLY TO THE SERVING * SLAVE MONITOR (, , ETC.). THE SLAVE MONITORS WILL ATTACH * TO THE SPECIFIED SESSION FOR THE EXECUTION OF THE REQUEST, THEN DETACH. * * SESSIONS WILL BE LOGGED OFF ON REQUEST OF THE USER ( DE/EX * COMMANDS OR LOG-OFF) OR BY AFTER THE PROGRAM TERMINATES. * * ALL ACCESS FROM "OLD NODES" (MESSAGE FORMAT LEVEL 0) WILL BE ASSIGNED * TO THE SAME PERMANENT DEFAULT SESSION, SUCH THAT THE RESULTING SHARED * ACCESS WILL APPEAR TO THE USER AS A NON-SESSION-MONITOR SYSTEM. SKP * GLBLK-START * ****************************************************************** * * * G L O B A L B L O C K REV 2013 791213 * * * * GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY: * * * * REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST * * GET, #SLAV, RQCNV, RPCNV, GRPM, DINIT, PTOPM * * EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3 * * DSTIO, LUMAP, #CMGT, INCNV, OTCNV, RMTIO * * RSM, DLGON, #DISM, #DSSM, #MSSM, #SCSM, #UPSM * ****************************************************************** * ***!!!!! THE ORDER OF THE FIRST 8 WORDS (#STR THRU #LVL) IS * ***!!!!! FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES * ***!!!!! ERROR CODES & LEVEL # ALWAYS BE IN THE SAME PLACE, * ***!!!!! REGARDLESS OF MESSAGE FORMAT. THIS ALSO MAKES * ***!!!!! STORE-AND-FORWARD CODE MUCH SIMPLER. * #STR EQU 0 STREAM WORD. #SEQ EQU #STR+1 SEQUENCE NUMBER. #SRC EQU #SEQ+1 SOURCE NODE #. #DST EQU #SRC+1 DEST. NODE #. #EC1 EQU #DST+1 REPLY ECOD1. #EC2 EQU #EC1+1 REPLY ECOD2. #ENO EQU #EC2+1 NUMBER OF NODE REPORTING ERROR. #ECQ EQU #ENO+1 ERROR CODE QUALIFIER (BITS 4 TO 7) #LVL EQU #ECQ MESSAGE FORMAT LEVEL (BITS 0 TO 3) * #MAS EQU #LVL+1 MA "SEND" SEQ. # #MAR EQU #MAS+1 MA "RECV" SEQ. # #MAC EQU #MAR+1 MA "CANCEL" FLAGS #HCT EQU #MAC+1 HOP COUNT #SID EQU #HCT+1 SESSION ID WORD * #EHD EQU #SID LAST ITEM OF HEADER #MHD EQU #EHD+1 MINIMUM HEADER SIZE #REQ EQU #MHD START OF REQUEST SPECIFIC AREA #REP EQU #MHD START OF REPLY SPECIFIC AREA * #MXR EQU #MHD+24 <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>> #LSZ EQU 2 <<< SIZE OF LOCAL APPENDAGE AREA >>> * ****************************************************************** * * GLBLK-END SKP * OPBLK-START * ****************************************************************** * * * O P R E Q B L O C K REV 2013 791119 * * * * OFFSETS INTO DS/1000 OPREQ MESSAGE BUFFERS, USED BY: * * * * DMESS, OPERM, RQCNV, RPCNV * * RSM, DLGON, #MSSM, #UPSM * ****************************************************************** * * OFFSETS INTO OPREQ REQUEST AND REPLY BUFFERS. * #CML EQU #REQ COMMAND LENGTH. #CMS EQU #CML+1 COMMAND STRING. #LGC EQU #CMS+1 LOGON REQUEST CODE #LNL EQU #LGC+1 LENGTH OF USER NAME #LUN EQU #LNL+1 LOGON USER NAME * #RLN EQU #REP REPLY LENGTH. #MSG EQU #RLN+1 REPLY MESSAGE. * * MAXIMUM SIZE OF OPREQ REQUEST/REPLY BUFFER. * #OLW EQU #CMS+23 M A X I M U M S I Z E ! ! ! * * OPBLK-END SKP A EQU 0 B EQU 1 * RSM EQU * LDB $OPSY RBR,SLB SKIP IF NON-DMS CLA,RSS JMP DTCH STA MOD1 * DTCH JSB DTACH DETACH FROM SESSION. DEF *+1 * RSGET JSB #GETR HANG ON CLASS: READ ENTIRE REQUEST DEF *+4 INTO RSM AND SAVE S.A.M. BUFFER. DEF #RSM DEF RQB REQUEST BUFFER DEF C#MXR MAXIMUM LENGTH. * JMP RSGET ERROR RETURN. * * SUCCESSFUL READ COMPLETION LOGIC FOLLOWS * CLA STA SID STA PDFLG STA LGERR CLEAR ERROR REPLY VALUES. STA LGTYP STA LGQLF * JSB #NRVS GET +NODE NUMBER AND UPGRADE LEVEL DEF *+6 OF SOURCE NODE. DEF RQB+#SRC -LU OR +NODE FOR SEARCH. DEF TEMP DUMMY (MASTER TIME-OUT). DEF SLEVL SOURCE UPGRADE LEVEL RETURNED. DEF TEMP DUMMY (NEIGHBOR). DEF SNODE +SOURCE NODE # IF CALLED WITH -LU. NOP ERROR RETURN. * LDA RQB+#SRC WAS #NRVS CALL MADE WITH +NODE? SSA,RSS STA SNODE YES. STORE ORIGINAL SOURCE NODE PARAM. * LDA RQB+#STR GET STREAM WORD. AND B77 CPA B7 OPERATOR COMMAND? RSS JMP DEFLT NO. DEFAULT SESSION NEEDED. * LDA RQB+#CML YES. COMMAND LEN = 2? ADA N2 SSA JMP DEFLT NO. USER WANTS DEFAULT SESSION. * LDA RQB+#CMS YES. COMMAND = "XX"? CPA "XX" JMP ACCNT YES. LOGON/LOGOF/NON-SESSION. * * DEFAULT SESSION REQUIRED. * DEFLT LDA SLEVL REQUEST FROM OLD NODE (LEVEL 0)? SZA JMP DFLT1 NO. * * REQUEST IS FROM AN OLD LEVEL 0 NODE (NO SESSION ID FIELD IN HEADER). * USE PERMANENT DEFAULT SESSION CREATED SOLELY FOR OLD NODES. THIS * SESSION IS CREATED WHEN IT IS FIRST NEEDED, AND FROM THEN ON EVERY * OLD NODE REQUEST WILL PASS THRU HERE AND BE ASSIGNED THE "OLD NODE * PERMANENT DEFAULT SESSION" ID. OLD NODES CANNOT SEND LOG-OFF REQUESTS * FOR THIS SESSION. * LDA PDFID HAVE WE CREATED THE "PERMANENT" SZA,RSS "OLD NODE" SESSION? JMP DPERM NO. GO CREATE IT. * JSB LUSES YES. IS IT STILL UP? DEF *+2 DEF PDFID * SZA,RSS JMP SGONE NO. LDA PDFID YES. PUT SESSION ID IN REQUEST STA SID AND DISPATCH TO PROPER MONITOR. JMP STID1 * SGONE LDA PDFEN GET ADDRESS OF "PERM DEFAULT" ENTRY. JSB RLEAS RELEASE THE POOL ENTRY. * DPERM CLA,INA FLAG THAT THIS IS TO BE THE OLD STA PDFLG NODE "PERMANENT" DEFAULT SESSION. * * SET UP TO CREATE DEFAULT SESSION. ALL "NEW NODE" USERS GET THEIR * OWN SESSIONS SO THAT INTER-SESSION COMMUNICATION CAN TAKE PLACE. * DFLT1 CLA CLEAR "LOGON" FLAG. STA LGFLG * JSB .DRCT MOVE DEFAULT USER NAME DEF #DFUN LDB DLGBF TO LOGON BUFFER. JSB .MVW DEF D11 NOP LDA D21 SET LENGTH IN BYTES. STA LGLEN JMP SCAN GO FIND SESSION ID. * * EXPLICIT DLGON/DLGOF/DLGNS REQUEST. * ACCNT CLA,INA SET "LOGON" FLAG. STA LGFLG * LDA RQB+#LGC GET REQUEST CODE. CPA B1 JMP RLGON GO DO LOG-ON. CPA B2 JMP NONSM GO DO NON-SESSION. JMP RLGOF GO DO LOG-OFF (O OR -1). * RLGON LDA RQB+#LNL GET # BYTES IN USER NAME. ADA N33 CHECK LIMIT, LDB RQB+#LNL AND IF NECESSARY, SSA,RSS TRUNCATE TO THE LDB D32 MAXIMUM OF 32 CHARACTERS. STB LGLEN JSB .DRCT MOVE REQUESTED USER NAME DEF RQB+#LUN RAL LDB DLGBF TO LOGON BUFFER. RBL JSB .MBT DEF LGLEN NOP * * CHECK FOR "HELLO" FOLLOWED BY "HELLO" FROM AN HP 3000. ALSO, * CHECK FOR ABANDONED SESSION THAT MAY HAVE BEEN CREATED FROM THE * SOURCE STATION LU (SOURCE SESSION ID). THIS CAN HAPPEN WHEN THE * SOURCE NODE IS REBOOTED WITHOUT A LOG-OFF. IF ONE IS FOUND, LOG IT OFF. * (...IF SOURCE SID IS ZERO, SESSION WAS CREATED FROM A PROGRAM OR * TERMINAL IN A NON-MTM/SESSION NODE OR FROM THE SYSTEM CONSOLE IN AN * MTM/SESSION NODE... NOTHING CAN BE DONE HERE UNTIL FUTURE ENHANCEMENTS * TIE SEQUENCE NUMBERS TO ALL SESSION IDENTIFIERS. * SCAN LDA RQB+#SID ALF,ALF AND B377 SOURCE SESSION ID (STATION LU, ZERO, STA OSID 254, MTM LU, OR MPE "FROM PROCESS #"). SZA,RSS TAKE JUMP IF NO SOURCE SESSION ID (COULD JMP FLUSH BE FROM "OLD" NODE OR "AUTO-SCHED" PROG. * LDB #POOL GET ADDR OF SID POOL. JSB LODWD STA TEMP SAVE # POOL ENTRIES (NEGATIVE). INB * SCANL STB POOLA SAVE POOL ENTRY ADDRESS. JSB LODWD (CROSS) LOAD WORD 1 OF NEXT ENTRY. SSA,RSS SIGN BIT SET (IN USE)? JMP BUMPI NO. GO TO NEXT ENTRY. * INB YES. CHECK SOURCE NODE #. JSB LODWD (IF 3000 2ND HELLO, SOURCE NODE # WILL CPA SNODE BE LOCAL NODE # IN REQUEST & IN #POOL.) RSS JMP BUMPJ NO MATCH. INB MATCH. CHECK SOURCE SESSION ID JSB LODWD OR MPE "FROM PROCESS #". AND B377 CPA OSID RSS JMP BUMPK NO MATCH. * LDB POOLA MATCH. GET DEST. SESSION ID. JSB LODWD AND B377 ISOLATE. IOR BIT13 SET BIT 13 TO KILL ACTIVE PROGS. STA OSID STORE FOR LOG OFF. * JSB .CLGF LOG OFF PRIOR (OR ABANDONED) SESSION. OSID OCT 0 * (A) = COMPLETION CLASS #. SSA,RSS IF SESSION NOT INITIALIZED (!), SZA,RSS OR IF SCB NOT FOUND, JMP RPOOL SKIP THE CLASS FLUSH. * JSB LRSPN FLUSH RESPONSE FROM "LOGON". CLA IGNORE LOGOF ERROR BY STA LGTYP CLEARING ANY RETURNED STA LGERR ERROR CODES. * RPOOL JSB RLEAS RELEASE #POOL ENTRY AT "POOLA". JMP FLUSH GO FLUSH ID POOL. * BUMPI INB BUMPJ INB BUMPK ADB POOSZ ADB N2 (FOR POOSZ-2) ISZ TEMP JMP SCANL LOOP TILL DONE. * * FLUSH ID POOL OF ALL "IN USE" ENTRIES FOR WHICH A SESSION NO LONGER * EXISTS, INCLUDING THE FIRST ENTRY (PERMANENT "OLD NODE" DEFAULT SESSION). * FLUSH LDB #POOL GET ADDRESS OF SID POOL. JSB LODWD GET # POOL ENTRIES (NEGATIVE). STA CNT INB POINT TO 1ST POOL ENTRY. FLOOP JSB LODWD (CROSS) LOAD WORD 1 OF POOL ENTRY. SSA,RSS IS ENTRY IN USE (CHECK BIT 15)? JMP FNEXT NO. GO TO NEXT POOL ENTRY. * STB POOLA YES. SAVE ADDRESS OF POOL ENTRY. AND B377 ISOLATE "IN-USE" SESSION ID. STA IOP1 * JSB LUSES IS THE SESSION FOR THIS DEF *+2 #POOL ENTRY STILL AROUND? DEF IOP1 * LDB POOLA (RESTORE B-REGISTER) SZA JMP FNEXT YES. ENTRY IS GOOD. JSB RLEAS NO. RELEASE POOL ENTRY AT "POOLA". LDA IOP1 WAS THIS THE PERM. DEFAULT SESSION? CLB CPA PDFID STB PDFID YES. INDICATE THAT IT IS GONE. LDB POOLA * FNEXT ADB POOSZ ADVANCE TO NEXT POOL ENTRY. ISZ CNT JMP FLOOP LOOP TILL DONE. * * FIND AN AVAILABLE SESSION IDENTIFIER IN SESSION ID POOL. EACH * POOL ENTRY CONSISTS OF: SESSION ID (BIT 15 SET IF IN USE), OWNER'S * NODE NUMBER, OWNER'S SOURCE SESSION ID, AND THREE WORDS FOR NAME OF * PROGRAM SCHEDULED IN THIS SESSION FROM A REMOTE NODE. * THE FIRST ENTRY IS DEDICATED FOR USE AS THE PERMANENT "OLD NODE" * DEFAULT SESSION. * LDB #POOL GET ADDR OF SID POOL. JSB LODWD GET # POOL ENTRIES (NEGATIVE). STA CNT INB POINT TO 1ST POOL ENTRY. * LDA PDFLG ARE WE CREATING THE PERMANENT SZA,RSS "OLD NODE" DEFAULT SESSION? JMP NXENT NO. ADVANCE TO 2ND #POOL ENTRY. JSB LODWD YES. FIRST ENTRY IS FOR JMP IDFND THIS PURPOSE. * LOOP JSB LODWD (CROSS) LOAD WORD 1 OF NEXT ENTRY. SSA,RSS IS SIGN BIT SET? JMP IDFND NO. THIS ID IS AVAILABLE. * NXENT ADB POOSZ BUMP ADDR TO NEXT ID. ISZ CNT END OF POOL? JMP LOOP NO, CONTINUE. * JMP RS03 GIVE A "SESSION LIMIT" ERROR. * IDFND AND B377 STA SID SAVE SESSION ID. STB POOLA SAVE ADDRESS OF SID POOL ENTRY. * JSB LUSES DOES SOME OTHER SUBSYSTEM HAVE A DEF *+2 SESSION FOR THIS ID? DEF SID (NOT EXPECTED) * LDB POOLA (RESTORE (B)) SZA JMP NXENT YES. GO TO NEXT #POOL ENTRY. * LDA SID NO. ALL CLEAR. IOR BIT15 SET SIGN BIT FOR "IN USE". JSB STUFF STORE BACK TO #POOL ENTRY. * * STORE OWNER'S NODE # AND SOURCE SESSION ID IN POOL ENTRY. * IF PERMANENT "OLD NODE" DEFAULT SESSION, ONLY THE CREATING NODE * WILL BE DESCRIBED. * INB LDA SNODE JSB STUFF STORE NODE NUMBER. INB LDA RQB+#SID ALF,ALF AND B377 JSB STUFF STORE SOURCE SESSION ID. * * PERFORM PROGRAMMATIC LOG-ON. * LDB DLGBF ADDRESS OF ACCOUNT NAME. LDA LGLEN LENGTH OF ACCOUNT NAME IN BYTES. CMA,INA NEGATIVE # BYTES. * JSB .CLGN CALL LOGON. SID OCT 0 SESSION IDENTIFIER. * (A) = COMPLETION CLASS #. SSA,RSS IF SESSION NOT INITIALIZED (!), JMP GETRS LDA "SM" SET FOR "REMOTE SESSION STA LGTYP NOT INITIALIZED" ERROR, LDA "00" STA LGERR JMP RLESP AND SEND REPLY. * GETRS JSB LRSPN GET RESPONSE FROM "LOGON". * SZA,RSS IF NO ERROR, JMP RSLT GO FINISH UP. * RLESP JSB RLEAS ERROR. RELEASE POOL ENTRY (IF ANY). CLA STA SID CLEAR SESSION ID. * JMP REPLY SEND REPLY. * RSLT JSB DTACH DETACH FROM "LOG-ON" SESSION. DEF *+1 * LDA LGFLG WAS THIS AN EXPLICIT LOG-ON REQ? SZA,RSS JMP STID NO. * * SEND A REPLY FOR LOG-ON, LOG-OFF, OR NON-SESSION ACCESS REQUEST * REGARDLESS OF WHETHER IT CAME FROM AN HP 1000 OR HP 3000, AND * WHETHER OR NOT A LOGON/LOGOF ERROR OCCURRED. * SEND REPLIES FOR SLAVE MONITORS WHEN DEFAULT SESSION LOG-ON FAILED. * REPLY LDA RQB SET REPLY BIT. IOR RPBIT STA RQB LDA RQB+#SID STORE DEST SESSION ID (IF ANY). AND B1774 IOR SID STA RQB+#SID LDA LGERR STORE LOGON ERROR CODE (IF ANY). STA RQB+#EC2 LDB LGTYP STORE ERROR TYPE CODE (IF ANY). STB RQB+#EC1 LDA #NODE GET LOCAL NODE NUMBER. SZB IF LGTYP NOT ZERO, IOR BIT15 SET SIGN BIT. STA RQB+#ENO STORE REPORTING NODE NUMBER. LDB LGQLF GET QUALIFIER. BLF POSITION. LDA RQB+#ECQ AND NOTQ IOR B PLACE QUALIFIER (IF ANY) IN REPLY. STA RQB+#ECQ * SNRPY JSB #SLAV SEND THE REPLY. DEF *+4 (CAN ALSO GO TO RPCNV.) DEF C#MHD DEF B0 DEF B0 NOP IGNORE ERROR RETURN. * * RELEASE THE BUFFER IN S.A.M. * CLEAR LDA #RSM ALR,RAR CLEAR "SAVE BUFFER" FLAG. STA CLASS * JSB EXEC DO DUMMY GET TO CLEAR DEF *+5 CLASS BUFFER. DEF SD21 DEF CLASS DEF RQB DEF B0 NOP IGNORE ERROR. * JMP RSGET GO BACK TO GET. * * RETHREAD "CORRECTED" HP 1000 REQUESTS TO PROPER MONITOR. * STID LDA PDFLG IS THIS THE PERMANENT DEFAULT SZA,RSS SESSION FOR OLD NODES? JMP STID1 NO. LDA SID YES. SAVE STA PDFID SESSION ID LDA POOLA AND STA PDFEN POOL ENTRY ADDRESS. CLA CLEAR THE FLAG. STA PDFLG * STID1 LDA RQB+#SID GET SESSION ID WORD OF REQ. AND B1774 CLEAR OLD DEST SESSION ID. IOR SID STORE DEST SESSION ID. STA RQB+#SID * LDA RQB+#STR FIND MONITOR'S CLASS #. AND B77 ISOLATE STREAM. ADA #LDEF ADA B2 POINT TO LIST HEADER POINTER. LDB A,I POINT TO LIST HEADER. INB ADDR OF CLASS #. LDA B,I GET MONITOR'S CLASS #. RAL,CLE,ERA CLEAR SIGN BIT. STA CLASS * JSB #RQUE RETHREAD TO MONITOR. DEF *+9 DEF K20N ICODE. DEF B10K REQUE WITH Z BIT SET. DEF B0 NO DATA. DEF B0 DEF RQB SPECIFY 14-WORD OVERLAY. DEF D14 DEF CLASS DEST. CLASS #. DEF #RSM SOURCE CLASS #. * RSS ERROR RETURN. JMP RSGET NORMAL RETURN. * CPA "DS" LOOK FOR DS08 ERROR. RSS JSB ERR1 (JSB IS FOR COMPUTING RELATIVE ADDR) CPB "08" RSS IF DS08, THEN BUSY ERROR. JSB ERR1 (JSB IS FOR COMPUTING RELATIVE ADDR) * STA RQB+#EC1 RETURN BUSY ERROR. STB RQB+#EC2 LDA #NODE IOR BIT15 STA RQB+#ENO LDA RQB+#STR AND RTYCT IOR RPBIT IOR #BREJ STA RQB+#STR JMP SNRPY GO SEND REPLY. SKP * * REQUEST FOR NON-SESSION ACCESS. * NONSM LDA #PASS IS "RES" PASSWORD BLANK? CPA BLNKS JMP NSID YES. ALLOW ACCESS. * LDA N10 FIND # CHAR IN "RES" PASSWORD. STA TEMP CLA STA CNT INITIALIZE CHARACTER COUNT. JSB .DRCT DEF #PASS LDB A RBL COUNT JSB .LBT CPA B40 JMP CKSLS ISZ CNT COUNT CHARACTERS UNTIL BLANK ISZ TEMP OR END OF FIELD. JMP COUNT * CKSLS LDA RQB+#LUN SET "SLASH FIX" DEPENDING WHETHER ALF,ALF REQUEST PASSWORD BEGINS WITH AND B377 A SLASH OR NOT. CLB CPA SLASH INB STB SLSHF 0 = NO SLASH, 1 = SLASH PRESENT. CMB,INB PRIME TO SUBTRACT "SLASH FIX". * ADB RQB+#LNL COMPARE PASSWORD LENGTHS. CPB CNT RSS JMP RS05 DIFFERENT LENGTHS. ERROR. * JSB .DRCT COMPARE PASSWORDS. DEF #PASS PASSWORD IN "RES". RAL STA B JSB .DRCT DEF RQB+#LUN PASSWORD IN REQUEST BUFFER. RAL ADA SLSHF ADD "SLASH FIX". JSB .CBT DEF CNT NOP JMP NSID PASSWORD MATCHES. JMP RS05 MISMATCH, JMP RS05 MISMATCH. ERROR. * NSID LDA D254 MATCH. ALLOW ACCESS. STA SID SET SESSION ID = 254. JMP REPLY GO SEND REPLY. SKP * * REQUEST FOR LOG-OFF. CAN BE A "NO-REPLY" REQUEST!!! * RLGOF LDA RQB+#LNL GET LOG-OFF SESSION ID. AND B377 ISOLATE. STA OFFID * LDB #POOL GET ADDR OF SID POOL. JSB LODWD GET # POOL ENTRIES (NEGATIVE). STA TEMP INB POINT TO 1ST POOL ENTRY. LOOP1 JSB LODWD (CROSS) LOAD WORD 1 OF NEXT ENTRY. SSA,RSS ENTRY IN USE? JMP NEXTP NO. GO CHECK NEXT ENTRY. AND B377 CPA OFFID YES. DEST SESSION ID? JMP SAVAD YES. NEXTP ADB POOSZ NO. GO CHECK NEXT ENTRY. ISZ TEMP JMP LOOP1 JMP CKREP NOT FOUND. * SAVAD STB POOLA FOUND. SAVE ADDR OF POOL ENTRY. * LDA RQB+#LGC IS THIS AN UPLIN LOG-OFF FOR A INA,SZA TERMINATED/ABORTED MASTER PROGRAM? JMP KILL NO. * JSB LODWD YES. TELL DS SLAVE MONITORS (#ATCH) NOT IOR BIT13 TO ATTACH TO THIS DYING SESSION. JSB STUFF (SET BIT 13 OF 1ST WORD IN #POOL ENTRY.) * JSB LUSES GET SCB POINTER FOR THIS SESSION. DEF *+2 DEF OFFID SZA,RSS JMP KILL1 STA SCBP SAVE THE SCB POINTER. * JSB $LIBR GO PRIVILEGED. NOP * LDA KEYWD GET ADDRESS OF KEYWORD TABLE. STA KEYPT SET POINTER TO TOP OF TABLE. SLOOP LDB KEYPT,I GET NEXT ID SEGMENT ADDRESS. SZB,RSS JMP IDEND END OF LIST. ADB D32 POINT TO SCB POINTER WORD. LDA B,I GET SCB POINTER, IF ANY. CPA SCBP IS THIS ID SEGMENT ATTACHED TO THE RSS SESSION TO BE LOGGED OFF? JMP NXTID NO. GO CHECK NEXT ID SEGMENT. * ADB N20 YES. CHECK IF IT'S A DS SLAVE MONITOR. CLE,ELB STB ADDR BYTE ADDR OF NAME IN ID SEGMENT. LDA #MNUM NUMBER OF SLAVE-STREAM TYPES. CMA,INA STA CNT SET COUNTER. * LDB #LDEF SEARCH SLAVE MONITOR NAMES ADB B2 FOR ID-SEGMENT NAME. STB TEMP ADDR OF 1ST SLAVE-STREAM HEADER ADDR. HLOOP LDB TEMP,I NEXT SLAVE-STREAM HEADER ADDR. ADB B2 ADDR OF MONITOR NAME IN ENTRY. CLE,ELB BYTE ADDR OF MONITOR NAME. LDA ADDR BYTE ADDR OF NAME IN ID SEGMENT. JSB .CBT COMPARE THE NAMES. DEF B5 NOP JMP DTCHM MATCH. GO DETACH THE DS MONITOR. NOP ISZ TEMP NO MATCH. GO TO NEXT SLAVE HEADER ADDR. ISZ CNT JMP HLOOP LOOP TILL END OF HEADERS. JMP NXTID ATTACHED PROG NOT A DS MONITOR. * DTCHM LDB KEYPT,I DETACH THE DS SLAVE MONITOR ADB D32 FROM THE SESSION BY CLA CLEARING THE SCB POINTER WORD STA B,I IN THE ID SEGMENT. * NXTID ISZ KEYPT POINT TO NEXT ID SEGMENT. JMP SLOOP GO CHECK IT OUT. * IDEND JSB $LIBX GO UN-PRIVILEGED. DEF *+1 DEF *+1 * KILL LDA OFFID SET BIT 13 TO KILL ACTIVE PROGS. IOR BIT13 STA OFFID * JSB .CLGF CALL LOGOF. OFFID OCT 0 SESSION ID. * (A) = COMPLETION CLASS #. SSA,RSS IF SESSION NOT INITIALIZED (!), SZA,RSS OR SCB NOT FOUND, JMP *+2 SKIP THE CLASS BUFFER FLUSH. * JSB LRSPN GET RESPONSE FROM LOGOF. * KILL1 JSB RLEAS RELEASE #POOL ENTRY AT "POOLA". * CLA STA SID * CKREP LDA RQB+#LGC CHECK IF "NO-REPLY" LOG-OFF. INA,SZA JMP REPLY GO SEND A REPLY. * JSB #RSAX NO REPLY. RELEASE "OPERM'S" TCB. DEF *+4 DEF B7 DEF RQB+#SEQ (SEQ # = 0) DEF RQB+#STR (STREAM 7 ) * JMP CLEAR GO RELEASE S.A.M. BUFFER. SKP * * SUBR. TO PROCESS RESPONSE BUFFERS FROM REPLY CLASS OF LOGON AND LOGOF. * SET (A) = REPLY CLASS NUMBER PASSED FROM LOGON/LOGOF. * RETURNS WITH ERROR CODE (OR ZERO) IN (A) AND IN "LGERR". * LRSPN NOP STA CLASS STORE REPLY CLASS NUMBER. LDA "RS" PRE-LOADED IN CASE THERE IS STA LGTYP AN I/O CLASS ERROR ON LOGON STATUS. * LRSP1 JSB EXEC GET RESPONSE FROM LOGON/LOGOF. DEF *+8 DEF SD21 DEF CLASS CLASS NUMBER. DEF LGBUF BUFR FOR ASCII MSGS. DEF B0 LENGTH. (NORMALLY 128 WORDS, BUT ASCII DEF IOP1 INFO NOT DISPL SINCE NOT INTERACTIVE. DEF IOP2 PARAM FROM LOGON. DEF CALL JMP LRSPE ERROR RETURN. * LDA CALL FETCH CALL TYPE. CPA B1 MUST BE READ OR WRITE/READ. RSS JMP LRSP1 TRY AGAIN. * LDA IOP2 FETCH LOGON/LOGOF STATUS. SSA,RSS IF NEGATIVE (ERROR TERMINATION) SZA,RSS OR ZERO (GOOD LOGON/LOGOF RETURN) RSS CONTINUE, JMP LRSP1 ELSE GET NEXT MESSAGE. * CLA NO "RS" ERROR FROM LOGON STATUS, STA LGTYP SO CLEAR THE ERROR TYPE. LDA CLASS REMOVE "SAVE CLASS" BIT. XOR BIT13 STA CLASS * AGAIN JSB EXEC RELEASE THE LOGON/LOGOF CLASS. DEF *+5 DEF SD21 DEF CLASS DEF LGBUF DEF B0 RSS JMP AGAIN * LDA IOP2 EXTRACT LOGON/LOGOF ERROR CODE ALF,ALF (IF ANY). RAL,RAL AND B77 LDB "SM" IF LOGON/OF ERROR, SZA,RSS JMP LEXIT STB LGTYP SET ERROR TYPE = "SM". RSS LRSPE LDA B2 FORCED ERROR CODE FOR CLASS GET. CCE JSB $CVT1 CONVERT ERROR CODE TO ASCII. IOR LB60 MAKE SURE LEFT BYTE IS ACSII. LEXIT STA LGERR (ERROR TYPE ALREADY SET) * JMP LRSPN,I RETURN TO CALLER. SKP * * SUBROUTINE TO RELEASE #POOL ENTRY. * RLEAS NOP LDB POOLA ADDR OF POOL ENTRY TO RELEASE. SZB,RSS JMP RLEAS,I EXIT IF NONE. * JSB LODWD GET WORD 1. RAL CHECK BIT 14 FOR CLONED PROG. SSA,RSS JMP RCLR NO CLONED ID SEGMENT. * LDB POOLA GET NAME OF CLONED PROGRAM ADB B3 FROM #POOL ENTRY JSB LODWD INTO LOCAL STORAGE. STA BUF INB JSB LODWD STA BUF+1 INB JSB LODWD STA BUF+2 * JSB IDRPD RELEASE CLONED ID SEGMENT. DEF *+3 DEF BUFAD ADDR OF PROGRAM NAME. DEF TEMP RETURNED ERROR CODE. * RCLR LDB POOLA RELEASE #POOL ENTRY. JSB LODWD GET WORD 1. AND B377 CLEAR ALL LEFT BYTE FLAGS. JSB STUFF STORE BACK. * LDA POOSZ CLEAR WORDS 2-LAST. CMA,INA INA STA TEMP LDB POOLA CLA CLENT INB JSB STUFF ISZ TEMP JMP CLENT * JMP RLEAS,I RETURN. SKP * * SUBROUTINE TO STORE A WORD IN SAM. * STUFF NOP JSB $LIBR GO PRIVILEGED. NOP MOD1 JMP STUF2 NOP HERE IF DMS. XSA B,I STORE IN ALTERNATE MAP. RSS STUF2 STA B,I JSB $LIBX DEF STUFF * * LOAD WORD FROM S.A.M., CROSS-LOAD IF DMS SYSTEM. * LODWD NOP LDA $OPSY OPERATING SYSTEM TYPE. RAR,SLA SKIP IF NON-DMS. JMP *+3 DMS. GO EXECUTE XLA. LDA B,I NON-DMS. PICK UP SAM WORD. JMP LODWD,I RETURN. XLA B,I CROSS-LOAD SAM WORD. JMP LODWD,I SKP * * ERROR SECTION FOR ALL RSM-GENERATED ERRORS. * ("RS02" IS DONE IN THE "LRSPN" SUBROUTINE.) * RS03 CLA,INA SET QUALIFIER = 1. STA LGQLF LDA "03" NODAL SESSION LIMIT EXCEEDED. JMP ERTN1 RS05 LDA "05" WRONG PASSWORD FOR NON-SESSION. * ERTN1 STA LGERR STORE AS LOGON ERROR CODE. LDA "RS" SET ERROR CODE TYPE. STA LGTYP CLA CLEAR SESSION ID. STA SID LDA RQB+#STR INITIALIZE RETRY COUNTERS. AND RTYCT IOR #BREJ STA RQB+#STR * JMP REPLY SEND REPLY. * * THIS REQUEST IS NON-RECOVERABLE, CLEAR, LOG, THEN IGNORE IT * ERR1 NOP HERE TO REPORT IRRECOVERABLE ERROR DST RQB+5 SAVE REGS FOR QCLM LDA @RSM GET BASE ADDR OF "RSM". CMA,INA GET RELATIVE ERROR ADDRESS ADA ERR1 AND STA RQB+4 PASS ERROR ADDR TO QCLM. DLD $TIME RECORD TIME OF ERROR DST RQB+7 LDA PNAME PASS PROGRAM NAME (RSM). STA RQB+9 DLD PNAME+1 DST RQB+10 LDA #QCLM SZA,RSS IF NO QCLM, JMP CLEAR FORGET MESSAGE. * JSB EXEC MAILBOX WRITE/READ TO QCLM DEF *+8 DEF K20N DEF B0 DEF RQB DEF D12 DEF B0 DEF B0 DEF #QCLM NOP * JMP CLEAR GO CLEAR BUFFER IN SAM. SKP * * CONSTANTS AND STORAGE * KEYWD EQU 1657B B0 OCT 0 B1 OCT 1 B2 OCT 2 B3 OCT 3 B5 OCT 5 B7 OCT 7 B40 OCT 40 B10K OCT 010000 BIT13 OCT 020000 BIT15 OCT 100000 B77 OCT 77 B377 OCT 377 B1774 OCT 177400 NOTQ OCT 177417 SD21 OCT 100025 SLASH OCT 57 LB60 OCT 30000 POOSZ DEC 7 SIZE OF #POOL ENTRY. D11 DEC 11 D12 DEC 12 D14 DEC 14 D21 DEC 21 D32 DEC 32 D254 DEC 254 N2 DEC -2 N10 DEC -10 N20 DEC -20 N33 DEC -33 K20N OCT 100024 C#MHD ABS #MHD SNODE NOP SLEVL NOP POOLA NOP LGTYP NOP LGERR NOP LGQLF NOP LGFLG NOP PDFLG OCT 0 PDFID OCT 0 PDFEN NOP SLSHF NOP TEMP NOP CLASS NOP CALL NOP CNT NOP SCBP NOP ADDR NOP KEYPT NOP IOP1 NOP IOP2 NOP @RSM DEF RSM PNAME ASC 3,RSM LGBUF BSS 1 CAN BE MADE 128 WORDS IF NEED ARISES. DLGBF DEF LOGBF LOGBF BSS 16 LGLEN NOP BUFAD DEF BUF BUF BSS 3 RPBIT OCT 40000 RTYCT OCT 170077 STREAM WORD RETRY COUNT MASK * "RS" ASC 1,RS "SM" ASC 1,SM "XX" ASC 1,XX BLNKS ASC 1, "00" ASC 1,00 "03" ASC 1,03 "05" ASC 1,05 "08" ASC 1,08 "DS" ASC 1,DS C#MXR ABS #MXR * BSS 0 SIZE OF RSM. * END RSM