*/
/********************************************************/
/* */
+/* Procedure to close the remote connection with MX*/
+/* */
+/********************************************************/
+static RMTTYP *close_mx(RMTTYP *rmt)
+
+{
+return rmt;
+}
+/*
+^L
+*/
+/********************************************************/
+/* */
/* Procedure to connect to the remote SMTP server */
/* */
/********************************************************/
-static _Bool connect_mx(RMTTYP *rmt)
+static RMTTYP *connect_mx(LOGPTR *logptr,TRATYP *tra)
{
#define OPEP "lvleml.c:connect_to_mx,"
_Bool done;
+char *orgdomain;
+char *dstdomain;
+MXTYP **mxs;
+RMTTYP *rmt;
int phase;
int proceed;
done=false;
+orgdomain=strrchr(tra->mailfrom,'@');
+dstdomain=strrchr(tra->rcptto,'@');
+rmt=(RMTTYP *)0;
phase=0;
proceed=true;
while (proceed==true) {
switch (phase) {
- case 0 : //do we have MX
- if (rmt->mxs==(MXTYP **)0) {
+ case 0 : //preparing RMT record
+ if ((orgdomain==(char *)0)||(dstdomain==(char *)0)) {
+ char cmt[100];
+
+ (void) snprintf(cmt,sizeof(cmt),"from <%s> or rcpt <%s>, without domain",
+ tra->mailfrom,tra->rcptto);
+ (void) log_fprintlog(rmt->logptr,false,cmt);
+ (void) rou_alert(0,"%s %s (Bug!)",OPEP,cmt);
+ phase=999;
+ }
+ break;
+ case 1 : //looking for MX list
+ orgdomain++;
+ dstdomain++;
+ if (mxs==(MXTYP **)0) {
(void) log_fprintlog(rmt->logptr,false,"NO MX found for domain <%s>",
- rmt->dstdomain);
+ dstdomain);
phase=999;
}
break;
- case 1 : //Trying to connect
- MXTYP **mxs;
- const char *srcip;
-
- mxs=rmt->mxs;
- srcip=(const char *)0;
+ case 2 : //creating rmt record
+ rmt=(RMTTYP *)calloc(1,sizeof(RMTTYP *));
+ rmt->mxs=mxs;
+ rmt->orgdomain=strdup(orgdomain);
+ rmt->dstdomain=strdup(dstdomain);
while (*mxs!=(MXTYP *)0) {
rmt->curmx=*mxs;
(void) rou_alert(0,"%s JMPDBG trying connect to <%s>",
OPEP,rmt->curmx->mxname);
- rmt->socptr=soc_openfeedsock(pro_smtp,srcip,rmt->curmx->mxname,EMLPORT);
- if (rmt->socptr!=(SOCPTR *)0) {
+ rmt->socptr=soc_openfeedsock(pro_smtp,(char *)0,rmt->curmx->mxname,EMLPORT);
+ if (rmt->socptr!=(SOCPTR *)0) {
char cmt[100];
(void) snprintf(cmt,sizeof(cmt),"Now Connected to MX <%s>",
rmt->curmx->mxname);
(void) log_fprintlog(rmt->logptr,false,cmt);
- break;
+ break; //MX available found
}
- mxs++;
+ mxs++;
}
- if (rmt->socptr==(SOCPTR *)0)
- phase=999;
+ if (rmt->socptr==(SOCPTR *)0)
+ phase=999; //No NX found!
break;
- case 2 : //waiting for signon
+ case 3 : //waitin MX signon
int res;
res=tcp_get_smtp_reply(rmt,WAITRMT,(char ***)0);
- switch (res) {
+ switch (res) {
case SIGNON : //everything fine
break;
default : //not getting the right signon
+ rmt=close_mx(rmt); //closing remote connection
phase=999; //No need to go further
break;
}
break;
- case 3 : //send greetings
+ case 4 :
if ((done=greetings_rmt(rmt))==false)
- phase=999; //greeting not successful!
- break;
- case 4 : //send greetings
+ rmt=close_mx(rmt); //closing remote connection
break;
default : //SAFE Guard
proceed=false;
}
phase++;
}
-return done;
+return rmt;
#undef OPEP
}
*/
/********************************************************/
/* */
-/* Procedure to close the remote connection with MX*/
-/* */
-/********************************************************/
-static void close_mx(RMTTYP *rmt)
-
-{
-}
-/*
-^L
-*/
-/********************************************************/
-/* */
/* Procedure to send the data to the remote server */
/* */
/********************************************************/
static TRATYP **send_to_mx(RMTTYP *rmt,TRATYP **list)
{
+int tobesend;
TRATYP **tosend;
char *sessid;
int phase;
_Bool proceed;
+tobesend=0;
tosend=(TRATYP **)0;
-sessid=(char *)0;
+sessid=(*list)->sessid;
phase=0;
proceed=true;
while (proceed==true) {
switch (phase) {
case 3 : //sending data
- (void) senddata(rmt,tosend,sessid);
+ if (tobesend>0)
+ (void) senddata(rmt,tosend,sessid);
break;
default : //SAFE Guard
proceed=false;
/* Procedure to send the whole email transaction */
/* */
/********************************************************/
-static void sending_email(char *orgdomain,char *dstdomain,char *sessid,TRATYP **tra)
+static void sending_email(LOGPTR *logptr,TRATYP **tra)
{
#define OPEP "lvleml.c:sending_email,"
time_t isnow;
-RMTTYP rmt;
+char *sessid;
+RMTTYP *rmt;
TRATYP **tosend;
int phase;
_Bool proceed;
isnow=time((time_t *)0);
-(void) memset(&rmt,'\000',sizeof(rmt));
-rmt.mxs=dns_getmx(dstdomain);
-rmt.dstdomain=dstdomain;
-rmt.orgdomain=orgdomain;
+sessid=(char *)0;
+rmt=(RMTTYP *)0;
tosend=(TRATYP **)0;
phase=0;
proceed=true;
phase=999; //all scanning done
break;
case 1 : //collecting email to be sent
- rmt.logptr=log_closelog(rmt.logptr);
+ sessid=(*tra)->sessid;
while (*tra!=(TRATYP *)0) {
if (strcmp((*tra)->sessid,sessid)!=0) {
sessid=(*tra)->sessid;
if (tosend==(TRATYP **)0)
phase=-1; //lets continue to see other email
break;
- case 3 : { //checking if connection is open
- char cmt[100];
-
- (void) snprintf(cmt,sizeof(cmt),"session-id=%s",sessid);
- rmt.logptr=log_openlog(sessid,false,cmt);
- if (rmt.socptr!=(SOCPTR *)0) { //reset the connection
- phase++; //NO need to open connection
- }
- break;
- }
- case 4 : //Opening connection if not open
- if (connect_mx(&rmt)==false) {
+ case 3 : //Opening connection if not open
+ if ((rmt=connect_mx(logptr,*tra))==(RMTTYP *)0) {
char cmt[100];
- (void) snprintf(cmt,sizeof(cmt),"Unable to contact ANY MX for domain <%s>",
- dstdomain);
- (void) log_fprintlog(rmt.logptr,false,cmt);
+ (void) snprintf(cmt,sizeof(cmt),"Unable to contact ANY MX to reach <%s>",
+ (*tra)->rcptto);
+ (void) log_fprintlog(logptr,false,cmt);
if (tosend!=(TRATYP **)0) {
TRATYP **ptr;
char note[150];
case 5 : { //sending originator
int rspcode;
- rspcode=simple_smtp_command(&rmt,"MAIL FROM: <%s>",(*tosend)->mailfrom);
+ rspcode=simple_smtp_command(rmt,"MAIL FROM: <%s>",(*tosend)->mailfrom);
switch (rspcode) {
case CMDOK : //originator accepted
break;
dest=tosend;
while (*dest!=(TRATYP *)0) {
- dest=send_to_mx(&rmt,dest);
+ dest=send_to_mx(rmt,dest);
if (*dest==(TRATYP *)0)
break; //no more to send;
- if (reset_mx(&rmt)==false) {
+ if (reset_mx(rmt)==false) {
break; //can not send more
}
}
break;
}
case 7 : //closing current connection with MX
- (void) close_mx(&rmt);
+ (void) close_mx(rmt);
break;
case 8 : //cleaning recipient list
(void) free(tosend);
}
phase++;
}
-rmt.mxs=dns_freemxlist(rmt.mxs);
-
#undef OPEP
}
/*
{
#define OPEP "lvleml.c:eml_remote_email,"
-char *orgdomain;
-char *dstdomain;
-char *sessid;
+char *mainsesid;
+LOGPTR *logptr;
int phase;
_Bool proceed;
-orgdomain=(char *)0;
-dstdomain=(char *)0;
-sessid=(char *)0;
+mainsesid=(char *)0;
+logptr=(LOGPTR *)0;
phase=0;
proceed=true;
while (proceed==true) {
phase=999;
}
break;
- case 1 : //set originator domain
- if ((orgdomain=strrchr((*tra)->mailfrom,'@'))!=(char *)0)
- orgdomain++;
- if (orgdomain==(char *)0) {
- (void) rou_alert(0,"%s Originator address <%s> without domain? (Bug?)",
- OPEP,(*tra)->mailfrom);
+ case 1 : //checking if we have a session ID
+ if ((*tra)->sessid==(char *)0) {
+ (void) rou_alert(0,"%s Session ID is NULL (Bug?)",OPEP);
phase=999;
}
break;
- case 2 : //detecting remote domain
- if ((dstdomain=strrchr((*tra)->rcptto,'@'))!=(char *)0)
- dstdomain++;
- if (dstdomain==(char *)0) {
- (void) rou_alert(0,"%s Recipient address <%s> without domain? (Bug?)",
- OPEP,(*tra)->rcptto);
- phase=999;
- }
+ case 2 : //extracting the main session number
+ char *ptr;
+ char cmt[100];
+
+ mainsesid=strdup((*tra)->sessid);
+ ptr=strrchr(mainsesid,'-');
+ if (ptr!=(char *)0)
+ *ptr='\000';
+ (void) snprintf(cmt,sizeof(cmt),"main-session-id=%s",mainsesid);
+ logptr=log_openlog(mainsesid,false,cmt);
break;
- case 3 : //checking if we have a session ID
- sessid=(*tra)->sessid;
- if (sessid==(char *)0) {
- (void) rou_alert(0,"%s Session ID is NULL (Bug?)",OPEP);
- sessid="0000-0000";
- }
+ case 3 : //sending all email within transaction
+ (void) sending_email(logptr,tra);
break;
- case 4 : //sending the whole transaction to remote server
- (void) sending_email(orgdomain,dstdomain,sessid,tra);
+ case 4 : //closing log linked to session
+ logptr=log_closelog(logptr);
break;
default : //SAFE Guard
proceed=false;