XWBTCPL ;SLC/KCM - Listener for TCP connects ;12/09/2004 07:33
;;1.1;RPC BROKER;**1,7,9,15,16,35**;Mar 28, 1997
;ISC-SF/EG - DHCP Broker
;
; This routine is the background process that listens for client
; requests to connect to M. When a request is received, This
; procedure will job a routine to handle the requests of the client.
;
; This job may be started in the background with: D STRT^XWBTCP(PORT)
;
; When running, this job may be stopped with: D STOP^XWBTCP(PORT)
;
; Where port is the known service port to listen for connections
; p*35 Moved reads and writes to XWBRW
;
EN(XWBTSKT) ; -- accept clients and start the individual message handler
N $ETRAP,$ESTACK S $ETRAP="D ^%ZTER J EN^XWBTCPL($G(XWBTSKT)) HALT"
N RETRY,X,XWBVER,XWBVOL,LEN,MSG,XWBOS,DONE,DSMTCP,NATIP,XWBRBUF
N XWBTIME
S U="^",RETRY="START"
X ^%ZOSF("UCI") S XWBVOL=$P(Y,",",2) ;(*p7,p9*)
IF $G(XWBTSKT)="" S XWBTSKT=9000 ; default service port
S XWBTDEV=XWBTSKT
;
Q:'$$SEMAPHOR(XWBTSKT,"LOCK") ; -- quit if job is already running
;
S XWBDEBUG=$$GET^XPAR("SYS","XWBDEBUG") ;(*p35)
I XWBDEBUG D LOGSTART^XWBDLOG("XWBTCPL") ;(*p35)
D UPDTREC(XWBTSKT,3) ;updt RPC BROKER SITE PARAMETER record as RUNNING
D MARKER^XWBTCP(XWBTSKT,-1) ;Clear marker
;
D SETNM^%ZOSV($E("RPCB_Port:"_XWBTSKT,1,15)) ;change process name
;
RESTART ;
H 5 ;Hibernate so caller can clear (*p16,*p35)
N $ESTACK S $ETRAP="D ETRAP^XWBTCPL"
S DONE=0,X=0,XWBTIME=5,XWBTIME(1)=5
S XWBOS=$S(^%ZOSF("OS")["DSM":"DSM",^("OS")["OpenM":"OpenM",^("OS")["GT.M":"GTM",^("OS")["MSM":"MSM",1:"")
S XWBT("BF")=$S(XWBOS="GT.M":"#",1:"!") ;(*p35)
;
S %T=0 ;Check for Open success (*p35)
;DSM
I XWBOS="DSM" O XWBTSKT:TCPCHAN:5 S %T=$T ;Open listener
;Cache, Terminator = $C(4)512 buffers, queue = 10
I XWBOS="OpenM" S XWBTDEV="|TCP|"_XWBTSKT O XWBTDEV:(:XWBTSKT:"A":$C(4):512:512:10):5 S %T=$T ;(*p35)
;GT.M (*p35)
I XWBOS="GTM" D
. S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""")
. S XWBTDEV="SKD$"_$J,XWBTSKT=XWBTSKT
. O XWBTDEV:(ZLISTEN=XWBTSKT_":TCP":NODELIMITER:ATTACH="listener"):5:"SOCKET" S %T=$T Q:'%T
. U XWBTDEV S XWBTDEV("LISTENER")=$KEY
. W /LISTEN(1)
. U XWBTDEV S XWBTDEV("STATUS")=$KEY
. Q
;Check if got device Open
I '%T D LOG^XWBDLOG("Open "_XWBTSKT_" Fail") Q ;(*p35)
;
I XWBDEBUG D LOG^XWBDLOG("Port Open: "_XWBTSKT)
F D Q:DONE
. S DONE=0
. ; -- listen for connect & get the initial message from the client
. I XWBOS="DSM" U XWBTSKT S XWBTIME=60 ;Will wait at read
. I XWBOS="MSM" S XWBTDEV=56 O 56 U 56::"TCP" W /SOCKET("",XWBTSKT)
. I XWBOS="OpenM" U XWBTDEV R *X ;Cache will wait here for connection
. I XWBOS="GTM" D
. . K XWBTDEV("SOCKET")
. . F D Q:$D(XWBTDEV("SOCKET"))
. . . ;Wait for connection, $KEY will be "CONNECT|socket_handle|remote_ipaddress"
. . . U XWBTDEV W /WAIT(10) S XWBTDEV("KEY")=$KEY
. . . I XWBTDEV("KEY")="" Q
. . . S XWBTDEV("SOCKET")=$P(XWBTDEV("KEY"),"|",2)
. . . S (XWBTDEV("IP"),IO("GTM-IP"))=$P(XWBTDEV("KEY"),"|",3)
. . . U XWBTDEV:(SOCKET=XWBTDEV("SOCKET"):WIDTH=512:NOWRAP:EXCEPTION="GOTO ETRAP")
. . . Q
. . Q
. ;========================MAIN LOOP=======================
. ;(*p35) change to use MSG, MSG1 and MSG2
. S (MSG,MSG1,MSG2,XWBRBUF)=""
. ;F XCNT=0:0 R MSG1#1:XWBTIME Q:$T I '$T S XCNT=XCNT+1 Q:XCNT>5
. F XCNT=0:0 S MSG1=$$BREAD^XWBRW(1,XWBTIME,1) Q:$L(MSG1) S XCNT=XCNT+1 Q:XCNT>5
. Q:XCNT>5
. I MSG1'="{" D RELEASE(0) Q ;Not the right start so Close.
. S MSG1=MSG1_$$BREAD^XWBRW(4,,1) IF (MSG1'="{XWB}") D RELEASE(0) Q
. S MSG1=MSG1_$$BREAD^XWBRW(6)
. I $E(MSG1,11)="|" D
. . S VL=$$BREAD^XWBRW(1),VL=$A(VL)
. . S XWBVER=$$BREAD^XWBRW(VL)
. . S LEN=$$BREAD^XWBRW(5)
. . S MSG=$$BREAD^XWBRW(+LEN)
. E S X=$E(MSG1,11),LEN=$E(MSG1,6,10)-1,MSG2=$$BREAD^XWBRW(LEN),MSG=X_MSG2,XWBVER=0
. ; -- msg should be: action^client IP^client port^token
. I XWBDEBUG D LOG^XWBDLOG("Hdr:"_MSG1_" Msg:"_MSG) ;(*p35)
. ;
. ; -- if the action is TCPconnect (usual case)
. I $P(MSG,"^")="TCPconnect" D
. . N DZ,%T S DZ="",%T=0,RETRY=$S($G(RETRY)>1:RETRY-1,1:0) ;(*p7*)
. . ;Get the peer and use that IP, Allow use thru a NAT box.
. . S NATIP=$$GETPEER^%ZOSV I $L(NATIP) S $P(MSG,"^",2)=NATIP ;(*p35)
. . I '$$NEWJOB D QSND("reject") Q ;(*p7,*p35)
. . I XWBDEBUG>1 D LOG^XWBDLOG("JOB: "_MSG)
. . ;Job a Server, X should be null
. . J EN^XWBTCPC($P(MSG,"^",2),$P(MSG,"^",3),$P(DZ,"^"),XWBVER,$P(MSG,"^",4))::5 S %T=$T
. . I %T D QSND("accept") ;(*p35)
. . I '%T D QSND("reject") ;(*p35)
. ;
. ; -- if the action is TCPdebug (when msg handler run interactively)
. I $P(MSG,"^")="TCPdebug" D QSND("accept") ;(*p35)
. ;
. ; -- if the action is TCPshutdown, this listener will quit if the
. ; stop flag has been set. This request comes from an M process.
. I $P(MSG,"^")="TCPshutdown" S DONE=1 D QSND^XWBRW("ack")
. D RELEASE(0) ;Now release the connection. (*p7*)
. Q
; -- loop end
;
S %=$$SEMAPHOR(XWBTSKT,"UNLOCK") ; destroy 'running flag'
D LOG^XWBDLOG("Exit")
D UPDTREC(XWBTSKT,6) ;updt RPC BROKER SITE PARAMETER record as STOPPED
S $ETRAP="" ;(*p35) Turn off error trap
IF XWBOS="DSM" C XWBTSKT ;Do Close last in case it gets an error
Q
;
QSND(STR) ;Write output (*p35)
D QSND^XWBRW(STR),LOG^XWBDLOG(STR)
Q
;
ETRAP ; -- on trapped error, send error info to client
N XWBERC,XWBERR S $ETRAP="D ^%ZTER J EN^XWBTCPL($G(XWBTSKT)) HALT"
S XWBERC=$$EC^%ZOSV,XWBERR=$C(24)_"M ERROR="_XWBERC_$C(13,10)_"LAST REF="_$$LGR^%ZOSV
D ^%ZTER ;Record error and clear $ECODE
D LOG^XWBDLOG("Error: "_$E(XWBERC,1,200))
S RETRY=$G(RETRY)+1 H 3+(RETRY\5) ;(*p7*) Slow down but never stop
;Halt if DSM DUPNAME
I XWBERC["F-DUPLNAM" D HALT
. S %=$$SEMAPHOR(XWBTSKT,"UNLOCK") ; destroy 'running flag'
. D UPDTREC(XWBTSKT,6) ;updt RPC BROKER SITE PARAMETER record as STOPPED
. Q
S XWBDEBUG=$G(XWBDEBUG)
;Set new trap
S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" G RESTART^XWBTCPL"
;
I (XWBERC["READ")!(XWBERC["WRITE")!(XWBERC["SYSTEM-F") G ETRAPX
IF XWBOS="DSM" D
. I $D(XWBTLEN),XWBTLEN,XWBERC'["SYSTEM-F" D QSND(XWBERR) ;(p35)
IF XWBOS="OpenM",XWBERC'["<WRITE>" D QSND(XWBERR) ;(*p7,35*)
IF XWBOS="MSM" D QSND(XWBERR) ;(*p7,35*)
ETRAPX D RELEASE(1) ;Now close the connection. (*p7*)
I XWBOS="DSM" H 15 ;Wait for device to close
S $ECODE=",U1," Q ;Pass error up to pop stack.
;
FLUSH ;Flush the input buffer
F R X:0 Q:'$T
Q
;
RELEASE(%) ;Now release the connection. (*p7*)
;Parameter is zero to Release, one to Close
I XWBOS="DSM" D Q ;(*p35)
. I $G(%) C XWBTSKT Q
. U XWBTSKT:DISCONNECT ; release this socket
I XWBOS="OpenM" D Q ;(*p35)
. I $G(%) C XWBTDEV Q
. W *-2 ;Release the socket
I XWBOS="GTM" D Q ;(*p35)
. I $G(%) C XWBTDEV Q
. C XWBTDEV:(SOCKET=XWBTDEV("SOCKET")) ;release the socket
I XWBOS="MSM" C 56
Q
;
UPDTREC(XWBTSKT,STATE,XWBENV) ; -- update STATUS field and ^%ZIS X-ref of the
;RPC BROKER SITE PARAMETER file
;XWBTSKT: listener port
N C,XWBOXIEN,XWBPOIEN,XWBFDA
S C=",",U="^"
I $G(XWBENV)'="" S Y=XWBENV
E D GETENV^%ZOSV ;get Y=UCI^VOL^NODE^BOXLOOKUP of current system
;I STATE=3 S ^%ZIS(8994.171,"RPCB Listener",$P(Y,U,2),$P(Y,U),$P(Y,U,4),XWBTSKT)=$J
;I STATE=6 K ^%ZIS(8994.171,"RPCB Listener",$P(Y,U,2),$P(Y,U),$P(Y,U,4),XWBTSKT)
;
S XWBOXIEN=$$FIND1^DIC(8994.17,",1,","",$P(Y,U,4)) ;find rec for box
S XWBPOIEN=$$FIND1^DIC(8994.171,C_XWBOXIEN_",1,","",XWBTSKT)
D:XWBPOIEN>0 ;update STATUS field if entry was found
. D FDA^DILF(8994.171,XWBPOIEN_C_XWBOXIEN_C_1_C,1,"R",STATE,"XWBFDA")
. D FILE^DIE("","XWBFDA")
Q
;
;
SEMAPHOR(XWBTSKT,XWBACT) ;Lock/Unlock listener semaphore
;XWBTSKT: listener port, XWBACT: "LOCK" | "UNLOCK" action to perform
;if LOCK is requested, it will be attempted with 1 sec timeout and if
;lock was obtained RESULT will be 1, otherwise it will be 0. For
;unlock RESULT will always be 1.
N RESULT
S U="^",RESULT=1
D GETENV^%ZOSV ;get Y=UCI^VOL^NODE^BOXLOOKUP of current system
I XWBACT="LOCK" D
. L +^%ZIS(8994.171,"RPCB Listener",$P(Y,U,2),$P(Y,U),$P(Y,U,4),XWBTSKT):1
. S RESULT=$T
E L -^%ZIS(8994.171,"RPCB Listener",$P(Y,U,2),$P(Y,U),$P(Y,U,4),XWBTSKT)
Q RESULT
;
NEWJOB() ;Check if OK to start a new job, Return 1 if OK, 0 if not OK.
N X,Y,XQVOL,XUVOL
S X=$O(^XTV(8989.3,1,4,"B",XWBVOL,0)),XUVOL=$S(X>0:^XTV(8989.3,1,4,X,0),1:"ROU^y^1"),XQVOL=XWBVOL
S X=$$INHIBIT^XUSRB ;Returns 1 if new logons are inhibited.
Q 'X
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXWBTCPL 8566 printed Nov 22, 2024@17:47:26 Page 2
XWBTCPL ;SLC/KCM - Listener for TCP connects ;12/09/2004 07:33
+1 ;;1.1;RPC BROKER;**1,7,9,15,16,35**;Mar 28, 1997
+2 ;ISC-SF/EG - DHCP Broker
+3 ;
+4 ; This routine is the background process that listens for client
+5 ; requests to connect to M. When a request is received, This
+6 ; procedure will job a routine to handle the requests of the client.
+7 ;
+8 ; This job may be started in the background with: D STRT^XWBTCP(PORT)
+9 ;
+10 ; When running, this job may be stopped with: D STOP^XWBTCP(PORT)
+11 ;
+12 ; Where port is the known service port to listen for connections
+13 ; p*35 Moved reads and writes to XWBRW
+14 ;
EN(XWBTSKT) ; -- accept clients and start the individual message handler
+1 NEW $ETRAP,$ESTACK
SET $ETRAP="D ^%ZTER J EN^XWBTCPL($G(XWBTSKT)) HALT"
+2 NEW RETRY,X,XWBVER,XWBVOL,LEN,MSG,XWBOS,DONE,DSMTCP,NATIP,XWBRBUF
+3 NEW XWBTIME
+4 SET U="^"
SET RETRY="START"
+5 ;(*p7,p9*)
XECUTE ^%ZOSF("UCI")
SET XWBVOL=$PIECE(Y,",",2)
+6 ; default service port
IF $GET(XWBTSKT)=""
SET XWBTSKT=9000
+7 SET XWBTDEV=XWBTSKT
+8 ;
+9 ; -- quit if job is already running
if '$$SEMAPHOR(XWBTSKT,"LOCK")
QUIT
+10 ;
+11 ;(*p35)
SET XWBDEBUG=$$GET^XPAR("SYS","XWBDEBUG")
+12 ;(*p35)
IF XWBDEBUG
DO LOGSTART^XWBDLOG("XWBTCPL")
+13 ;updt RPC BROKER SITE PARAMETER record as RUNNING
DO UPDTREC(XWBTSKT,3)
+14 ;Clear marker
DO MARKER^XWBTCP(XWBTSKT,-1)
+15 ;
+16 ;change process name
DO SETNM^%ZOSV($EXTRACT("RPCB_Port:"_XWBTSKT,1,15))
+17 ;
RESTART ;
+1 ;Hibernate so caller can clear (*p16,*p35)
HANG 5
+2 NEW $ESTACK
SET $ETRAP="D ETRAP^XWBTCPL"
+3 SET DONE=0
SET X=0
SET XWBTIME=5
SET XWBTIME(1)=5
+4 SET XWBOS=$SELECT(^%ZOSF("OS")["DSM":"DSM",^("OS")["OpenM":"OpenM",^("OS")["GT.M":"GTM",^("OS")["MSM":"MSM",1:"")
+5 ;(*p35)
SET XWBT("BF")=$SELECT(XWBOS="GT.M":"#",1:"!")
+6 ;
+7 ;Check for Open success (*p35)
SET %T=0
+8 ;DSM
+9 ;Open listener
IF XWBOS="DSM"
OPEN XWBTSKT:TCPCHAN:5
SET %T=$TEST
+10 ;Cache, Terminator = $C(4)512 buffers, queue = 10
+11 ;(*p35)
IF XWBOS="OpenM"
SET XWBTDEV="|TCP|"_XWBTSKT
OPEN XWBTDEV:(:XWBTSKT:"A":$CHAR(4):512:512:10):5
SET %T=$TEST
+12 ;GT.M (*p35)
+13 IF XWBOS="GTM"
Begin DoDot:1
+14 SET @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""")
+15 SET XWBTDEV="SKD$"_$JOB
SET XWBTSKT=XWBTSKT
+16 OPEN XWBTDEV:(ZLISTEN=XWBTSKT_":TCP":NODELIMITER:ATTACH="listener"):5:"SOCKET"
SET %T=$TEST
if '%T
QUIT
+17 USE XWBTDEV
SET XWBTDEV("LISTENER")=$KEY
+18 WRITE /LISTEN(1)
+19 USE XWBTDEV
SET XWBTDEV("STATUS")=$KEY
+20 QUIT
End DoDot:1
+21 ;Check if got device Open
+22 ;(*p35)
IF '%T
DO LOG^XWBDLOG("Open "_XWBTSKT_" Fail")
QUIT
+23 ;
+24 IF XWBDEBUG
DO LOG^XWBDLOG("Port Open: "_XWBTSKT)
+25 FOR
Begin DoDot:1
+26 SET DONE=0
+27 ; -- listen for connect & get the initial message from the client
+28 ;Will wait at read
IF XWBOS="DSM"
USE XWBTSKT
SET XWBTIME=60
+29 IF XWBOS="MSM"
SET XWBTDEV=56
OPEN 56
USE 56::"TCP"
WRITE /SOCKET("",XWBTSKT)
+30 ;Cache will wait here for connection
IF XWBOS="OpenM"
USE XWBTDEV
READ *X
+31 IF XWBOS="GTM"
Begin DoDot:2
+32 KILL XWBTDEV("SOCKET")
+33 FOR
Begin DoDot:3
+34 ;Wait for connection, $KEY will be "CONNECT|socket_handle|remote_ipaddress"
+35 USE XWBTDEV
WRITE /WAIT(10)
SET XWBTDEV("KEY")=$KEY
+36 IF XWBTDEV("KEY")=""
QUIT
+37 SET XWBTDEV("SOCKET")=$PIECE(XWBTDEV("KEY"),"|",2)
+38 SET (XWBTDEV("IP"),IO("GTM-IP"))=$PIECE(XWBTDEV("KEY"),"|",3)
+39 USE XWBTDEV:(SOCKET=XWBTDEV("SOCKET"):WIDTH=512:NOWRAP:EXCEPTION="GOTO ETRAP")
+40 QUIT
End DoDot:3
if $DATA(XWBTDEV("SOCKET"))
QUIT
+41 QUIT
End DoDot:2
+42 ;========================MAIN LOOP=======================
+43 ;(*p35) change to use MSG, MSG1 and MSG2
+44 SET (MSG,MSG1,MSG2,XWBRBUF)=""
+45 ;F XCNT=0:0 R MSG1#1:XWBTIME Q:$T I '$T S XCNT=XCNT+1 Q:XCNT>5
+46 FOR XCNT=0:0
SET MSG1=$$BREAD^XWBRW(1,XWBTIME,1)
if $LENGTH(MSG1)
QUIT
SET XCNT=XCNT+1
if XCNT>5
QUIT
+47 if XCNT>5
QUIT
+48 ;Not the right start so Close.
IF MSG1'="{"
DO RELEASE(0)
QUIT
+49 SET MSG1=MSG1_$$BREAD^XWBRW(4,,1)
IF (MSG1'="{XWB}")
DO RELEASE(0)
QUIT
+50 SET MSG1=MSG1_$$BREAD^XWBRW(6)
+51 IF $EXTRACT(MSG1,11)="|"
Begin DoDot:2
+52 SET VL=$$BREAD^XWBRW(1)
SET VL=$ASCII(VL)
+53 SET XWBVER=$$BREAD^XWBRW(VL)
+54 SET LEN=$$BREAD^XWBRW(5)
+55 SET MSG=$$BREAD^XWBRW(+LEN)
End DoDot:2
+56 IF '$TEST
SET X=$EXTRACT(MSG1,11)
SET LEN=$EXTRACT(MSG1,6,10)-1
SET MSG2=$$BREAD^XWBRW(LEN)
SET MSG=X_MSG2
SET XWBVER=0
+57 ; -- msg should be: action^client IP^client port^token
+58 ;(*p35)
IF XWBDEBUG
DO LOG^XWBDLOG("Hdr:"_MSG1_" Msg:"_MSG)
+59 ;
+60 ; -- if the action is TCPconnect (usual case)
+61 IF $PIECE(MSG,"^")="TCPconnect"
Begin DoDot:2
+62 ;(*p7*)
NEW DZ,%T
SET DZ=""
SET %T=0
SET RETRY=$SELECT($GET(RETRY)>1:RETRY-1,1:0)
+63 ;Get the peer and use that IP, Allow use thru a NAT box.
+64 ;(*p35)
SET NATIP=$$GETPEER^%ZOSV
IF $LENGTH(NATIP)
SET $PIECE(MSG,"^",2)=NATIP
+65 ;(*p7,*p35)
IF '$$NEWJOB
DO QSND("reject")
QUIT
+66 IF XWBDEBUG>1
DO LOG^XWBDLOG("JOB: "_MSG)
+67 ;Job a Server, X should be null
+68 JOB EN^XWBTCPC($PIECE(MSG,"^",2),$PIECE(MSG,"^",3),$PIECE(DZ,"^"),XWBVER,$PIECE(MSG,"^",4))::5
SET %T=$TEST
+69 ;(*p35)
IF %T
DO QSND("accept")
+70 ;(*p35)
IF '%T
DO QSND("reject")
End DoDot:2
+71 ;
+72 ; -- if the action is TCPdebug (when msg handler run interactively)
+73 ;(*p35)
IF $PIECE(MSG,"^")="TCPdebug"
DO QSND("accept")
+74 ;
+75 ; -- if the action is TCPshutdown, this listener will quit if the
+76 ; stop flag has been set. This request comes from an M process.
+77 IF $PIECE(MSG,"^")="TCPshutdown"
SET DONE=1
DO QSND^XWBRW("ack")
+78 ;Now release the connection. (*p7*)
DO RELEASE(0)
+79 QUIT
End DoDot:1
if DONE
QUIT
+80 ; -- loop end
+81 ;
+82 ; destroy 'running flag'
SET %=$$SEMAPHOR(XWBTSKT,"UNLOCK")
+83 DO LOG^XWBDLOG("Exit")
+84 ;updt RPC BROKER SITE PARAMETER record as STOPPED
DO UPDTREC(XWBTSKT,6)
+85 ;(*p35) Turn off error trap
SET $ETRAP=""
+86 ;Do Close last in case it gets an error
IF XWBOS="DSM"
CLOSE XWBTSKT
+87 QUIT
+88 ;
QSND(STR) ;Write output (*p35)
+1 DO QSND^XWBRW(STR)
DO LOG^XWBDLOG(STR)
+2 QUIT
+3 ;
ETRAP ; -- on trapped error, send error info to client
+1 NEW XWBERC,XWBERR
SET $ETRAP="D ^%ZTER J EN^XWBTCPL($G(XWBTSKT)) HALT"
+2 SET XWBERC=$$EC^%ZOSV
SET XWBERR=$CHAR(24)_"M ERROR="_XWBERC_$CHAR(13,10)_"LAST REF="_$$LGR^%ZOSV
+3 ;Record error and clear $ECODE
DO ^%ZTER
+4 DO LOG^XWBDLOG("Error: "_$EXTRACT(XWBERC,1,200))
+5 ;(*p7*) Slow down but never stop
SET RETRY=$GET(RETRY)+1
HANG 3+(RETRY\5)
+6 ;Halt if DSM DUPNAME
+7 IF XWBERC["F-DUPLNAM"
Begin DoDot:1
+8 ; destroy 'running flag'
SET %=$$SEMAPHOR(XWBTSKT,"UNLOCK")
+9 ;updt RPC BROKER SITE PARAMETER record as STOPPED
DO UPDTREC(XWBTSKT,6)
+10 QUIT
End DoDot:1
HALT
+11 SET XWBDEBUG=$GET(XWBDEBUG)
+12 ;Set new trap
+13 SET $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK -9 S $ECODE="""" G RESTART^XWBTCPL"
+14 ;
+15 IF (XWBERC["READ")!(XWBERC["WRITE")!(XWBERC["SYSTEM-F")
GOTO ETRAPX
+16 IF XWBOS="DSM"
Begin DoDot:1
+17 ;(p35)
IF $DATA(XWBTLEN)
IF XWBTLEN
IF XWBERC'["SYSTEM-F"
DO QSND(XWBERR)
End DoDot:1
+18 ;(*p7,35*)
IF XWBOS="OpenM"
IF XWBERC'["<WRITE>"
DO QSND(XWBERR)
+19 ;(*p7,35*)
IF XWBOS="MSM"
DO QSND(XWBERR)
ETRAPX ;Now close the connection. (*p7*)
DO RELEASE(1)
+1 ;Wait for device to close
IF XWBOS="DSM"
HANG 15
+2 ;Pass error up to pop stack.
SET $ECODE=",U1,"
QUIT
+3 ;
FLUSH ;Flush the input buffer
+1 FOR
READ X:0
if '$TEST
QUIT
+2 QUIT
+3 ;
RELEASE(%) ;Now release the connection. (*p7*)
+1 ;Parameter is zero to Release, one to Close
+2 ;(*p35)
IF XWBOS="DSM"
Begin DoDot:1
+3 IF $GET(%)
CLOSE XWBTSKT
QUIT
+4 ; release this socket
USE XWBTSKT:DISCONNECT
End DoDot:1
QUIT
+5 ;(*p35)
IF XWBOS="OpenM"
Begin DoDot:1
+6 IF $GET(%)
CLOSE XWBTDEV
QUIT
+7 ;Release the socket
WRITE *-2
End DoDot:1
QUIT
+8 ;(*p35)
IF XWBOS="GTM"
Begin DoDot:1
+9 IF $GET(%)
CLOSE XWBTDEV
QUIT
+10 ;release the socket
CLOSE XWBTDEV:(SOCKET=XWBTDEV("SOCKET"))
End DoDot:1
QUIT
+11 IF XWBOS="MSM"
CLOSE 56
+12 QUIT
+13 ;
UPDTREC(XWBTSKT,STATE,XWBENV) ; -- update STATUS field and ^%ZIS X-ref of the
+1 ;RPC BROKER SITE PARAMETER file
+2 ;XWBTSKT: listener port
+3 NEW C,XWBOXIEN,XWBPOIEN,XWBFDA
+4 SET C=","
SET U="^"
+5 IF $GET(XWBENV)'=""
SET Y=XWBENV
+6 ;get Y=UCI^VOL^NODE^BOXLOOKUP of current system
IF '$TEST
DO GETENV^%ZOSV
+7 ;I STATE=3 S ^%ZIS(8994.171,"RPCB Listener",$P(Y,U,2),$P(Y,U),$P(Y,U,4),XWBTSKT)=$J
+8 ;I STATE=6 K ^%ZIS(8994.171,"RPCB Listener",$P(Y,U,2),$P(Y,U),$P(Y,U,4),XWBTSKT)
+9 ;
+10 ;find rec for box
SET XWBOXIEN=$$FIND1^DIC(8994.17,",1,","",$PIECE(Y,U,4))
+11 SET XWBPOIEN=$$FIND1^DIC(8994.171,C_XWBOXIEN_",1,","",XWBTSKT)
+12 ;update STATUS field if entry was found
if XWBPOIEN>0
Begin DoDot:1
+13 DO FDA^DILF(8994.171,XWBPOIEN_C_XWBOXIEN_C_1_C,1,"R",STATE,"XWBFDA")
+14 DO FILE^DIE("","XWBFDA")
End DoDot:1
+15 QUIT
+16 ;
+17 ;
SEMAPHOR(XWBTSKT,XWBACT) ;Lock/Unlock listener semaphore
+1 ;XWBTSKT: listener port, XWBACT: "LOCK" | "UNLOCK" action to perform
+2 ;if LOCK is requested, it will be attempted with 1 sec timeout and if
+3 ;lock was obtained RESULT will be 1, otherwise it will be 0. For
+4 ;unlock RESULT will always be 1.
+5 NEW RESULT
+6 SET U="^"
SET RESULT=1
+7 ;get Y=UCI^VOL^NODE^BOXLOOKUP of current system
DO GETENV^%ZOSV
+8 IF XWBACT="LOCK"
Begin DoDot:1
+9 LOCK +^%ZIS(8994.171,"RPCB Listener",$PIECE(Y,U,2),$PIECE(Y,U),$PIECE(Y,U,4),XWBTSKT):1
+10 SET RESULT=$TEST
End DoDot:1
+11 IF '$TEST
LOCK -^%ZIS(8994.171,"RPCB Listener",$PIECE(Y,U,2),$PIECE(Y,U),$PIECE(Y,U,4),XWBTSKT)
+12 QUIT RESULT
+13 ;
NEWJOB() ;Check if OK to start a new job, Return 1 if OK, 0 if not OK.
+1 NEW X,Y,XQVOL,XUVOL
+2 SET X=$ORDER(^XTV(8989.3,1,4,"B",XWBVOL,0))
SET XUVOL=$SELECT(X>0:^XTV(8989.3,1,4,X,0),1:"ROU^y^1")
SET XQVOL=XWBVOL
+3 ;Returns 1 if new logons are inhibited.
SET X=$$INHIBIT^XUSRB
+4 QUIT 'X