Google
 

Trailing-Edge - PDP-10 Archives - bb-lw55a-bm - galaxy-sources/oprnet.mac
There are 26 other files named oprnet.mac in the archive. Click here to see a list.
	TITLE	OPRNET	ORION NETWORK SUPPORT CODE
	SUBTTL	Preliminaries

;	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1975, 1988.
;	ALL RIGHTS RESERVED.
;
;	THIS SOFTWARE IS FURNISHED UNDER A  LICENSE AND MAY BE USED AND  COPIED
;	ONLY IN  ACCORDANCE  WITH  THE  TERMS OF  SUCH  LICENSE  AND  WITH  THE
;	INCLUSION OF THE ABOVE  COPYRIGHT NOTICE.  THIS  SOFTWARE OR ANY  OTHER
;	COPIES THEREOF MAY NOT BE PROVIDED  OR OTHERWISE MADE AVAILABLE TO  ANY
;	OTHER PERSON.  NO  TITLE TO  AND OWNERSHIP  OF THE  SOFTWARE IS  HEREBY
;	TRANSFERRED.
;
;	THE INFORMATION IN THIS  SOFTWARE IS SUBJECT  TO CHANGE WITHOUT  NOTICE
;	AND SHOULD  NOT  BE CONSTRUED  AS  A COMMITMENT  BY  DIGITAL  EQUIPMENT
;	CORPORATION.
;
;	DIGITAL ASSUMES NO  RESPONSIBILITY FOR  THE USE OR  RELIABILITY OF  ITS
;	SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.

;*******
;THIS PROGRAM IS ONLY FOR THE -20 AT PRESENT AND IS THEREFORE COMPLETELY
;UNDER CONDITIONAL ASSEMBLY **********

	SEARCH	GLXMAC,ORNMAC
	PROLOG(OPRNET)

	ERRSET				;INIT ERROR TABLES

;Version numbers

	NETMAN==:0			;Maintenance edit number
	NETDEV==:31			;Development edit number
	VERSIN (NET)			;Generate edit number

TOPS20 <
	EXTERNAL G$HOST
	EXTERNAL LEVTAB
	EXTERNAL CHNTAB

	EXTERNAL NSPCON
	EXTERNAL NSPACT
	EXTERNAL NODNAM
	EXTERNAL SRVTBL
	EXTERNAL SRVDAT
	EXTERNAL TRMFRK
	EXTERNAL SRVACS
	SUBTTL	Table of Contents


;		Table of Contents for OPRNET
;
;
;			   Section			      Page
;   1. Preliminaries. . . . . . . . . . . . . . . . . . . . .    1
;   2. Table of Contents. . . . . . . . . . . . . . . . . . .    2
;   3. Revision history . . . . . . . . . . . . . . . . . . .    3
;   4. N$INIT . . . . . . . . . . . . . . . . . . . . . . . .    4
;   5. N$ISRV . . . . . . . . . . . . . . . . . . . . . . . .    5
;   6. N$CONN . . . . . . . . . . . . . . . . . . . . . . . .    6
;   7. N$CFRK . . . . . . . . . . . . . . . . . . . . . . . .    7
;   8. N$TERM . . . . . . . . . . . . . . . . . . . . . . . .    8
;   9. N$KFRK . . . . . . . . . . . . . . . . . . . . . . . .    9
;  10. N$INT. . . . . . . . . . . . . . . . . . . . . . . . .   10
;  11. N$PINT . . . . . . . . . . . . . . . . . . . . . . . .   11
;  12. N$ITER . . . . . . . . . . . . . . . . . . . . . . . .   12
SUBTTL	Revision history

COMMENT \

12	4.2.1361	3-Jun-82
	Check for false return after L%CENT.

*****  Release 4.2 -- begin maintenance edits  *****

*****  Release 5.0 -- begin development edits  *****

20	5.1003		4-Jan-82
	Move to new development area.  Add version vector.  Clean up
edit organization.  Update TOC.

21	5.1010		8-Feb-82
	In N$INIT, set up needed locations in CHNTAB.

*****  Release 5 -- begin maintenance edits  *****
25	Increment maintenance edit level for GALAXY 5.

*****	Release 6.0 -- begin development edits	*****

30	6.1037		26-Oct-87
	Move sources from G5: to G6:

31	6.1225		8-Mar-88
	Update copyright notice.

\   ;End of Revision History
SUBTTL	N$INIT	Initialize a server link

