| 1 | XMR ;ISC-SF/GMB-SMTP Receiver (RFC 821) ;09/24/2003  12:25
 | 
|---|
| 2 |  ;;8.0;MailMan;**22**;Jun 28, 2002
 | 
|---|
| 3 | ENT ; INITIALIZE
 | 
|---|
| 4 |  S ER=0
 | 
|---|
| 5 |  S XMC("NOREQUEUE")=1
 | 
|---|
| 6 |  D GET^XMCXT(0)
 | 
|---|
| 7 |  I '$D(XMC("BATCH")) S XMC("BATCH")=0
 | 
|---|
| 8 |  D OPEN^XML I ER!$G(POP) D  Q
 | 
|---|
| 9 |  . D ^%ZISC:IO'=$G(IO(0)) W !,$C(7),$$EZBLD^DIALOG($S(ER:42227,1:37000)) ;Open failed / up-arrow out.
 | 
|---|
| 10 |  S:'$D(XM) XM=""
 | 
|---|
| 11 |  I XMC("BATCH") U IO
 | 
|---|
| 12 |  E  D
 | 
|---|
| 13 |  . X ^%ZOSF("EOFF")
 | 
|---|
| 14 |  . S X=255
 | 
|---|
| 15 |  . X ^%ZOSF("RM"),^%ZOSF("TYPE-AHEAD")
 | 
|---|
| 16 |  S XMC("START")=$$TSTAMP^XMXUTIL1-.001
 | 
|---|
| 17 |  D RECEIVE
 | 
|---|
| 18 |  ;I $G(XMINST) D XMTFINIS^XMTDR(XMINST)
 | 
|---|
| 19 |  Q
 | 
|---|
| 20 | RECEIVE ; BEGINNING OF INTERPRETER
 | 
|---|
| 21 |  ; The following variables are used in here only.  They are not
 | 
|---|
| 22 |  ; 'new'd because this routine may be called recursively via the
 | 
|---|
| 23 |  ; TURN command, which alternates sending and receiving.
 | 
|---|
| 24 |  S XMC("DIR")="R"
 | 
|---|
| 25 |  D KILL
 | 
|---|
| 26 |  S XMEC=0,XMCONT="^HELP^NOOP^RSET^QUIT^VRFY^EXPN^STAT^CHRS^ECHO^"
 | 
|---|
| 27 |  D DOTRAN^XMC1(42300,$$FMTE^XLFDT(DT,5)) ;Transcript Date: |1|
 | 
|---|
| 28 |  S XMSTATE="^HELO^QUIT^"
 | 
|---|
| 29 |  I 'XMC("BATCH") D
 | 
|---|
| 30 |  . D BUFLUSH^XML
 | 
|---|
| 31 |  . W:'$D(XMNO220) 220
 | 
|---|
| 32 |  . H 2
 | 
|---|
| 33 |  . S XMSG="220 "_$G(^XMB("NETNAME"))_" MailMan "_$P($T(XMR+1),";",3)_" ready" X XMSEN
 | 
|---|
| 34 |  F  D  Q:ER!($G(XMCMD)="QUIT")!$G(XMC("QUIT"))
 | 
|---|
| 35 |  . D DOTRAN^XMC1(42301) ;Waiting for input
 | 
|---|
| 36 |  . S XMSTIME=300 X XMREC K XMSTIME Q:ER
 | 
|---|
| 37 |  . S XMP=XMRG
 | 
|---|
| 38 |  . F I=$C(9),"  " F  Q:XMP'[I  S XMP=$P(XMP,I,1)_" "_$P(XMP,I,2,999) ; strip tabs / extra blanks
 | 
|---|
| 39 |  . S XMCMD=$$UP^XLFSTR($P(XMP," ")),XMP=$P(XMP," ",2,999)
 | 
|---|
| 40 |  . Q:XMCMD=""
 | 
|---|
| 41 |  . I XMSTATE_XMCONT'[(U_XMCMD_U) D ERRCMD Q
 | 
|---|
| 42 |  . I $T(@XMCMD)="" S XMSG="502 Command not implemented" X XMSEN Q
 | 
|---|
| 43 |  . D @XMCMD
 | 
