| 1 | XWBTCPC ;ISC-SF/EG/VYD - TCP/IP PROCESS HANDLER ;08/25/2004  14:18
 | 
|---|
| 2 |  ;;1.1;RPC BROKER;**2,5,4,6,9,16,26,35**;Mar 28, 1997
 | 
|---|
| 3 |  ;Based on: XQORTCPH ;SLC/KCM - Service TCP Messages
 | 
|---|
| 4 |  ;Modified by ISC-SF/EG
 | 
|---|
| 5 |  ; 0. No longer supports old style OERR messages
 | 
|---|
| 6 |  ; 1. Makes call to RPC  broker
 | 
|---|
| 7 |  ; 2. Result of an rpc call can be a closed form of global
 | 
|---|
| 8 |  ; 3. Can receive a large local array, within limits of job
 | 
|---|
| 9 |  ;    partition size.
 | 
|---|
| 10 |  ; 4. Sets default device to NULL device prior to call, restores
 | 
|---|
| 11 |  ;    at termination.  Prevents garbage from 'talking' calls.
 | 
|---|
| 12 |  ; 5. All reads have a timeout.
 | 
|---|
| 13 |  ; 6. Intro message is sent when first connected.
 | 
|---|
| 14 |  ; 7. Uses callback model to connect to client
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 | EN(XWBTIP,XWBTSKT,DUZ,XWBVER,XWBCLMAN) ; -- Main entry point
 | 
|---|
| 18 |  N TYPE,XWBTBUF,XWBTBUF1,XWBTDEV,XWBTLEN,XWBTOS,XWBTRTN,XWBWRAP
 | 
|---|
| 19 |  N X,XWBL,XWB1,XWB2,Y,XWBTIME,XWBPTYPE,XWBPLEN,XWBNULL,XWBODEV,XWBRBUF
 | 
|---|
| 20 |  N XWBERROR,XWBSEC ;new error variable available to rpc calls
 | 
|---|
| 21 |  N IO,IOP,L,XWBAPVER,VL,XWBTHDR,XWBT
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 |  ;Set up the error trap
 | 
|---|
| 24 |  S U="^",$ETRAP="D ^%ZTER,XUTL^XUSCLEAN H" ;XWB-30
 | 
|---|
| 25 |  S XWBOS=$$OS
 | 
|---|
| 26 |  S XWBT("BF")=$S(XWBOS="GT.M":"#",1:"!")
 | 
|---|
| 27 |  ;start RUM for Broker Handler XWB*1.1*5
 | 
|---|
| 28 |  D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,1)
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  S XWBCLMAN=$G(XWBCLMAN)
 | 
|---|
| 31 |  I '$D(XWBDEBUG) D  ;(*p35)
 | 
|---|
| 32 |  . S XWBDEBUG=$$GET^XPAR("SYS","XWBDEBUG")
 | 
|---|
| 33 |  . D LOGSTART^XWBDLOG("XWBTCPC")
 | 
|---|
| 34 |  . Q
 | 
|---|
| 35 |  I XWBDEBUG D LOG("Callback: "_XWBTIP_" :"_XWBTSKT) ;(*p35)
 | 
|---|
| 36 |  D SETTIME(1) ;Setup for sign-on time-out
 | 
|---|
| 37 |  ;Use Kernel to open the connection back to the client on new port
 | 
|---|
| 38 |  D CALL^%ZISTCP(XWBTIP,XWBTSKT) Q:POP  S XWBTDEV=IO,IO(0)=IO
 | 
|---|
| 39 |  ;Attempt to share the license, Must have TCP port open first.
 | 
|---|
| 40 |  U XWBTDEV I $T(SHARELIC^%ZOSV)'="" D SHARELIC^%ZOSV(1)
 | 
|---|
| 41 |  ;setup null device "NULL"
 | 
|---|
| 42 |  S %ZIS="0H",IOP="NULL" D ^%ZIS S XWBNULL=IO I POP S XWBERROR="No NULL device" D ^%ZTER Q
 | 