;THIS ROUTINE WILL TRY TO SETUP A PASSIVE TASK FOR OPERATOR
;CONNECTIONS. IF SUCCESSFUL IT WILL TURN ON NSPACT OTHERWISE
;IT WILL LEAVE IT OFF


N$INIT:: SETZM	NSPACT			;INITIALIZE NSP ACTIVE FLAG
	HRROI	S1,[ASCIZ/SRV/]		;IS THERE A SERVER
	STDEV				;SEE IF EXISTS?
	   PJRST NSPSE1			;NSP ERROR ..NO NSP
	$CALL	L%CLST			;CREATE A LIST
	MOVEM	S1,G$NETL##		;SAVE THE NETWORK LIST NUMBER
	MOVSI	P1,-NUMSRV		;NUMBER OF SERVERS
	MOVEI	P2,SRVTBL		;ADDRESS OF TABLE
	MOVEI	P3,CHNSRV		;CHANNEL DISPATCH ADDRESS
	MOVEI	S1,SRVTSK		;GET SERVER NUMBER
	SKIPE	DEBUGW			;ARE WE DEBUGGING
	MOVEI	S1,DEBSRV		;GET DEBUGGING SERVER
	$TEXT	(<-1,,SRVDAT>,<SRV:^D/S1/^0>)
INIT.1:	MOVEM	P3,SRV.CN(P2)		;SAVE THE CHANNEL NUMBER
	HRLZI	S1,IPCLEV		;Get priority level
	HLR	S1,SRVADR(P1)		;Address of connect interrupt routine
	MOVEM	S1,CHNTAB(P3)		;Set it
	HRR	S1,SRVADR(P1)		;Address of input interupt routine
	MOVEM	S1,CHNTAB+1(P3)		;Set it in channel table
	$CALL	N$ISRV			;INIT A SERVER
	MOVEI	P2,SRV.SZ(P2)		;GET THE NEXT ENTRY
	ADDI	P3,2			;2 CHANNELS PER SERVER (EDIT 2)
	AOBJN	P1,INIT.1		;TRY NEXT ONE
	MOVE	S1,[IPCLEV,,N$ITER]	;INTERRUPT ON FORK TERMINATION
	MOVEM	S1,CHNTAB+.ICIFT	;SAVE IN CHANNEL TABLE
	MOVX	S1,.FHSLF		;GET MY HANDLE
	MOVX	S2,<CHNINT!1B<.ICIFT>>	;SERVERS AND FORK TERMINATION
	AIC				;ACTIVATE THE CHANNEL
	POPJ	P,			;RETURN
SUBTTL	N$ISRV	Open the server link

;THIS ROUTINE WILL OPEN A SERVER FOR THE OPR TASK AND SAVE
;JFN AND DATA IN THE SERVER TABLE
;
;CALLED WITH P1/	SERVER ENTRY
;	     P2/	SERVER ENTRY ADDRESS

N$ISRV:	MOVX	S1,GJ%SHT!GJ%NEW	;NEW CONNECTION
	HRROI	S2,SRVDAT		;POINTER TO STRING
	GTJFN				;GET A JFN
	   PJRST NSPSE2			;CAN NOT GET A JFN
	MOVEM	S1,SRV.JF(P2)		;SAVE THE JFN
	MOVE	S2,[FLD(NETBSZ,OF%BSZ)+OF%RD+OF%WR] ;OPEN FLAGS AND SIZE
	OPENF				;TRY TO OPEN LINK
	   PJRST NSPSE3			;OPEN FAILED..RETURN
	MOVE	S1,SRV.JF(P2)		;GET THE JFN
	MOVEI	S2,.MOACN		;ATTACH TO INTERRUPT SYSTEM
	SETZM	T1			;CLEAR THE FLAG
	MOVE	T2,SRV.CN(P2)		;GET CHANNEL NUMBER
	STORE	T2,T1,MO%CDN		;SAVE FOR CONNECTS
	AOS	T2			;GET NEXT CHANNEL
	STORE	T2,T1,MO%DAV		;DATA AVAILABLE INTERRUPTS (EDIT 2)
	MTOPR				;DO THE FUNCTION
	  ERJMP	NSPSE3			;CLEAN UP
	POPJ	P,			;RETURN

