+2004-01-15 Ulrich Drepper <drepper@redhat.com>
+
+ * resolv/resolv.h: Add RES_USEBSTRING.
+ * resolv/res_debug.c (p_option): Add handling for RES_USE_INET6,
+ RES_ROTATE, RES_NOCHECKNAME, and RES_USEBSTRING.
+ * resolv/res_init.c (res_setioptions): Recognize ip6-bytestring.
+ * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyaddr_r): Only perform
+ bytestring IPv6 lookup with RES_USEBSTRING option is selected.
+ Otherwise use the two nibble formats.
+
2004-01-14 Ulrich Drepper <drepper@redhat.com>
* configure.in: Define HAVE_Z_RELRO if the linker supports -z relro.
-/* Copyright (C) 1996-2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996.
return NSS_STATUS_UNAVAIL;
}
+ host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024);
+
switch (af)
{
case AF_INET:
(uaddr[2] & 0xff), (uaddr[1] & 0xff), (uaddr[0] & 0xff));
break;
case AF_INET6:
- /* XXX Maybe we need an option to select whether to use the nibble
- or the bitfield form. The RFC requires the bitfield form so
- we use it. */
+ /* Only lookup with the byte string format if the user wants it. */
+ if (__builtin_expect (_res.options & RES_USEBSTRING, 0))
+ {
+ qp = stpcpy (qbuf, "\\[x");
+ for (n = 0; n < IN6ADDRSZ; ++n)
+ qp += sprintf (qp, "%02hhx", uaddr[n]);
+ strcpy (qp, "].ip6.arpa");
+ n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR,
+ host_buffer.buf->buf, 1024, &host_buffer.ptr);
+ if (n >= 0)
+ goto got_it_already;
+ }
qp = qbuf;
- qp = stpcpy (qbuf, "\\[x");
- for (n = 0; n < IN6ADDRSZ; ++n)
- qp += sprintf (qp, "%02hhx", uaddr[n]);
- strcpy (qp, "].ip6.arpa");
+ for (n = IN6ADDRSZ - 1; n >= 0; n--)
+ {
+ static const char nibblechar[16] = "0123456789abcdef";
+ *qp++ = nibblechar[uaddr[n] & 0xf];
+ *qp++ = '.';
+ *qp++ = nibblechar[(uaddr[n] >> 4) & 0xf];
+ *qp++ = '.';
+ }
+ strcpy(qp, "ip6.arpa");
break;
default:
/* Cannot happen. */
break;
}
- host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024);
-
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
1024, &host_buffer.ptr);
if (n < 0 && af == AF_INET6)
{
- qp = qbuf;
- for (n = IN6ADDRSZ - 1; n >= 0; n--)
- qp += sprintf (qp, "%x.%x.", uaddr[n] & 0xf, (uaddr[n] >> 4) & 0xf);
strcpy (qp, "ip6.int");
n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf,
host_buffer.buf != orig_host_buffer
return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
}
+ got_it_already:
status = getanswer_r (host_buffer.buf, n, qbuf, T_PTR, result, buffer, buflen,
errnop, h_errnop, 0 /* XXX */);
if (host_buffer.buf != orig_host_buffer)
#endif
} else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) {
statp->options |= RES_USE_INET6;
+ } else if (!strncmp(cp, "ip6-bytestring",
+ sizeof("ip6-bytestring") - 1)) {
+ statp->options |= RES_USEBSTRING;
} else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) {
statp->options |= RES_ROTATE;
} else if (!strncmp(cp, "no-check-names",