$(EMLPAR)$(TESTITER)
onefeed : debug
- @ bin/feeder \
+ @ \
+ bin/feeder \
-f \
- -d 2 \
+ -d 9 \
-c ./conf/$(APPNAME).conf.dvl \
$(TESTIP) \
$(TESTPORT) \
typedef enum { //List of command
cmd_comment, //Test sequence in int/out comment mode
+ cmd_connect, //Start connection with smtp server
cmd_data, //start the SMTP data sequence
cmd_gotls, //going in tls mode
- cmd_orgn, //Change peer IP origin
+ cmd_ipfrom, //Change peer IP origin
cmd_restart, //restart connection with remote server
cmd_wait, //delay exchange with remote
cmd_unknown
#undef OPEP
}
/*
+\f
+*/
+/********************************************************/
+/* */
+/* Procedure to connect to SMTP server if NOT YET */
+/* connected */
+/* */
+/********************************************************/
+static _Bool doconnect(FEEDTYP *fd)
+
+{
+_Bool isopen;
+
+isopen=true;
+if (fd->socptr==(SOCPTR *)0)
+ fd->socptr=soc_openfeedsock(pro_smtp,fd->srcip,fd->destip,fd->destport);
+if (fd->socptr==(SOCPTR *)0) {
+ (void) rou_alert(0,"Unable to open link to [%s:%s]",fd->destip,fd->destport);
+ isopen=false;
+ }
+return isopen;
+}
+/*
^L
*/
/************************************************/
const char *cmd;
}cmdavail[]={
{cmd_comment,"COMMENT"},
+ {cmd_connect,"CONNECT"},
{cmd_data,"DATA"},
{cmd_gotls,"GOTLS"},
- {cmd_orgn,"ORGN"},
+ {cmd_ipfrom,"IPFROM"},
{cmd_restart,"RESTART"},
{cmd_wait,"WAIT"},
{cmd_unknown,(const char *)0}
if (setcomment(fd,param)==false)
(void) report(*numline,line,"Unable to set comment mode");
break;
+ case cmd_connect : //start link connection
+ if (doconnect(fd)==false) {
+ (void) report(*numline,line,"Unable connect!");
+ status=false;
+ }
+ break;
case cmd_data : //sending email content to remote
if ((status=dosenddata(fd,numline,param))==false)
(void) report(*numline,line,"Unable to fully send data");
if ((status=gomodetls(fd->socptr))==false)
(void) report(*numline,line,"Unable to set TLS mode");
break;
- case cmd_orgn : //Changing PEERIP
+ case cmd_ipfrom : //Change/set the client IP
if (param!=(char *)0) {
- if(( status=dorestart(fd,param))==false)
- (void) report(*numline,line,"Unable to change srcip!");
+ fd->srcip=rou_freestr(fd->srcip);
+ fd->srcip=strdup(param);
}
else {
(void) report(*numline,line,"Missing new PEER IP value");
phase=0;
proceed=true;
while (proceed==true) {
- //(void) rou_alert(0,"%s JMPDBG, phase='%d'",OPEP,phase);
+ (void) rou_alert(0,"%s JMPDBG, phase='%d'",OPEP,phase);
switch (phase) {
case 0 : //do we have a "..." sequence at the end
if (tocheck>0) {
{
#define OPEP "feeder.c:scanline"
+
_Bool status;
char action;
int phase;
action=line[0];
line+=2;
break;
- case 2 : //discarding comment
+ case 2 : //check open version action
+ switch (action) {
+ case 'R' : //wait Receiving line
+ case 'S' : //Sending line
+ if (doconnect(fd)==false) {
+ status=false;
+ phase=999; //Not Connected!
+ }
+ break;
+ default : //Nothing to do
+ break;
+ }
+ break;
+ case 3 : //discarding comment
+ (void) rou_alert(0,"%s action='%c' line=<%s>",OPEP,action,line);
switch (action) {
case 'C' : //command to execute
status=docommand(fd,numline,line);
phase++;
}
return status;
+
#undef OPEP
}
/*
proceed=false;
}
break;
- case 1 : //Opening the socket
- fd->socptr=soc_openfeedsock(pro_smtp,fd->srcip,fd->destip,fd->destport);
- if (fd->socptr==(SOCPTR *)0) {
- (void) rou_alert(0,"Unable to open link to [%s:%s]",
- fd->destip,fd->destport);
- (void) fclose(fd->datatst);
- fd->datatst=(FILE *)0;
- proceed=false; //Can not scan file
- }
+ case 1 : //Opening the socket (obsolete)
break;
case 2 : //reading line;
while (fgets(line,sizeof(line),fd->datatst)!=(char *)0) {
T:(feed05) Email testing remote server
-R:220 mailleur.example.com, ESMTP (cleartext) mailleur...
+C:IPFROM 127.127.0.25
+C:CONNECT
#====================================================
-C:ORGN 127.127.0.25
R:220 mailleur.example.com, ESMTP (cleartext) mailleur...
S:helo example.com
R:250 mailleur.example.com, link (cleartext) ready, your IP/FQDN=[127.127.0.25/No.Reverse]
va_end(args);
return rs;
-#undef OPEP
-}
-/*
-\f
-*/
-/********************************************************/
-/* */
-/* Procedure to do some action to change database */
-/* contents. */
-/* */
-/********************************************************/
-static int sqlrequest(SQLTYP *sql,const char *fmt,...)
-
-{
-#define OPEP "devsql.c:sqlrequest,"
-
-int number;
-va_list args;
-char *cmd;
-
-number=-1;
-va_start(args,fmt);
-if ((rou_vasprintf(&cmd,fmt,args))>0) {
- switch(sql->sqldb) {
- case db_postgres :
- number=pos_request(sql->db.psql,cmd);
- break;
- case db_maria :
- number=mar_request(sql->db.msql,cmd);
- break;
- default :
- (void) rou_alert(0,"%s Unexpected type='%d' (BUG!?)",
- OPEP,(int)sql->sqldb);
- break;
- }
- (void) free(cmd);
- }
-va_end(args);
-return number;
-
#undef OPEP
}
/*
#define OPEP "devseql.c:insert_ses,"
#define INSSES "INSERT INTO "SESSIONS" (sessid) VALUES(%s)"
-return (sqlrequest(sql,INSSES,seskey)==1);
+return (sql_request(sql,INSSES,seskey)==1);
#undef INSSES
#undef OPEP
}
}
if (isok==true)
- isok=(sqlrequest(sql,UPDSES,cmtset,seskey)==1);
+ isok=(sql_request(sql,UPDSES,cmtset,seskey)==1);
cmtset=rou_freestr(cmtset);
return isok;
phase++;
}
return gooddata;
+#undef OPEP
+}
+/*
+\f
+*/
+/********************************************************/
+/* */
+/* Procedure to do some action to change database */
+/* contents. */
+/* */
+/********************************************************/
+PUBLIC int sql_request(SQLPTR *sqlptr,const char *fmt,...)
+
+{
+#define OPEP "devsql.c:sql_request,"
+
+int number;
+SQLTYP *sql;
+va_list args;
+char *cmd;
+
+number=-1;
+sql=(SQLTYP *)sqlptr;
+va_start(args,fmt);
+if ((rou_vasprintf(&cmd,fmt,args))>0) {
+ switch(sql->sqldb) {
+ case db_postgres :
+ number=pos_request(sql->db.psql,cmd);
+ break;
+ case db_maria :
+ number=mar_request(sql->db.msql,cmd);
+ break;
+ default :
+ (void) rou_alert(0,"%s Unexpected type='%d' (BUG!?)",
+ OPEP,(int)sql->sqldb);
+ break;
+ }
+ (void) free(cmd);
+ }
+va_end(args);
+return number;
+
#undef OPEP
}
/*
char *field;
field="code,sessid,rcptto,numline,info";
- (void) sqlrequest(sqlptr,DELACT,goodid,goodrcpt);
+ (void) sql_request(sqlptr,DELACT,goodid,goodrcpt);
if (act->resp!=(char **)0) {
char **resp;
int num;
char *goodinfo;
goodinfo=sql_gooddata(sqlptr,*resp);
- (void) sqlrequest(sqlptr,INACT,field,goodcode,goodid,goodrcpt,num,goodinfo);
+ (void) sql_request(sqlptr,INACT,field,goodcode,goodid,goodrcpt,num,goodinfo);
goodinfo=rou_freestr(goodinfo);
resp++;
num++;
//procedure to manage action stats on email exhange status
extern _Bool sql_mngact(SQLPTR *sqlptr,SQLENUM action,ACTTYP *act);
-//procedure to locak access to a full table
-extern _Bool sql_locktable(SQLPTR *sqlptr,char *tblname,_Bool action);
+extern int sql_request(SQLPTR *sqlptr,const char *fmt,...);
#endif
#include "subrou.h"
#include "gessql.h"
-#define REMOTES "remotes" //Table about remotes site
+#define RMTTBL "remotes" //Table about remotes site
/*
^L
/* IP connection number. */
/* */
/********************************************************/
-PUBLIC int sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta)
+PUBLIC _Bool sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta)
{
#define OPEP "gessql.c:sql_newconnect,"
-int links;
-_Bool locked;
-SMTTYP *smtpdata;
+static const char *updfmt="UPDATE %s SET links=links+%d,lastupdate=now() WHERE remoteip='%s'";
+
+_Bool done;
int phase;
_Bool proceed;
-links=0;
-locked=false;
-smtpdata=(SMTTYP *)0;
+done=true;
phase=0;
proceed=true;
while (proceed==true) {
switch (phase) {
- case 0 : //Locking table
- if ((locked=sql_locktable(sqlptr,REMOTES,true))==false) {
- (void) rou_alert(0,"%s Unable to lock %s table (Bug?)",
- OPEP,REMOTES);
- phase=999; //Trouble trouble
- }
- break;
- case 1 : //loading record
- break;
- case 2 : //creating record if not exiting
- break;
- case 3 : //updating record
- smtpdata->links+=delta;
- links=smtpdata->links;
- smtpdata=sql_freesmtp(smtpdata);
+ case 0 : //updating remotes record with links
+ if (sql_request(sqlptr,updfmt,RMTTBL,delta,rmtip)==1)
+ phase=999;
break;
default : //SAFE Guard
- if (locked==true)
- (void) sql_locktable(sqlptr,REMOTES,false);
proceed=false;
break;
}
phase++;
}
-return links;
+return done;
+
#undef OPEP
}
//Procedure to increment (or decrement) the remoteip
//connection number
-extern int sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta);
+extern _Bool sql_newconnect(SQLPTR *sqlptr,char *rmtip,int delta);
#endif
(void) prc_settitle("%s, incoming contact from [%s] on [%s:%s]",
appname,contact->peerip,
contact->locname,contact->locserv);
- if (sql_newconnect(contact->sqlptr,contact->peerip,1)>1) {
- phase=999; //need to explain no contact;
- }
break;
- case 2 : //do contact
+ case 2 : //check if remote link is acceptable
+ if (sql_newconnect(contact->sqlptr,contact->peerip,1)==false)
+ phase=999; //connection rejected
+ break;
+ case 3 : //do contact
intstat=eml_docontact(contact);
switch (intstat) {
case 1 : //command 'quit' recieved
break;
}
break;
- case 3 : //check for immediat local delivery
- if (contact->recipients!=(RCPTYP **)0) {
- }
- break;
case 4 : //connection terminated
+ (void) sql_newconnect(contact->sqlptr,contact->peerip,-1);
break;
default : //SAFE guard
- if (contact!=(CONTYP *)0)
+ if (contact!=(CONTYP *)0)
contact=eml_dropcontact(contact);
proceed=false;
break;
values ('user2@mardb.example.com','user2');
//List of remote IP status
-INSERT INTO remotes (remoteip,connections,credit,status) \
- values ('127.127.9.25',0,10,'valide');
+INSERT INTO remotes (remoteip,credit,status) \
+ values ('127.127.0.25',10,'valide');
//defining table about remote server
CREATE TABLE remotes (
+ lastscan DBTIMESTAMP //record laste update
+ DFLT NOW(),
lastupdate DBTIMESTAMP //record creation
DFLT NOW(),
remoteip TEXTUNIQUE, //remote IP number
status TEXT //'toscan','inscan','valide'
DFLT 'toscan'
);
-CREATE INDEX remotes_ndx ON remotes (lastupdate,INS(status));
-INSERT INTO remotes (remoteip,connections,credit,status) \
- values ('127.0.0.1',0,99,'valide');
+CREATE INDEX remotes_ndx ON remotes (INS(status));
+INSERT INTO remotes (remoteip,credit,status) \
+ values ('127.0.0.1',99,'valide');
//--------------------------------------------------------------
//Defining TRIGGER fonctions according database type