;ERRORS
NSPSE3:	MOVE	S1,SRV.JF(P2)		;GET THE JFN
	TXO	S1,CZ%ABT		;SET THE ABORT BIT
	CLOSF				;CLOSE AND RELEASE THE JFN
	  JRST	.+1			;IGNORE ERRORS
NSPSE1:	
NSPSE2:
	$RETF				;ERROR..RETURN ***
SUBTTL	N$CONN	Process the NSP connect request

;THIS ROUTINE WILL PROCESS THE CONNECT THAT WAS FLAGED BY THE
;INTERRUPT AND RESET THE FLAG

N$CONN:: SKIPN	NSPCON			;CONNECT?
	$RETT				;NO..JUST RETURN
	SETZ	S1,			;CLEAR S1
	EXCH	S1,NSPCON		;RESET THE VALUE
	MOVEI	P1,NUMSRV		;GET NUMBER OF SERVERS
	MOVEI	P2,SRVTBL		;ADDRESS OF SERVER TABLE
CONN.1:	SETOM	S1			;INDICATOR
	CAME	S1,SRV.IN(P2)		;DID WE GET CONNECT
	  JRST	CONN.5			;NO..TRY NEXT ONE
	SETZM	SRV.IN(P2)		;CLEAR THE FLAG
	MOVE	S1,SRV.JF(P2)		;GET THE JFN FOR LINK
	MOVX	S2,.MORLS		;READ LINK STATUS
	MTOPR				;GET STATUS IN T1
	   ERJMP CONRE1			;BAD LINK ***
	TXNN	T1,MO%WCC		;WAITING FOR CONNECT?
	   PJRST CONN.3			;NO..TRY OTHER STATES
	MOVE	S1,SRV.JF(P2)		;GET THE JFN
	MOVEI	S2,.MORHN		;READ THE HOST NAME
	HRROI	T1,NODNAM		;PLACE TO STORE NAME
	MTOPR				;GET THE NAME
	   ERJMP CONRE3			;BAD LINK..***
	MOVEI	S1,NODNAM		;GET NODE NAME ADDRESS
	$CALL	S%SIXB			;CONVERT TO SIXBIT
	SKIPE	DEBUGW			;ARE WE DEBUGGING
	PJRST	CONN.2			;YES..IGNORE NODE CHECK
	CAMN	S2,G$HOST		;IS IT CENTRAL SITE
	   PJRST CONN.4			;CLOSE THE LINK
CONN.2:	MOVEM	S2,SRVACS+T2		;SAVE THE NODE NAME
	$CALL	N$CFRK			;CREATE THE PROCESS
;	$CALL	N$ISRV			;GET ANOTHER SERVER (EDIT 2)
	JRST	CONN.5			;TRY NEXT ENTRY
CONN.3:	PJRST	CONN.5			;IGNORE OTHER CODES FOR NOW ***
CONN.4:	MOVE	S1,SRV.JF(P2)		;GET THE JFN
	MOVEI	S2,.MOCLZ		;REFUSE THE CONNECT
	HRROI	T1,[ASCIZ/Not remote node/]
	HRLI	S2,.DCX34		;GET THE CODE
	MOVEI	T2,^D15			;15 CHARACTERS
	MTOPR				;REJECT IT
	  ERJMP	.+1			;IGNORE ERROR ***
	CLOSF				;CLOSE THE LINK
	  ERJMP .+1			;*** IGNORE ERROR
	$CALL	N$ISRV			;SETUP ANOTHER SERVER (EDIT 4)
CONN.5:	MOVEI	P2,SRV.SZ(P2)		;GET TO NEXT ENTRY
	SOJG	P1,CONN.1		;TRY NEXT ONE
	$RETT				;ALL DONE..RETURN
CONRE1:
CONRE2:
CONRE3:	$RETF				;RETURN FALSE.***
SUBTTL	N$CFRK	Create a fork and process the link


;THIS ROUTINE WILL START UP AN OPR AND PROCESS THE LINK
;AS A NORMAL OPR BUT WILL ENTER OPR AT OPRRMT

