From 4fbbabc2705e0c7320516b673f855494d48ec81d Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 25 Oct 1996 18:08:43 +0000 Subject: Initial revision svn path=/trunk/; revision=379 --- mx.h | 13 +++++++++++ mxget.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 mx.h create mode 100644 mxget.c diff --git a/mx.h b/mx.h new file mode 100644 index 00000000..5e2824c0 --- /dev/null +++ b/mx.h @@ -0,0 +1,13 @@ +/* mx.h -- name-to-preference association for MX records */ + +struct mxentry +{ + char *name; + int pref; +}; + +#ifdef HAVE_PROTOTYPES +extern int getmxrecords(char *, int, struct mxentry *); +#endif /* HAVE_PROTOTYPES */ + +/* mx.h ends here */ diff --git a/mxget.c b/mxget.c new file mode 100644 index 00000000..081c20f6 --- /dev/null +++ b/mxget.c @@ -0,0 +1,81 @@ +/* + * mxget.c -- fetch MX records for given DNS name + * + * Copyright 1996 by Eric S. Raymond + * All rights reserved. + * For license terms, see the file COPYING in this directory. + */ + +#include +#ifdef HAVE_GETHOSTBYNAME +#include +#include +#include +#include +#include +#include "mx.h" + +/* + * This ought to be in the bind library. It's adapted from sendmail. + */ + +int getmxrecords(name, nmx, pmx) +/* get MX records for given host */ +char *name; +int nmx; +struct mxentry *pmx; +{ + unsigned char answer[PACKETSZ], MXHostBuf[PACKETSZ], *eom, *cp, *bp; + int n, ancount, qdcount, buflen, type, pref, ind; + HEADER *hp; + + n = res_search(name,C_IN,T_MX,(unsigned char*)&answer, sizeof(answer)); + if (n == -1) + return(-1); + + hp = (HEADER *)&answer; + cp = answer + HFIXEDSZ; + eom = answer + n; + for (qdcount = ntohs(hp->qdcount); qdcount--; cp += n + QFIXEDSZ) + if ((n = dn_skipname(cp, eom)) < 0) + return(-1); + buflen = sizeof(MXHostBuf) - 1; + bp = MXHostBuf; + ind = 0; + ancount = ntohs(hp->ancount); + while (--ancount >= 0 && cp < eom) + { + if ((n = dn_expand(answer, eom, cp, bp, buflen)) < 0) + break; + cp += n; + GETSHORT(type, cp); + cp += INT16SZ + INT32SZ; + GETSHORT(n, cp); + if (type != T_MX) + { + cp += n; + continue; + } + GETSHORT(pref, cp); + if ((n = dn_expand(answer, eom, cp, bp, buflen)) < 0) + break; + cp += n; + + pmx[ind].name = bp; + pmx[ind].pref = pref; + if (++ind > nmx) + break; + + n = strlen(bp); + bp += n; + *bp++ = '\0'; + + + buflen -= n + 1; + } + + return(ind); +} +#endif /* HAVE_GETHOSTBYNAME */ + +/* mxget.c ends here */ -- cgit v1.2.3