From 85e09d9a91021c6522841569330bf2fdb0601208 Mon Sep 17 00:00:00 2001 From: Michael Hampton Date: Wed, 11 Oct 2000 22:47:51 +0000 Subject: [PATCH] * domain.c: getmx() returns hostname as MX if no MX records found a la RFC 974 --- citadel/ChangeLog | 4 ++ citadel/domain.c | 99 +++++++++++++++++++++++++---------------------- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/citadel/ChangeLog b/citadel/ChangeLog index 7c74ca909..7fcdd9196 100644 --- a/citadel/ChangeLog +++ b/citadel/ChangeLog @@ -1,4 +1,7 @@ $Log$ + Revision 573.11 2000/10/11 22:47:51 error + * domain.c: getmx() returns hostname as MX if no MX records found a la RFC 974 + Revision 573.10 2000/10/10 19:18:12 ajc * Added support of macros ALL, BODY, FAST, and FULL to the IMAP FETCH command @@ -2086,3 +2089,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 265fce1df..52d57665f 100644 --- a/citadel/domain.c +++ b/citadel/domain.c @@ -118,66 +118,71 @@ int getmx(char *mxbuf, char *dest) { C_IN, T_MX, (unsigned char *)answer, sizeof(answer) ); if (ret < 0) { - lprintf(5, "No MX found\n"); - return(0); + mxrecs = mallok(sizeof(struct mx)); + mxrecs[0].pref = 0; + strcpy(mxrecs[0].host, dest); + num_mxrecs = 1; } + else { - /* If we had to truncate, shrink the number to avoid fireworks */ - if (ret > sizeof(answer)) - ret = sizeof(answer); - - hp = (HEADER *)&answer[0]; - startptr = &answer[0]; /* start and end of buffer */ - endptr = &answer[ret]; - ptr = startptr + HFIXEDSZ; /* advance past header */ - - for (qdcount = ntohs(hp->qdcount); qdcount--; ptr += ret + QFIXEDSZ) { - if ((ret = dn_skipname(ptr, endptr)) < 0) { - lprintf(9, "dn_skipname error\n"); - return(0); - } - } - - while(1) { - memset(expanded_buf, 0, sizeof(expanded_buf)); - ret = dn_expand(startptr, - endptr, - ptr, - expanded_buf, - sizeof(expanded_buf) - ); - if (ret < 0) break; - ptr += ret; - - GETSHORT(type, ptr); - ptr += INT16SZ + INT32SZ; - GETSHORT(n, ptr); - - if (type != T_MX) { - ptr += n; + /* If we had to truncate, shrink the number to avoid fireworks */ + if (ret > sizeof(answer)) + ret = sizeof(answer); + + hp = (HEADER *)&answer[0]; + startptr = &answer[0]; /* start and end of buffer */ + endptr = &answer[ret]; + ptr = startptr + HFIXEDSZ; /* advance past header */ + + for (qdcount = ntohs(hp->qdcount); qdcount--; ptr += ret + QFIXEDSZ) { + if ((ret = dn_skipname(ptr, endptr)) < 0) { + lprintf(9, "dn_skipname error\n"); + return(0); + } } - - else { - GETSHORT(pref, ptr); + + while(1) { + memset(expanded_buf, 0, sizeof(expanded_buf)); ret = dn_expand(startptr, endptr, ptr, expanded_buf, sizeof(expanded_buf) ); + if (ret < 0) break; ptr += ret; - - ++num_mxrecs; - if (mxrecs == NULL) { - mxrecs = mallok(sizeof(struct mx)); + + GETSHORT(type, ptr); + ptr += INT16SZ + INT32SZ; + GETSHORT(n, ptr); + + if (type != T_MX) { + ptr += n; } + else { - mxrecs = reallok(mxrecs, - (sizeof(struct mx) * num_mxrecs) ); + GETSHORT(pref, ptr); + ret = dn_expand(startptr, + endptr, + ptr, + expanded_buf, + sizeof(expanded_buf) + ); + ptr += ret; + + ++num_mxrecs; + if (mxrecs == NULL) { + mxrecs = mallok(sizeof(struct mx)); + } + else { + mxrecs = reallok(mxrecs, + (sizeof(struct mx) * num_mxrecs) ); + } + + mxrecs[num_mxrecs - 1].pref = pref; + strcpy(mxrecs[num_mxrecs - 1].host, + expanded_buf); } - - mxrecs[num_mxrecs - 1].pref = pref; - strcpy(mxrecs[num_mxrecs - 1].host, expanded_buf); } } -- 2.39.2