N$CFRK:: MOVE	S1,G$NETL##		;GET NET LIST NUMBER
	$CALL	L%LAST			;POSITION TO THE END
	MOVE	S1,G$NETL##		;GET THE NUMBER
	MOVEI	S2,NET.SZ		;SIZE OF AN ENTRY
	$CALL	L%CENT			;CREATE AN ENTRY
	JUMPF	CFRK.2			;Trouble in river city
	MOVE	T2,S2			;SAVE IN T2 ENTRY ADDRESS
	MOVE	S1,SRV.JF(P2)		;GET NETWORK JFN
	MOVEM	S1,SRVACS+T1		;SAVE IN AC T1..SERVER LINK
	MOVX	S1,<CR%CAP!CR%ACS>	;CAPABILITIES AND AC BLOCK
	MOVEI	S2,SRVACS		;ADDRESS OF AC BLOCK
	CFORK				;CREATE A FORK
	   JRST	CFRK.1			;ERROR..
	MOVEM	S1,NET.FK(T2)		;SAVE FORK HANDLE
	MOVEM	S1,SRV.FK(P2)		;SAVE FORK HANDLE (EDIT 2)
	MOVEM	P2,NET.SA(T2)		;SAVE SERVER TABLE ADDRESS( EDIT 2 + 7)
	MOVX	S1,GJ%SHT+GJ%OLD	;SHORT+OLD JFN
	HRROI	S2,[ASCIZ/SYS:OPR.EXE/]	;OPR PROGRAM
	SKIPE	DEBUGW			;ARE WE DEBUGGING
	HRROI	S2,[ASCIZ/OPR.EXE/]	;GET FROM LOCAL AREA
	GTJFN				;GET THE JFN
	   JRST	CFRK.2			;ERROR..
	HRL	S1,NET.FK(T2)		;GET THE FORK HANDLE
	SETZ	S2,			;CLEAR S2
	GET				;GET THE PROGRAM INTO THE PROCESS
	ERJMP	CFRK.3			;KILL FORK AND RETURN
	MOVEM	S1,NET.PG(T2)		;SAVE THE JFN OF PROGRAM
	MOVE	S1,NET.FK(T2)		;GET THE FORK HANDLE
	MOVEI	S2,1			;USE ENTRY 1 IN ENTRY VECTOR
	SFRKV				;START UP THE FORK
	ERJMP	CFRK.3			;KILL THE FORK
	MOVE	S1,SRV.JF(P2)		;GET THE JFN OF LINK
	MOVEM	S1,NET.LJ(T2)		;SAVE THE LINK IN DATA BASE
	$RETT				;RETURN
CFRK.1:
CFRK.2:	$RETF				;ERROR...***
CFRK.3:	PJRST	N$KFRK			;KILL THE PROCESS
SUBTTL	N$TERM	Terminate an inferior process

;THIS ROUTINE WILL FIND THE TERMINATED PROCESS AND RELEASE THE 
;PROCESS AND JFNS

N$TERM:: SKIPN	TRMFRK			;ANY TERMINATIONS
	$RETT				;NO..RETURN
	SETZ	S1,			;CLEAR S1
	EXCH	S1,TRMFRK		;RESET THE FLAG
	MOVE	S1,G$NETL##		;GET THE NET LIST NUMBER
	$CALL	L%FIRST			;POSITION TO THE FIRST
	JUMPF	.RETT			;JUST IGNORE..MUST BE ARCHEIVE
TERM.1:	MOVE	T2,S2			;GET THE ENTRY NUMBER
	MOVE	S1,NET.FK(T2)		;GET PROCESS HANDLE
	RFSTS				;READ FORK STATUS
	  ERJMP	TERM.2			;TRY NEXT ONE
	LOAD	S2,S1,RF%STS		;GET THE STATUS
	CAIE	S2,.RFHLT		;HALTED??
	CAIN	S2,.RFFPT		;TERMINATED
	SKIPA				;YES..
	JRST	TERM.2			;NO..TRY NEXT ONE
	$CALL	N$KFRK			;KILL THE PROCESS
TERM.2:	MOVE	S1,G$NETL##		;GET LIST NUMBER
	$CALL	L%NEXT			;GET THE NEXT ENTRY
	JUMPT	TERM.1			;O.K..CHECK IT OUT
	$RETT				;RETURN
SUBTTL	N$KFRK	Kill the current process

;THIS ROUTINE WILL DO THE APPROPRIATE FORK KILLING AND JFN
;RELEASING

