Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: XWBCDDD

XWBCDDD.m

Go to the documentation of this file.
  1. XWBTCPC ;ISC-SF/EG/VYD - TCP/IP PROCESS HANDLER ;11/19/96 14:01 [ 11/20/96 12:53 PM ]
  1. ;;1.1T3;RPC BROKER;;Nov 25, 1996
  1. ;Based on:
  1. ;XQORTCPH ;SLC/KCM - Service TCP Messages [ 12/04/94 9:06 PM ]
  1. ;Modified by ISC-SF/EG
  1. ; 0. No longer supports old style OERR messages
  1. ; 1. Makes call to RPC broker
  1. ; 2. Handles MSM Server under Windows NT
  1. ; 3. Handles MSM under Unix - same as DSM
  1. ; 4. Result of an rpc call can be a closed form of global
  1. ; 5. Can receive a large local array, within limits of job
  1. ; partition size.
  1. ; 6. Sets default device to NULL device prior to call, restores
  1. ; at termination. Prevents garbage from 'talking' calls.
  1. ; 7. All reads have a timeout.
  1. ; 8. Intro message is sent when first connected.
  1. ; 9. Uses callback model to connect to client
  1. ;
  1. MSM ;entry point for MSERVER service - used by MSM
  1. N XWBVER,LEN,MSG,X
  1. S XWBVER=0
  1. R LEN#11 IF $E(LEN,1,5)'="{XWB}" D Q ;bad client, abort
  1. . W "RPC broker disconnect!",!
  1. . C 56
  1. . Q
  1. IF $E(LEN,11,11)="|" D
  1. . R X#1
  1. . R XWBVER#$A(X)
  1. . R LEN#5
  1. . R MSG#LEN
  1. . Q
  1. ELSE S X=$E(LEN,11,11),LEN=$E(LEN,6,10)-1 R MSG#LEN S MSG=X_MSG
  1. IF $P(MSG,"^")="TCPconnect" D
  1. . D SNDERR W "accept",$C(4),!
  1. . C 56
  1. . D EN($P(MSG,"^",2),$P(MSG,"^",3),$P(X,"^"),XWBVER)
  1. IF $P(MSG,"^")="TCPdebug" D
  1. . D SNDERR W "accept",$C(4),!
  1. C 56
  1. Q
  1. ;
  1. EN(XWBTIP,XWBTSKT,DUZ,XWBVER) ; -- Main entry point
  1. N TYPE,XWBTBUF,XWBTBUF1,XWBTDEV,XWBTLEN,XWBTOS,XWBTRTN,XWBWRAP
  1. N X,XWBL,XWB1,XWB2,Y,XWBTIME,XWBPTYPE,XWBPLEN,XWBNULL,XWBODEV
  1. N XWBERROR,XWBSEC ;new error variable available to rpc calls
  1. N XRTL,IO,IOP,L,XWBAPVER
  1. ;
  1. S XWBOS=$S(^%ZOSF("OS")["DSM":"DSM",^("OS")["UNIX":"UNIX",^("OS")["OpenM":"OpenM",1:"MSM")
  1. IF $$NEWERR^%ZTER S $ETRAP="D ^%ZTER H"
  1. E S X="^%ZTER",@^%ZOSF("TRAP")
  1. K XRTL IF XWBOS="DSM" S XRTL=1 ;log response time data for DSM
  1. S XWBTIME=1
  1. ;call client on new port
  1. IF XWBOS="DSM" D
  1. . ;IF '$D(%)#2 S %=$P($ZIO,":")_":" ; Call with dsm$xecute()
  1. . ;S %=+$P($ZIO,"Port: ",2)_":"
  1. . ;S (XWBTDEV,IO,IO(0))=%,X=$E(%_"WKSTA",1,15)
  1. . ;;D SETENV^%ZOSV
  1. . O XWBTSKT:(TCPCHAN:ADDRESS=XWBTIP:SHARE)
  1. . U XWBTSKT X ^%ZOSF("TRMOFF")
  1. . S XWBTDEV=XWBTSKT
  1. ;
  1. IF XWBOS="MSM"!(XWBOS="UNIX") D
  1. . O 56 U 56::"TCP"
  1. . W /SOCKET(XWBTIP,XWBTSKT)
  1. . ;S (XWBTDEV,IO,IO(0))=56
  1. . S XWBTDEV=56
  1. ;
  1. ;Open in stream mode, Standard terminators, Big buffers
  1. IF XWBOS="OpenM" D
  1. . S XWBTDEV="|TCP|"_XWBTSKT
  1. . O XWBTDEV:(XWBTIP:XWBTSKT:"ST":$C(13,10):512:512) ;RWF
  1. . U XWBTDEV ;RWF
  1. ;
  1. ;setup null device "NULL"
  1. S XWBNULL=$S(XWBOS="DSM":"_NLA0:",1:"")
  1. IF XWBOS="DSM" O XWBNULL
  1. ELSE D
  1. . S (IO,IO(0))=XWBTDEV
  1. . S IOP="NULL" D ^%ZIS S XWBNULL=IO
  1. ;
  1. ;change process name
  1. D CHPRN("ip"_$P(XWBTIP,".",3,4)_":"_XWBTSKT)
  1. RESTART IF $$NEWERR^%ZTER N $ESTACK S $ETRAP="S %ZTER11S=$STACK D ETRAP^XWBTCPC"
  1. E S X="ETRAP^XWBTCPC",@^%ZOSF("TRAP")
  1. S DIQUIET=1,U="^" D DT^DICRW
  1. U XWBTDEV D MAIN
  1. ;Turn off the error for the exit
  1. IF $$NEWERR^%ZTER S $ETRAP=""
  1. E S X="",@^%ZOSF("TRAP")
  1. I $G(DUZ) D LOGOUT^XUSRB
  1. K XWBR,XWBARY
  1. C XWBTDEV
  1. IF XWBOS="DSM" C XWBNULL
  1. ELSE D ^%ZISC
  1. Q
  1. ;
  1. MAIN ; -- main message processing loop
  1. F D Q:XWBTBUF="#BYE#"
  1. . S XWBAPVER=0
  1. . ;
  1. . ; -- read client request
  1. . ;R XWBTBUF#15:36000 IF '$T S XWBTBUF="#BYE#" D SNDERR W XWBTBUF,$C(4),! Q
  1. . R XWBTBUF#11:36000 IF '$T S XWBTBUF="#BYE#" D SNDERR W XWBTBUF,$C(4),! Q
  1. . S TYPE=$S($E(XWBTBUF,1,5)="{XWB}":1,1:0)
  1. . I 'TYPE S XWBTBUF="#BYE#" D SNDERR W XWBTBUF,$C(4),! Q
  1. . S XWBTLEN=$E(XWBTBUF,6,10)
  1. . S L=$E(XWBTBUF,11,11) IF L="|" R L#1 S L=$A(L) R XWBAPVER#L R XWBTBUF#5
  1. . E R XWBTBUF#4 S XWBTBUF=L_XWBTBUF
  1. . S XWBPLEN=XWBTBUF
  1. . R XWBTBUF#XWBPLEN:XWBTIME
  1. . I $P(XWBTBUF,U)="TCPconnect" D Q
  1. . . D SNDERR W "accept",$C(4),! ;Ack
  1. . IF TYPE D
  1. . . K XWBR,XWBARY
  1. . . IF XWBTBUF="#BYE#" D SNDERR W "#BYE#",$C(4),! Q ; -- clean disconnect
  1. . . S XWBTLEN=XWBTLEN-15
  1. . . ;IF XWBOS="DSM" X "ZDEBUG ON B "
  1. . . D CALLP^XWBBRK(.XWBR,XWBTBUF)
  1. . . S XWBPTYPE=$S('$D(XWBPTYPE):1,XWBPTYPE<1:1,XWBPTYPE>6:1,1:XWBPTYPE)
  1. . IF XWBTBUF="#BYE#" Q
  1. . U XWBTDEV
  1. . D SNDERR
  1. . D:$D(XRTL) T0^%ZOSV ;start RTL
  1. . IF XWBOS="DSM"!(XWBOS="UNIX")!(XWBOS="OpenM") D SNDDSM ;RWF
  1. . IF XWBOS="MSM" D SND
  1. . S XWBSEC=""
  1. . W $C(4),! ;send eot and flush buffer
  1. . S:$D(XRT0) XRTN="RPC BROKER WRITE" D:$D(XRT0) T1^%ZOSV ;stop RTL
  1. Q ;End Of Main
  1. ;
  1. SNDERR ;send error information
  1. ;XWBSEC is the security packet, XWBERROR is application packet
  1. N X
  1. S X=$G(XWBSEC)
  1. W $C($L(X))_X W:($X+$L(X)+1)>512 !
  1. S X=$G(XWBERROR)
  1. W $C($L(X))_X W:($X+$L(X)+1)>512 !
  1. S XWBERROR="" ;clears parameters
  1. Q
  1. ;
  1. SND ; -- Send data (all except DSM)
  1. N I,T
  1. ;
  1. ; -- error or abort occurred, send null
  1. IF $L(XWBSEC)>0 W "" Q
  1. ; -- RPC returned closed root of array, process it as global array
  1. IF XWBPTYPE=2,$D(XWBR)#2,$D(@XWBR)>1 S XWBPTYPE=4,XWBWRAP=1
  1. ; -- single value
  1. IF XWBPTYPE=1 S XWBR=$G(XWBR) W XWBR Q
  1. ; -- table delimited by CR+LF
  1. IF XWBPTYPE=2 D Q
  1. . S I="" F S I=$O(XWBR(I)) Q:I="" W XWBR(I),$C(13,10)
  1. ; -- word processing
  1. IF XWBPTYPE=3 D Q
  1. . S I="" F S I=$O(XWBR(I)) Q:I="" W XWBR(I) W:XWBWRAP $C(13,10)
  1. ; -- global array
  1. IF XWBPTYPE=4 D Q
  1. . S I=XWBR,T=$E(I,1,$L(I)-1) W:$D(@I)>10 @I F S I=$Q(@I) Q:I=""!(I'[T) W @I W:XWBWRAP $C(13,10)
  1. ; -- global instance
  1. IF XWBPTYPE=5 S XWBR=$G(@XWBR) W XWBR Q
  1. ; -- variable length records
  1. IF XWBPTYPE=6 S I="" F S I=$O(XWBR(I)) Q:I="" W $C($L(XWBR(I))),XWBR(I)
  1. Q
  1. SNDDSM ; -- send data for DSM (requires buffer flush (!) every 509 chars)
  1. N I,T
  1. ;
  1. ; -- error or abort occurred, send null
  1. IF $L(XWBSEC)>0 W "" Q
  1. ; -- RPC returned closed root of array, process it as global array
  1. IF XWBPTYPE=2,$D(XWBR)#2,$D(@XWBR)>1 S XWBPTYPE=4,XWBWRAP=1
  1. ; -- single value
  1. IF XWBPTYPE=1 S XWBR=$G(XWBR) W XWBR Q
  1. ; -- table delimited by CR+LF
  1. I XWBPTYPE=2 D Q
  1. . S I="" F S I=$O(XWBR(I)) Q:I="" W:($X+$L(XWBR(I)))>509 ! W XWBR(I),$C(13,10)
  1. ; -- word processing
  1. IF XWBPTYPE=3 D Q
  1. . S I="" F S I=$O(XWBR(I)) Q:I="" W:($X+$L(XWBR(I)))>509 ! W XWBR(I) W:XWBWRAP $C(13,10)
  1. ; -- global array
  1. IF XWBPTYPE=4 D Q
  1. . S I=XWBR,T=$E(I,1,$L(I)-1) W:$D(@I)>10 @I F S I=$Q(@I) Q:I=""!(I'[T) W:($X+$L(@I))>509 ! W @I W:XWBWRAP&(@I'=$C(13,10)) $C(13,10)
  1. ; -- global instance
  1. IF XWBPTYPE=5 S XWBR=$G(@XWBR) W XWBR Q
  1. ; -- variable length records
  1. IF XWBPTYPE=6 S I="" F S I=$O(XWBR(I)) Q:I="" W:($X+$L(XWBR(I)))>509 ! W $C($L(XWBR(I))),XWBR(I)
  1. Q
  1. ;
  1. ETRAP ; -- on trapped error, send error info to client
  1. N XWBERR
  1. S XWBERR=$C(24)_"M ERROR="_$ZERROR_$C(13,10)_"LAST REF="_$ZR_$C(4)
  1. ;Turn off trapping during trap.
  1. IF $$NEWERR^%ZTER S $ETRAP=""
  1. E S X="",@^%ZOSF("TRAP")
  1. U XWBTDEV
  1. D ^%ZTER
  1. IF XWBOS="DSM" D
  1. . I $D(XWBTLEN),XWBTLEN,$ZE'["SYSTEM-F" D SNDERR W XWBERR,!
  1. IF XWBOS'="DSM" D
  1. . D SNDERR W XWBERR,!
  1. I ($ZE["READERR")!($ZE["DISCON")!($ZE["SYSTEM-F") HALT
  1. I '$$NEWERR^%ZTER G RESTART
  1. S $ETRAP="Q:($ESTACK&'$QUIT) Q:$ESTACK 0 S $ECODE="""" G RESTART",$ECODE=",U99,"
  1. Q
  1. ;
  1. BREAD(L) ;read tcp buffer, L is length
  1. N E,X,DONE
  1. S (E,DONE)=0
  1. R X#L:XWBTIME
  1. S E=X
  1. IF $L(E)<L F D Q:'DONE
  1. . IF $L(E)=L S DONE=1 Q
  1. . R X#(L-$L(E)):XWBTIME
  1. . S E=E_X
  1. Q E
  1. ;
  1. CHPRN(N) ;change process name
  1. ;Change process name to N
  1. D SETNM^%ZOSV($E(N,1,15))
  1. Q
  1. ;