]> SAFE projects GIT repository - jmp/mailleur/commitdiff
New version of sending_email is compiling
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sun, 15 Jun 2025 03:26:05 +0000 (23:26 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Sun, 15 Jun 2025 03:26:05 +0000 (23:26 -0400)
lib/lvleml.c

index 1f960dc71eee9d7d1a304f8cb3d617274e174fc5..54dbec9c26ca624399b832680015b70bbc0d8e13 100644 (file)
@@ -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;