#define FNAME "feeder"
+#define WRESP 5 //wait 5 sec for SMTP server
+ //to answer
+
static char titre[100]; //test title
static char testname[100]; //dest description
char *destport; //Port to connect to
char *srcip; //IP to be used as source
_Bool commented; //feed in comment mode
+ FILE *datatst; //reference to the data-tst file
SOCPTR *socptr; //connection socket
}FEEDTYP;
typedef enum { //List of command
cmd_comment, //Test sequence in int/out comment mode
+ cmd_data, //start the SMTP data sequence
cmd_gotls, //going in tls mode
cmd_orgn, //Change peer IP origin
cmd_restart, //restart connection with remote server
*/
/************************************************/
/* */
+/* procedure to send data to remote SMTP */
+/* server. */
+/* */
+/************************************************/
+static _Bool dosenddata(FEEDTYP *fd)
+
+{
+int status;
+char *line;
+char *action;
+_Bool empty;
+char data[300];
+int phase;
+_Bool proceed;
+
+status=false;
+line=(char *)0;
+action="data";
+empty=false;
+(void) strcpy(data,"");
+phase=0;
+proceed=true;
+while (proceed==true) {
+ switch (phase) {
+ case 0 : //Transmit "DATA" to remote
+ if (dooutgoing(fd->socptr,action)!=(strlen(action)+2))
+ phase=999; //Unable to send STARTTLS sequence
+ break;
+ case 1 : //Get STARTTLS command status
+ if (tcp_getline(fd->socptr,WRESP,&line)<=0)
+ phase=999; //Didn't get signon
+ break;
+ case 2 : //did we received the Proper "proceed" acknoledge
+ if (line!=(char *)0) { //Always
+ int code;
+
+ code=0;
+ (void) sscanf(line,"%d",&code);
+ if (code!=DATAOK)
+ phase=999;
+ line=rou_freestr(line);
+ }
+ break;
+ case 3 : //
+ while (fgets(data,sizeof(data),fd->datatst)!=(char *)0) {
+ (void) rou_alert(0,"JMPDBG got <%s>",data);
+ if ((empty==true)||(strcmp(data,".")==0)) {
+ phase++; //Eveythin is fine
+ break;
+ }
+ empty=false;
+ if (strlen(data)==0)
+ empty=true;
+ }
+ break;
+ case 4 : //phase reached only by data exhaustion
+ phase=999; //Trouble trouble
+ break;
+ case 5 : //we have completed data transmission
+ status=true;
+ break;
+ default : //SAFE Guard
+ proceed=false;
+ break;
+ }
+ phase++;
+ }
+return status;
+}
+/*
+^L
+*/
+/************************************************/
+/* */
/* procedure to set the link in TLS mode */
/* */
/************************************************/
static _Bool gomodetls(SOCPTR *socptr)
{
-#define WTLS 5 /*wait 5 sec for TLS */
_Bool status;
char *got;
phase=999; //Unable to send STARTTLS sequence
break;
case 1 : //Get STARTTLS command status
- if (tcp_getline(socptr,WTLS,&got)<=0)
+ if (tcp_getline(socptr,WRESP,&got)<=0)
phase=999; //Didn't get signon
break;
case 2 : //did we received the signon
const char *cmd;
}cmdavail[]={
{cmd_comment,"COMMENT"},
+ {cmd_data,"DATA"},
{cmd_gotls,"GOTLS"},
{cmd_orgn,"ORGN"},
{cmd_restart,"RESTART"},
param++; //pointer on parameter
}
switch (getcmd(line)) {
+ case cmd_comment : //detect comment flag
+ if (setcomment(fd,param)==false)
+ (void) report(numline,line,"Unable to set comment mode");
+ break;
+ case cmd_data : //sending email content to remote
+ if ((status=dosenddata(fd))==false)
+ (void) report(numline,line,"Unable to fully send data");
+ break;
case cmd_gotls : //GOTLS
if ((status=gomodetls(fd->socptr))==false)
(void) report(numline,line,"Unable to set TLS mode");
status=false;
}
break;
+ case cmd_restart : //restart link
+ if ((status=dorestart(fd,(char *)0))==false)
+ (void) report(numline,line,"Unable to restart feed socket!");
+ break;
case cmd_wait : //SLEEP mode
if (param!=(char *)0)
(void) sleep(atoi(param));
status=false;
}
break;
- case cmd_restart : //restart link
- if ((status=dorestart(fd,(char *)0))==false)
- (void) report(numline,line,"Unable to restart feed socket!");
- break;
- case cmd_comment : //restart link
- if (setcomment(fd,param)==false)
- (void) report(numline,line,"Unable to set comment mode");
- break;
case cmd_unknown :
default :
(void) report(numline,line,"Unknown command");
{
_Bool status;
-FILE *fichier;
int numline;
char line[200];
int phase;
status=false;
(void) strcpy(testname,"");
-fichier=(FILE *)0;
numline=0;
(void) strcpy(line,"");
phase=0;
ptr=filename;
(void) snprintf(titre,sizeof(titre),"%s:",ptr);
}
- if ((fichier=fopen(filename,"r"))==(FILE *)0) {
+ if ((fd->datatst=fopen(filename,"r"))==(FILE *)0) {
(void) rou_alert(0,"Unable to open file <%s> (error=<%s>",
filename,strerror(errno));
proceed=false;
if (fd->socptr==(SOCPTR *)0) {
(void) rou_alert(0,"Unable to open link to [%s:%s]",
fd->destip,fd->destport);
- (void) fclose(fichier);
+ (void) fclose(fd->datatst);
+ fd->datatst=(FILE *)0;
proceed=false; //Can not scan file
}
break;
case 2 : //reading line;
- while (fgets(line,sizeof(line),fichier)!=(char *)0) {
+ while (fgets(line,sizeof(line),fd->datatst)!=(char *)0) {
char *ptr;
numline++;
break;
default : //SAFE Guard
fd->socptr=soc_closefeedsock(fd->socptr);
- (void) fclose(fichier);
+ (void) fclose(fd->datatst);
+ fd->datatst=(FILE *)0;
proceed=false;
break;
}
phase=0;
proceed=true;
while (proceed==true) {
- (void) rou_alert(0,"JMPDBG %s phase='%d' parm=<%s>",OPEP,phase,parameter);
+ //(void) rou_alert(0,"JMPDBG %s phase='%d' parm=<%s>",OPEP,phase,parameter);
switch (phase) {
case 0 : //checking if we have a parameter
if ((parameter==(char *)0)||(strlen(parameter)==0))
*/
/************************************************/
/* */
+/* Procedure to accept EMAIL contents from */
+/* SMTP peers. */
+/* Return true, if everything is fine */
+/* */
+/************************************************/
+static _Bool getdata(CONTYP *contact)
+
+{
+#define OPEP "lvleml.c:getdata,"
+
+_Bool done;
+int phase;
+_Bool proceed;
+
+done=false;
+phase=0;
+proceed=true;
+while (proceed==true) {
+ //(void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
+ switch (phase) {
+ case 0 : //Do we have a parameter
+ (void) transmit(contact,"%d 3.5.0 %s",
+ DATAOK,"End data with <CR><LF>.<CR><LF>");
+ break;
+ default : //SAFE guard
+ proceed=false;
+ break;
+ }
+ phase++;
+ }
+return done;
+#undef OPEP
+}
+/*
+\f
+*/
+/************************************************/
+/* */
/* Procedure to send an "HELO" message */
/* if EHLO message is not accepted. */
/* */
(void) log_fprintlog(contact->logptr,false,"%s",line);
code=eml_getcode(line);
switch (code) {
+ case c_data : //Peer request to transfer email corps.
+ proceed=getdata(contact);
+ break;
case c_helo : //HELO SMTP protocol
proceed=dohelo(contact,line);
break;