|---|
| 43 |  D SAVDEV^%ZISUTL("XWBNULL")
 | 
|---|
| 44 |  I XWBOS="GTM" S @("$ZINTERRUPT=""I $$JOBEXAM^ZU($ZPOSITION)""")
 | 
|---|
| 45 |  ;change process name
 | 
|---|
| 46 |  S X="ip"_$P(XWBTIP,".",3,4)_":"_XWBTSKT
 | 
|---|
| 47 |  D SETNM^%ZOSV($E(X,1,15)),LOG("ProcName: "_X)
 | 
|---|
| 48 | RESTART ;(*p35)
 | 
|---|
| 49 |  N $ESTACK S $ETRAP="D ETRAP^XWBTCPC"
 | 
|---|
| 50 |  S U="^",DUZ=0,DUZ(0)="",DTIME=300
 | 
|---|
| 51 |  U XWBTDEV D MAIN
 | 
|---|
| 52 |  ;Turn off the error trap for the exit
 | 
|---|
| 53 |  S $ETRAP=""
 | 
|---|
| 54 |  I $G(DUZ) D LOGOUT^XUSRB
 | 
|---|
| 55 |  K XWBR,XWBARY
 | 
|---|
| 56 |  ;stop RUM for handler XWB*1.1*5
 | 
|---|
| 57 |  D LOGRSRC^%ZOSV("$BROKER HANDLER$",2,2)
 | 
|---|
| 58 |  D LOG("DUZ="_$G(DUZ)_"  LOGGED OFF")
 | 
|---|
| 59 |  D USE^%ZISUTL("XWBNULL"),CLOSE^%ZISUTL("XWBNULL")
 | 
|---|
| 60 |  C XWBTDEV ;Close can get an error
 | 
|---|
| 61 |  Q
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 | MAIN ; -- main message processing loop
 | 
|---|
| 64 |  N XCNT,XR
 | 
|---|
| 65 |  F  D  Q:XWBTBUF="#BYE#"
 | 
|---|
| 66 |  . S XWBAPVER=0,(XWBSEC,XWBERROR,XWBRBUF)=""
 | 
|---|
| 67 |  . U XWBTDEV ;Make sure we are reading from the right device
 | 
|---|
| 68 |  . ; -- read client request
 | 
|---|
| 69 |  . ;F XCNT=0:0 R XR#1:XWBTIME Q:(XR="{")!(XR="#")  I '$T S XCNT=XCNT+1 Q:XCNT>5
 | 
|---|
| 70 |  . S XR=$$BREAD^XWBRW(1,XWBTIME,1)
 | 
|---|
| 71 |  . I '$L(XR) D LOG("Timeout"),TIMEOUT S XWBTBUF="#BYE#" Q
 | 
|---|
| 72 |  . S XWBTHDR=XR_$$BREAD^XWBRW(4) ;(*p35)
 | 
