| 1 | XMKPRD ;ISC-SF/GMB-DNS Interface ;07/11/2002  08:09 | 
|---|
| 2 | ;;8.0;MailMan;;Jun 28, 2002 | 
|---|
| 3 | NEXTIPF(XMSITE,XMIPT,XMIPLIST) ; Function returns next IP address to try. | 
|---|
| 4 | ; IN: | 
|---|
| 5 | ; XMSITE   - .01 field of domain in file 4.2 (not a synonym) | 
|---|
| 6 | ; XMIPT    - List of IP addresses, separated by ",", already tried | 
|---|
| 7 | ; XMIPLIST - (optional) List of IP addresses, separated by ",", to try | 
|---|
| 8 | I '$D(XMIPLIST) D | 
|---|
| 9 | . D SHOW(42260) ;Call DNS for IP Address list ... | 
|---|
| 10 | . S XMIPLIST=$$IPADDR(XMSITE) | 
|---|
| 11 | . D SHOW($S(XMIPLIST="":42261,1:42262),XMIPLIST) ;Returned: Nothing!/|1| | 
|---|
| 12 | I XMIPLIST="" Q "" | 
|---|
| 13 | I $G(XMIPT)="" Q $P(XMIPLIST,",") | 
|---|
| 14 | N XMJ,XMIP | 
|---|
| 15 | F XMJ=1:1:$L(XMIPT,",") D  Q:XMIP=""!(","_XMIPT_","'[(","_XMIP_",")) | 
|---|
| 16 | . S XMIP=$P(XMIPT,",",XMJ) | 
|---|
| 17 | . D NEXTIP(.XMIP,.XMIPLIST) | 
|---|
| 18 | Q XMIP | 
|---|
| 19 | IPADDR(XMSITE) ; | 
|---|
| 20 | N XMIPARY,XMIP,XMIPSITE,XMI,XMIPREC,XMIPLIST | 
|---|
| 21 | D MAIL^XLFNSLK(.XMIPARY,XMSITE) | 
|---|
| 22 | S XMI=0 | 
|---|
| 23 | F  S XMI=$O(XMIPARY(XMI)) Q:'XMI  D | 
|---|
| 24 | . S XMIPREC=XMIPARY(XMI) | 
|---|
| 25 | . S XMIP=$P(XMIPREC,U,2) | 
|---|
| 26 | . ;I XMIP'?1.N1"."1.N1"."1.N1".".E D  Q | 
|---|
| 27 | . I XMIP="" D  Q | 
|---|
| 28 | . . D SHOW(42260.1,XMIPREC) ;Ignore '|1|' - no IP address | 
|---|
| 29 | . S XMIPSITE=$$UP^XLFSTR($P(XMIPREC,U,1)) | 
|---|
| 30 | . ; Accept whatever DNS returns, except for FORUM.  We accept FORUM if | 
|---|
| 31 | . ; we're trying to get to FORUM, but we don't want messages destined | 
|---|
| 32 | . ; for another site to be routed through FORUM.  If this is a non-VA | 
|---|
| 33 | . ; site, then it's OK to route through FORUM. | 
|---|
| 34 | . I ^XMB("NETNAME")[".VA.GOV",XMSITE'["FORUM.VA.GOV",XMIPSITE["FORUM.VA.GOV" D  Q | 
|---|
| 35 | . . D SHOW(42260.2,XMIPREC) ;Ignore '|1|' - that's a different site | 
|---|
| 36 | . ;I '$$SAMESITE(XMIPSITE,XMSITE) D  Q | 
|---|
| 37 | . ;. D SHOW(42260.2,XMIPREC) ;Ignore '|1|' - that's a different site | 
|---|
| 38 | . I ","_$G(XMIPLIST)_","[(","_XMIP_",") D  Q | 
|---|
| 39 | . . D SHOW(42260.3,XMIPREC) ;Ignore '|1|' - already have that IP address | 
|---|
| 40 | . D SHOW(42260.4,XMIPREC) ;Accept '|1|' | 
|---|
| 41 | . I $G(XMIPLIST)="" S XMIPLIST=XMIP Q | 
|---|
| 42 | . S XMIPLIST=XMIPLIST_","_XMIP | 
|---|
| 43 | Q $G(XMIPLIST) | 
|---|
| 44 | SAMESITE(X,XMSITE) ; | 
|---|
| 45 | N DIC,Y,D | 
|---|
| 46 | I $E(X,$L(X))="." S X=$E(X,1,$L(X)-1) | 
|---|
| 47 | S DIC="^DIC(4.2,",DIC(0)="FMXZ",D="B^C" | 
|---|
| 48 | F  D MIX^DIC1 Q:Y>0!(X'[".")  S X=$P(X,".",2,99) | 
|---|
| 49 | I Y,Y(0,0)=XMSITE Q 1 | 
|---|
| 50 | Q 0 | 
|---|
| 51 | SHOW(XMDIALOG,XM1) ; | 
|---|
| 52 | I $D(ZTQUEUED)!'$G(XMC("PLAY")) Q | 
|---|
| 53 | I +XMDIALOG=XMDIALOG W !,$$EZBLD^DIALOG(XMDIALOG,$G(XM1)) Q | 
|---|
| 54 | W !,XMDIALOG | 
|---|
| 55 | Q | 
|---|
| 56 | NEXTIP(XMIP,XMIPLIST) ; | 
|---|
| 57 | N XMI | 
|---|
| 58 | F XMI=1:1:$L(XMIPLIST,",") Q:$P(XMIPLIST,",",XMI)=XMIP | 
|---|
| 59 | I XMIP'=$P(XMIPLIST,",",XMI) S XMIP=$P(XMIPLIST,","),XMIPLIST=$P(XMIPLIST,",",2,99) Q | 
|---|
| 60 | I XMI=1 S XMIPLIST=$P(XMIPLIST,",",2,99) | 
|---|
| 61 | E  I XMI=$L(XMIPLIST,",") S XMIPLIST=$P(XMIPLIST,",",1,XMI-1) | 
|---|
| 62 | E  S XMIPLIST=$P(XMIPLIST,",",1,XMI-1)_","_$P(XMIPLIST,",",XMI+1,99) | 
|---|
| 63 | S XMIP=$P(XMIPLIST,","),XMIPLIST=$P(XMIPLIST,",",2,99) | 
|---|
| 64 | Q | 
|---|
| 65 | ; *** The following is not used *** | 
|---|
| 66 | CONNECT(XMSITE,XMIP,XMPORT) ; Function tries to connect to site. | 
|---|
| 67 | ; Returns the IP address if success; 0 if failure | 
|---|
| 68 | ; XMSITE - Site name to connect to | 
|---|
| 69 | ; XMIP   - Site IP address to try first (optional).  If none given, | 
|---|
| 70 | ;           or if attempt fails, DNS is called to retrieve address(es). | 
|---|
| 71 | ; XMPORT - Port number to use (optional, default=25) | 
|---|
| 72 | N XMIPLIST,XMOK | 
|---|
| 73 | I '$G(XMPORT) S XMPORT=25 | 
|---|
| 74 | D SHOW("Connect to "_XMSITE_" on port "_XMPORT_$S($G(XMIP):", IP Address "_XMIP,1:"")) | 
|---|
| 75 | I $G(XMIP)="" D NEXTIPR(XMSITE,.XMIP,.XMIPLIST) Q:XMIP="" 0 | 
|---|
| 76 | S XMOK=0 | 
|---|
| 77 | F  D TRYIP(XMIP,.XMOK) Q:XMOK  D NEXTIPR(XMSITE,.XMIP,.XMIPLIST) Q:XMIP="" | 
|---|
| 78 | Q:XMOK XMIP | 
|---|
| 79 | D SHOW("Connect failed.  Try again later.") | 
|---|
| 80 | Q 0 | 
|---|
| 81 | NEXTIPR(XMSITE,XMIP,XMIPLIST) ; Routine returns next IP address to try | 
|---|
| 82 | ; IN/OUT: | 
|---|
| 83 | ; XMIP     - in:  Last IP address tried | 
|---|
| 84 | ;            out: Next IP address to try | 
|---|
| 85 | ; XMIPLIST - in:  (optional) List of IP addresses, separated by ",", | 
|---|
| 86 | ;                 we haven't yet tried | 
|---|
| 87 | ;            out: Same, but with XMIP (out) removed | 
|---|
| 88 | I '$D(XMIPLIST) D | 
|---|
| 89 | . D SHOW(42260) ;Call DNS for IP Address list ... | 
|---|
| 90 | . S XMIPLIST=$$IPADDR(XMSITE) | 
|---|
| 91 | . D SHOW($S(XMIPLIST="":42261,1:42262),XMIPLIST) ;Returned: Nothing!/|1| | 
|---|
| 92 | I XMIPLIST="" S XMIP="" Q | 
|---|
| 93 | I $G(XMIP)="" S XMIP=$P(XMIPLIST,","),XMIPLIST=$P(XMIPLIST,",",2,99) Q | 
|---|
| 94 | D NEXTIP(.XMIP,.XMIPLIST) | 
|---|
| 95 | Q | 
|---|
| 96 | TRYIP(XMIP,XMOK) ; Try the IP address, if it works, set XMOK=1 | 
|---|
| 97 | D SHOW("Trying "_XMIP) | 
|---|
| 98 | D CALL^%ZISTCP(XMIP,XMPORT) | 
|---|
| 99 | S XMOK='POP | 
|---|
| 100 | I 'XMOK D SHOW("Attempt failed.") | 
|---|
| 101 | Q | 
|---|