From 8a46f85f94a660881de2a8b6542411663e7c0f01 Mon Sep 17 00:00:00 2001 From: "Jean-Marc Pigeon (Delson)" Date: Wed, 7 May 2025 19:23:22 -0400 Subject: [PATCH] Able to store email within the queue directory --- lib/lvleml.c | 27 ++++++++++++++++++++------- lib/subrou.c | 3 ++- lib/unieml.c | 35 ++++++++++++++++++++++++++++++----- lib/unieml.h | 1 + 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/lib/lvleml.c b/lib/lvleml.c index 3417d6a..34c31e8 100644 --- a/lib/lvleml.c +++ b/lib/lvleml.c @@ -181,6 +181,7 @@ static _Bool getdata(CONTYP *contact) _Bool done; char *line; _Bool empty; +FILE *queue; int got; int phase; _Bool proceed; @@ -188,35 +189,47 @@ _Bool proceed; done=false; line=(char *)0; empty=false; +queue=(FILE *)0; got=0; phase=0; proceed=true; while (proceed==true) { //(void) rou_alert(0,"JMPDBG %s phase='%d' empty='%d'",OPEP,phase,empty); switch (phase) { - case 0 : //Do we have a parameter + case 0 : //opening the queue email + if ((queue=eml_opennewqueue(contact->cursesid))==(FILE *)0) + phase=999; //trouble trouble + break; + case 1 : //Do we have a parameter (void) transmit(contact,"%d 3.5.0 %s", DATAOK,"End data with ."); break; - case 1 : //get incoming line + case 2 : //get incoming line got=tcp_getline(contact->socptr,WAITLINE,&line); - if (got<=0) { //data timeout - } + if (got<0) //data timeout + phase=999; //Trouble trouble break; - case 2 : //just display line + case 3 : //just display line + (void) fprintf(queue,"%s\n",line); if ((empty==false)||(strcmp(line,".")!=0)) - phase=0; //Wait for next line + phase=1; //Wait for next line empty=false; if (strlen(line)==0) empty=true; line=rou_freestr(line); break; - case 3 : //got all data + case 4 : //got all data + if (eml_closenewqueue(queue)<0) + phase=999; //Trouble trouble + case 5 : //everything fine (void) transmit(contact,"%d 3.5.3 %s", CMDOK,"Message accepted for delivery"); done=true; + proceed=false; //task done break; default : //SAFE guard + (void) transmit(contact,"%d 5.5.4 %s", + DATRJC,"Server does not accept mail"); proceed=false; break; } diff --git a/lib/subrou.c b/lib/subrou.c index 389188f..7319908 100644 --- a/lib/subrou.c +++ b/lib/subrou.c @@ -528,7 +528,9 @@ crashdir=(char *)0; doabort=false; phase=0; proceed=true; +(void) rou_valert(0,fmt,args); while (proceed==true) { + //(void) rou_alert(0,"JMPDBG core phase='%d'",phase); switch (phase) { case 0 : //find out if crashdir is existing if ((crashdir=get_dropzone())==(char *)0) @@ -577,7 +579,6 @@ while (proceed==true) { phase++; } (void) sleep(COREDELAY); /*to avoid crash avalanche */ -(void) rou_valert(LOG_INFO,fmt,args); va_end(args); if (doabort==true) (void) abort(); /*doing to do the abort */ diff --git a/lib/unieml.c b/lib/unieml.c index 68d5868..4f3a7ee 100644 --- a/lib/unieml.c +++ b/lib/unieml.c @@ -162,12 +162,12 @@ PUBLIC FILE *eml_opennewqueue(char *sessionid) { #define OPEP "unieml.c:eml_opennewqueue," -FILE *fichier; +FILE *newqueue; char *filename; int phase; int proceed; -fichier=(FILE *)0; +newqueue=(FILE *)0; filename=(char *)0; phase=0; proceed=true; @@ -175,7 +175,7 @@ while (proceed==true) { //(void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase); switch (phase) { case 0 : //Do we have a session ID - if ((sessionid=(char *)0)||(strlen(sessionid)==0)) { + if ((sessionid==(char *)0)||(strlen(sessionid)==0)) { (void) rou_core_dump("%s sessionID is not set (bug?)",OPEP); phase=999; //never reached } @@ -183,7 +183,9 @@ while (proceed==true) { case 1 : //"Computing" the file new queue filename filename=rou_apppath(QDIR); filename=(char *)realloc(filename,strlen(filename)+strlen(sessionid)+10); - if ((fichier=fopen(filename,"w"))==(FILE *)0) { + (void) strcat(filename,"/"); + (void) strcat(filename,sessionid); + if ((newqueue=fopen(filename,"w"))==(FILE *)0) { (void) rou_alert(0,"%s Unable to open file <%s> (error=<%s>)", OPEP,filename,strerror(errno)); } @@ -195,5 +197,28 @@ while (proceed==true) { } phase++; } -return fichier; +return newqueue; +#undef OPEP +} +/* +^L +*/ +/********************************************************/ +/* */ +/* Procedure to close the file to the email stored */ +/* stored within queue. */ +/* */ +/********************************************************/ +PUBLIC int eml_closenewqueue(FILE *newqueue) + +{ +#define OPEP "unieml.c:eml_closenewqueue," +int status; + +if ((status=fclose(newqueue))<0) { + (void) rou_alert(0,"%s Unable to close queuefile (error=<%s>)", + OPEP,strerror(errno)); + } +return status; +#undef OPEP } diff --git a/lib/unieml.h b/lib/unieml.h index 29d20e4..fb8e93a 100644 --- a/lib/unieml.h +++ b/lib/unieml.h @@ -18,6 +18,7 @@ #define DATAOK 354 //Ready to accept EMAIL data #define BADPAR 501 //error in parameters #define CMDBAD 502 //command not implemented +#define DATRJC 521 //Data Rejected //list of keyword -- 2.47.3