]> SAFE projects GIT repository - jmp/mailleur/commitdiff
Improving foreground mode (fix memory leak)
authorJean-Marc Pigeon (Delson) <jmp@safe.ca>
Wed, 26 Mar 2025 06:25:47 +0000 (02:25 -0400)
committerJean-Marc Pigeon (Delson) <jmp@safe.ca>
Wed, 26 Mar 2025 06:25:47 +0000 (02:25 -0400)
Makefile
app/emlrcvr.c
lib/devlog.c
lib/devsoc.c
lib/lvleml.c
lib/modrec.c
lib/subrou.c
lib/subrou.h
vgcore.4405 [deleted file]

index 50f47a21375dd92c86230790ce8815d8becd2cea..c4174df10ab2566cd007adb0772bc2f3546e3261 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,8 @@ clean :
 #test area sub directory
 SBINDIR        =       usr/sbin
 DATATST        =       data-tst
+LOCKDIR        =       $(TESTDIR)/var/run/$(APPNAME)
+
 #managing debugging test
 TESTDIR        =       $(CURDIR)/test_area
 TESTIP =       127.127.10.25
@@ -50,15 +52,16 @@ dbgfeed     :       debug
 #starting email receiver
 
 EMLPAR =                                               \
-          -r $(TESTDIR)                                        \
-          -d                                         \
+          -r $(TESTDIR)                                \
+          -d 8                                         \
           :$(TESTIP):$(TESTPORT)                       \
 
 emlrcvr        :  debug newtest
           @ echo
           @ echo "--------------"
           @ echo "starting $@"
-          @ $(TESTDIR)/$(SBINDIR)/$@ $(EMLPAR) 
+          @ $(TESTDIR)/$(SBINDIR)/$@                   \
+               $(EMLPAR) 
           @ echo "--------------"
 
 valrcvr        :  clean debug newtest          #valgrin dest
@@ -66,22 +69,27 @@ valrcvr     :  clean debug newtest          #valgrin dest
           @ valgrind                                   \
                --leak-check=full                       \
                --show-leak-kinds=all                   \
-               --track-origins=yes                     \
-               --trace-children=no                     \
-               --track-fds=yes                         \
                 $(TESTDIR)/$(SBINDIR)/emlrcvr          \
                        -f                              \
                        $(EMLPAR)
             
+#              --track-fds=yes                         \
+#              --track-origins=yes                     \
+#              --trace-children=no                     \
+
 dbgrcvr        :  clean debug newtest          #using gdb
           @ gdb --args                                 \
                $(TESTDIR)/$(SBINDIR)/emlrcvr           \
                -f                                      \
                $(EMLPAR) 
 
-#--------------------------------------------------------------------
-#preparing a test area
-newtest        :  deltest
+norcvr :
+         @  -  if [ -f $(LOCKDIR)/emlrcvr.lock ]; then \
+                 echo "Terminating emlrcvr";           \
+                 kill -TERM                            \
+                       `cat $(LOCKDIR)/emlrcvr.lock`;  \
+                fi
+
 #--------------------------------------------------------------------
 #test procedure
 #--------------------------------------------------------------------
@@ -105,7 +113,7 @@ newtest     :  deltest
                $(TESTDIR)
 
 deltest        :  
-          @ rm -fr $(TSTDIR)
+          @ rm -fr $(TESTDIR)
 
 #--------------------------------------------------------------------
 #Installation procedure
@@ -120,9 +128,9 @@ SUBDIR      =                                                               \
 
 #--------------------------------------------------------------------
 #definitions globale
-APPNAME        =  MAILLEUR
+APPNAME        =  mailleur
 #--------------------------------------------------------------------
 #Managing testarea
 SBINDIR = usr/sbin
-CURDIR  = `pwd`
+CURDIR  = $(shell pwd)
 #===================================================================
