#:: -> smtp:0.0.0.0:25:2
#SMTPPORTS " "::"
#SMTPPORTS = ":127.127.10.25:1025:,smtps:127.127.10.25:1026:1"
-#SMTPPORTS = ":127.127.10.25:1025:"
-SMTPPORTS = "smtps:127.127.10.25:1065:1"
+SMTPPORTS = ":127.127.10.25:1025:"
+#SMTPPORTS = "smtps:127.127.10.25:1065:1"
#------------------------------------------------
#Defining SERVER mode Certificate data
CA_ROOT_SRV = "./certs/root-safe_CA.pem"
R:250 2.1.3 trouble@subdom1.example.com.. sender ok
S:RCPT TO: <dom1user3@subdom1.example.com>
R:250 2.6.4 Address accepted
+S:RCPT TO: <dom1user3@example.com>
+R:250 2.6.4 Address accepted
#-------------------------------------------------------------------------
#-sending data
C:DATA
}
break;
case 1 : //check about local domain, TEMPORARY code
- if (strcmp(rcpt->domain,"example.com")==0) {
- rcpt->code='L'; //domain is local
- phase=999; //No need to go further
+ int status;
+
+ status=dns_is_domain_local(rcpt->domain);
+ switch (status) {
+ case dns_nomx :
+ done=false;
+ break;
+ case dns_local :
+ rcpt->code='L'; //domain is local
+ break;
+ case dns_remote :
+ rcpt->code='R'; //domain is remote
+ break;
+ default :
+ (void) rou_alert(0,"%s Unexpected status='%d' for domain<%s>",
+ OPEP,status,rcpt->domain);
+ break;
}
break;
- case 2 : //domain is a remote one
- rcpt->code='R';
- break;
default : //SAFE Guard
proceed=false;
break;
}
break;
case 3 : //Do we have a domain MX
- (void) setlocdom(contact,neu);
- if (neu->domain!=(const char *)0) { //always
- MXTYP **mx;
-
- if ((mx=dns_getmx(neu->domain))==(MXTYP **)0) {
- (void) transmit(contact,"%d 5.6.3 %s (rcpt=%s)",
- MISSMX,
- "No valid MX found for recipient domain name",
- neu->domain);
- neu=eml_freerecipient(neu);
- phase=999; //no need to go further
- }
- mx=dns_freemxlist(mx);
+ if (setlocdom(contact,neu)==false) {
+ (void) transmit(contact,"%d 5.6.3 %s (domain=%s)",
+ MISSMX,
+ "No valid MX found for recipient domain name",
+ neu->domain);
+ neu=eml_freerecipient(neu); //free recipient
+ phase=999; //no need to go further
}
break;
case 4 : //Storing rcpt to
mx=(MXTYP *)calloc(1,sizeof(MXTYP));
mx->preference=atoi(list[i]);
mx->mxname=strdup(list[i+1]);
+ //(void) rou_alert(0,"%s JMPDBG MX[%d]=<%s>",OPEP,i,mx->mxname);
mxlist=(MXTYP **)rou_addlist((void **)mxlist,(void *)mx);
answer++;
}
return match;
#undef OPEP
}
+/*
+\f
+*/
+/********************************************************/
+/* */
+/* Procedure to check if a domain is handle by the */
+/* local interface (serveur is primary MX). */
+/* */
+/********************************************************/
+PUBLIC LOCTYP dns_is_domain_local(const char *domain)
+
+
+{
+#define OPEP "unidns.c:dns_is_domain_local,"
+
+LOCTYP status;
+MXTYP **dns;
+int phase;
+_Bool proceed;
+
+status=dns_nomx;
+phase=0;
+proceed=true;
+while (proceed==true) {
+ switch (phase) {
+ case 0 : //Do we have a domain
+ if ((domain==(char *)0)||(strlen(domain)==0))
+ phase=999; //No domain (Bug?)
+ break;
+ case 1 : //getting MX list
+ if ((dns=dns_getmx(domain))==(MXTYP **)0)
+ phase=999; //domain without MX?
+ break;
+ case 2 : //listing MX
+ MXTYP **ptr;
+
+ ptr=dns;
+ while ((*ptr)!=(MXTYP *)0) {
+ (void) rou_alert(0,"%s JMPDBG pref='%d' mxname=<%s>",
+ OPEP,(*ptr)->preference,(*ptr)->mxname);
+ ptr++;
+ }
+ break;
+ case 3 : //cleaning MX list
+ dns=dns_freemxlist(dns);
+ break;
+ default : //SAFE Guard
+ proceed=false;
+ break;
+ }
+ phase++;
+ }
+return status;
+
+#undef OPEP
+}
char **mxip; //MX IPNUM list
}MXTYP;
+typedef enum { //domain MX status
+ dns_nomx, //Domain without MX
+ dns_local, //Domain is local
+ dns_remote, //Domain is remote
+ dns_unknown //Unknow domain status.
+ }LOCTYP;
+
//Procedure to get ONE SPF entry within domain dns
extern char *dns_getspf(char *domain);
//procedure to detect if a domain is served by a local
//smtp server
-extern _Bool dns_is_domain_local(const char *domain);
+extern LOCTYP dns_is_domain_local(const char *domain);
#endif
#define BADPAR 501 //error in parameters
#define CMDBAD 502 //command not implemented
#define DATRJC 521 //Data Rejected
+#define REJECT 550 //E-mail/domain rejected
#define UKNUSER 551 //Unknown user
#define MALABRT 552 //email data rejected
#define NOTEML 553 //Not an email address