XMKPRD ;ISC-SF/GMB-DNS Interface ;07/11/2002 08:09
;;8.0;MailMan;;Jun 28, 2002
NEXTIPF(XMSITE,XMIPT,XMIPLIST) ; Function returns next IP address to try.
; IN:
; XMSITE - .01 field of domain in file 4.2 (not a synonym)
; XMIPT - List of IP addresses, separated by ",", already tried
; XMIPLIST - (optional) List of IP addresses, separated by ",", to try
I '$D(XMIPLIST) D
. D SHOW(42260) ;Call DNS for IP Address list ...
. S XMIPLIST=$$IPADDR(XMSITE)
. D SHOW($S(XMIPLIST="":42261,1:42262),XMIPLIST) ;Returned: Nothing!/|1|
I XMIPLIST="" Q ""
I $G(XMIPT)="" Q $P(XMIPLIST,",")
N XMJ,XMIP
F XMJ=1:1:$L(XMIPT,",") D Q:XMIP=""!(","_XMIPT_","'[(","_XMIP_","))
. S XMIP=$P(XMIPT,",",XMJ)
. D NEXTIP(.XMIP,.XMIPLIST)
Q XMIP
IPADDR(XMSITE) ;
N XMIPARY,XMIP,XMIPSITE,XMI,XMIPREC,XMIPLIST
D MAIL^XLFNSLK(.XMIPARY,XMSITE)
S XMI=0
F S XMI=$O(XMIPARY(XMI)) Q:'XMI D
. S XMIPREC=XMIPARY(XMI)
. S XMIP=$P(XMIPREC,U,2)
. ;I XMIP'?1.N1"."1.N1"."1.N1".".E D Q
. I XMIP="" D Q
. . D SHOW(42260.1,XMIPREC) ;Ignore '|1|' - no IP address
. S XMIPSITE=$$UP^XLFSTR($P(XMIPREC,U,1))
. ; Accept whatever DNS returns, except for FORUM. We accept FORUM if
. ; we're trying to get to FORUM, but we don't want messages destined
. ; for another site to be routed through FORUM. If this is a non-VA
. ; site, then it's OK to route through FORUM.
. I ^XMB("NETNAME")[".DOMAIN.EXT",XMSITE'["DOMAIN.EXT",XMIPSITE["DOMAIN.EXT" D Q
. . D SHOW(42260.2,XMIPREC) ;Ignore '|1|' - that's a different site
. ;I '$$SAMESITE(XMIPSITE,XMSITE) D Q
. ;. D SHOW(42260.2,XMIPREC) ;Ignore '|1|' - that's a different site
. I ","_$G(XMIPLIST)_","[(","_XMIP_",") D Q
. . D SHOW(42260.3,XMIPREC) ;Ignore '|1|' - already have that IP address
. D SHOW(42260.4,XMIPREC) ;Accept '|1|'
. I $G(XMIPLIST)="" S XMIPLIST=XMIP Q
. S XMIPLIST=XMIPLIST_","_XMIP
Q $G(XMIPLIST)
SAMESITE(X,XMSITE) ;
N DIC,Y,D
I $E(X,$L(X))="." S X=$E(X,1,$L(X)-1)
S DIC="^DIC(4.2,",DIC(0)="FMXZ",D="B^C"
F D MIX^DIC1 Q:Y>0!(X'[".") S X=$P(X,".",2,99)
I Y,Y(0,0)=XMSITE Q 1
Q 0
SHOW(XMDIALOG,XM1) ;
I $D(ZTQUEUED)!'$G(XMC("PLAY")) Q
I +XMDIALOG=XMDIALOG W !,$$EZBLD^DIALOG(XMDIALOG,$G(XM1)) Q
W !,XMDIALOG
Q
NEXTIP(XMIP,XMIPLIST) ;
N XMI
F XMI=1:1:$L(XMIPLIST,",") Q:$P(XMIPLIST,",",XMI)=XMIP
I XMIP'=$P(XMIPLIST,",",XMI) S XMIP=$P(XMIPLIST,","),XMIPLIST=$P(XMIPLIST,",",2,99) Q
I XMI=1 S XMIPLIST=$P(XMIPLIST,",",2,99)
E I XMI=$L(XMIPLIST,",") S XMIPLIST=$P(XMIPLIST,",",1,XMI-1)
E S XMIPLIST=$P(XMIPLIST,",",1,XMI-1)_","_$P(XMIPLIST,",",XMI+1,99)
S XMIP=$P(XMIPLIST,","),XMIPLIST=$P(XMIPLIST,",",2,99)
Q
; *** The following is not used ***
CONNECT(XMSITE,XMIP,XMPORT) ; Function tries to connect to site.
; Returns the IP address if success; 0 if failure
; XMSITE - Site name to connect to
; XMIP - Site IP address to try first (optional). If none given,
; or if attempt fails, DNS is called to retrieve address(es).
; XMPORT - Port number to use (optional, default=25)
N XMIPLIST,XMOK
I '$G(XMPORT) S XMPORT=25
D SHOW("Connect to "_XMSITE_" on port "_XMPORT_$S($G(XMIP):", IP Address "_XMIP,1:""))
I $G(XMIP)="" D NEXTIPR(XMSITE,.XMIP,.XMIPLIST) Q:XMIP="" 0
S XMOK=0
F D TRYIP(XMIP,.XMOK) Q:XMOK D NEXTIPR(XMSITE,.XMIP,.XMIPLIST) Q:XMIP=""
Q:XMOK XMIP
D SHOW("Connect failed. Try again later.")
Q 0
NEXTIPR(XMSITE,XMIP,XMIPLIST) ; Routine returns next IP address to try
; IN/OUT:
; XMIP - in: Last IP address tried
; out: Next IP address to try
; XMIPLIST - in: (optional) List of IP addresses, separated by ",",
; we haven't yet tried
; out: Same, but with XMIP (out) removed
I '$D(XMIPLIST) D
. D SHOW(42260) ;Call DNS for IP Address list ...
. S XMIPLIST=$$IPADDR(XMSITE)
. D SHOW($S(XMIPLIST="":42261,1:42262),XMIPLIST) ;Returned: Nothing!/|1|
I XMIPLIST="" S XMIP="" Q
I $G(XMIP)="" S XMIP=$P(XMIPLIST,","),XMIPLIST=$P(XMIPLIST,",",2,99) Q
D NEXTIP(.XMIP,.XMIPLIST)
Q
TRYIP(XMIP,XMOK) ; Try the IP address, if it works, set XMOK=1
D SHOW("Trying "_XMIP)
D CALL^%ZISTCP(XMIP,XMPORT)
S XMOK='POP
I 'XMOK D SHOW("Attempt failed.")
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXMKPRD 4227 printed Dec 13, 2024@02:12:30 Page 2
XMKPRD ;ISC-SF/GMB-DNS Interface ;07/11/2002 08:09
+1 ;;8.0;MailMan;;Jun 28, 2002
NEXTIPF(XMSITE,XMIPT,XMIPLIST) ; Function returns next IP address to try.
+1 ; IN:
+2 ; XMSITE - .01 field of domain in file 4.2 (not a synonym)
+3 ; XMIPT - List of IP addresses, separated by ",", already tried
+4 ; XMIPLIST - (optional) List of IP addresses, separated by ",", to try
+5 IF '$DATA(XMIPLIST)
Begin DoDot:1
+6 ;Call DNS for IP Address list ...
DO SHOW(42260)
+7 SET XMIPLIST=$$IPADDR(XMSITE)
+8 ;Returned: Nothing!/|1|
DO SHOW($SELECT(XMIPLIST="":42261,1:42262),XMIPLIST)
End DoDot:1
+9 IF XMIPLIST=""
QUIT ""
+10 IF $GET(XMIPT)=""
QUIT $PIECE(XMIPLIST,",")
+11 NEW XMJ,XMIP
+12 FOR XMJ=1:1:$LENGTH(XMIPT,",")
Begin DoDot:1
+13 SET XMIP=$PIECE(XMIPT,",",XMJ)
+14 DO NEXTIP(.XMIP,.XMIPLIST)
End DoDot:1
if XMIP=""!(","_XMIPT_","'[(","_XMIP_","))
QUIT
+15 QUIT XMIP
IPADDR(XMSITE) ;
+1 NEW XMIPARY,XMIP,XMIPSITE,XMI,XMIPREC,XMIPLIST
+2 DO MAIL^XLFNSLK(.XMIPARY,XMSITE)
+3 SET XMI=0
+4 FOR
SET XMI=$ORDER(XMIPARY(XMI))
if 'XMI
QUIT
Begin DoDot:1
+5 SET XMIPREC=XMIPARY(XMI)
+6 SET XMIP=$PIECE(XMIPREC,U,2)
+7 ;I XMIP'?1.N1"."1.N1"."1.N1".".E D Q
+8 IF XMIP=""
Begin DoDot:2
+9 ;Ignore '|1|' - no IP address
DO SHOW(42260.1,XMIPREC)
End DoDot:2
QUIT
+10 SET XMIPSITE=$$UP^XLFSTR($PIECE(XMIPREC,U,1))
+11 ; Accept whatever DNS returns, except for FORUM. We accept FORUM if
+12 ; we're trying to get to FORUM, but we don't want messages destined
+13 ; for another site to be routed through FORUM. If this is a non-VA
+14 ; site, then it's OK to route through FORUM.
+15 IF ^XMB("NETNAME")[".DOMAIN.EXT"
IF XMSITE'["DOMAIN.EXT"
IF XMIPSITE["DOMAIN.EXT"
Begin DoDot:2
+16 ;Ignore '|1|' - that's a different site
DO SHOW(42260.2,XMIPREC)
End DoDot:2
QUIT
+17 ;I '$$SAMESITE(XMIPSITE,XMSITE) D Q
+18 ;. D SHOW(42260.2,XMIPREC) ;Ignore '|1|' - that's a different site
+19 IF ","_$GET(XMIPLIST)_","[(","_XMIP_",")
Begin DoDot:2
+20 ;Ignore '|1|' - already have that IP address
DO SHOW(42260.3,XMIPREC)
End DoDot:2
QUIT
+21 ;Accept '|1|'
DO SHOW(42260.4,XMIPREC)
+22 IF $GET(XMIPLIST)=""
SET XMIPLIST=XMIP
QUIT
+23 SET XMIPLIST=XMIPLIST_","_XMIP
End DoDot:1
+24 QUIT $GET(XMIPLIST)
SAMESITE(X,XMSITE) ;
+1 NEW DIC,Y,D
+2 IF $EXTRACT(X,$LENGTH(X))="."
SET X=$EXTRACT(X,1,$LENGTH(X)-1)
+3 SET DIC="^DIC(4.2,"
SET DIC(0)="FMXZ"
SET D="B^C"
+4 FOR
DO MIX^DIC1
if Y>0!(X'[".")
QUIT
SET X=$PIECE(X,".",2,99)
+5 IF Y
IF Y(0,0)=XMSITE
QUIT 1
+6 QUIT 0
SHOW(XMDIALOG,XM1) ;
+1 IF $DATA(ZTQUEUED)!'$GET(XMC("PLAY"))
QUIT
+2 IF +XMDIALOG=XMDIALOG
WRITE !,$$EZBLD^DIALOG(XMDIALOG,$GET(XM1))
QUIT
+3 WRITE !,XMDIALOG
+4 QUIT
NEXTIP(XMIP,XMIPLIST) ;
+1 NEW XMI
+2 FOR XMI=1:1:$LENGTH(XMIPLIST,",")
if $PIECE(XMIPLIST,",",XMI)=XMIP
QUIT
+3 IF XMIP'=$PIECE(XMIPLIST,",",XMI)
SET XMIP=$PIECE(XMIPLIST,",")
SET XMIPLIST=$PIECE(XMIPLIST,",",2,99)
QUIT
+4 IF XMI=1
SET XMIPLIST=$PIECE(XMIPLIST,",",2,99)
+5 IF '$TEST
IF XMI=$LENGTH(XMIPLIST,",")
SET XMIPLIST=$PIECE(XMIPLIST,",",1,XMI-1)
+6 IF '$TEST
SET XMIPLIST=$PIECE(XMIPLIST,",",1,XMI-1)_","_$PIECE(XMIPLIST,",",XMI+1,99)
+7 SET XMIP=$PIECE(XMIPLIST,",")
SET XMIPLIST=$PIECE(XMIPLIST,",",2,99)
+8 QUIT
+9 ; *** The following is not used ***
CONNECT(XMSITE,XMIP,XMPORT) ; Function tries to connect to site.
+1 ; Returns the IP address if success; 0 if failure
+2 ; XMSITE - Site name to connect to
+3 ; XMIP - Site IP address to try first (optional). If none given,
+4 ; or if attempt fails, DNS is called to retrieve address(es).
+5 ; XMPORT - Port number to use (optional, default=25)
+6 NEW XMIPLIST,XMOK
+7 IF '$GET(XMPORT)
SET XMPORT=25
+8 DO SHOW("Connect to "_XMSITE_" on port "_XMPORT_$SELECT($GET(XMIP):", IP Address "_XMIP,1:""))
+9 IF $GET(XMIP)=""
DO NEXTIPR(XMSITE,.XMIP,.XMIPLIST)
if XMIP=""
QUIT 0
+10 SET XMOK=0
+11 FOR
DO TRYIP(XMIP,.XMOK)
if XMOK
QUIT
DO NEXTIPR(XMSITE,.XMIP,.XMIPLIST)
if XMIP=""
QUIT
+12 if XMOK
QUIT XMIP
+13 DO SHOW("Connect failed. Try again later.")
+14 QUIT 0
NEXTIPR(XMSITE,XMIP,XMIPLIST) ; Routine returns next IP address to try
+1 ; IN/OUT:
+2 ; XMIP - in: Last IP address tried
+3 ; out: Next IP address to try
+4 ; XMIPLIST - in: (optional) List of IP addresses, separated by ",",
+5 ; we haven't yet tried
+6 ; out: Same, but with XMIP (out) removed
+7 IF '$DATA(XMIPLIST)
Begin DoDot:1
+8 ;Call DNS for IP Address list ...
DO SHOW(42260)
+9 SET XMIPLIST=$$IPADDR(XMSITE)
+10 ;Returned: Nothing!/|1|
DO SHOW($SELECT(XMIPLIST="":42261,1:42262),XMIPLIST)
End DoDot:1
+11 IF XMIPLIST=""
SET XMIP=""
QUIT
+12 IF $GET(XMIP)=""
SET XMIP=$PIECE(XMIPLIST,",")
SET XMIPLIST=$PIECE(XMIPLIST,",",2,99)
QUIT
+13 DO NEXTIP(.XMIP,.XMIPLIST)
+14 QUIT
TRYIP(XMIP,XMOK) ; Try the IP address, if it works, set XMOK=1
+1 DO SHOW("Trying "_XMIP)
+2 DO CALL^%ZISTCP(XMIP,XMPORT)
+3 SET XMOK='POP
+4 IF 'XMOK
DO SHOW("Attempt failed.")
+5 QUIT