|---|
| 44 |  I $G(XMCMD)="QUIT"!ER,$G(XMZ) D ZAPIT^XMXMSGS2(.5,.95,XMZ)
 | 
|---|
| 45 |  S:$G(XMINST) $P(^XMBS(4.2999,XMINST,3),U,1,6)="^^^^^"
 | 
|---|
| 46 |  D KILL
 | 
|---|
| 47 |  Q
 | 
|---|
| 48 | KILL ;
 | 
|---|
| 49 |  K I,X,XMC("HELO RECV"),XMCMD,XMCONT,XMEC,XMINSTR,XMNVFROM,XMP
 | 
|---|
| 50 |  K XMREMID,XMRXMZ,XMRVAL,XMSTATE,XM2LONG,XMZ,XMZFDA,XMZIENS
 | 
|---|
| 51 |  K XMERR,^TMP("XMERR",$J)
 | 
|---|
| 52 |  Q
 | 
|---|
| 53 | CHRS ;;Christen this domain syntax: CHRS <parent>,<child>
 | 
|---|
| 54 |  N XMPARENT,XMCHILD,X,Y,DIC
 | 
|---|
| 55 |  S XMPARENT=$P(XMP,",",1),XMCHILD=$P(XMP,",",2)
 | 
|---|
| 56 |  S X=XMPARENT
 | 
|---|
| 57 |  S DIC=4.2,DIC(0)="MF"
 | 
|---|
| 58 |  D ^DIC
 | 
|---|
| 59 |  I +Y'=$P(^XMB(1,1,0),U,3) S XMSG="550 Parent name does not match locally initialized parent name" X XMSEN Q
 | 
|---|
| 60 |  S X=XMCHILD
 | 
|---|
| 61 |  S DIC=4.2
 | 
|---|
| 62 |  D ^DIC
 | 
|---|
| 63 |  I +Y'=$P(^XMB(1,1,0),U,1) S XMSG="550 Child name does not match locally initialized domain name" X XMSEN Q
 | 
|---|
| 64 |  S ^XMB("NETNAME")=$P(Y,U,2)
 | 
|---|
| 65 |  S $P(^XMB(1,1,0),U,4)=DT
 | 
|---|
| 66 |  S XMSG="250 Local domain "_$P(Y,U,2)_" successfully christened by parent "_XMPARENT X XMSEN
 | 
|---|
| 67 |  Q
 | 
|---|
| 68 | DATA ;;TEXT / ASSUMES VALID RECIPIENT
 | 
|---|
| 69 |  D DATA^XMR3
 | 
|---|
| 70 |  Q
 | 
|---|
| 71 | ECHO ;;ECHO TEST
 | 
|---|
| 72 |  S XMSG="314 Echo mode. Received messages will be echoed until a single period is received" X XMSEN Q:ER
 | 
|---|
| 73 |  F  X XMREC Q:ER  Q:XMRG="."  S XMSG=XMRG X XMSEN Q:ER
 | 
|---|
| 74 |  Q:ER
 | 
|---|
| 75 |  S XMSG="250 End of echo mode" X XMSEN
 | 
|---|
| 76 |  Q
 | 
|---|
| 77 | EXPN ;;EXPAND MAILING LIST
 | 
|---|
| 78 |  N XMIEN,XMPTR,XMCNT,XMNETNAM,Y,X,DIC
 | 
|---|
| 79 |  S X=XMP
 | 
