diff options
Diffstat (limited to 'sys-libs/glibc/files/2.3.4/glibc-2.3.4-mdns-resolver-20041102.diff')
-rw-r--r-- | sys-libs/glibc/files/2.3.4/glibc-2.3.4-mdns-resolver-20041102.diff | 463 |
1 files changed, 0 insertions, 463 deletions
diff --git a/sys-libs/glibc/files/2.3.4/glibc-2.3.4-mdns-resolver-20041102.diff b/sys-libs/glibc/files/2.3.4/glibc-2.3.4-mdns-resolver-20041102.diff deleted file mode 100644 index d22e0cbc7e6a..000000000000 --- a/sys-libs/glibc/files/2.3.4/glibc-2.3.4-mdns-resolver-20041102.diff +++ /dev/null @@ -1,463 +0,0 @@ -diff -Nru glibc-2.3.3/resolv/res_hconf.c libc-mdns/resolv/res_hconf.c ---- glibc-2.3.3/resolv/res_hconf.c 2004-11-04 15:14:48.265197552 -0500 -+++ libc-mdns/resolv/res_hconf.c 2004-11-04 15:01:40.000000000 -0500 -@@ -59,6 +59,7 @@ - #define ENV_TRIM_ADD "RESOLV_ADD_TRIM_DOMAINS" - #define ENV_MULTI "RESOLV_MULTI" - #define ENV_REORDER "RESOLV_REORDER" -+#define ENV_MDNS "RESOLV_MDNS" - - static const char *arg_service_list (const char *, int, const char *, - unsigned int); -@@ -81,7 +82,8 @@ - {"multi", arg_bool, HCONF_FLAG_MULTI}, - {"nospoof", arg_bool, HCONF_FLAG_SPOOF}, - {"spoofalert", arg_bool, HCONF_FLAG_SPOOFALERT}, -- {"reorder", arg_bool, HCONF_FLAG_REORDER} -+ {"reorder", arg_bool, HCONF_FLAG_REORDER}, -+ {"mdns", arg_bool, HCONF_FLAG_MDNS} - }; - - /* Structure containing the state. */ -@@ -431,6 +433,9 @@ - - memset (&_res_hconf, '\0', sizeof (_res_hconf)); - -+ /* Default for mdns is "on". */ -+ _res_hconf.flags |= HCONF_FLAG_MDNS; -+ - hconf_name = getenv (ENV_HOSTCONF); - if (hconf_name == NULL) - hconf_name = _PATH_HOSTCONF; -@@ -483,6 +488,10 @@ - arg_trimdomain_list (ENV_TRIM_OVERR, 1, envval, 0); - } - -+ envval = getenv (ENV_MDNS); -+ if (envval) -+ arg_bool (ENV_MDNS, 1, envval, HCONF_FLAG_MDNS); -+ - _res_hconf.initialized = 1; - } - -diff -Nru glibc-2.3.3/resolv/res_hconf.h libc-mdns/resolv/res_hconf.h ---- glibc-2.3.3/resolv/res_hconf.h 2001-07-06 00:55:39.000000000 -0400 -+++ libc-mdns/resolv/res_hconf.h 2004-11-04 15:01:40.000000000 -0500 -@@ -44,6 +44,7 @@ - # define HCONF_FLAG_SPOOFALERT (1 << 2) /* syslog warning of spoofed */ - # define HCONF_FLAG_REORDER (1 << 3) /* list best address first */ - # define HCONF_FLAG_MULTI (1 << 4) /* see comments for gethtbyname() */ -+# define HCONF_FLAG_MDNS (1 << 5) /* Disable MDNS support */ - }; - extern struct hconf _res_hconf; - -diff -Nru glibc-2.3.3/resolv/res_query.c libc-mdns/resolv/res_query.c ---- glibc-2.3.3/resolv/res_query.c 2004-11-04 15:14:48.268197096 -0500 -+++ libc-mdns/resolv/res_query.c 2004-11-04 15:01:40.000000000 -0500 -@@ -82,6 +82,8 @@ - #include <stdlib.h> - #include <string.h> - -+#include "res_hconf.h" -+ - /* Options. Leave them on. */ - /* #undef DEBUG */ - -@@ -280,6 +282,13 @@ - *domain && !done; - domain++) { - -+ if ((_res_hconf.flags & HCONF_FLAG_MDNS) != 0) { -+ /* don't add "local" domain if query contains a dot */ -+ if (dots && (!__strcasecmp(*domain, "local") || -+ !__strcasecmp(*domain, "local."))) -+ continue; -+ } -+ - if (domain[0][0] == '\0' || - (domain[0][0] == '.' && domain[0][1] == '\0')) - root_on_list++; -diff -Nru glibc-2.3.3/resolv/res_send.c libc-mdns/resolv/res_send.c ---- glibc-2.3.3/resolv/res_send.c 2004-11-04 15:14:48.269196944 -0500 -+++ libc-mdns/resolv/res_send.c 2004-11-04 15:06:31.000000000 -0500 -@@ -85,6 +85,9 @@ - #include <arpa/nameser.h> - #include <arpa/inet.h> - #include <sys/ioctl.h> -+#if defined(_LIBC) && defined(linux) -+#include <net/if.h> -+#endif - - #include <errno.h> - #include <fcntl.h> -@@ -96,6 +99,8 @@ - #include <string.h> - #include <unistd.h> - -+#include "res_hconf.h" -+ - #if PACKETSZ > 65536 - #define MAXPACKET PACKETSZ - #else -@@ -180,6 +185,9 @@ - static int send_dg(res_state, const u_char *, int, - u_char **, int *, int *, int, - int *, int *, u_char **); -+static int send_dg_mdns(res_state, const u_char *, int, -+ u_char **, int *, int *, struct sockaddr_in6 *, -+ int *, int *, u_char **); - #ifdef DEBUG - static void Aerror(const res_state, FILE *, const char *, int, - const struct sockaddr *); -@@ -332,6 +340,35 @@ - u_char *ans, int anssiz, u_char **ansp) - { - int gotsomewhere, terrno, try, v_circuit, resplen, ns, n; -+ int usemdns; -+ HEADER *qhp = (HEADER *) buf; -+ -+ usemdns = 0; -+ if ((_res_hconf.flags & HCONF_FLAG_MDNS) != 0 && -+ qhp->qr == 0 && qhp->opcode == QUERY && qhp->qdcount == htons(1)) { -+ /* got one simple query */ -+ const u_char *bp, *be; -+ be = buf + buflen; -+ for (bp = buf + NS_HFIXEDSZ; bp < be; ) -+ if ((*bp & NS_CMPRSFLGS) != 0) -+ break; -+ else if (*bp) { -+ if (*bp == 5 && !strncasecmp(bp, "\005local\000", 7)) { -+ usemdns = 1; -+ break; -+ } -+ if (*bp == 3 && !strncasecmp(bp, "\003254\003169\007in-addr\004arpa\000", 22)) { -+ usemdns = 1; -+ break; -+ } -+ if (*bp == 1 && !strncasecmp(bp, "\0010\0018\001e\001f\003ip6\004arpa\000", 18)) { -+ usemdns = 2; -+ break; -+ } -+ bp += *bp + 1; -+ } else -+ break; -+ } - - if (statp->nscount == 0) { - __set_errno (ESRCH); -@@ -465,10 +502,27 @@ - * Send request, RETRY times, or until successful. - */ - for (try = 0; try < statp->retry; try++) { -- for (ns = 0; ns < MAXNS; ns++) -+ for (ns = 0; ns < (usemdns ? 1 : MAXNS); ns++) - { - struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns]; - -+ if (usemdns == 1) { -+ static struct sockaddr_in mdns4; -+ mdns4.sin_family = AF_INET; -+ mdns4.sin_port = htons(5353); -+ mdns4.sin_addr.s_addr = htonl(0xe00000fb); -+ nsap = (struct sockaddr_in6 *)&mdns4; -+ } -+ if (usemdns == 2) { -+ static struct sockaddr_in6 mdns6; -+ mdns6.sin6_family = AF_INET6; -+ mdns6.sin6_port = htons(5353); -+ mdns6.sin6_addr.s6_addr32[0] = htonl(0xff020000); -+ mdns6.sin6_addr.s6_addr32[3] = htonl(0x000000fb); -+ nsap = &mdns6; -+ } -+ -+ - if (nsap == NULL) - goto next_ns; - same_ns: -@@ -525,8 +579,11 @@ - resplen = n; - } else { - /* Use datagrams. */ -- n = send_dg(statp, buf, buflen, &ans, &anssiz, &terrno, -- ns, &v_circuit, &gotsomewhere, ansp); -+ if (usemdns) -+ n = send_dg_mdns(statp, buf, buflen, &ans, &anssiz, &terrno, nsap, &v_circuit, &gotsomewhere, ansp); -+ else -+ n = send_dg(statp, buf, buflen, &ans, &anssiz, &terrno, -+ ns, &v_circuit, &gotsomewhere, ansp); - if (n < 0) - return (-1); - if (n == 0) -@@ -593,8 +650,15 @@ - if (!v_circuit) { - if (!gotsomewhere) - __set_errno (ECONNREFUSED); /* no nameservers found */ -- else -+ else if (!usemdns) { - __set_errno (ETIMEDOUT); /* no answer obtained */ -+ } else { -+ /* treat timeout as host not found */ -+ HEADER *anhp = (HEADER *) ans; -+ memset(ans, 0, HFIXEDSZ); -+ anhp->rcode = NXDOMAIN; -+ return HFIXEDSZ; -+ } - } else - __set_errno (terrno); - return (-1); -@@ -1035,6 +1099,255 @@ - } - } - -+static int -+send_dg_mdns(res_state statp, -+ const u_char *buf, int buflen, u_char **ansp, int *anssizp, -+ int *terrno, struct sockaddr_in6 *nsap, int *v_circuit, int *gotsomewhere, u_char **anscp) -+{ -+ const HEADER *hp = (HEADER *) buf; -+ u_char *ans = *ansp; -+ int anssiz = *anssizp; -+ HEADER *anhp = (HEADER *) ans; -+ struct timespec now, timeout, finish; -+ struct pollfd pfd[32]; -+ int ptimeout; -+ int fromlen, resplen, seconds, n, s; -+ int on = 1; -+ struct msghdr mhdr; -+ struct iovec iov; -+ u_char cmsgbuf[CMSG_SPACE(sizeof(int))]; -+ struct cmsghdr *cmsg; -+ int ttl; -+ struct ifconf ifconf; -+ struct ifreq ifreq[64]; -+ int ifreqn; -+ int i, j; -+ int ifidx[32], ifidxn; -+ struct ip_mreqn mreqn; -+ -+ s = socket(nsap->sin6_family == AF_INET ? PF_INET : PF_INET6, SOCK_DGRAM, 0); -+ if (s < 0) { -+ *terrno = errno; -+ Perror(statp, stderr, "socket(dg)", errno); -+ return (-1); -+ } -+ ifconf.ifc_len = sizeof(ifreq); -+ ifconf.ifc_req = ifreq; -+ ifidxn = 0; -+ if (ioctl(s, SIOCGIFCONF, &ifconf) == 0) { -+ ifreqn = ifconf.ifc_len / sizeof(*ifreq); -+ for (i = 0 ; i < ifreqn; i++) { -+ if (ioctl(s, SIOCGIFFLAGS, ifreq + i)) -+ continue; -+ if (!(ifreq[i].ifr_flags & IFF_MULTICAST)) -+ continue; -+ if (ioctl(s, SIOCGIFINDEX, ifreq + i)) -+ continue; -+ for (j = 0; j < ifidxn; j++) -+ if (ifidx[j] == ifreq[i].ifr_ifindex) -+ break; -+ if (j < ifidxn) -+ continue; -+ ifidx[ifidxn++] = ifreq[i].ifr_ifindex; -+ if (ifidxn == sizeof(ifidx)/sizeof(*ifidx)) -+ break; -+ } -+ } -+ j = 0; -+ for (i = 0; i < (ifidxn ? ifidxn : 1); i++) { -+ if (i) { -+ s = socket(nsap->sin6_family == AF_INET ? PF_INET : PF_INET6, SOCK_DGRAM, 0); -+ if (!s) -+ continue; -+ } -+ if (setsockopt(s, SOL_IP, IP_RECVTTL, &on, sizeof(on))) { -+ *terrno = errno; -+ Perror(statp, stderr, "IP_RECVTTL(dg)", errno); -+ close(s); -+ continue; -+ } -+ if (ifidxn) { -+ memset(&mreqn, 0, sizeof(mreqn)); -+ mreqn.imr_ifindex = ifidx[i]; -+ if (setsockopt(s, SOL_IP, IP_MULTICAST_IF, &mreqn, sizeof(mreqn))) { -+ *terrno = errno; -+ Perror(statp, stderr, "IP_MULTICAST_IF", errno); -+ close(s); -+ continue; -+ } -+ } -+ if (sendto(s, (char*)buf, buflen, 0, -+ (struct sockaddr *)nsap, sizeof *nsap) != buflen) { -+ Aerror(statp, stderr, "sendto", errno, *(struct sockaddr_in *)nsap); -+ close(s); -+ continue; -+ } -+ pfd[j].fd = s; -+ pfd[j].events = POLLIN; -+ j++; -+ } -+ /* -+ * Wait for reply. -+ */ -+ seconds = statp->retrans; -+ if (seconds <= 0) -+ seconds = 1; -+ evNowTime(&now); -+ evConsTime(&timeout, seconds, 0); -+ evAddTime(&finish, &now, &timeout); -+ wait: -+ if (j == 0) { -+ return (0); -+ } -+ -+ /* Convert struct timespec in milliseconds. */ -+ ptimeout = timeout.tv_sec * 1000 + timeout.tv_nsec / 1000000; -+ n = __poll (pfd, j, ptimeout); -+ if (n == 0) { -+ Dprint(statp->options & RES_DEBUG, (stdout, ";; timeout\n")); -+ *gotsomewhere = 1; -+ for (i = 0; i < j; i++) -+ close(pfd[i].fd); -+ return (0); -+ } -+ if (n < 0) { -+ if (errno == EINTR) { -+ evNowTime(&now); -+ if (evCmpTime(finish, now) > 0) { -+ evSubTime(&timeout, &finish, &now); -+ goto wait; -+ } -+ } -+ Perror(statp, stderr, "select", errno); -+ for (i = 0; i < j; i++) -+ close(pfd[i].fd); -+ res_nclose(statp); -+ return (0); -+ } -+ for (i = 0; i < j - 1; i++) -+ if (pfd[j].revents == POLLIN) -+ break; -+ s = pfd[i].fd; -+ __set_errno (0); -+ fromlen = sizeof(struct sockaddr_in6); -+ if (anssiz < MAXPACKET -+ && anscp -+ && (ioctl (s, FIONREAD, &resplen) < 0 -+ || anssiz < resplen)) { -+ ans = malloc (MAXPACKET); -+ if (ans == NULL) -+ ans = *ansp; -+ else { -+ anssiz = MAXPACKET; -+ *anssizp = MAXPACKET; -+ *ansp = ans; -+ *anscp = ans; -+ anhp = (HEADER *) ans; -+ } -+ } -+ iov.iov_base = ans; -+ iov.iov_len = anssiz; -+ mhdr.msg_name = 0; -+ mhdr.msg_namelen = 0; -+ mhdr.msg_iov = &iov; -+ mhdr.msg_iovlen = 1; -+ mhdr.msg_control = cmsgbuf; -+ mhdr.msg_controllen = sizeof(cmsgbuf); -+ mhdr.msg_flags = 0; -+ resplen = recvmsg(s, &mhdr, 0); -+ if (resplen <= 0) { -+ if (errno == EAGAIN) -+ goto wait; -+ Perror(statp, stderr, "recvfrom", errno); -+wait2: -+ close(s); -+ if (i < j) -+ memmove(pfd + i, pfd + i + 1, sizeof(*pfd) * (j - i)); -+ j--; -+ goto wait; -+ } -+ cmsg = CMSG_FIRSTHDR(&mhdr); -+ for (cmsg = CMSG_FIRSTHDR(&mhdr); cmsg; CMSG_NXTHDR(&mhdr, cmsg)) -+ if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_TTL) -+ break; -+ if (!cmsg) { -+ Dprint(statp->options & RES_DEBUG, -+ (stdout, ";; no TTL found\n")); -+ goto wait2; -+ } -+ ttl = *(int *)CMSG_DATA(cmsg); -+ if (ttl != 255) { -+ Dprint(statp->options & RES_DEBUG, -+ (stdout, ";; answer with bad TTL: %d \n", ttl)); -+ goto wait; -+ } -+ *gotsomewhere = 1; -+ if (resplen < HFIXEDSZ) { -+ /* -+ * Undersized message. -+ */ -+ Dprint(statp->options & RES_DEBUG, -+ (stdout, ";; undersized: %d\n", -+ resplen)); -+ *terrno = EMSGSIZE; -+ goto wait; -+ } -+ if (hp->id != anhp->id) { -+ /* -+ * response from old query, ignore it. -+ * XXX - potential security hazard could -+ * be detected here. -+ */ -+ DprintQ((statp->options & RES_DEBUG) || -+ (statp->pfcode & RES_PRF_REPLY), -+ (stdout, ";; old answer:\n"), -+ ans, (resplen > anssiz) ? anssiz : resplen); -+ goto wait; -+ } -+ if (!(statp->options & RES_INSECURE2) && -+ !res_queriesmatch(buf, buf + buflen, -+ ans, ans + anssiz)) { -+ /* -+ * response contains wrong query? ignore it. -+ * XXX - potential security hazard could -+ * be detected here. -+ */ -+ DprintQ((statp->options & RES_DEBUG) || -+ (statp->pfcode & RES_PRF_REPLY), -+ (stdout, ";; wrong query name:\n"), -+ ans, (resplen > anssiz) ? anssiz : resplen); -+ goto wait; -+ } -+ if (anhp->rcode == SERVFAIL || -+ anhp->rcode == NOTIMP || -+ anhp->rcode == REFUSED) { -+ DprintQ(statp->options & RES_DEBUG, -+ (stdout, "server rejected query:\n"), -+ ans, (resplen > anssiz) ? anssiz : resplen); -+ goto wait; -+ } -+ for (i = 0; i < j; i++) -+ close(pfd[i].fd); -+#if 0 -+ if (!(statp->options & RES_IGNTC) && anhp->tc) { -+ /* -+ * To get the rest of answer, -+ * use TCP with same server. -+ */ -+ Dprint(statp->options & RES_DEBUG, -+ (stdout, ";; truncated answer\n")); -+ *v_circuit = 1; -+ res_nclose(statp); -+ return (1); -+ } -+#endif -+ /* -+ * All is well, or the error is fatal. Signal that the -+ * next nameserver ought not be tried. -+ */ -+ return (resplen); -+} -+ - #ifdef DEBUG - static void - Aerror(const res_state statp, FILE *file, const char *string, int error, |