From: Art Cancro Date: Sat, 1 Dec 2001 17:00:23 +0000 (+0000) Subject: * serv_smtp.c: when multiple MX's are the same preference, randomize them X-Git-Tag: v7.86~6721 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=cc6b14b4fcf02e58135c04d5b8c0ae95b121b44e * serv_smtp.c: when multiple MX's are the same preference, randomize them --- diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 713cc019c..559e733df 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,7 @@ $Log$ + Revision 580.82 2001/12/01 17:00:23 ajc + * serv_smtp.c: when multiple MX's are the same preference, randomize them + Revision 580.81 2001/12/01 07:18:28 ajc * Fixed an SMTP delivery problem that was causing certain classes of transient errors to cause a message to never be delivered. @@ -2886,3 +2889,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant Fri Jul 10 1998 Art Cancro * Initial CVS import + diff --git a/citadel/domain.c b/citadel/domain.c index 69376cbb0..f64458ed4 100644 --- a/citadel/domain.c +++ b/citadel/domain.c @@ -52,6 +52,22 @@ int get_smarthosts(char *mxbuf) { } +/* + * Compare the preference of two MX records. First check by the actual + * number listed in the MX record. If they're identical, randomize the + * result. + */ +inline int mx_compare_pref(int pref1, int pref2) { + if (pref1 > pref2) { + return(1); + } + else if (pref1 < pref2) { + return(1); + } + else { + return(rand() % 2); + } +} /* @@ -69,8 +85,7 @@ void sort_mxrecs(struct mx *mxrecs, int num_mxrecs) { /* do the sort */ for (a = num_mxrecs - 2; a >= 0; --a) { for (b = 0; b <= a; ++b) { - if (mxrecs[b].pref > mxrecs[b+1].pref) { - + if (mx_compare_pref(mxrecs[b].pref,mxrecs[b+1].pref)) { memcpy(&hold1, &mxrecs[b], sizeof(struct mx)); memcpy(&hold2, &mxrecs[b+1], sizeof(struct mx)); memcpy(&mxrecs[b], &hold2, sizeof(struct mx));