|---|
| 73 |  . I XWBTHDR["#BYE#" S XWBTBUF="#BYE#" Q  ;Clear $C(4)
 | 
|---|
| 74 |  . S XWBTHDR=XWBTHDR_$$BREAD^XWBRW(6)
 | 
|---|
| 75 |  . I $G(XWBDEBUG)>1 D LOG("HDR Read:"_XWBTHDR_":")
 | 
|---|
| 76 |  . S TYPE=($E(XWBTHDR,1,5)="{XWB}")  ;check HDR
 | 
|---|
| 77 |  . I 'TYPE D  Q
 | 
|---|
| 78 |  . . D LOG("Bad Header: "_XWBTHDR) ;(*p35)
 | 
|---|
| 79 |  . . S XWBTBUF="#BYE#" D QSND^XWBRW(XWBTBUF) ;(*p35)
 | 
|---|
| 80 |  . . Q
 | 
|---|
| 81 |  . S XWBTLEN=$E(XWBTHDR,6,10),L=$E(XWBTHDR,11)
 | 
|---|
| 82 |  . I L="|" D  ;(*p35)  Save $T
 | 
|---|
| 83 |  . . S VL=$$BREAD^XWBRW(1),VL=$A(VL)
 | 
|---|
| 84 |  . . S XWBAPVER=$$BREAD^XWBRW(VL),XWBPLEN=$$BREAD^XWBRW(5) ;(*p35)
 | 
|---|
| 85 |  . E  S XWBTBUF=$$BREAD^XWBRW(4),XWBPLEN=L_XWBTBUF ;(*p35)
 | 
|---|
| 86 |  . S XWBTBUF=$$BREAD^XWBRW(XWBPLEN) ;(*p35)
 | 
|---|
| 87 |  . I $P(XWBTBUF,U)="TCPconnect" D  Q
 | 
|---|
| 88 |  . . D QSND^XWBRW("accept") ;Ack (*p35)
 | 
|---|
| 89 |  . IF TYPE D
 | 
|---|
| 90 |  . . K XWBR,XWBARY
 | 
|---|
| 91 |  . . IF XWBTBUF="#BYE#" D QSND^XWBRW("#BYE#") Q  ; -- clean disconnect
 | 
|---|
| 92 |  . . S XWBTLEN=XWBTLEN-15
 | 
|---|
| 93 |  . . D CALLP^XWBBRK(.XWBR,XWBTBUF)
 | 
|---|
| 94 |  . . S XWBPTYPE=$S('$D(XWBPTYPE):1,XWBPTYPE<1:1,XWBPTYPE>6:1,1:XWBPTYPE)
 | 
|---|
| 95 |  . IF XWBTBUF="#BYE#" D LOG("APP set #BYE#") Q  ;(*p35)
 | 
|---|
| 96 |  . U XWBTDEV
 | 
|---|
| 97 |  . D SND^XWBRW ;Does SNDERR,SND,WRITE($C(4))
 | 
|---|
| 98 |  . I $G(XWBSHARE) D KILL1^XUSCLEAN ; CLEAN OUT PARTITION FOR SHARED BROKER
 | 
|---|
| 99 |  Q  ;End Of Main
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 | ETRAP ; -- on trapped error, send error info to client
 | 
|---|
| 102 |  N XWBERC,XWBERR
 | 
|---|
| 103 |  ;Change trapping during trap.
 | 
|---|
| 104 |  S $ETRAP="D ^%ZTER,BYE^XUSCLEAN,XUTL^XUSCLEAN HALT" ;XWB-30
 | 
|---|
| 105 |  S XWBERC=$E($$EC^%ZOSV,1,200),XWBERR="M  ERROR="_XWBERC_$C(13,10)_"LAST REF="_$$LGR^%ZOSV
 | 
|---|
| 106 |  S XWBOS=$$OS
 | 
|---|
| 107 |  ;Check for short read, Tell Client to resend.
 | 
|---|
| 108 |  I $EC["U411" S XWBERROR="U411",XWBSEC="",XWBERR="Data Transfer Error to Server"
 | 
|---|
| 109 |  D ^%ZTER ;%ZTER clears $ZE and $ECODE
 | 
|---|
| 110 |  I $G(XWBDEBUG) D LOG("In ETRAP: "_XWBERC) ;(*p35)
 | 
|---|
| 111 |  I ($G(XWBERC)["READ")!($G(XWBERC)["WRITE")!($G(XWBERC)["SYSTEM-F")!('$D(XWBERC)) D:$G(DUZ) LOGOUT^XUSRB HALT  ; XWB-30
 | 
|---|
| 112 |  U XWBTDEV
 | 
|---|
| 113 |  L  ;Clear locks (*p35)
 | 
|---|
| 114 | ETX ;Exit for trap
 | 
|---|
| 115 |  D ESND^XWBRW($C(24)_XWBERR_$C(4)) ;(p*35)
 | 
|---|
| 116 |  S $ETRAP="Q:($ESTACK&'$QUIT)  Q:$ESTACK -9 S $ECODE="""" G RESTART^XWBTCPC",$ECODE=",U99,"
 | 
|---|
| 117 |  Q
 | 
|---|
| 118 |  ;
 | 
|---|
| 119 | STYPE(X,WRAP) ;For backward compatability only
 | 
|---|
| 120 |  I $D(WRAP) Q $$RTRNFMT^XWBLIB($G(X),WRAP)
 | 
|---|
| 121 |  Q $$RTRNFMT^XWBLIB(X)
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 | SETTIME(%) ;Set the Read timeout 0=RPC, 1=sign-on
 | 
|---|
| 124 |  ; Increased timeout period (%=1) during signon from 90 to 180 for accessibility reasons
 | 
|---|
| 125 |  S XWBTIME=$S($G(%):180,$G(XWBVER)>1.105:$$BAT^XUPARAM,1:36000),XWBTIME(1)=5 ; (*p35)
 | 
|---|
| 126 |  I $G(%) S XWBTIME=$S($G(XWBVER)>1.1:90,1:36000)
 | 
|---|
| 127 |  Q
 | 
|---|
| 128 | TIMEOUT ;Do this on MAIN  loop timeout
 | 
|---|
| 129 |  I $G(DUZ)>0 D QSND^XWBRW("#BYE#"_$C(4)) Q
 | 
|---|
| 130 |  ;Sign-on timeout
 | 
|---|
| 131 |  S XWBR(0)=0,XWBR(1)=1,XWBR(2)="",XWBR(3)="TIME-OUT",XWBPTYPE=2
 | 
|---|
| 132 |  D SND^XWBRW
 | 
|---|
| 133 |  Q
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 | MSM ;entry point for MSERVER service - used by MSM
 | 
|---|
| 136 |  N XWBVER,LEN,MSG,X
 | 
|---|
| 137 |  S XWBVER=0
 | 
|---|
| 138 |  R LEN#11:3600 IF $E(LEN,1,5)'="{XWB}" D  Q  ;bad client, abort
 | 
|---|
| 139 |  . W "RPC broker disconnect!",!
 | 
|---|
| 140 |  . C 56
 | 
|---|
| 141 |  . Q
 | 
|---|
| 142 |  IF $E(LEN,11,11)="|" D
 | 
|---|
| 143 |  . R X#1:60
 | 
|---|
| 144 |  . R XWBVER#$A(X):60
 | 
|---|
| 145 |  . R LEN#5:60
 | 
|---|
| 146 |  . R MSG#LEN:60
 | 
|---|
| 147 |  . Q
 | 
|---|
| 148 |  ELSE  S X=$E(LEN,11,11),LEN=$E(LEN,6,10)-1 R MSG#LEN:60 S MSG=X_MSG
 | 
|---|
| 149 |  IF $P(MSG,"^")="TCPconnect" D
 | 
|---|
| 150 |  . D QSND^XWBRW("accept")
 | 
|---|
| 151 |  . C 56
 | 
|---|
| 152 |  . D EN($P(MSG,"^",2),$P(MSG,"^",3),$P(X,"^"),XWBVER,$P(MSG,"^",4))
 | 
|---|
| 153 |  IF $P(MSG,"^")="TCPdebug" D
 | 
|---|
| 154 |  . D QSND^XWBRW("accept")
 | 
|---|
| 155 |  C 56
 | 
|---|
| 156 |  Q
 | 
|---|
| 157 | OS() ;Return the OS
 | 
|---|
| 158 |  N % S %=^%ZOSF("OS") ;(*p35)
 | 
|---|
| 159 |  Q $S(%["DSM":"DSM",%["OpenM":"OpenM",%["GT.M":"GTM",1:"MSM") ;(*p35)
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 | LOG(TX) ;DeBug Logging (*p35)
 | 
|---|
| 162 |  D:$G(XWBDEBUG) LOG^XWBDLOG(TX)
 | 
|---|
| 163 |  Q
 | 
|---|