From: Jean-Marc Pigeon (Delson) Date: Sun, 15 Jun 2025 03:26:05 +0000 (-0400) Subject: New version of sending_email is compiling X-Git-Tag: tag-0.9~180 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=a4f13ca6d38760cfa9a7386ca7346e0c8056126f;p=jmp%2Fmailleur New version of sending_email is compiling --- diff --git a/lib/lvleml.c b/lib/lvleml.c index 1f960dc..54dbec9 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -895,71 +895,102 @@ return done; */ /********************************************************/ /* */ +/* 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; @@ -967,7 +998,7 @@ while (proceed==true) { } phase++; } -return done; +return rmt; #undef OPEP } @@ -1005,18 +1036,6 @@ return ok; */ /********************************************************/ /* */ -/* Procedure to close the remote connection with MX*/ -/* */ -/********************************************************/ -static void close_mx(RMTTYP *rmt) - -{ -} -/* -^L -*/ -/********************************************************/ -/* */ /* Procedure to send the data to the remote server */ /* */ /********************************************************/ @@ -1121,19 +1140,22 @@ while (proceed==true) { 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; @@ -1151,22 +1173,21 @@ return list; /* 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; @@ -1178,7 +1199,7 @@ while (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; @@ -1202,23 +1223,13 @@ while (proceed==true) { 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]; @@ -1239,7 +1250,7 @@ while (proceed==true) { 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; @@ -1256,17 +1267,17 @@ while (proceed==true) { 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); @@ -1279,8 +1290,6 @@ while (proceed==true) { } phase++; } -rmt.mxs=dns_freemxlist(rmt.mxs); - #undef OPEP } /* @@ -1660,15 +1669,13 @@ PUBLIC void eml_remote_email(TRATYP **tra) { #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) { @@ -1679,33 +1686,28 @@ 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;