index e02ddd0e8505d8f339a641f8c4bb66d634c77ee1..99545948907dc28efd9a14ade2c3332df6879663 100644 (file)
@@ -59,12 +59,17 @@ while (proceed==true) {
       (void) sig_modeunisig(true);
       (void) sig_trapsignal(true,sig_alrm);
       break;
-    case 2      :       //doing main task
+    case 2      :       //sett lock
+      if (prc_locking(appname,true,5)==false)
+        phase++;        //no need to do task
+      break;
+    case 3      :       //doing main task
       if (foreground==true)
         (void) fprintf(stdout,"Running application in foreground\n");
       (void) rec_handlesmtp(params->argc,params->argv);
+      (void) prc_locking(appname,false,1);
       break;
-    case 3      :       //doing main task
+    case 4      :       //doing main task
       (void) prc_cleantitle();
       params=par_freeparams(params);
       (void) sig_trapsignal(false,sig_alrm);
index f06f4f43317a8aa81174d95ed62b2ad799e0eb4e..13060e320db1f78f1d5f34fc00a646e547e477d7 100644 (file)
@@ -124,13 +124,11 @@ phase=0;
 proceed=true;
 while (proceed==true) {
   switch (phase) {
-    case 0      :       //do we have a log name?
-      if (log==(LOGTYP *)0) {
-        (void) rou_alert(0,"%s log pointer is NULL (Bug!?)",OPEP);
+    case 0      :       //do we have a log reference?
+      if (log==(LOGTYP *)0) 
         phase=999;
-        }
       break;
-    case 1      :       //do we have a log name?
+    case 1      :       //closing log file
       if (fclose(log->file)!=0) {
         (void) rou_alert(0,"%s Unable to close log file <%s> (error=<%s>)",
                             OPEP,log->filename,strerror(errno));
index 6b58eb1c699ba348bca2161f84b306cdf6a3241b..a99ac98431a5cdf37d11ffdf88662f48ed5d62c6 100644 (file)
@@ -103,6 +103,7 @@ if (socptr!=(SOCPTR *)0) {
   soc->ip=rou_freestr(soc->ip);
   soc->port=rou_freestr(soc->port);
   soc->carpile=rou_freestr(soc->carpile);
+  soc->EOL=rou_freestr(soc->EOL);
   (void) free(soc);
   socptr=(SOCPTR *)0; 
   }
@@ -123,6 +124,7 @@ static SOCTYP *newsocket()
 SOCTYP *soc;
 
 soc=(SOCTYP *)calloc(1,sizeof(SOCTYP));
+soc->handle=-1;
 soc->maxcarin=MXCARIN;
 soc->carin=0;
 soc->EOL=strdup(CRLF);
@@ -334,8 +336,10 @@ while (proceed==true) {
   switch (phase) {
     case 0      :       //First prepare a new socket
       newsoc=dupsocket(soc);
+      soc->handle=-1;   //handle within sock not open
       if (openplain(newsoc)==false) 
-        proceed=false;  //received a termination signal
+                        //received a termination signal
+        phase=999;      //return a null socket
       break;
     case 1      :       //wait for incoming connexion
       switch (newsoc->proto) {
@@ -1063,6 +1067,7 @@ soc=(SOCTYP *)socptr;
 phase=0;
 proceed=true;
 while (proceed==true) {
+  (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
   switch (phase) {
     case 0      :       //checking if soc is available
       if (soc==(SOCTYP *)0) {
@@ -1076,7 +1081,7 @@ while (proceed==true) {
       break;
     case 2      :       //waiting for new connection
       if ((newsoc=waitincoming(soc))==(SOCPTR *)0) {
-        (void) rou_core_dump("%s, Contact from Remote not successful",OPEP);
+        (void) rou_alert(0,"%s, Contact from Remote not successful",OPEP);
         phase=999;      //no need to go further
         }
       break;
@@ -1203,6 +1208,7 @@ soc=(SOCTYP *)socptr;
 phase=0;
 proceed=true;
 while (proceed==true) {
+  //(void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
   switch (phase) {
     case 0      :       //checking if soc is available
       if (soc==(SOCTYP *)0) {
@@ -1232,7 +1238,7 @@ while (proceed==true) {
     case 2      :       //closing connexion
       (void) closeplain(soc);
       break;
-    case 4      :       //fee memory used by socket
+    case 3      :       //fee memory used by socket
       soc=freesocket(soc);
       socptr=(SOCPTR *)soc;
       break;
index a870569e98f01cf9434c8e1df730bdad9b54ace8..3cb2640117a843c189bc1b66d438e5b5cfaaf4fe 100644 (file)
@@ -64,6 +64,7 @@ if (rou_vasprintf(&line,fmt,args)>0) {
   (void) log_fprintlog(contact->logptr,true,"%s",line);
   (void) tcp_write(contact->socptr,line,strlen(line));
   (void) tcp_write(contact->socptr,CRLF,strlen(CRLF));
+  (void) free(line);
   }
 va_end(args);
 }
@@ -392,6 +393,7 @@ contact=(CONTYP *)0;
 phase=0;
 proceed=true;
 while (proceed==true) {
+  (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
   switch (phase){
     case 0      :       //check for binding
       if (socptr==(SOCPTR *)0) {
index 3b1b9b829ddc81ee0c206427f51f9f5b9d631c71..db5d904cce56d5abb5336e518e0bb209cae00284 100644 (file)
@@ -121,6 +121,7 @@ contact=(CONTYP *)0;
 phase=0;
 proceed=true;
 while (proceed==true) {
+  (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
   switch (phase) {
     case 0      :       //waiting contact
       if ((contact=eml_getcontact(socptr,pos))==(CONTYP *)0)
@@ -136,6 +137,7 @@ while (proceed==true) {
     case 2      :       //do contact
       switch (eml_docontact(contact)) {
         case -1 :       //Signal received 
+          (void) rou_alert(0,"JMPDBG got sgnal within contact");
           break;
         case  0 :       //exit under timeout
           (void) rou_alert(0,"Contact with peer <%s> closed by timeout",
@@ -218,11 +220,12 @@ while (proceed==true) {
         }
       if ((hangup==true)||(reload==true))
         phase=999;
-      (void) sleep(5);
       break;
     case 3      :       //Relax time
       if ((hangup==false)&&(reload==false))
         phase=0;        //lets continue to check childs
+      if (foreground==true)
+        phase=999;      //foreground ->one shot deal
       break;
     default     :       //SAFE Guard
       (void) prc_killchilds(childs,iterations,maxretry);
@@ -253,7 +256,7 @@ _Bool proceed;
 phase=0;
 proceed=true;
 while (proceed==true) {
-  //(void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
+  (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
   switch (phase) {
     case 0      :       //Opening logs
       (void) closelog();
@@ -307,6 +310,7 @@ bindings=(SOCPTR **)0;
 phase=0;
 proceed=true;
 while (proceed==true) {
+  (void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
   switch (phase) {
     case 0      :       //preparing iteration
       if ((nbrbind=prepbinding(&bindings,argc,argv))==0) {
@@ -353,7 +357,6 @@ while (proceed==true) {
         }
       break;
     case 4      :       //relax time
-      (void) sleep(5);  //Waiting for signal
       if ((hangup==false)&&(reload==false))
         phase=0;        //Normal process, lets restart
       break;
index 295061669c9af05cc1a5e44fe1d6550db307e0dd..a1bcfebcd449c303a46576382f9541c0679f93b1 100644 (file)
@@ -21,7 +21,7 @@
 
 //version definition 
 #define VERSION "0.6"
-#define RELEASE "12"
+#define RELEASE "13"
 
 //Public variables
 PUBLIC  int debug=0;            //debug level
index fd4400004989fcb1dab30c1d119c5a17c4865e75..0cd86a3e0e1ab3642a648d131d4cb1738e172184 100644 (file)
@@ -13,7 +13,7 @@
 #include        <time.h>
 
 
-#define APPNAME "maild"         //application name
+#define APPNAME "mailleur"         //application name
 
 #define PUBLIC                  //to specify public variable
 
diff --git a/vgcore.4405 b/vgcore.4405
deleted file mode 100644 (file)
index af9c107..0000000
Binary files a/vgcore.4405 and /dev/null differ