_Bool isok;
AFNTYP *afn;
+int phase;
+_Bool proceed;
isok=false;
-if ((afn=afn_getoneipnum(rmtip))!=(AFNTYP *)0) {
- char *reverse;
+afn=(AFNTYP *)0;
+phase=0;
+proceed=true;
+while (proceed==true) {
+ switch (phase) {
+ case 0 : //is the new IP valide
+ if ((afn=afn_getoneipnum(rmtip))==(AFNTYP *)0) {
+ (void) rou_alert(0,"%s <%s> is not a good ip (Testing?)",OPEP,rmtip);
+ phase=999;
+ }
+ break;
+ case 1 : //we have good ip, lets disconnect previous
+ if (sql_newconnect(contact->sqlptr,contact->peerip,-1)==false) {
+ (void) rou_alert(0,"%s Unable to update database remotes table (system?)"
+ OPEP);
+ phase=999;
+ }
+ break;
+ case 2 : { //ready to change IP'
+ char *reverse;
- reverse=afn_reversipnum(afn);
- contact->peerip=rou_freestr(contact->peerip);
- contact->peerip=strdup(rmtip);
- contact->peername=rou_freestr(contact->peername);
- contact->peername=dns_get_reverse_addr(reverse);
- switch (contact->privilege) {
- case rel_authentic :
+ contact->peerip=rou_freestr(contact->peerip);
+ contact->peerip=strdup(rmtip);
+ reverse=afn_reversipnum(afn);
+ contact->peername=rou_freestr(contact->peername);
+ contact->peername=dns_get_reverse_addr(reverse);
+ reverse=rou_freestr(reverse);
+ }
break;
- case rel_isrelay :
- //NO BREAK;
- case rel_plain :
- if (afn_is_ip_relayable(contact->peerip,contact->relayok)==true)
- contact->privilege=rel_isrelay; //IP is relayable
+ case 3 : //adjust privilege according new IP
+ switch (contact->privilege) {
+ case rel_authentic :
+ break;
+ case rel_isrelay :
+ //NO BREAK;
+ case rel_plain :
+ if (afn_is_ip_relayable(contact->peerip,contact->relayok)==true)
+ contact->privilege=rel_isrelay; //IP is relayable
+ break;
+ default :
+ (void) rou_alert(0,"%s unexpected privilege '%d' (Bug?)",
+ OPEP,contact->privilege);
+ phase=999;
+ break;
+ }
break;
- default :
- (void) rou_alert(0,"%s unexpeced privilege '%d' (Bug?)",
- OPEP,contact->privilege);
+ case 4 : //let update links
+ if (sql_newconnect(contact->sqlptr,rmtip,1)==false) {
+ (void) rou_alert(0,"%s <%s> Unable to increase links number! (Testing?)",
+ OPEP,rmtip);
+ phase=999;
+ }
+ break;
+ case 5 : //everything is now fine
+ (void) signon(contact);
+ isok=true;
+ break;
+ default : //SAFE Guard
+ afn=afn_freeipnum(afn);
+ proceed=false;
break;
}
- reverse=rou_freestr(reverse);
- afn=afn_freeipnum(afn);
- isok=true;
+ phase++;
}
-(void) signon(contact);
return isok;
#undef OPEP
#define OPEP "modrec.c:docontact"
CONTYP *contact;
+int delta;
int intstat;
int phase;
_Bool proceed;
contact=(CONTYP *)0;
intstat=0;
+delta=0;
phase=0;
proceed=true;
while (proceed==true) {
contact->locname,contact->locserv);
break;
case 2 : //check if remote link is acceptable
- if (sql_newconnect(contact->sqlptr,contact->peerip,1)==false)
+ delta=1;
+ if (sql_newconnect(contact->sqlptr,contact->peerip,delta)==false) {
phase=999; //connection rejected
+ }
+ delta=0;
break;
case 3 : //do contact
+ delta=-1;
intstat=eml_docontact(contact);
switch (intstat) {
case 1 : //command 'quit' recieved
}
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) {
+ (void) sql_newconnect(contact->sqlptr,contact->peerip,delta);
contact=eml_dropcontact(contact);
+ }
proceed=false;
break;
}