N$KFRK:: MOVE	S1,G$NETL##		;GET THE LIST NUMBER
	$CALL	L%CURR			;POSITION TO CURRENT ENTRY
	SKIPT				;O.K.
	$STOP(NCS,NO CURRENT SERVER DATA BASE IN SKEW)
	MOVE	T2,S2			;PLACE ADDRESS IN T2
	MOVE	S1,NET.FK(T2)		;GET FORK HANDLE
	KFORK				;KILL THE FORK
	  ERJMP KFRK.1			;ERROR..***
	MOVE	S1,NET.PG(T2)		;JFN OF PROGRAM IN PROCESS
	RLJFN				;RELEASE THE JFN
	  JRST .+1			;IGNORE ERRORS
	MOVE	S1,NET.LJ(T2)		;GET LINK JFN
	TXO	S1,CZ%ABT		;SET THE ABORT BIT
	CLOSF				;CLOSE AND RELEASE THE JFN
	  JRST	.+1			;IGNORE ERRORS
	MOVE	P2,NET.SA(T2)		;ADDRESS OF SERVER TABLE (EDIT 2)
	MOVE	S1,G$NETL##		;GET LIST NUMBER
	$CALL	L%DENT			;DELETE THE ENTRY
	SETZM	SRV.FK(P2)		;CLEAR FORK WORD
	$CALL	N$ISRV			;INIT THE SERVER (EDIT 2)
	$RETT				;RETURN
KFRK.1:	$STOP(IPH,<INVALID PROCESS HANDLE TO KILL>)
SUBTTL	N$INT	Process connect interupts



	DEFINE	SRVINT(XX,YY,ZZ),<
N$INI'XX:: $BGINT IPCLEV		;INIT INTERRUPT LEVEL
	SETOM	NSPCON			;MARK CONNECT INTERRUPT
	SETOM	SRVTBL+SRV.IN+YY	;SET INTERRUPT OCCURRED FLAG
	$DEBRK				;EXIT FROM INTERRUPT
N$INI'ZZ:: $BGINT IPCLEV		;INIT INTERRUPT LEVEL (EDIT 2)
	MOVEI	P1,SRVTBL+YY		;GET SERVER TABLE
	JRST	N$PINP			;PROCESS INPUT INTERRUPT
	>;END SRVINT

	XX==0
	YY==0
	ZZ==1
	REPEAT	NUMSRV,<SRVINT(\XX,YY,\ZZ)
	XX==XX+2
	ZZ==XX+1
	YY==YY+SRV.SZ
	>;END GENERATION
	DEFINE	SRVMAC(XX,ZZ),<
	XWD	N$INI'XX,N$INI'ZZ
	>
SRVADR:
	XX==0
	ZZ==1
	REPEAT	NUMSRV,<SRVMAC(\XX,\ZZ)
	XX==XX+2
	ZZ==XX+1
	>
SUBTTL	N$PINT	Process a data interupt

;THIS ROUTINE WILL CHECK THE SERVER AND IF ACTIVE AND
;THERE IS DATA AVAILABLE...THEN GIVE INTERRUPT TO THE
;PROCESS ..ELSE DEBRK

N$PINP:	SKIPN	SRV.FK(P1)		;FORK EXIST?
	$DEBRK				;JUST IGNORE IT
	MOVE	S1,SRV.JF(P1)		;GET THE SERVER JFN
	MOVX	S2,.MORLS		;READ THE LINK STATUS
	SETZ	T1,			;WORD FOR STATUS
	MTOPR				;DO THE MTOPR
	ERJMP	PINT.2			;FLAG ERROR
	TXNN	T1,MO%CON		;CHECK IF CONNECTED?
	JRST	PINT.1			;NO.. FORCE INTERRUPT TO TERMINATE 
	TXNN	T1,MO%EOM		;WAS THERE DATA
	$DEBRK				;NO..IGNORE IT
PINT.1:	MOVE	S1,SRV.FK(P1)		;GET THE PROCESS HANDLE
	MOVX	S2,<1B<INPCHN>>		;INPUT CHANNEL
	IIC				;GENERATE THE INTERRUPT
	ERJMP .+1			;IGNORE...***
	$DEBRK				;EXIT FROM INTERRUPT
PINT.2:	$DEBRK				;IGNORE FOR NOW***
SUBTTL	N$ITER	Process inferior termination

;THIS ROUTINE WILL FLAG FORK TERMINATION TO BE 
;PROCESSED IN MAIN LOOP

N$ITER:	$BGINT IPCLEV			;SETUP INTERRUPT LEVEL
	SETOM TRMFRK			;SET FORK TERMINATION
	$DEBRK				;EXIT FROM INTERRUPT
>;END TOPS20
	END