|---|
| 80 |  I X["<" S X=$P($P(X,"<",2),">")
 | 
|---|
| 81 |  I "^G.^g.^"[(U_$E(X,1,2)_U) S X=$E(X,3,999)
 | 
|---|
| 82 |  S DIC="^XMB(3.8,",DIC(0)="MF"
 | 
|---|
| 83 |  D ^DIC I Y<0 S XMSG="550 mail group not found" X XMSEN Q
 | 
|---|
| 84 |  S XMIEN=+Y,XMCNT=0,XMNETNAM=^XMB("NETNAME"),XMPTR=""
 | 
|---|
| 85 |  F  S XMPTR=$O(^XMB(3.8,XMIEN,1,"B",XMPTR)) Q:'XMPTR  D  Q:ER
 | 
|---|
| 86 |  . Q:'$D(^VA(200,XMPTR,0))
 | 
|---|
| 87 |  . S XMCNT=XMCNT+1
 | 
|---|
| 88 |  . S XMSG="250 <"_$TR($$NAME^XMXUTIL(XMPTR),". ,","+_.")_"@"_XMNETNAM_">" X XMSEN
 | 
|---|
| 89 |  I 'XMCNT S XMSG="250 No LOCAL members in group" X XMSEN Q:ER
 | 
|---|
| 90 |  S XMSG="250 List SHOWS local members only, not member groups, remote members or distribution lists." X XMSEN
 | 
|---|
| 91 |  Q
 | 
|---|
| 92 | HELO ;;HELO COMMAND
 | 
|---|
| 93 |  D HELO^XMR1
 | 
|---|
| 94 |  Q
 | 
|---|
| 95 | HELP ;;DISPLAY HELP MESSAGE
 | 
|---|
| 96 |  D HELPME^XMR4
 | 
|---|
| 97 |  Q
 | 
|---|
| 98 | MAIL ;;START
 | 
|---|
| 99 |  D:$D(XMRVAL) VALSET^XMR1(XMINST,.XMRVAL)
 | 
|---|
| 100 |  D MAIL^XMR1
 | 
|---|
| 101 |  Q
 | 
|---|
| 102 | MESS ;;
 | 
|---|
| 103 |  D MESS^XMR2
 | 
|---|
| 104 |  Q
 | 
|---|
| 105 | NOOP ;;NO OPERATION FOR TESTING
 | 
|---|
| 106 |  S XMSG="250 OK" X XMSEN
 | 
|---|
| 107 |  Q
 | 
|---|
| 108 | QUIT ;;
 | 
|---|
| 109 |  D:$D(XMRVAL) VALSET^XMR1(XMINST,.XMRVAL)
 | 
|---|
| 110 |  S XMSG="221 "_$G(^XMB("NETNAME"))_" Service closing transmission channel" X XMSEN
 | 
|---|
| 111 |  S XMC("QUIT")=1
 | 
|---|
| 112 |  Q
 | 
|---|
| 113 | RCPT ;;
 | 
|---|
| 114 |  D RCPT^XMR1
 | 
|---|
| 115 |  Q
 | 
|---|
| 116 | RSET ;;RESET STATE TABLES
 | 
|---|
| 117 |  N X,XMI,Y,DIC
 | 
|---|
| 118 |  I $G(XMZ) D
 | 
|---|
| 119 |  . I $D(^XMB(3.9,XMZ,0)),'$D(^XMB(3.9,XMZ,1,0)) D KILLMSG^XMXUTIL(XMZ)
 | 
|---|
| 120 |  . I $D(^XMB(3.7,.5,2,.95,1,XMZ)) D ZAPIT^XMXMSGS2(.5,.95,XMZ)
 | 
|---|
| 121 |  S XMSTATE="HELO^MAIL^"
 | 
|---|
| 122 |  K XMZ,XMZFDA,XMZIENS,^TMP("XMY",$J),^TMP("XMY0",$J)
 | 
|---|
| 123 |  S XMSG="250" X XMSEN Q
 | 
|---|
| 124 |  Q
 | 
|---|
| 125 | STAT ;;
 | 
|---|
| 126 |  N K,I,J
 | 
|---|
| 127 |  I $G(XMNVFROM)'="" S XMSG="211-Current reverse path is: "_XMNVFROM X XMSEN Q:ER
 | 
|---|
| 128 |  I $G(XMINST)'="" S XMSG="211-Current sender is: "_$P(^DIC(4.2,XMINST,0),U) X XMSEN Q:ER
 | 
|---|
| 129 |  S XMSG="211-Acceptable commands at the moment are: " X XMSEN Q:ER
 | 
|---|
| 130 |  S XMSG="211-"
 | 
|---|
| 131 |  S K=XMSTATE_XMCONT F I=1:1:$L(K,U) S J=$P(K,U,I) I J'="" S XMSG=XMSG_J_" "
 | 
|---|
| 132 |  X XMSEN Q:ER
 | 
|---|
| 133 |  I $D(XMZ),$O(^XMB(3.9,XMZ,2,0))>0 D  Q:ER
 | 
|---|
| 134 |  . S J=0
 | 
|---|
| 135 |  . S XMSG="211-Current text buffer is:" X XMSEN Q:ER
 | 
|---|
| 136 |  . F  S J=$O(^XMB(3.9,XMZ,2,J)) Q:J'>0  S XMSG="211-"_J_"  "_^(J,0) X XMSEN Q:ER
 | 
|---|
| 137 |  Q:ER
 | 
|---|
| 138 |  I $O(^TMP("XMY",$J,""))'="" D  Q:ER
 | 
|---|
| 139 |  . S J=""
 | 
|---|
| 140 |  . S XMSG="211-Current recipients are: " X XMSEN Q:ER
 | 
|---|
| 141 |  . F  S J=$O(^TMP("XMY",$J,J)) Q:J=""  S XMSG="211-"_$S('J:J,1:$$NAME^XMXUTIL(J)) X XMSEN Q:ER
 | 
|---|
| 142 |  Q:ER
 | 
|---|
| 143 |  S XMSG="211 OK" X XMSEN
 | 
|---|
| 144 |  Q
 | 
|---|
| 145 | TURN ;;
 | 
|---|
| 146 |  D:$D(XMRVAL) VALSET^XMR1(XMINST,.XMRVAL)
 | 
|---|
| 147 |  ;TURN AROUND PROTOCOL
 | 
|---|
| 148 |  I $F("Yy",$P(^DIC(4.2,XMINST,0),U,16))>1 S XMSG="502 "_^XMB("NETNAME")_" has TURN disabled." X XMSEN Q
 | 
|---|
| 149 |  I '$O(^XMB(3.7,.5,2,XMINST+1000,1,0)) S XMSG="502 "_^XMB("NETNAME")_" has no messages to export" X XMSEN Q
 | 
|---|
| 150 |  I $P(^DIC(4.2,XMINST,0),U)'=$G(XMC("HELO RECV")) S XMSG="502 TURN command rejected." X XMSEN Q
 | 
|---|
| 151 |  S XMSG="250 "_^XMB("NETNAME")_" has messages to export" X XMSEN Q:ER
 | 
|---|
| 152 |  D KILL
 | 
|---|
| 153 |  G SEND^XMS
 | 
|---|
| 154 | VRFY ;;VERIFY USER EXISTS
 | 
|---|
| 155 |  N XMNAME
 | 
|---|
| 156 |  S XMINSTR("ADDR FLAGS")="X" ; Do not expand
 | 
|---|
| 157 |  S XMNAME=$$LOOKUP^XMR1(XMP,.XMINSTR)
 | 
|---|
| 158 |  K XMINSTR("ADDR FLAGS")
 | 
|---|
| 159 |  Q:XMNAME=0
 | 
|---|
| 160 |  S XMSG="250 "_XMNAME_" <"_$TR(Y,". ,","+_.")_"@"_^XMB("NETNAME")_">" X XMSEN
 | 
|---|
| 161 |  Q
 | 
|---|
| 162 | ERRCMD ;
 | 
|---|
| 163 |  S XMEC=XMEC+1
 | 
|---|
| 164 |  I XMEC>9 S ER=1,XMSG="500 too many errors or fatal error, closing channel"
 | 
|---|
| 165 |  E  S XMSG="500 Syntax error, command ("_XMCMD_") out of sequence, or unrecognized command"
 | 
|---|
| 166 |  X XMSEN
 | 
|---|
| 167 |  Q
 | 
|---|
| 168 | TST ;
 | 
|---|
| 169 |  S XM="",XMC("BATCH")=0,XMC("DX")=1,XMCHAN="TEST"
 | 
|---|
| 170 |  D OPEN^XML
 | 
|---|
| 171 |  D RECEIVE
 | 
|---|
| 172 |  D KILL^XMC
 | 
|---|
| 173 |  Q
 | 
|---|
| 174 | DECNET ; Task-Task Communications
 | 
|---|
| 175 |  I $$NEWERR^%ZTER N $ETRAP,$ESTACK S $ETRAP="D R^XMCTRAP"
 | 
|---|
| 176 |  E  S X="R^XMCTRAP",@^%ZOSF("TRAP")
 | 
|---|
| 177 |  S (IO,I0(0))="SYS$NET",XMCHAN="DECNET" D DT^DICRW O IO U IO
 | 
|---|
| 178 |  G ENT
 | 
|---|