static RMTTYP *close_mx(RMTTYP *rmt)
{
-if (rmt!=(RMTTYP *)0) {
- rmt->socptr=soc_closefeedsock(rmt->socptr);
- rmt->mxs=dns_freemxlist(rmt->mxs);
- rmt->orgdomain=rou_freestr(rmt->orgdomain);
- rmt->dstdomain=rou_freestr(rmt->dstdomain);
- (void) free(rmt);
- rmt=(RMTTYP *)0;
+#define OPEP "lvleml.c:close_mx,"
+
+int phase;
+_Bool proceed;
+
+phase=0;
+proceed=(rmt!=(RMTTYP *)0);
+while (proceed==true) {
+ switch (phase) {
+ case 0 : //need to disconnect
+ if (rmt->socptr!=(SOCPTR *)0) {
+ char **resp;
+ int rspcode;
+
+ resp=(char **)0;
+ rspcode=tcp_smtp_command(rmt,&resp,"QUIT");
+ switch (rspcode) {
+ case QUITOK : //Everything fine
+ break;
+ default :
+ (void) rou_alert(0,"%s Unexpected QUIT status='%d' (check code!)",
+ OPEP,rspcode);
+ break;
+ }
+ resp=(char **)rou_freelist((void **)resp,(genfree_t)rou_freestr);
+ rmt->socptr=soc_closefeedsock(rmt->socptr);
+ }
+ break;
+ case 1 : //free memory
+ rmt->mxs=dns_freemxlist(rmt->mxs);
+ rmt->orgdomain=rou_freestr(rmt->orgdomain);
+ rmt->dstdomain=rou_freestr(rmt->dstdomain);
+ (void) free(rmt);
+ rmt=(RMTTYP *)0;
+ break;
+ default : //SAFE Guard
+ proceed=false;
+ break;
+ }
+ phase++;
}
return rmt;
+
+#undef OPEP
}
/*
^L