diff options
Diffstat (limited to 'resolv')
-rw-r--r-- | resolv/Makefile | 2 | ||||
-rw-r--r-- | resolv/gethnamaddr.c | 82 | ||||
-rw-r--r-- | resolv/inet_addr.c | 20 | ||||
-rw-r--r-- | resolv/netdb.h | 170 | ||||
-rw-r--r-- | resolv/res_send.c | 11 |
5 files changed, 242 insertions, 43 deletions
diff --git a/resolv/Makefile b/resolv/Makefile index e07cfb0b15..f1a8701017 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -21,7 +21,7 @@ # subdir := resolv -headers := resolv.h arpa/nameser.h sys/bitypes.h +headers := resolv.h netdb.h arpa/nameser.h sys/bitypes.h distribute := ../conf/portability.h routines := gethnamaddr getnetbyaddr getnetbyname getnetent getnetnamadr \ diff --git a/resolv/gethnamaddr.c b/resolv/gethnamaddr.c index d3b68f7d95..87b4db1a6f 100644 --- a/resolv/gethnamaddr.c +++ b/resolv/gethnamaddr.c @@ -93,6 +93,7 @@ static const char AskedForGot[] = "gethostby*.getanswer: asked for \"%s\", got \"%s\""; static char *h_addr_ptrs[MAXADDRS + 1]; +static struct hostent *gethostbyname_ipv4 __P((const char *)); static struct hostent host; static char *host_aliases[MAXALIASES]; @@ -156,7 +157,9 @@ getanswer(answer, anslen, qname, qclass, qtype) int haveanswer, had_error; int toobig = 0; char tbuf[MAXDNAME+1]; + const char *tname; + tname = qname; host.h_name = NULL; eom = answer->buf + anslen; /* @@ -249,19 +252,36 @@ getanswer(answer, anslen, qname, qclass, qtype) buflen -= n; continue; } + if (qtype == T_PTR && type == T_CNAME) { + n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf); + if (n < 0) { + had_error++; + continue; + } + cp += n; + /* Get canonical name. */ + n = strlen(tbuf) + 1; /* for the \0 */ + if (n > buflen) { + had_error++; + continue; + } + strcpy(bp, tbuf); + tname = bp; + bp += n; + buflen -= n; + continue; + } if (type != qtype) { - /* CNAME->PTR should not cause a log message. */ - if (!(qtype == T_PTR && type == T_CNAME)) - syslog(LOG_NOTICE|LOG_AUTH, + syslog(LOG_NOTICE|LOG_AUTH, "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", - qname, p_class(qclass), p_type(qtype), - p_type(type)); + qname, p_class(qclass), p_type(qtype), + p_type(type)); cp += n; continue; /* XXX - had_error++ ? */ } switch (type) { case T_PTR: - if (strcasecmp(qname, bp) != 0) { + if (strcasecmp(tname, bp) != 0) { syslog(LOG_NOTICE|LOG_AUTH, AskedForGot, qname, bp); cp += n; @@ -377,6 +397,36 @@ struct hostent * gethostbyname(name) const char *name; { + struct hostent *hp; + +#if defined(AF_INET6) && defined(RES_TRY_INET6) + if (_res.options & RES_TRY_INET6) { + hp = gethostbyname2(name, AF_INET6); + if (hp) + return (hp); + } +#endif + return (gethostbyname2(name, AF_INET)); +} + +struct hostent * +gethostbyname2(name, af) + const char *name; + int af; +{ + switch (af) { + case AF_INET: + return (gethostbyname_ipv4(name)); + } + errno = EAFNOSUPPORT; + h_errno = NETDB_INTERNAL; + return (NULL); +} + +static struct hostent * +gethostbyname_ipv4(name) + const char *name; +{ querybuf buf; register const char *cp; int n; @@ -727,23 +777,3 @@ dn_skipname(comp_dn, eom) return (__dn_skipname(comp_dn, eom)); } #endif /*old-style libc with yp junk in it*/ - -#ifdef ultrix -/* more icky libc packaging in ultrix */ -int -local_hostname_length(hostname) - const char *hostname; -{ - int len_host, len_domain; - - if (!*_res.defdname) - res_init(); - len_host = strlen(hostname); - len_domain = strlen(_res.defdname); - if (len_host > len_domain && - !strcasecmp(hostname + len_host - len_domain, _res.defdname) && - hostname[len_host - len_domain - 1] == '.') - return (len_host - len_domain - 1); - return (0); -} -#endif diff --git a/resolv/inet_addr.c b/resolv/inet_addr.c index 2a15067b07..01a38e6a00 100644 --- a/resolv/inet_addr.c +++ b/resolv/inet_addr.c @@ -66,10 +66,6 @@ static char rcsid[] = "$Id$"; /* these are compatibility routines, not needed on recent BSD releases */ -#ifndef NEED_INETADDR -int __inet_addr_unneeded__; -#else - /* * Ascii internet address interpretation routine. * The value returned is in network order. @@ -84,11 +80,6 @@ inet_addr(cp) return (val.s_addr); return (INADDR_NONE); } -#endif /*NEED_INETADDR*/ - -#ifndef NEED_INETATON -int __inet_aton_unneeded__; -#else /* * Check whether "cp" is a valid ascii representation @@ -113,8 +104,10 @@ inet_aton(cp, addr) /* * Collect number up to ``.''. * Values are specified as for C: - * 0x=hex, 0=octal, other=decimal. + * 0x=hex, 0=octal, isdigit=decimal. */ + if (!isdigit(c)) + return (0); val = 0; base = 10; if (c == '0') { c = *++cp; @@ -123,7 +116,7 @@ inet_aton(cp, addr) else base = 8; } - while (c != '\0') { + for (;;) { if (isascii(c) && isdigit(c)) { val = (val * base) + (c - '0'); c = *++cp; @@ -141,7 +134,7 @@ inet_aton(cp, addr) * a.b.c (with c treated as 16 bits) * a.b (with b treated as 24 bits) */ - if (pp >= parts + 3 || val > 0xff) + if (pp >= parts + 3) return (0); *pp++ = val; c = *++cp; @@ -151,7 +144,7 @@ inet_aton(cp, addr) /* * Check for trailing characters. */ - if (c && (!isascii(c) || (!isspace(c) && !ispunct(c)))) + if (c != '\0' && (!isascii(c) || !isspace(c))) return (0); /* * Concoct the address according to @@ -188,4 +181,3 @@ inet_aton(cp, addr) addr->s_addr = htonl(val); return (1); } -#endif /*NEED_INETATON*/ diff --git a/resolv/netdb.h b/resolv/netdb.h new file mode 100644 index 0000000000..822b621363 --- /dev/null +++ b/resolv/netdb.h @@ -0,0 +1,170 @@ +/* + * ++Copyright++ 1980, 1983, 1988, 1993 + * - + * Copyright (c) 1980, 1983, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +/* + * @(#)netdb.h 8.1 (Berkeley) 6/2/93 + * $Id$ + */ + +#ifndef _NETDB_H_ +#define _NETDB_H_ + +#include <sys/param.h> +#if (!defined(BSD)) || (BSD < 199306) +# include <sys/bitypes.h> +#endif +#include <sys/cdefs.h> + +#define _PATH_HEQUIV "/etc/hosts.equiv" +#define _PATH_HOSTS "/etc/hosts" +#define _PATH_NETWORKS "/etc/networks" +#define _PATH_PROTOCOLS "/etc/protocols" +#define _PATH_SERVICES "/etc/services" + +extern int h_errno; + +/* + * Structures returned by network data base library. All addresses are + * supplied in host order, and returned in network order (suitable for + * use in system calls). + */ +struct hostent { + char *h_name; /* official name of host */ + char **h_aliases; /* alias list */ + int h_addrtype; /* host address type */ + int h_length; /* length of address */ + char **h_addr_list; /* list of addresses from name server */ +#define h_addr h_addr_list[0] /* address, for backward compatiblity */ +}; + +/* + * Assumption here is that a network number + * fits in an unsigned long -- probably a poor one. + */ +struct netent { + char *n_name; /* official name of net */ + char **n_aliases; /* alias list */ + int n_addrtype; /* net address type */ + unsigned long n_net; /* network # */ +}; + +struct servent { + char *s_name; /* official service name */ + char **s_aliases; /* alias list */ + int s_port; /* port # */ + char *s_proto; /* protocol to use */ +}; + +struct protoent { + char *p_name; /* official protocol name */ + char **p_aliases; /* alias list */ + int p_proto; /* protocol # */ +}; + +/* + * Error return codes from gethostbyname() and gethostbyaddr() + * (left in extern int h_errno). + */ + +#define NETDB_INTERNAL -1 /* see errno */ +#define NETDB_SUCCESS 0 /* no problem */ +#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */ +#define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */ +#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */ +#define NO_DATA 4 /* Valid name, no data record of requested type */ +#define NO_ADDRESS NO_DATA /* no address, look for MX record */ + +__BEGIN_DECLS +void endhostent __P((void)); +void endnetent __P((void)); +void endprotoent __P((void)); +void endservent __P((void)); +struct hostent *gethostbyaddr __P((const char *, int, int)); +struct hostent *gethostbyname __P((const char *)); +struct hostent *gethostbyname2 __P((const char *, int)); +struct hostent *gethostent __P((void)); +struct netent *getnetbyaddr __P((long, int)); /* u_long? */ +struct netent *getnetbyname __P((const char *)); +struct netent *getnetent __P((void)); +struct protoent *getprotobyname __P((const char *)); +struct protoent *getprotobynumber __P((int)); +struct protoent *getprotoent __P((void)); +struct servent *getservbyname __P((const char *, const char *)); +struct servent *getservbyport __P((int, const char *)); +struct servent *getservent __P((void)); +void herror __P((const char *)); +const char *hstrerror __P((int)); +void sethostent __P((int)); +/* void sethostfile __P((const char *)); */ +void setnetent __P((int)); +void setprotoent __P((int)); +void setservent __P((int)); +__END_DECLS + +/* This is nec'y to make this include file properly replace the sun version. */ +#ifdef __GNU_LIBRARY__ +#include <rpc/netdb.h> +#else +#ifdef sun +struct rpcent { + char *r_name; /* name of server for this rpc program */ + char **r_aliases; /* alias list */ + int r_number; /* rpc program number */ +}; +struct rpcent *getrpcbyname(), *getrpcbynumber(), *getrpcent(); +#endif /* sun */ +#endif /* __GNU_LIBRARY__ */ + +#endif /* !_NETDB_H_ */ diff --git a/resolv/res_send.c b/resolv/res_send.c index 4ee52b438b..f8e58f3e11 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -109,6 +109,13 @@ static int vc = 0; /* is the socket a virtual ciruit? */ #define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) #endif +/* XXX - this should be done in portability.h */ +#if (defined(BSD) && (BSD >= 199103)) || defined(linux) +# define CAN_RECONNECT 1 +#else +# define CAN_RECONNECT 0 +#endif + #ifndef DEBUG # define Dprint(cond, args) /*empty*/ # define DprintQ(cond, args, query, size) /*empty*/ @@ -484,7 +491,7 @@ res_send(buf, buflen, ans, anssiz) _res_close(); s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) { -#if !defined(BSD) || (BSD < 199103) +#if !CAN_RECONNECT bad_dg_sock: #endif terrno = errno; @@ -538,7 +545,7 @@ res_send(buf, buflen, ans, anssiz) * for responses from more than one server. */ if (connected) { -#if defined(BSD) && (BSD >= 199103) +#if CAN_RECONNECT struct sockaddr_in no_addr; no_addr.sin_family = AF_INET; |