S:EHLO example.com
R:250-emlrcvr ready, your IP/FQDN=[127.0.0.1/localhost.localdomain]
R:250-SIZE 52428800
+R:250-ORGN
R:250-STARTTLS
R:250-8BITMIME
R:250-ENHANCEDSTATUSCODES
case 1 :
(void) rou_alert(0,"%s Polling return millisec='%d'",OPEP,millisec);
(void) usleep(500000);
- (void) soc_receive(socptr);
- if ((polling[0].revents&POLLHUP)==POLLHUP) {
- (void) close(soc->handle);
- soc->handle=-1;
- soc->connected=false;
- status=0;
- }
+ status=soc_receive(socptr);
/*
if ((polling[0].revents&POLLERR)==POLLERR) {
(void) rou_alert(0,"%s Polling POLLERR",OPEP);
errno=EAGAIN;
switch (errno) {
case EAGAIN : //no char available yet
+ got=0; //lets report "no char"
break;
case ECONNRESET : //Connection reset by peer
(void) rou_alert(0,"%s connection reset by peer",OPEP);
}
break;
case 0 : //No char available?
- (void) rou_alert(0,"%s, detected EOF error=<%s:%d>",
- OPEP,strerror(errno),errno);
- if (close(soc->handle)<0)
- (void) rou_alert(0,"%s, after close error=<%s:%d>",
- OPEP,strerror(errno),errno);
- soc->handle=-1; //Socket is now disconnected
- soc->connected=false;
+ //wait for timeout detection
break;
- default : //we got some char from remote
+ default : //we got some char from remote
for (int i=0;i<got;i++,buffer++) {
if (*buffer=='\000')
*buffer='?';
/* for a CRLF AS EOL. */
/* - Return "got", which could be: */
/* - a positive number of character read. */
-/* - 0, then reading reach time out */
-/* - -1, the link is disconnected (by remote) */
+/* - 0, reading reach time out */
+/* - -1, signal received */
+/* - -2, remote disconnect */
/* */
/********************************************************/
PUBLIC int tcp_getline(SOCPTR *socptr,u_int secwait,char **lineptr)
while (proceed==true) {
//(void) rou_alert(0,"JMPDBG %s phase='%d'",OPEP,phase);
switch (phase) {
- case 0 :
- if (socptr==(SOCPTR *)0) {
- (void) rou_alert(0,"%s socket pointer is NULL (Bug!?)",OPEP);
- phase=999; //trouble trouble
+ case 0 : //link still open?
+ if (soc_receive(socptr)<0) {
+ got=-2;
+ phase=999;
}
break;
- case 1 : //get nextline
+ case 1 : //get nextline if ready
if ((got=soc_getnextline(socptr,lineptr))>0)
phase=999; //we got a line.
break;
- case 2 : //still need to wait
- break;
- case 3 : //lets wait secwait*1000 millisec for input
+ case 2 : //lets wait secwait*1000 millisec for input
got=soc_waitforchar(socptr,secwait*1000);
switch (got) {
case -1 : //trouble? signal?
if ((hangup==true)||(reload==true))
phase=999; //we got a real signal
- break; //no need to read line
+ break;
case 0 : //normal time out
- phase=0; //still waiting for a full line
+ if (soc_receive(socptr)<0)
+ got=-2; //remote disconnected
+ phase=999;
break;
default : //char available
- phase=0; //check for new line
- if (soc_receive(socptr)<0) {
- got=-1;
- phase=999; //remote disconnected?
- }
+ phase=0; //is new line ready?
break;
}
break;
/********************************************************/
/* */
/* Procedure to proceed with peer exchange */
-/* 3 return values: */
-/* -1 exit with trouble. */
-/* 0 normal exit. */
-/* 1 continue to proceed. */
+/* 5 return values: */
+/* 1 exiting via "quit" */
+/* 0 contact timeout */
+/* -1 signal received */
+/* -2 remote disconnected */
+/* -3 BUG! */
/* */
/********************************************************/
PUBLIC int eml_docontact(CONTYP *contact)
while (proceed==true) {
char *line;
+ line=(char *)0;
status=tcp_getline(contact->socptr,delay,&line);
- //(void) rou_alert(0,"%s, JMPDBG tcp_getline status='%d'",OPEP,status);
if (status<=0) { //timeout or trouble?
- (void) log_fprintlog(contact->logptr,false,"%s","Lost contact with remote");
+ char str[100];
+
+ switch (status) {
+ case 0 : //timeout
+ (void) snprintf(str,sizeof(str),"Remote not responding with %d sec",delay);
+ break;
+ case -1 : //signal received
+ (void) snprintf(str,sizeof(str),"Signal Received");
+ break;
+ case -2 : //contact lost
+ (void) snprintf(str,sizeof(str),"Lost link with remote");
+ break;
+ default :
+ (void) snprintf(str,sizeof(str),"Unexpected status='%d' (Bug?)",status);
+ status=-3;
+ break;
+ }
+ (void) log_fprintlog(contact->logptr,"Exiting contact condition=<%s>",str);
+ //(void) rou_alert(0,"%s exit status='%d'",OPEP,status);
break; //no need to go further
}
(void) log_fprintlog(contact->logptr,false,"%s",line);
(void) transmit(contact,"%d 2.0.0 Bye, closing connection %s",
QUITOK,contact->mainsesid);
//(void) rou_alert(0,"%s JMPDBG Bye transmitted",OPEP);
+ status=1; //every thing fine
proceed=false;
break;
case c_mail : //MAIL FROM: checking originator
break;
default :
(void) rou_alert(0,"Unable to find keyword for <%s> (Bug?)",OPEP,line);
- status=-1;
+ status=-3;
+ proceed=false;
break;
}
line=rou_freestr(line);
#define TESTL 8
CONTYP *contact;
-
+int intstat;
int phase;
_Bool proceed;
contact=(CONTYP *)0;
+intstat=0;
phase=0;
proceed=true;
while (proceed==true) {
(void) rou_checkleak(true);
break;
case 2 : //do contact
- switch (eml_docontact(contact)) {
- case -1 : //Signal received
- (void) rou_alert(0,"Signal received within contact");
+ intstat=eml_docontact(contact);
+ switch (intstat) {
+ case 1 : //quit done
break;
case 0 : //exit under timeout
(void) rou_alert(0,"Lost contact with peer <%s>",contact->peerip);
break;
- default : //exit under quit
- (void) rou_alert(0,"Contact terminated by 'quit'");
+ case -1 : //Signal received
+ (void) rou_alert(0,"Signal received within contact");
+ break;
+ case -2 : //Signal received
+ (void) rou_alert(0,"Signal received within contact");
+ break;
+ default : //trouble trouble
+ (void) rou_alert(0,"%s Unepected status='%d' (BUG?!)",OPEP,intstat);
break;
}
break;
//version definition
#define VERSION "0.6"
-#define RELEASE "32"
-#define BRANCH "dvl;"
+#define RELEASE "33"
+#define BRANCH "dvl"
//Public variables
PUBLIC int debug=0; //debug level