.TITLE VDR - VIRTUAL DEVICE REQUESTOR .IDENT /V01.01/ ; ; COPYRIGHT (C) 1979, 1980 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. ; ; ; MODULE DESCRIPTION: ; ; VIRTUAL DEVICE REQUESTOR (STARTUP TASK) ; ; ; DISTRIBUTED SYSTEMS SOFTWARE ENGINEERING ; ; IDENT HISTORY: ; ; 1.00 5-FEB-80 ; J. A. SCHRIESHEIM ; ; 1.01 4-MAY-81 J. A. SCHRIESHEIM ; ADDED EXTRA WORD TO REQUEST PEM FOR IAS SUPPORT ; .SBTTL MACRO CALLS AND LOCAL DEFINITIONS ; ; MACRO CALLS ; .MCALL GMCR$,ISTAT$,STATE$,TRAN$,QIOW$,HDRDF$,GNDW$,MRKT$,WTSE$ .MCALL OPNW$,PEMW$,CLSW$,DIR$,ALUN$,EXIT$S,EXST$S,NETDF$,DECL$S HDRDF$ ; DEFINE HEADER OFFSETS NETDF$ ; DEFINE NETWORK SYMBOLS ; ; LOCAL DEFINITIONS ; MBLUN=1 TILUN=2 TMPLUN=3 NTEFN=1 TIEFN=2 MTEFN=3 ; ; DPB'S ; GMCR: GMCR$ ALUN: ALUN$ MBLUN,NS QIO: QIOW$ IO.WVB,TILUN,TIEFN,,,,<,,40> OPN: OPNW$ MBLUN,NTEFN,NSSTAT PEM: PEMW$ MBLUN,NTEFN,NSSTAT,, GND: GNDW$ MBLUN,NTEFN,NSSTAT,, CLS: CLSW$ MBLUN,NTEFN FNDDEV: ALUN$ TMPLUN MRKT: MRKT$ MTEFN,1,2 WTSE: WTSE$ MTEFN ; ; TEXT STRINGS ; .NLIST BEX .ENABL LC SYNERR: .ASCIZ <15>/VDV -- Syntax error/ MCRERR: .ASCIZ <15>/VDV -- Failed to get MCR command line/ NETERR: .ASCIZ <15>/VDV -- Unable to communicate with VDV$$$/ DEVERR: .ASCIZ <15>/VDV -- Device not in use/ PRIERR: .ASCIZ <15>/VDV -- Privilege violation/ MOUERR: .ASCIZ <15>/VDV -- Device still mounted/ .EVEN .DSABL LC .LIST BEX ; ; REQUEST MESSAGE TO VDV$$$ ; MSG: .RAD50 /VDV$$$/ ; TARGET TASK NAME .WORD 0 ; ... AND TERMINAL IDENTIFIER (NONE) FUNC: .WORD IO.ATT ; FUNCTION USER: .BLKW 1 ; USER'S UCB ADDRESS OWNER: .BLKW 1 ; OWNER OF DEVICE NODE: .ASCII / / ; NODE NAME TO CONNECT TO DEVL: .WORD 0 ; LENGTH OF DEVICE/FILE NAME DEV: .BLKB 40. ; DEVICE/FILE NAME LOGNAM: .WORD 0,0 ; LOGICAL NAME TO ASSIGN UIDC: .WORD 0 ; USER ID COUNT UID: .BLKB 16. ; USER ID PASC: .WORD 0 ; PASSWORD COUNT PAS: .BLKB 8. ; PASSWORD ACNC: .WORD 0 ; ACCOUNT COUNT ACN: .BLKB 16. ; ACCOUNT MSGL=.-MSG ; ; MISC. STORAGE ; GNDBUF: .BLKW 4 ; GND BUFFER FOR PEM STATUS RETURN TEXT: .WORD 0 ; TEXT STRING TO PRINT EXSTAT: .WORD EX$ERR ; EXIT STATUS (ASSUME ERROR) NSSTAT: .BLKW 2 ; NETWORK I/O STATUS BLOCK VFLAG: .WORD 0 ; FLAGS VD.CON=1 ; CONNECT FLAG VD.DIS=2 ; DISCONNECT FLAG .SBTTL TPARS STATE TABLES ISTAT$ STATE1,KEYTBL ; ; MAIN COMMAND PARSING STATES ; STATE$ STATE1 TRAN$ "VDV" STATE$ TRAN$ !CON1,END TRAN$ !DIS1 STATE$ END TRAN$ $EOS,$EXIT ; ; SUB EXPRESSION FOR PARSING CONNECT COMMAND ; STATE$ CON1 TRAN$ "CONNECT",,,VD.CON,VFLAG STATE$ CON2 TRAN$ !NOD1,CON3 TRAN$ $LAMDA,,SETLOC STATE$ CON3 TRAN$ $BLANK,CON4,EBLANK TRAN$ $ANY,CON3,SETNAM TRAN$ $EOS STATE$ CON4 TRAN$ $LAMDA,,CHKNAM STATE$ CON5 TRAN$ !OWN1,CON5 TRAN$ !LOG1,CON5 TRAN$ $LAMDA,$EXIT ; ; SUB EXPRESSION FOR PARSING DISCONNECT COMMAND ; STATE$ DIS1 TRAN$ "DISCONNECT",,,VD.DIS,VFLAG STATE$ DIS2 TRAN$ $ALPHA,,SETA1 STATE$ DIS3 TRAN$ $ALPHA,,SETA2 STATE$ DIS4 TRAN$ $NUMBR,DIS5,SETN TRAN$ $LAMDA STATE$ DIS5 TRAN$ ':,$EXIT ; ; SUBEXPRESSION FOR PARSING NODE NAMES ; STATE$ NOD1 TRAN$ $STRNG,,SETNOD STATE$ NOD2 TRAN$ '/,NOD3 TRAN$ !NODEND,$EXIT STATE$ NOD3 TRAN$ '/,NOD4 TRAN$ !NODEND,$EXIT TRAN$ $ANY,NOD3,SETUID STATE$ NOD4 TRAN$ '/,NOD5 TRAN$ !NODEND,$EXIT TRAN$ $ANY,NOD4,SETPAS STATE$ NOD5 TRAN$ !NODEND,$EXIT TRAN$ $ANY,NOD5,SETACN STATE$ NODEND TRAN$ ': STATE$ TRAN$ ':,$EXIT ; ; SUBEXPRESSION FOR PARSING OWNER OF DEVICE ; STATE$ OWN1 TRAN$ "GLOBAL",$EXIT,SETGLO ; ; SUBEXPRESSION FOR PARSING LOGICAL NAME TO ASSIGN ; STATE$ LOG1 TRAN$ "NAME" STATE$ LOG2 TRAN$ $ALPHA,,SETLA1 STATE$ LOG3 TRAN$ $ALPHA,,SETLA2 STATE$ LOG4 TRAN$ $NUMBR,LOG5,SETLN TRAN$ $LAMDA STATE$ LOG5 TRAN$ ':,$EXIT STATE$ .SBTTL VDR - VDR MAIN LINE CODE ;+ ; **-VDR-VIRTUAL DEVICE CONNECT REQUEST TASK ; ; THIS TASK PARSES A MCR COMMAND LINE. IF THE REQUEST IS FOR A ; VIRTUAL DEVICE CONNECTION, THE REQUEST IS PASSED TO VDV$$$. ; IF THE REQUEST IS FOR A DISCONNECT AND THE USER HAS THE CORRECT ; PRIVILEGE, THE CORRECT VDV$$$ TASK IS UNSTOPPED TO RELEASE THE DEVICE. ; ;- VDR:: CALL GETCOM ; GET AND PARSE THE COMMAND BCS 20$ ; IF CS, EXIT BIT #VD.CON,VFLAG ; IS THIS A CONNECT ? BEQ 10$ ; IF EQ, NO - TRY DISCONNECT CALL CONN ; ELSE, PROCESS COMMAND BR 20$ ; AND CLEAN UP 10$: BIT #VD.DIS,VFLAG ; DISCONNECT ? BEQ 20$ ; IF EQ, NO - ERROR CALL DISC ; ELSE, PROCESS DISCONNECT 20$: MOV TEXT,R0 ; GET STRING ADDRESS BEQ 100$ ; IF EQ, NOTHING TO PRINT CALL PRINT ; ELSE, PRINT IT 100$: EXST$S EXSTAT ; EXIT WITH STATUS EXIT$S ; IF ALL ELSE FAILS, JUST EXIT .SBTTL GETCOM - GET AND PARSE A COMMAND LINE ;+ ; **-GETCOM-GET AND PARSE A COMMAND LINE ; ; THIS ROUTINE GETS THE MCR COMMAND LINE, AND PARSES IT. ; ;- GETCOM: MOV #MCRERR,TEXT ; ASSUME COULDN'T GET COMMAND LINE DIR$ #GMCR ; TRY TO GET THE LINE BCS 100$ ; IF CS, RETURN WITH ERROR MOV $DSW,R3 ; GET LENGTH OF COMMAND MOV #GMCR+G.MCRB,R4 ; POINT TO THE COMMAND BUFFER MOV #SYNERR,TEXT ; ASSUME SYNTAX ERROR MOV $TKTCB,R0 ; GET OUR TCB ADDRESS MOV T.UCB(R0),USER ; STORE OUR TI: UCB ADDRESS MOV T.UCB(R0),OWNER ; DEFAULT OWNER TO TI: MOV #3*256.,R1 ; ABREV. KEYWORDS TO 3 CHARS MOV #KEYTBL,R2 ; POINT TO KEYWORD TABLE MOV #STATE1,R5 ; AND FIRST STATE CALL .TPARS ; PARSE THE COMMAND LINE 100$: RETURN .SBTTL CONN - PROCESS CONNECT COMMAND ;+ ; **-CONN-PROCESS CONNECT COMMAND ; ; THIS ROUTINE PEMS THE REQUEST INFORMATION TO VDV$$$ AND ; WAITS FOR THE RETURN STATUS PEM. ; ;- CONN: MOV #NETERR,TEXT ; ASSUME NETWORK I/O ERROR DIR$ #ALUN ; ASSIGN MAILBOX LUN BCS 100$ ; IF CS, ERROR DIR$ #OPN ; OPEN THE MAILBOX BCS 100$ ; EXIT ON ERROR TSTB NSSTAT ; ERROR ? BMI 100$ ; IF MI, YES DIR$ #PEM ; PEM TO VDV$$$ TSTB NSSTAT ; ERROR ? BMI 100$ ; IF MI, YES - PRINT ERROR CALL GETPEM ; ELSE, TRY TO GET THE STATUS PEM CLR TEXT ; CLEAR ERROR TEXT 100$: DIR$ #CLS ; CLOSE THE MAILBOX RETURN .SBTTL DISC - PROCESS DISCONNECT COMMAND ;+ ; **-DISC-PROCESS DISCONNECT COMMAND ; ; THIS ROUTINE CHECKS FOR PROPER PRIVILEGE, SETS THE EXIT FLAG ; FOR THE VIRTUAL DEVICE'S FRONT END, AND UNSTOPS IT ; ;- DISC: MOV #DEVERR,TEXT ; ASSUME BAD DEVICE DIR$ #FNDDEV ; TRY TO ASSIGN A LUN BCS 100$ ; IF CS, COULDN'T - RETURN SWSTK$ 90$ ;; ELSE, ENTER SYSTEM STATE MOV $HEADR,R0 ;; GET OUR HEADER ADDRESS MOV <*4>+H.LUN(R0),R0 ;; GET THE UCB ADDRESS MOV U.DCB(R0),R1 ;; POINT TO THE DCB CMP D.NAM(R1),#"VD ;; IS THIS A VD: ? BEQ 15$ ;; IF EQ, YES - VALID DEVICE CMP D.NAM(R1),#"VP ;; IS IT A VP: ? BEQ 15$ ;; IF EQ, YES - VALID DEVICE CMP D.NAM(R1),#"VM ;; ELSE, IS IT A VM: ? BNE 20$ ;; IF NE, NO - UNKNOWN DEVICE 15$: MOV $TKTCB,R1 ;; GET OUR TCB ADDRESS MOV T.UCB(R1),R1 ;; GET OUR TI: ADDRESS CMP U.USR(R0),R1 ;; DO WE OWN THIS DEVICE ? BEQ 17$ ;; IF EQ, YES - OKAY TO DISCONNECT BIT #U2.PRV,U.CW2(R1) ;; ELSE, IS USER PRIVILEGED ? BNE 17$ ;; IF NE, YES - OKAY MOV #PRIERR,TEXT ;; ELSE, PRIV VIOLATION BR 20$ ;; ... 17$: MOV U.VDV(R0),R2 ;; GET THE OWNER'S TCB ADDRESS BEQ 20$ ;; IF EQ, NONE - RETURN BIT #DV.MNT,U.CW1(R0) ;; IS THE DEVICE MOUNTABLE ? BEQ 18$ ;; IF EQ, NO - SKIP MOUNT CHECK MOV #MOUERR,TEXT ;; ASSUME DEVICE STILL MOUNTED BITB #US.MNT,U.STS(R0) ;; IS IT STILL MOUNTED ? BEQ 20$ ;; IF EQ, YES - ERROR 18$: CLR U.OWN(R0) ;; DEALLOCATE DEVICE BICB #US.PUB,U.ST2(R0) ;; SET IT TO NON-PUBLIC MOV R1,T.UCB(R2) ;; SET FRONT END'S TI: TO OUR'S BIS #1,T.EFLG(R2) ;; SET THE EXIT FLAG MOV #EX$SUC,EXSTAT ;; SET SUCCESS EXIT STATUS CLR TEXT ;; NO MESSAGE TO PRINT MOV R2,R0 ;; SET TCB ADDRESS CALLR $EXRQN ;; UNSTOP THE TASK 20$: RETURN ;; BACK TO USER STATE 90$: DECL$S ;; DECLARE A SIGNIFICANT EVENT 100$: RETURN .SBTTL TPARS ACTION ROUTINES ;+ ; **-SETNOD-SET A NODE NAME INTO THE PEM REQUEST BLOCK ;- SETNOD: MOV #NODE,R0 ; POINT TO NAME BUFFER MOV .PSTPT,R1 ; POINT TO NAME FOUND MOV .PSTCN,R2 ; GET STRING LENGTH CMP R2,#6 ; NODE NAME TOO LONG ? BLE 10$ ; IF LE, NO ADD #2,(SP) ; ELSE, REJECT THE TRANSITION BR 20$ ; ... 10$: MOVB (R1)+,(R0)+ ; MOVE NODE NAME INTO BUFFER DEC R2 ; LOOP TILL DONE BNE 10$ ; ... 20$: RETURN ;+ ; **-SETLOC-SET THE NODE NAME TO SPACES IN THE PEM REQUEST BLOCK ;- SETLOC: MOV #" ,NODE ; USE THE DEFAULT NAME (SPACES) MOV #" ,NODE+2 ; ... MOV #" ,NODE+4 ; ... RETURN ;+ ; **-SETNAM-SAVE A CHARACTER FROM THE DEVICE OR FILE NAME ;- SETNAM: BIS #1,.PFLAG ; DISABLE BLANK SUPPRESSION CMP DEVL,#40. ; IS THE NAME ALREADY AT IT'S LIMIT ? BEQ REJECT ; IF EQ, YES - BAD SYNTAX MOV #DEV,R0 ; POINT TO NAME BUFFER ADD DEVL,R0 ; INDEX TO NEXT CHAR IN BUFFER MOVB .PCHAR,(R0) ; SAVE CHARACTER INC DEVL ; AND UPDATE NAME COUNT RETURN ;+ ; **-EBLANK-ENABLE BLANK SUPPRESSION ;- EBLANK: BIC #1,.PFLAG ; ENABLE BLANK SUPPRESSION RETURN ;+ ; **-CHKNAM-CHECK THAT A FILE/DEVICE NAME WAS SPECIFIED ;- CHKNAM: TST DEVL ; WAS A FILE/DEVICE NAME SPECIFIED ? BNE 10$ ; IF NE, YES - OKAY ADD #2,(SP) ; ELSE, NO - REJECT 10$: RETURN ;+ ; **-SETA1-SET THE FIRST CHAR OF A DEVICE NAME IN ALUN$ DPB ;- SETA1: MOVB .PCHAR,FNDDEV+A.LUNA RETURN ;+ ; **-SETA2-SET THE SECOND CHAR OF A DEVICE NAME IN ALUN$ DPB ;- SETA2: MOVB .PCHAR,FNDDEV+A.LUNA+1 RETURN ;+ ; **-SETN-SET THE UNIT NUMBER IN ALUN$ DPB ;- SETN: MOV .PNUMB,FNDDEV+A.LUNU RETURN ;+ ; **-SETGLO-SET OWNER OF DEVICE AS GLOBAL ;- SETGLO: CLR OWNER ; SET OWNER AS GLOBAL MOV $TKTCB,R0 ; GET OUR TCB ADDRESS MOV T.UCB(R0),R0 ; GET OUR TI: UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; ARE WE PRIVILEGED ? BNE 10$ ; IF NE, YES - OKAY MOV #PRIERR,TEXT ; ELSE, SET ERROR MESSAGE ADD #2,(SP) ; REJECT TRANSITION 10$: RETURN ;+ ; **-SETLA1-SET 1ST CHAR OF LOGICAL NAME TO BE ASSIGNED ;- SETLA1: MOVB .PCHAR,LOGNAM RETURN ;+ ; **-SETLA2-SET 2ND CHAR OF LOGICAL NAME TO BE ASSIGNED ;- SETLA2: MOVB .PCHAR,LOGNAM+1 RETURN ;+ ; **-SETLN-SET UNIT NUMBER OF LOGICAL NAME TO BE ASSIGNED ;- SETLN: MOV .PNUMB,LOGNAM+2 RETURN ;+ ; **-SETUID-SAVE A CHARACTER FROM THE USER-ID ;- .ENABL LSB SETUID: CMP UIDC,#16. ; IS THE FIELD ALREADY AT IT'S LIMIT ? BEQ REJECT ; IF EQ, YES - BAD SYNTAX MOV #UID,R0 ; POINT TO BUFFER ADD UIDC,R0 ; INDEX TO NEXT CHAR IN BUFFER MOVB .PCHAR,(R0) ; SAVE CHARACTER INC UIDC ; AND UPDATE COUNT RETURN REJECT: ADD #2,(SP) ; REJECT TRANSITION RETURN ;+ ; **-SETPAS-SAVE A CHARACTER FROM THE PASSWORD ;- SETPAS: CMP PASC,#8. ; IS THE FIELD ALREADY AT IT'S LIMIT ? BEQ REJECT ; IF EQ, YES - BAD SYNTAX MOV #PAS,R0 ; POINT TO BUFFER ADD PASC,R0 ; INDEX TO NEXT CHAR IN BUFFER MOVB .PCHAR,(R0) ; SAVE CHARACTER INC PASC ; AND UPDATE COUNT RETURN ;+ ; **-SETACN-SAVE A CHARACTER FROM THE ACCOUNT ;- SETACN: CMP ACNC,#16. ; IS THE FIELD ALREADY AT IT'S LIMIT ? BEQ REJECT ; IF EQ, YES - BAD SYNTAX MOV #ACN,R0 ; POINT TO BUFFER ADD ACNC,R0 ; INDEX TO NEXT CHAR IN BUFFER MOVB .PCHAR,(R0) ; SAVE CHARACTER INC ACNC ; AND UPDATE COUNT RETURN .DSABL LSB .SBTTL GETPEM - GET THE PEM STATUS MESSAGE ;+ ; **-GETPEM-GET THE PEM STATUS MESSAGE FOR EXIT STATUS ;- GETPEM: 10$: DIR$ #GND ; TRY TO GET SOME NETWORK DATA TSTB NSSTAT ; SUCCESS ? BPL 20$ ; IF PL, YES DIR$ #MRKT ; ELSE, WAIT AROUND A WHILE DIR$ #WTSE ; ... BR 10$ ; ... 20$: CMPB NSSTAT+1,#NT.EVT ; IS IT A PEM ? BNE 10$ ; IF NE, NO - DROP IT MOV GNDBUF+6,EXSTAT ; ELSE, SAVE EXIT STATUS RETURN .SBTTL PRINT - PRINT AN ASCIZ STRING ;+ ; **-PRINT-PRINT AN ASCIZ STRING ; ; INPUTS: ; R0 = ADDRESS OF STRING ; ;- PRINT: MOV R0,QIO+Q.IOPL ; SET STRING ADDRESS 10$: TSTB (R0)+ ; LOOK FOR END OF STRING BNE 10$ ; ... SUB QIO+Q.IOPL,R0 ; CALC STRING LENGTH MOV R0,QIO+Q.IOPL+2 ; SET STRING LENGTH DIR$ #QIO ; PRINT IT RETURN .END VDR