From: Jean-Marc Pigeon (Delson) Date: Wed, 26 Mar 2025 06:25:47 +0000 (-0400) Subject: Improving foreground mode (fix memory leak) X-Git-Tag: tag-0.7~62 X-Git-Url: https://jmp-git.ovh.safe.ca/?a=commitdiff_plain;h=785a471e795b46c5de46792d7b951ffba35fec03;p=jmp%2Fmailleur Improving foreground mode (fix memory leak) --- diff --git a/Makefile b/Makefile index 50f47a2..c4174df 100644 --- 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) \ - -d8 \ + -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) #=================================================================== diff --git a/app/emlrcvr.c b/app/emlrcvr.c index e02ddd0..9954594 100644 --- a/app/emlrcvr.c +++ b/app/emlrcvr.c @@ -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); diff --git a/lib/devlog.c b/lib/devlog.c index f06f4f4..13060e3 100644 --- a/lib/devlog.c +++ b/lib/devlog.c @@ -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)); diff --git a/lib/devsoc.c b/lib/devsoc.c index 6b58eb1..a99ac98 100644 --- a/lib/devsoc.c +++ b/lib/devsoc.c @@ -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; diff --git a/lib/lvleml.c b/lib/lvleml.c index a870569..3cb2640 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -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) { diff --git a/lib/modrec.c b/lib/modrec.c index 3b1b9b8..db5d904 100644 --- a/lib/modrec.c +++ b/lib/modrec.c @@ -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; diff --git a/lib/subrou.c b/lib/subrou.c index 2950616..a1bcfeb 100644 --- a/lib/subrou.c +++ b/lib/subrou.c @@ -21,7 +21,7 @@ //version definition #define VERSION "0.6" -#define RELEASE "12" +#define RELEASE "13" //Public variables PUBLIC int debug=0; //debug level diff --git a/lib/subrou.h b/lib/subrou.h index fd44000..0cd86a3 100644 --- a/lib/subrou.h +++ b/lib/subrou.h @@ -13,7 +13,7 @@ #include -#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 index af9c107..0000000 Binary files a/vgcore.4405 and /dev/null differ