summaryrefslogtreecommitdiff
path: root/usr/src/lib/libresolv
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libresolv
downloadillumos-gate-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libresolv')
-rw-r--r--usr/src/lib/libresolv/Makefile105
-rw-r--r--usr/src/lib/libresolv/arpa/nameser.h248
-rw-r--r--usr/src/lib/libresolv/mapfile-vers35
-rw-r--r--usr/src/lib/libresolv/netdb.h216
-rw-r--r--usr/src/lib/libresolv/res_comp.c350
-rw-r--r--usr/src/lib/libresolv/res_debug.c524
-rw-r--r--usr/src/lib/libresolv/res_gethost.c472
-rw-r--r--usr/src/lib/libresolv/res_init.c304
-rw-r--r--usr/src/lib/libresolv/res_mkquery.c310
-rw-r--r--usr/src/lib/libresolv/res_query.c299
-rw-r--r--usr/src/lib/libresolv/res_send.c516
-rw-r--r--usr/src/lib/libresolv/res_sethost.c67
-rw-r--r--usr/src/lib/libresolv/resolv.h116
-rw-r--r--usr/src/lib/libresolv/spec/Makefile55
-rw-r--r--usr/src/lib/libresolv/spec/Makefile.targ35
-rw-r--r--usr/src/lib/libresolv/spec/amd64/Makefile44
-rw-r--r--usr/src/lib/libresolv/spec/i386/Makefile44
-rw-r--r--usr/src/lib/libresolv/spec/res_mkquery.spec75
-rw-r--r--usr/src/lib/libresolv/spec/resolv.spec135
-rw-r--r--usr/src/lib/libresolv/spec/sparc/Makefile44
-rw-r--r--usr/src/lib/libresolv/spec/sparcv9/Makefile45
-rw-r--r--usr/src/lib/libresolv/spec/versions51
-rw-r--r--usr/src/lib/libresolv/synonyms.h573
23 files changed, 4663 insertions, 0 deletions
diff --git a/usr/src/lib/libresolv/Makefile b/usr/src/lib/libresolv/Makefile
new file mode 100644
index 0000000000..f7c9174148
--- /dev/null
+++ b/usr/src/lib/libresolv/Makefile
@@ -0,0 +1,105 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# lib/libresolv/Makefile
+#
+
+LIBRARY= libresolv.a
+VERS= .1
+
+PICS= pics/res_comp.o pics/res_debug.o pics/res_init.o \
+ pics/res_mkquery.o pics/res_query.o pics/res_send.o \
+ pics/res_gethost.o pics/res_sethost.o
+
+pics/%.o: %.c
+ $(COMPILE.c) -o $@ $<
+ $(POST_PROCESS_O)
+
+OBJECTS= \
+res_gethost.o res_comp.o res_debug.o res_init.o res_mkquery.o \
+res_query.o res_send.o res_sethost.o
+
+# include library definitions
+include ../Makefile.lib
+
+# install this library in the root filesystem
+include ../Makefile.rootfs
+
+SUBDIRS= spec
+
+MAPDIR= ./spec/$(MACH)
+MAPFILE= $(MAPDIR)/mapfile
+MAPFILES= $(MAPFILE) mapfile-vers
+MAPOPTS= $(MAPFILES:%=-M%)
+
+CLOBBERFILES += $(MAPFILE)
+
+C99MODE= $(C99_DISABLE)
+
+# We really want to say this:
+# CPPFLAGS += -DDEBUG -DSYSV -D_REENTRANT -I.
+# but some system header files are replaced by local versions
+# so we must put -I. ahead of the default include directories:
+CPPFLAGS = -I. $(CPPFLAGS.master) -DDEBUG -DSYSV -D_REENTRANT
+LDLIBS += -lsocket -lnsl -lc
+DYNFLAGS += $(MAPOPTS)
+
+ROOTDYNLIBS= $(DYNLIB:%=$(ROOTLIBDIR)/%)
+
+all := TARGET= all
+clean := TARGET= clean
+clobber := TARGET= clobber
+delete := TARGET= delete
+install := TARGET= install
+lint := TARGET= lint
+catalog := TARGET= catalog
+package := TARGET= package
+
+.KEEP_STATE:
+
+LIBS = $(DYNLIB)
+
+all: $(SUBDIRS) $(LIBS)
+
+install: all $(ROOTDYNLIBS) $(SUBDIRS)
+
+lint: lintcheck
+
+clean clobber: $(SUBDIRS)
+
+spec: FRC
+ @cd $@; pwd; $(MAKE) $(TARGET)
+
+$(DYNLIB): $(MAPFILES)
+
+$(MAPFILE):
+ @cd $(MAPDIR); $(MAKE) mapfile
+
+# include library targets
+include ../Makefile.targ
+
+FRC:
diff --git a/usr/src/lib/libresolv/arpa/nameser.h b/usr/src/lib/libresolv/arpa/nameser.h
new file mode 100644
index 0000000000..cf8dc45f42
--- /dev/null
+++ b/usr/src/lib/libresolv/arpa/nameser.h
@@ -0,0 +1,248 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1994 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+#ifndef _ARPA_NAMESER_H
+#define _ARPA_NAMESER_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/isa_defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Define constants based on rfc883
+ */
+#define PACKETSZ 512 /* maximum packet size */
+#define MAXDNAME 256 /* maximum domain name */
+#define MAXCDNAME 255 /* maximum compressed domain name */
+#define MAXLABEL 63 /* maximum length of domain label */
+ /* Number of bytes of fixed size data in query structure */
+#define QFIXEDSZ 4
+ /* number of bytes of fixed size data in resource record */
+#define RRFIXEDSZ 10
+
+/*
+ * Internet nameserver port number
+ */
+#define NAMESERVER_PORT 53
+
+/*
+ * Currently defined opcodes
+ */
+#define QUERY 0x0 /* standard query */
+#define IQUERY 0x1 /* inverse query */
+#define STATUS 0x2 /* nameserver status query */
+/* #define xxx 0x3 */ /* 0x3 reserved */
+ /* non standard */
+#define UPDATEA 0x9 /* add resource record */
+#define UPDATED 0xa /* delete a specific resource record */
+#define UPDATEDA 0xb /* delete all nemed resource record */
+#define UPDATEM 0xc /* modify a specific resource record */
+#define UPDATEMA 0xd /* modify all named resource record */
+
+#define ZONEINIT 0xe /* initial zone transfer */
+#define ZONEREF 0xf /* incremental zone referesh */
+
+/*
+ * Currently defined response codes
+ */
+#define NOERROR 0 /* no error */
+#define FORMERR 1 /* format error */
+#define SERVFAIL 2 /* server failure */
+#define NXDOMAIN 3 /* non existent domain */
+#define NOTIMP 4 /* not implemented */
+#define REFUSED 5 /* query refused */
+ /* non standard */
+#define NOCHANGE 0xf /* update failed to change db */
+
+/*
+ * Type values for resources and queries
+ */
+#define T_A 1 /* host address */
+#define T_NS 2 /* authoritative server */
+#define T_MD 3 /* mail destination */
+#define T_MF 4 /* mail forwarder */
+#define T_CNAME 5 /* connonical name */
+#define T_SOA 6 /* start of authority zone */
+#define T_MB 7 /* mailbox domain name */
+#define T_MG 8 /* mail group member */
+#define T_MR 9 /* mail rename name */
+#define T_NULL 10 /* null resource record */
+#define T_WKS 11 /* well known service */
+#define T_PTR 12 /* domain name pointer */
+#define T_HINFO 13 /* host information */
+#define T_MINFO 14 /* mailbox information */
+#define T_MX 15 /* mail routing information */
+#define T_TXT 16 /* text strings */
+ /* non standard */
+#define T_UINFO 100 /* user (finger) information */
+#define T_UID 101 /* user ID */
+#define T_GID 102 /* group ID */
+#define T_UNSPEC 103 /* Unspecified format (binary data) */
+ /* Query type values which do not appear in resource records */
+#define T_AXFR 252 /* transfer zone of authority */
+#define T_MAILB 253 /* transfer mailbox records */
+#define T_MAILA 254 /* transfer mail agent records */
+#define T_ANY 255 /* wildcard match */
+
+/*
+ * Values for class field
+ */
+
+#define C_IN 1 /* the arpa internet */
+#define C_CHAOS 3 /* for chaos net at MIT */
+#define C_HS 4 /* for Hesiod name server at MIT */
+ /* Query class values which do not appear in resource records */
+#define C_ANY 255 /* wildcard match */
+
+/*
+ * Status return codes for T_UNSPEC conversion routines
+ */
+#define CONV_SUCCESS 0
+#define CONV_OVERFLOW -1
+#define CONV_BADFMT -2
+#define CONV_BADCKSUM -3
+#define CONV_BADBUFLEN -4
+
+/*
+ * Structure for query header, the order of the fields is machine and
+ * compiler dependent, in our case, the bits within a byte are assignd
+ * least significant first, while the order of transmition is most
+ * significant first. This requires a somewhat confusing rearrangement.
+ */
+
+typedef struct {
+ u_short id; /* query identification number */
+#if defined(_BIT_FIELDS_HTOL) || defined(BIT_ZERO_ON_LEFT)
+ /* Bit zero on left: SPARC and similar architectures */
+ /* fields in third byte */
+ u_char qr:1; /* response flag */
+ u_char opcode:4; /* purpose of message */
+ u_char aa:1; /* authoritive answer */
+ u_char tc:1; /* truncated message */
+ u_char rd:1; /* recursion desired */
+ /* fields in fourth byte */
+ u_char ra:1; /* recursion available */
+ u_char pr:1; /* primary server required (non standard) */
+ u_char unused:2; /* unused bits */
+ u_char rcode:4; /* response code */
+#else
+#if defined(_BIT_FIELDS_LTOH) || defined(BIT_ZERO_ON_RIGHT)
+ /* Bit zero on right: Intel x86 and similar architectures */
+ /* fields in third byte */
+ u_char rd:1; /* recursion desired */
+ u_char tc:1; /* truncated message */
+ u_char aa:1; /* authoritive answer */
+ u_char opcode:4; /* purpose of message */
+ u_char qr:1; /* response flag */
+ /* fields in fourth byte */
+ u_char rcode:4; /* response code */
+ u_char unused:2; /* unused bits */
+ u_char pr:1; /* primary server required (non standard) */
+ u_char ra:1; /* recursion available */
+#else
+ /* you must determine what the correct bit order is for your compiler */
+ UNDEFINED_BIT_ORDER;
+#endif
+#endif
+ /* remaining bytes */
+ u_short qdcount; /* number of question entries */
+ u_short ancount; /* number of answer entries */
+ u_short nscount; /* number of authority entries */
+ u_short arcount; /* number of resource entries */
+} HEADER;
+
+/*
+ * Defines for handling compressed domain names
+ */
+#define INDIR_MASK 0xc0
+
+/*
+ * Structure for passing resource records around.
+ */
+struct rrec {
+ short r_zone; /* zone number */
+ short r_class; /* class number */
+ short r_type; /* type number */
+ u_long r_ttl; /* time to live */
+ int r_size; /* size of data area */
+ char *r_data; /* pointer to data */
+};
+
+extern u_short _getshort();
+extern u_long _getlong();
+
+/*
+ * Inline versions of get/put short/long.
+ * Pointer is advanced; we assume that both arguments
+ * are lvalues and will already be in registers.
+ * cp MUST be u_char *.
+ */
+#define GETSHORT(s, cp) { \
+ (s) = *(cp)++ << 8; \
+ (s) |= *(cp)++; \
+}
+
+#define GETLONG(l, cp) { \
+ (l) = *(cp)++ << 8; \
+ (l) |= *(cp)++; (l) <<= 8; \
+ (l) |= *(cp)++; (l) <<= 8; \
+ (l) |= *(cp)++; \
+}
+
+
+#define PUTSHORT(s, cp) { \
+ *(cp)++ = (s) >> 8; \
+ *(cp)++ = (s); \
+}
+
+/*
+ * Warning: PUTLONG destroys its first argument.
+ */
+#define PUTLONG(l, cp) { \
+ (cp)[3] = l; \
+ (cp)[2] = (l >>= 8); \
+ (cp)[1] = (l >>= 8); \
+ (cp)[0] = l >> 8; \
+ (cp) += sizeof (u_long); \
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ARPA_NAMESER_H */
diff --git a/usr/src/lib/libresolv/mapfile-vers b/usr/src/lib/libresolv/mapfile-vers
new file mode 100644
index 0000000000..8107ddfb6e
--- /dev/null
+++ b/usr/src/lib/libresolv/mapfile-vers
@@ -0,0 +1,35 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Special mapfile to establish h_errno as a filter on libnsl. As a filtered
+# symbol, this isn't visible to apptrace, and thus doesn't have to be defined
+# from the specfiles. To ensure the symbol remains in .bss, with the correct
+# size, its filtering capabilities are assigned here rather than via a specfile.
+
+SUNW_0.7 {
+ global:
+ h_errno = FILTER libnsl.so.1;
+};
diff --git a/usr/src/lib/libresolv/netdb.h b/usr/src/lib/libresolv/netdb.h
new file mode 100644
index 0000000000..82fa0d37a2
--- /dev/null
+++ b/usr/src/lib/libresolv/netdb.h
@@ -0,0 +1,216 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1996 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+/*
+ * 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).
+ */
+
+#ifndef _NETDB_H
+#define _NETDB_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#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"
+
+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 32 bits -- 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 # */
+};
+
+#ifdef __STDC__
+struct hostent *gethostbyname_r
+ (const char *, struct hostent *, char *, int, int *h_errnop);
+struct hostent *gethostbyaddr_r
+ (const char *, int, int, struct hostent *, char *, int, int *h_errnop);
+struct hostent *gethostent_r(struct hostent *, char *, int, int *h_errnop);
+
+struct servent *getservbyname_r
+ (const char *name, const char *, struct servent *, char *, int);
+struct servent *getservbyport_r
+ (int port, const char *, struct servent *, char *, int);
+struct servent *getservent_r(struct servent *, char *, int);
+
+struct netent *getnetbyname_r
+ (const char *, struct netent *, char *, int);
+struct netent *getnetbyaddr_r(long, int, struct netent *, char *, int);
+struct netent *getnetent_r(struct netent *, char *, int);
+
+struct protoent *getprotobyname_r
+ (const char *, struct protoent *, char *, int);
+struct protoent *getprotobynumber_r
+ (int, struct protoent *, char *, int);
+struct protoent *getprotoent_r(struct protoent *, char *, int);
+
+int getnetgrent_r(char **, char **, char **, char *, int);
+int innetgr(const char *, const char *, const char *, const char *);
+
+/* Old interfaces that return a pointer to a static area; MT-unsafe */
+struct hostent *gethostbyname(const char *);
+struct hostent *gethostbyaddr(const char *, int, int);
+struct hostent *gethostent(void);
+struct netent *getnetbyname(const char *);
+struct netent *getnetbyaddr(long, int);
+struct netent *getnetent(void);
+struct servent *getservbyname(const char *, const char *);
+struct servent *getservbyport(int, const char *);
+struct servent *getservent(void);
+struct protoent *getprotobyname(const char *);
+struct protoent *getprotobynumber(int);
+struct protoent *getprotoent(void);
+int getnetgrent(char **, char **, char **);
+
+int sethostent(int);
+int endhostent(void);
+int setnetent(int);
+int endnetent(void);
+int setservent(int);
+int endservent(void);
+int setprotoent(int);
+int endprotoent(void);
+int setnetgrent(const char *);
+int endnetgrent(void);
+int rcmd(char **ahost, unsigned short inport,
+ const char *luser, const char *ruser, const char *cmd, int *fd2p);
+int rexec(char **ahost, unsigned short inport,
+ const char *user, const char *passwd, const char *cmd, int *fd2p);
+int rresvport(int *);
+int ruserok(const char *rhost, int suser, const char *ruser, const char *luser);
+#else
+struct hostent *gethostbyname_r();
+struct hostent *gethostbyaddr_r();
+struct hostent *gethostent_r();
+struct servent *getservbyname_r();
+struct servent *getservbyport_r();
+struct servent *getservent_r();
+struct netent *getnetbyname_r();
+struct netent *getnetbyaddr_r();
+struct netent *getnetent_r();
+struct protoent *getprotobyname_r();
+struct protoent *getprotobynumber_r();
+struct protoent *getprotoent_r();
+int getnetgrent_r();
+int innetgr();
+
+/* Old interfaces that return a pointer to a static area; MT-unsafe */
+struct hostent *gethostbyname();
+struct hostent *gethostbyaddr();
+struct hostent *gethostent();
+struct netent *getnetbyname();
+struct netent *getnetbyaddr();
+struct netent *getnetent();
+struct servent *getservbyname();
+struct servent *getservbyport();
+struct servent *getservent();
+struct protoent *getprotobyname();
+struct protoent *getprotobynumber();
+struct protoent *getprotoent();
+int getnetgrent();
+
+int sethostent();
+int endhostent();
+int setnetent();
+int endnetent();
+int setservent();
+int endservent();
+int setprotoent();
+int endprotoent();
+int setnetgrent();
+int endnetgrent();
+int rcmd();
+int rexec();
+int rresvport();
+int ruserok();
+#endif
+
+/*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (when using the resolver)
+ */
+
+extern int h_errno;
+
+#define HOST_NOT_FOUND 1 /* Authoritive 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 */
+
+#define MAXHOSTNAMELEN 256
+
+#define MAXALIASES 35
+#define MAXADDRS 35
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NETDB_H */
diff --git a/usr/src/lib/libresolv/res_comp.c b/usr/src/lib/libresolv/res_comp.c
new file mode 100644
index 0000000000..9835ead5df
--- /dev/null
+++ b/usr/src/lib/libresolv/res_comp.c
@@ -0,0 +1,350 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1996 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "synonyms.h"
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <arpa/nameser.h>
+
+static dn_find();
+
+
+/*
+ * Expand compressed domain name 'comp_dn' to full domain name.
+ * 'msg' is a pointer to the begining of the message,
+ * 'eomorig' points to the first location after the message,
+ * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
+ * Return size of compressed name or -1 if there was an error.
+ */
+dn_expand(msg, eomorig, comp_dn, exp_dn, length)
+ u_char *msg, *eomorig, *comp_dn, *exp_dn;
+ int length;
+{
+ register u_char *cp, *dn;
+ register int n, c;
+ u_char *eom;
+ int len = -1, checked = 0;
+
+ dn = exp_dn;
+ cp = comp_dn;
+ eom = exp_dn + length;
+ /*
+ * fetch next label in domain name
+ */
+ while (n = *cp++) {
+ /*
+ * Check for indirection
+ */
+ switch (n & INDIR_MASK) {
+ case 0:
+ if (dn != exp_dn) {
+ if (dn >= eom)
+ return (-1);
+ *dn++ = '.';
+ }
+ if (dn+n >= eom)
+ return (-1);
+ checked += n + 1;
+ while (--n >= 0) {
+ if ((c = *cp++) == '.') {
+ if (dn + n + 2 >= eom)
+ return (-1);
+ *dn++ = '\\';
+ }
+ *dn++ = c;
+ if (cp >= eomorig) /* out of range */
+ return (-1);
+ }
+ break;
+
+ case INDIR_MASK:
+ if (len < 0)
+ len = cp - comp_dn + 1;
+ cp = msg + (((n & 0x3f) << 8) | (*cp & 0xff));
+ if (cp < msg || cp >= eomorig) /* out of range */
+ return (-1);
+ checked += 2;
+ /*
+ * Check for loops in the compressed name;
+ * if we've looked at the whole message,
+ * there must be a loop.
+ */
+ if (checked >= eomorig - msg)
+ return (-1);
+ break;
+
+ default:
+ return (-1); /* flag error */
+ }
+ }
+ *dn = '\0';
+ if (len < 0)
+ len = cp - comp_dn;
+ return (len);
+}
+
+/*
+ * Compress domain name 'exp_dn' into 'comp_dn'.
+ * Return the size of the compressed name or -1.
+ * 'length' is the size of the array pointed to by 'comp_dn'.
+ * 'dnptrs' is a list of pointers to previous compressed names. dnptrs[0]
+ * is a pointer to the beginning of the message. The list ends with NULL.
+ * 'lastdnptr' is a pointer to the end of the arrary pointed to
+ * by 'dnptrs'. Side effect is to update the list of pointers for
+ * labels inserted into the message as we compress the name.
+ * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr'
+ * is NULL, we don't update the list.
+ */
+dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr)
+ u_char *exp_dn, *comp_dn;
+ int length;
+ u_char **dnptrs, **lastdnptr;
+{
+ register u_char *cp, *dn;
+ register int c, l;
+ u_char **cpp, **lpp, *sp, *eob;
+ u_char *msg;
+
+ dn = exp_dn;
+ cp = comp_dn;
+ eob = cp + length;
+ if (dnptrs != NULL) {
+ if ((msg = *dnptrs++) != NULL) {
+ for (cpp = dnptrs; *cpp != NULL; cpp++)
+ ;
+ lpp = cpp; /* end of list to search */
+ }
+ } else
+ msg = NULL;
+ for (c = *dn++; c != '\0'; /*EMPTY*/) {
+ /* look to see if we can use pointers */
+ if (msg != NULL) {
+ if ((l = dn_find(dn-1, msg, dnptrs, lpp)) >= 0) {
+ if (cp+1 >= eob)
+ return (-1);
+ *cp++ = (l >> 8) | INDIR_MASK;
+ *cp++ = l % 256;
+ return (cp - comp_dn);
+ }
+ /* not found, save it */
+ if (lastdnptr != NULL && cpp < lastdnptr-1) {
+ *cpp++ = cp;
+ *cpp = NULL;
+ }
+ }
+ sp = cp++; /* save ptr to length byte */
+ do {
+ if (c == '.') {
+ c = *dn++;
+ break;
+ }
+ if (c == '\\') {
+ if ((c = *dn++) == '\0')
+ break;
+ }
+ if (cp >= eob) {
+ if (msg != NULL)
+ *lpp = NULL;
+ return (-1);
+ }
+ *cp++ = c;
+ } while ((c = *dn++) != '\0');
+ /* catch trailing '.'s but not '..' */
+ if ((l = cp - sp - 1) == 0 && c == '\0') {
+ cp--;
+ break;
+ }
+ if (l <= 0 || l > MAXLABEL) {
+ if (msg != NULL)
+ *lpp = NULL;
+ return (-1);
+ }
+ *sp = l;
+ }
+ if (cp >= eob) {
+ if (msg != NULL)
+ *lpp = NULL;
+ return (-1);
+ }
+ *cp++ = '\0';
+ return (cp - comp_dn);
+}
+
+/*
+ * Skip over a compressed domain name. Return the size or -1.
+ */
+dn_skipname(comp_dn, eom)
+ u_char *comp_dn, *eom;
+{
+ register u_char *cp;
+ register int n;
+
+ cp = comp_dn;
+ while (cp < eom && (n = *cp++)) {
+ /*
+ * check for indirection
+ */
+ switch (n & INDIR_MASK) {
+ case 0: /* normal case, n == len */
+ cp += n;
+ continue;
+ default: /* illegal type */
+ return (-1);
+ case INDIR_MASK: /* indirection */
+ cp++;
+ }
+ break;
+ }
+ return (cp - comp_dn);
+}
+
+/*
+ * Search for expanded name from a list of previously compressed names.
+ * Return the offset from msg if found or -1.
+ * dnptrs is the pointer to the first name on the list,
+ * not the pointer to the start of the message.
+ */
+static
+dn_find(exp_dn, msg, dnptrs, lastdnptr)
+ u_char *exp_dn, *msg;
+ u_char **dnptrs, **lastdnptr;
+{
+ register u_char *dn, *cp, **cpp;
+ register int n;
+ u_char *sp;
+
+ for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
+ dn = exp_dn;
+ sp = cp = *cpp;
+ while (n = *cp++) {
+ /*
+ * check for indirection
+ */
+ switch (n & INDIR_MASK) {
+ case 0: /* normal case, n == len */
+ while (--n >= 0) {
+ if (*dn == '.')
+ goto next;
+ if (*dn == '\\')
+ dn++;
+ if (*dn++ != *cp++)
+ goto next;
+ }
+ if ((n = *dn++) == '\0' && *cp == '\0')
+ return (sp - msg);
+ if (n == '.')
+ continue;
+ goto next;
+
+ default: /* illegal type */
+ return (-1);
+
+ case INDIR_MASK: /* indirection */
+ cp = msg + (((n & 0x3f) << 8) | *cp);
+ }
+ }
+ if (*dn == '\0')
+ return (sp - msg);
+ next: /*EMPTY*/;
+ }
+ return (-1);
+}
+
+/*
+ * Routines to insert/extract short/long's. Must account for byte
+ * order and non-alignment problems. This code at least has the
+ * advantage of being portable.
+ *
+ * used by sendmail.
+ */
+
+u_short
+_getshort(msgp)
+ u_char *msgp;
+{
+ register u_char *p = (u_char *) msgp;
+#ifdef vax
+ /*
+ * vax compiler doesn't put shorts in registers
+ */
+ register u_long u;
+#else
+ register u_short u;
+#endif
+
+ u = *p++ << 8;
+ return ((u_short)(u | *p));
+}
+
+u_long
+_getlong(msgp)
+ u_char *msgp;
+{
+ register u_char *p = (u_char *) msgp;
+ register u_long u;
+
+ u = *p++; u <<= 8;
+ u |= *p++; u <<= 8;
+ u |= *p++; u <<= 8;
+ return (u | *p);
+}
+
+
+putshort(s, msgp)
+ register u_short s;
+ register u_char *msgp;
+{
+
+ msgp[1] = s;
+ msgp[0] = s >> 8;
+}
+
+putlong(l, msgp)
+ register u_long l;
+ register u_char *msgp;
+{
+
+ msgp[3] = l;
+ msgp[2] = (l >>= 8);
+ msgp[1] = (l >>= 8);
+ msgp[0] = l >> 8;
+}
diff --git a/usr/src/lib/libresolv/res_debug.c b/usr/src/lib/libresolv/res_debug.c
new file mode 100644
index 0000000000..2b4de0981d
--- /dev/null
+++ b/usr/src/lib/libresolv/res_debug.c
@@ -0,0 +1,524 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1996 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "synonyms.h"
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <arpa/nameser.h>
+
+extern char *p_cdname(), *p_rr(), *p_type(), *p_class(), *p_time();
+extern char *inet_ntoa();
+
+char *_res_opcodes[] = {
+ "QUERY",
+ "IQUERY",
+ "CQUERYM",
+ "CQUERYU",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "UPDATEA",
+ "UPDATED",
+ "UPDATEDA",
+ "UPDATEM",
+ "UPDATEMA",
+ "ZONEINIT",
+ "ZONEREF",
+};
+
+char *_res_resultcodes[] = {
+ "NOERROR",
+ "FORMERR",
+ "SERVFAIL",
+ "NXDOMAIN",
+ "NOTIMP",
+ "REFUSED",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "NOCHANGE",
+};
+
+p_query(msg)
+ char *msg;
+{
+ fp_query(msg, stdout);
+}
+
+/*
+ * Print the contents of a query.
+ * This is intended to be primarily a debugging routine.
+ */
+fp_query(msg, file)
+ char *msg;
+ FILE *file;
+{
+ register char *cp;
+ register HEADER *hp;
+ register int n;
+
+ /*
+ * Print header fields.
+ */
+ hp = (HEADER *)msg;
+ cp = msg + sizeof (HEADER);
+ fprintf(file, "HEADER:\n");
+ fprintf(file, "\topcode = %s", _res_opcodes[hp->opcode]);
+ fprintf(file, ", id = %d", ntohs(hp->id));
+ fprintf(file, ", rcode = %s\n", _res_resultcodes[hp->rcode]);
+ fprintf(file, "\theader flags: ");
+ if (hp->qr)
+ fprintf(file, " qr");
+ if (hp->aa)
+ fprintf(file, " aa");
+ if (hp->tc)
+ fprintf(file, " tc");
+ if (hp->rd)
+ fprintf(file, " rd");
+ if (hp->ra)
+ fprintf(file, " ra");
+ if (hp->pr)
+ fprintf(file, " pr");
+ fprintf(file, "\n\tqdcount = %d", ntohs(hp->qdcount));
+ fprintf(file, ", ancount = %d", ntohs(hp->ancount));
+ fprintf(file, ", nscount = %d", ntohs(hp->nscount));
+ fprintf(file, ", arcount = %d\n\n", ntohs(hp->arcount));
+ /*
+ * Print question records.
+ */
+ if (n = ntohs(hp->qdcount)) {
+ fprintf(file, "QUESTIONS:\n");
+ while (--n >= 0) {
+ fprintf(file, "\t");
+ cp = p_cdname(cp, msg, file);
+ if (cp == NULL)
+ return;
+ fprintf(file, ", type = %s", p_type(_getshort(cp)));
+ cp += sizeof (u_short);
+ fprintf(file, ", class = %s\n\n",
+ p_class(_getshort(cp)));
+ cp += sizeof (u_short);
+ }
+ }
+ /*
+ * Print authoritative answer records
+ */
+ if (n = ntohs(hp->ancount)) {
+ fprintf(file, "ANSWERS:\n");
+ while (--n >= 0) {
+ fprintf(file, "\t");
+ cp = p_rr(cp, msg, file);
+ if (cp == NULL)
+ return;
+ }
+ }
+ /*
+ * print name server records
+ */
+ if (n = ntohs(hp->nscount)) {
+ fprintf(file, "NAME SERVERS:\n");
+ while (--n >= 0) {
+ fprintf(file, "\t");
+ cp = p_rr(cp, msg, file);
+ if (cp == NULL)
+ return;
+ }
+ }
+ /*
+ * print additional records
+ */
+ if (n = ntohs(hp->arcount)) {
+ fprintf(file, "ADDITIONAL RECORDS:\n");
+ while (--n >= 0) {
+ fprintf(file, "\t");
+ cp = p_rr(cp, msg, file);
+ if (cp == NULL)
+ return;
+ }
+ }
+}
+
+char *
+p_cdname(cp, msg, file)
+ char *cp, *msg;
+ FILE *file;
+{
+ char name[MAXDNAME];
+ int n;
+
+ if ((n = dn_expand(msg, msg + 512, cp, name, sizeof (name))) < 0)
+ return (NULL);
+ if (name[0] == '\0') {
+ name[0] = '.';
+ name[1] = '\0';
+ }
+ fputs(name, file);
+ return (cp + n);
+}
+
+/*
+ * Print resource record fields in human readable form.
+ */
+char *
+p_rr(cp, msg, file)
+ char *cp, *msg;
+ FILE *file;
+{
+ int type, class, dlen, n, c;
+ struct in_addr inaddr;
+ char *cp1, *cp2;
+
+ if ((cp = p_cdname(cp, msg, file)) == NULL)
+ return (NULL); /* compression error */
+ fprintf(file, "\n\ttype = %s", p_type(type = _getshort(cp)));
+ cp += sizeof (u_short);
+ fprintf(file, ", class = %s", p_class(class = _getshort(cp)));
+ cp += sizeof (u_short);
+ fprintf(file, ", ttl = %s", p_time(_getlong(cp)));
+ cp += sizeof (u_long);
+ fprintf(file, ", dlen = %d\n", dlen = _getshort(cp));
+ cp += sizeof (u_short);
+ cp1 = cp;
+ /*
+ * Print type specific data, if appropriate
+ */
+ switch (type) {
+ case T_A:
+ switch (class) {
+ case C_IN:
+ case C_HS:
+#ifdef SYSV
+ memcpy((void *)&inaddr, (void *)cp, sizeof (inaddr));
+#else
+ bcopy(cp, (char *)&inaddr, sizeof (inaddr));
+#endif
+ if (dlen == 4) {
+ fprintf(file, "\tinternet address = %s\n",
+ inet_ntoa(inaddr));
+ cp += dlen;
+ } else if (dlen == 7) {
+ fprintf(file, "\tinternet address = %s",
+ inet_ntoa(inaddr));
+ fprintf(file, ", protocol = %d", cp[4]);
+ fprintf(file, ", port = %d\n",
+ (cp[5] << 8) + cp[6]);
+ cp += dlen;
+ }
+ break;
+ default:
+ cp += dlen;
+ }
+ break;
+ case T_CNAME:
+ case T_MB:
+ case T_MG:
+ case T_MR:
+ case T_NS:
+ case T_PTR:
+ fprintf(file, "\tdomain name = ");
+ cp = p_cdname(cp, msg, file);
+ fprintf(file, "\n");
+ break;
+
+ case T_HINFO:
+ if (n = *cp++) {
+ fprintf(file, "\tCPU=%.*s\n", n, cp);
+ cp += n;
+ }
+ if (n = *cp++) {
+ fprintf(file, "\tOS=%.*s\n", n, cp);
+ cp += n;
+ }
+ break;
+
+ case T_SOA:
+ fprintf(file, "\torigin = ");
+ cp = p_cdname(cp, msg, file);
+ fprintf(file, "\n\tmail addr = ");
+ cp = p_cdname(cp, msg, file);
+ fprintf(file, "\n\tserial = %ld", _getlong(cp));
+ cp += sizeof (u_long);
+ fprintf(file, "\n\trefresh = %s", p_time(_getlong(cp)));
+ cp += sizeof (u_long);
+ fprintf(file, "\n\tretry = %s", p_time(_getlong(cp)));
+ cp += sizeof (u_long);
+ fprintf(file, "\n\texpire = %s", p_time(_getlong(cp)));
+ cp += sizeof (u_long);
+ fprintf(file, "\n\tmin = %s\n", p_time(_getlong(cp)));
+ cp += sizeof (u_long);
+ break;
+
+ case T_MX:
+ fprintf(file, "\tpreference = %ld,", _getshort(cp));
+ cp += sizeof (u_short);
+ fprintf(file, " name = ");
+ cp = p_cdname(cp, msg, file);
+ break;
+
+ case T_TXT:
+ (void) fputs("\t\"", file);
+ cp2 = cp1 + dlen;
+ while (cp < cp2) {
+ if (n = (unsigned char) *cp++) {
+ for (c = n; c > 0 && cp < cp2; c--)
+ if (*cp == '\n') {
+ (void) putc('\\', file);
+ (void) putc(*cp++, file);
+ } else
+ (void) putc(*cp++, file);
+ }
+ }
+ (void) fputs("\"\n", file);
+ break;
+
+ case T_MINFO:
+ fprintf(file, "\trequests = ");
+ cp = p_cdname(cp, msg, file);
+ fprintf(file, "\n\terrors = ");
+ cp = p_cdname(cp, msg, file);
+ break;
+
+ case T_UINFO:
+ fprintf(file, "\t%s\n", cp);
+ cp += dlen;
+ break;
+
+ case T_UID:
+ case T_GID:
+ if (dlen == 4) {
+ fprintf(file, "\t%ld\n", _getlong(cp));
+ cp += sizeof (int);
+ }
+ break;
+
+ case T_WKS:
+ if (dlen < sizeof (u_long) + 1)
+ break;
+#ifdef SYSV
+ memcpy((void *)&inaddr, (void *)cp, sizeof (inaddr));
+#else
+ bcopy(cp, (char *)&inaddr, sizeof (inaddr));
+#endif
+ cp += sizeof (u_long);
+ fprintf(file, "\tinternet address = %s, protocol = %d\n\t",
+ inet_ntoa(inaddr), *cp++);
+ n = 0;
+ while (cp < cp1 + dlen) {
+ c = *cp++;
+ do {
+ if (c & 0200)
+ fprintf(file, " %d", n);
+ c <<= 1;
+ } while (++n & 07);
+ }
+ putc('\n', file);
+ break;
+
+#ifdef ALLOW_T_UNSPEC
+ case T_UNSPEC:
+ {
+ int NumBytes = 8;
+ char *DataPtr;
+ int i;
+
+ if (dlen < NumBytes) NumBytes = dlen;
+ fprintf(file, "\tFirst %d bytes of hex data:",
+ NumBytes);
+ for (i = 0, DataPtr = cp; i < NumBytes; i++, DataPtr++)
+ fprintf(file, " %x", *DataPtr);
+ fputs("\n", file);
+ cp += dlen;
+ }
+ break;
+#endif /* ALLOW_T_UNSPEC */
+
+ default:
+ fprintf(file, "\t???\n");
+ cp += dlen;
+ }
+ if (cp != cp1 + dlen) {
+ fprintf(file, "packet size error (%#x != %#x)\n", cp, cp1+dlen);
+ cp = NULL;
+ }
+ fprintf(file, "\n");
+ return (cp);
+}
+
+static char nbuf[40];
+
+/*
+ * Return a string for the type
+ */
+char *
+p_type(type)
+ int type;
+{
+ switch (type) {
+ case T_A:
+ return ("A");
+ case T_NS: /* authoritative server */
+ return ("NS");
+ case T_CNAME: /* canonical name */
+ return ("CNAME");
+ case T_SOA: /* start of authority zone */
+ return ("SOA");
+ case T_MB: /* mailbox domain name */
+ return ("MB");
+ case T_MG: /* mail group member */
+ return ("MG");
+ case T_MR: /* mail rename name */
+ return ("MR");
+ case T_NULL: /* null resource record */
+ return ("NULL");
+ case T_WKS: /* well known service */
+ return ("WKS");
+ case T_PTR: /* domain name pointer */
+ return ("PTR");
+ case T_HINFO: /* host information */
+ return ("HINFO");
+ case T_MINFO: /* mailbox information */
+ return ("MINFO");
+ case T_MX: /* mail routing info */
+ return ("MX");
+ case T_TXT: /* text */
+ return ("TXT");
+ case T_AXFR: /* zone transfer */
+ return ("AXFR");
+ case T_MAILB: /* mail box */
+ return ("MAILB");
+ case T_MAILA: /* mail address */
+ return ("MAILA");
+ case T_ANY: /* matches any type */
+ return ("ANY");
+ case T_UINFO:
+ return ("UINFO");
+ case T_UID:
+ return ("UID");
+ case T_GID:
+ return ("GID");
+#ifdef ALLOW_T_UNSPEC
+ case T_UNSPEC:
+ return ("UNSPEC");
+#endif /* ALLOW_T_UNSPEC */
+ default:
+ (void) sprintf(nbuf, "%d", type);
+ return (nbuf);
+ }
+}
+
+/*
+ * Return a mnemonic for class
+ */
+char *
+p_class(class)
+ int class;
+{
+
+ switch (class) {
+ case C_IN: /* internet class */
+ return ("IN");
+ case C_HS: /* hesiod class */
+ return ("HS");
+ case C_ANY: /* matches any class */
+ return ("ANY");
+ default:
+ (void) sprintf(nbuf, "%d", class);
+ return (nbuf);
+ }
+}
+
+/*
+ * Return a mnemonic for a time to live
+ */
+char *
+p_time(value)
+ u_long value;
+{
+ int secs, mins, hours;
+ register char *p;
+
+ if (value == 0) {
+ strcpy(nbuf, "0 secs");
+ return (nbuf);
+ }
+
+ secs = value % 60;
+ value /= 60;
+ mins = value % 60;
+ value /= 60;
+ hours = value % 24;
+ value /= 24;
+
+#define PLURALIZE(x) x, (x == 1) ? "" : "s"
+ p = nbuf;
+ if (value) {
+ (void) sprintf(p, "%d day%s", PLURALIZE(value));
+ while (*++p);
+ }
+ if (hours) {
+ if (value)
+ *p++ = ' ';
+ (void) sprintf(p, "%d hour%s", PLURALIZE(hours));
+ while (*++p);
+ }
+ if (mins) {
+ if (value || hours)
+ *p++ = ' ';
+ (void) sprintf(p, "%d min%s", PLURALIZE(mins));
+ while (*++p);
+ }
+ if (secs || ! (value || hours || mins)) {
+ if (value || hours || mins)
+ *p++ = ' ';
+ (void) sprintf(p, "%d sec%s", PLURALIZE(secs));
+ }
+ return (nbuf);
+}
diff --git a/usr/src/lib/libresolv/res_gethost.c b/usr/src/lib/libresolv/res_gethost.c
new file mode 100644
index 0000000000..9e20672a14
--- /dev/null
+++ b/usr/src/lib/libresolv/res_gethost.c
@@ -0,0 +1,472 @@
+/*
+ * Copyright (c) 1985, 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ *
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI" /* SunOS 1.11; UCB 6.32 */
+
+#include "synonyms.h"
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <ctype.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <errno.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include <syslog.h>
+
+/*
+ * When the name service switch calls libresolv, it doesn't want fallback
+ * to /etc/hosts, so we provide a method to turn it off.
+ */
+static int no_hosts_fallback = 0;
+
+void
+__res_set_no_hosts_fallback(void) {
+ no_hosts_fallback = 1;
+}
+
+static int
+__res_no_hosts_fallback(void) {
+ return(no_hosts_fallback);
+}
+
+static char *h_addr_ptrs[MAXADDRS + 1];
+
+static struct hostent host;
+static char *host_aliases[MAXALIASES];
+static char hostbuf[BUFSIZ+1];
+static struct in_addr host_addr;
+static char HOSTDB[] = "/etc/hosts";
+static FILE *hostf = NULL;
+static char hostaddr[MAXADDRS];
+static char *host_addrs[2];
+static int stayopen = 0;
+static char *any();
+
+#if PACKETSZ > 1024
+#define MAXPACKET PACKETSZ
+#else
+#define MAXPACKET 1024
+#endif
+
+typedef union {
+ HEADER hdr;
+ u_char buf[MAXPACKET];
+} querybuf;
+
+static union {
+ long al;
+ char ac;
+} align;
+
+
+int h_errno;
+
+static struct hostent *
+getanswer(answer, anslen, iquery)
+ querybuf *answer;
+ int anslen;
+ int iquery;
+{
+ register HEADER *hp;
+ register u_char *cp;
+ register int n;
+ u_char *eom;
+ char *bp, **ap;
+ int type, class, buflen, ancount, qdcount;
+ int haveanswer, getclass = C_ANY;
+ char **hap;
+
+ eom = answer->buf + anslen;
+ /*
+ * find first satisfactory answer
+ */
+ hp = &answer->hdr;
+ ancount = ntohs(hp->ancount);
+ qdcount = ntohs(hp->qdcount);
+ bp = hostbuf;
+ buflen = sizeof (hostbuf);
+ cp = answer->buf + sizeof (HEADER);
+ if (qdcount) {
+ if (iquery) {
+ if ((n = dn_expand((char *)answer->buf, eom,
+ cp, bp, buflen)) < 0) {
+ h_errno = NO_RECOVERY;
+ return ((struct hostent *) NULL);
+ }
+ cp += n + QFIXEDSZ;
+ host.h_name = bp;
+ n = strlen(bp) + 1;
+ bp += n;
+ buflen -= n;
+ } else
+ cp += dn_skipname(cp, eom) + QFIXEDSZ;
+ while (--qdcount > 0)
+ cp += dn_skipname(cp, eom) + QFIXEDSZ;
+ } else if (iquery) {
+ if (hp->aa)
+ h_errno = HOST_NOT_FOUND;
+ else
+ h_errno = TRY_AGAIN;
+ return ((struct hostent *) NULL);
+ }
+ ap = host_aliases;
+ host.h_aliases = host_aliases;
+ hap = h_addr_ptrs;
+#if BSD >= 43 || defined(h_addr) /* new-style hostent structure */
+ host.h_addr_list = h_addr_ptrs;
+#endif
+ haveanswer = 0;
+ while (--ancount >= 0 && cp < eom && haveanswer < MAXADDRS) {
+ if ((n = dn_expand((char *)answer->buf, eom,
+ cp, bp, buflen)) < 0)
+ break;
+ cp += n;
+ type = _getshort(cp);
+ cp += sizeof (u_short);
+ class = _getshort(cp);
+ cp += sizeof (u_short) + sizeof (u_long);
+ n = _getshort(cp);
+ cp += sizeof (u_short);
+ if (type == T_CNAME) {
+ cp += n;
+ if (ap >= &host_aliases[MAXALIASES-1])
+ continue;
+ *ap++ = bp;
+ n = strlen(bp) + 1;
+ bp += n;
+ buflen -= n;
+ continue;
+ }
+ if (iquery && type == T_PTR) {
+ if ((n = dn_expand((char *)answer->buf, eom,
+ cp, bp, buflen)) < 0) {
+ cp += n;
+ continue;
+ }
+ cp += n;
+ host.h_name = bp;
+ return (&host);
+ }
+ if (iquery || type != T_A) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("unexpected answer type %d, size %d\n",
+ type, n);
+#endif
+ cp += n;
+ continue;
+ }
+ if (haveanswer) {
+ if (n != host.h_length) {
+ cp += n;
+ continue;
+ }
+ if (class != getclass) {
+ cp += n;
+ continue;
+ }
+ } else {
+ host.h_length = n;
+ getclass = class;
+ host.h_addrtype = (class == C_IN) ? AF_INET : AF_UNSPEC;
+ if (!iquery) {
+ host.h_name = bp;
+ bp += strlen(bp) + 1;
+ }
+ }
+
+ bp += sizeof (align) - ((u_long)bp % sizeof (align));
+
+ if (bp + n >= &hostbuf[sizeof (hostbuf)]) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("size (%d) too big\n", n);
+#endif
+ break;
+ }
+#ifdef SYSV
+ memcpy((void *)(*hap++ = bp), (void *)cp, n);
+#else
+ bcopy(cp, *hap++ = bp, n);
+#endif
+ bp += n;
+ cp += n;
+ haveanswer++;
+ }
+ if (haveanswer) {
+ *ap = NULL;
+#if BSD >= 43 || defined(h_addr) /* new-style hostent structure */
+ *hap = NULL;
+#else
+ host.h_addr = h_addr_ptrs[0];
+#endif
+ return (&host);
+ } else {
+ h_errno = TRY_AGAIN;
+ return ((struct hostent *) NULL);
+ }
+}
+
+struct hostent *
+res_gethostbyname(name)
+ char *name;
+{
+ querybuf buf;
+ register char *cp;
+ int n;
+ struct hostent *hp, *gethostdomain();
+ static struct hostent *_gethtbyname();
+
+ /*
+ * disallow names consisting only of digits/dots, unless
+ * they end in a dot.
+ */
+ if (isdigit(name[0]))
+ for (cp = name; /*EMPTY*/; ++cp) {
+ if (!*cp) {
+ if (*--cp == '.')
+ break;
+ h_errno = HOST_NOT_FOUND;
+ return ((struct hostent *) NULL);
+ }
+ if (!isdigit(*cp) && *cp != '.')
+ break;
+ }
+
+ if ((n = res_search(name, C_IN, T_A, buf.buf, sizeof (buf))) < 0) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("res_search failed\n");
+#endif
+ if (errno == ECONNREFUSED)
+ return (_gethtbyname(name));
+ else
+ return ((struct hostent *) NULL);
+ }
+ return (getanswer(&buf, n, 0));
+}
+
+static struct hostent *
+_getrhbyaddr(addr, len, type)
+ char *addr;
+ int len, type;
+{
+ int n;
+ querybuf buf;
+ register struct hostent *hp;
+ char qbuf[MAXDNAME];
+ static struct hostent *_gethtbyaddr();
+
+ if (type != AF_INET)
+ return ((struct hostent *) NULL);
+ (void) sprintf(qbuf, "%d.%d.%d.%d.in-addr.arpa",
+ ((unsigned)addr[3] & 0xff),
+ ((unsigned)addr[2] & 0xff),
+ ((unsigned)addr[1] & 0xff),
+ ((unsigned)addr[0] & 0xff));
+ n = res_query(qbuf, C_IN, T_PTR, (char *)&buf, sizeof (buf));
+ if (n < 0) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("res_query failed\n");
+#endif
+ if (errno == ECONNREFUSED)
+ return (_gethtbyaddr(addr, len, type));
+ return ((struct hostent *) NULL);
+ }
+ hp = getanswer(&buf, n, 1);
+ if (hp == NULL)
+ return ((struct hostent *) NULL);
+ hp->h_addrtype = type;
+ hp->h_length = len;
+ h_addr_ptrs[0] = (char *)&host_addr;
+ h_addr_ptrs[1] = (char *)0;
+ host_addr = *(struct in_addr *)addr;
+ return (hp);
+}
+
+/*
+ * First we get what the PTR record says, but do an extra call
+ * to gethostbyname() to make sure that someone is not trying to
+ * spoof us. Hopefully this is not done that often, so good
+ * performance is not really an issue.
+ */
+struct hostent *
+res_gethostbyaddr(addr, len, type)
+ char *addr;
+ int len;
+ int type;
+{
+ char **a, hbuf[MAXHOSTNAMELEN];
+ struct hostent *hp, *hp2;
+
+ if ((hp = _getrhbyaddr(addr, len, type)) == (struct hostent *)NULL)
+ return ((struct hostent *)NULL);
+
+ /* hang on to what we got as an answer */
+ (void) strcpy(hbuf, hp->h_name);
+
+ /* check to make sure by doing a forward query */
+ if ((hp2 = res_gethostbyname(hbuf)) != (struct hostent *)NULL)
+ for (a = hp2->h_addr_list; *a; a++)
+#ifdef SYSV
+ if (memcmp(*a, addr, hp2->h_length) == 0)
+#else
+ if (bcmp(*a, addr, hp2->h_length) == 0)
+#endif
+ return (hp2);
+
+ /*
+ * we've been spoofed, make sure to log it.
+ * XXX - syslog needs a security priority level.
+ */
+ syslog(LOG_NOTICE, "gethostbyaddr: %s != %s", hbuf,
+ inet_ntoa(*(struct in_addr *)addr));
+ return ((struct hostent *)NULL);
+}
+
+static
+_sethtent(f)
+ int f;
+{
+ if (__res_no_hosts_fallback()) return(0);
+
+ if (hostf == NULL)
+ hostf = fopen(HOSTDB, "r");
+ else
+ rewind(hostf);
+ stayopen |= f;
+}
+
+static
+_endhtent()
+{
+ if (__res_no_hosts_fallback()) return(0);
+
+ if (hostf && !stayopen) {
+ (void) fclose(hostf);
+ hostf = NULL;
+ }
+}
+
+static struct hostent *
+_gethtent()
+{
+ char *p;
+ register char *cp, **q;
+
+ if (__res_no_hosts_fallback()) return(NULL);
+
+ if (hostf == NULL && (hostf = fopen(HOSTDB, "r")) == NULL)
+ return (NULL);
+again:
+ if ((p = fgets(hostbuf, BUFSIZ, hostf)) == NULL)
+ return (NULL);
+ if (*p == '#')
+ goto again;
+ cp = any(p, "#\n");
+ if (cp == NULL)
+ goto again;
+ *cp = '\0';
+ cp = any(p, " \t");
+ if (cp == NULL)
+ goto again;
+ *cp++ = '\0';
+ /* THIS STUFF IS INTERNET SPECIFIC */
+#if BSD >= 43 || defined(h_addr) /* new-style hostent structure */
+ host.h_addr_list = host_addrs;
+#endif
+ host.h_addr = hostaddr;
+ *((u_long *)host.h_addr) = inet_addr(p);
+ host.h_length = sizeof (u_long);
+ host.h_addrtype = AF_INET;
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ host.h_name = cp;
+ q = host.h_aliases = host_aliases;
+ cp = any(cp, " \t");
+ if (cp != NULL)
+ *cp++ = '\0';
+ while (cp && *cp) {
+ if (*cp == ' ' || *cp == '\t') {
+ cp++;
+ continue;
+ }
+ if (q < &host_aliases[MAXALIASES - 1])
+ *q++ = cp;
+ cp = any(cp, " \t");
+ if (cp != NULL)
+ *cp++ = '\0';
+ }
+ *q = NULL;
+ return (&host);
+}
+
+static char *
+any(cp, match)
+ register char *cp;
+ char *match;
+{
+ register char *mp, c;
+
+ while (c = *cp) {
+ for (mp = match; *mp; mp++)
+ if (*mp == c)
+ return (cp);
+ cp++;
+ }
+ return ((char *)0);
+}
+
+static struct hostent *
+_gethtbyname(name)
+ char *name;
+{
+ register struct hostent *p;
+ register char **cp;
+
+ _sethtent(0);
+ while (p = _gethtent()) {
+ if (strcasecmp(p->h_name, name) == 0)
+ break;
+ for (cp = p->h_aliases; *cp != 0; cp++)
+ if (strcasecmp(*cp, name) == 0)
+ goto found;
+ }
+found:
+ _endhtent();
+ return (p);
+}
+
+static struct hostent *
+_gethtbyaddr(addr, len, type)
+ char *addr;
+ int len, type;
+{
+ register struct hostent *p;
+
+ _sethtent(0);
+ while (p = _gethtent())
+#ifdef SYSV
+ if (p->h_addrtype == type && !memcmp(p->h_addr, addr, len))
+#else
+ if (p->h_addrtype == type && !bcmp(p->h_addr, addr, len))
+#endif
+ break;
+ _endhtent();
+ return (p);
+}
diff --git a/usr/src/lib/libresolv/res_init.c b/usr/src/lib/libresolv/res_init.c
new file mode 100644
index 0000000000..1c01d85271
--- /dev/null
+++ b/usr/src/lib/libresolv/res_init.c
@@ -0,0 +1,304 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1999 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "synonyms.h"
+
+#include <sys/types.h>
+#include <sys/sockio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+
+#include <netinet/in.h>
+#include <net/if.h>
+#include <netinet/if_ether.h>
+#include <arpa/inet.h>
+
+#define MAXIFS 256
+
+/*
+ * Resolver state default settings
+ */
+
+struct state _res = {
+ RES_TIMEOUT, /* retransmition time interval */
+ 4, /* number of times to retransmit */
+ RES_DEFAULT, /* options flags */
+ 1, /* number of name servers */
+};
+
+/*
+ * Set up default settings. If the configuration file exist, the values
+ * there will have precedence. Otherwise, the server address is set to
+ * INADDR_LOOPBACK and the default domain name comes from the gethostname().
+ * BUT if the NIS/RPC domain name is set, that is used if all else fails.
+ *
+ * The configuration file should only be used if you want to redefine your
+ * domain or run without a server on your machine.
+ *
+ * Note the user can always override then domain name with the environment
+ * variable LOCALDOMAIN which has absolute priority.
+ *
+ *
+ * Return 0 if completes successfully, -1 on error
+ */
+res_init()
+{
+ register FILE *fp;
+ register char *cp, **pp;
+ register int n;
+ char buf[BUFSIZ];
+#ifdef SYSV
+ extern char *strchr();
+#else
+ extern char *index();
+#endif
+ extern char *strcpy(), *strncpy();
+ extern char *getenv();
+ int nserv = 0; /* number of nameserver records read from file */
+ int haveenv = 0;
+ int havesearch = 0;
+
+ _res.nsaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); /* INADDR_ANY */
+ _res.nsaddr.sin_family = AF_INET;
+ _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
+ _res.nscount = 1;
+
+#ifdef SIOCGIFNUM
+ { int numifs, s, n, int_up;
+ struct ifconf ifc;
+ register struct ifreq *ifrp;
+ struct ifreq ifr;
+ unsigned bufsize;
+ unsigned int flags;
+ char *buf;
+ extern void *malloc();
+
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+ perror("socket");
+ return (-1);
+ }
+ if (ioctl(s, SIOCGIFNUM, (char *)&numifs) < 0) {
+ numifs = MAXIFS;
+ }
+ bufsize = numifs * sizeof (struct ifreq);
+ buf = (char *)malloc(bufsize);
+ if (buf == NULL) {
+ perror("out of memory");
+ close(s);
+ return (-1);
+ }
+ ifc.ifc_len = bufsize;
+ ifc.ifc_buf = buf;
+ if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) {
+ perror("ifconfig: SIOCGIFCONF");
+ close(s);
+ free(buf);
+ return (-1);
+ }
+
+ int_up = 0;
+ ifrp = ifc.ifc_req;
+ for (n = ifc.ifc_len / sizeof (struct ifreq); n > 0;
+ n--, ifrp++) {
+ memset((void *) &ifr, 0, sizeof (ifr));
+ strncpy(ifr.ifr_name, ifrp->ifr_name,
+ sizeof (ifr.ifr_name));
+ if (ioctl(s, SIOCGIFFLAGS, (char *)&ifr) < 0) {
+ perror("SIOCGIFFLAGS");
+ close(s);
+ free(buf);
+ return (-1);
+ }
+ flags = ifr.ifr_flags;
+ /* we are looking for a non-loopback interface */
+ if ((flags & IFF_UP) && ((flags & IFF_LOOPBACK) == 0))
+ int_up = 1;
+ }
+ close(s);
+ free(buf);
+ if (int_up == 0) /* all the non-LOOPBACK interfaces are DOWN */
+ return (-1);
+ }
+#endif /* SIOCGIFNUM */
+
+
+ /*
+ * for the benefit of hidden NIS domains, we use the same procedure
+ * as sendmail: convert leading + to dot, then drop to first dot
+ */
+ getdomainname(buf, BUFSIZ);
+ if (buf[0] == '+')
+ buf[0] = '.';
+#ifdef SYSV
+ cp = strchr(buf, (int)'.');
+#else
+ cp = index(buf, '.');
+#endif
+ if (cp == NULL)
+ strcpy(_res.defdname, buf);
+ else
+ strcpy(_res.defdname, cp+1);
+
+ /* Allow user to override the local domain definition */
+ if ((cp = getenv("LOCALDOMAIN")) != NULL) {
+ (void) strncpy(_res.defdname, cp, sizeof (_res.defdname));
+ haveenv++;
+ }
+
+ if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
+ /* read the config file */
+ while (fgets(buf, sizeof (buf), fp) != NULL) {
+ /* read default domain name */
+ if (!strncmp(buf, "domain", sizeof ("domain") - 1)) {
+ if (haveenv) /* skip if have from environ */
+ continue;
+ cp = buf + sizeof ("domain") - 1;
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ if ((*cp == '\0') || (*cp == '\n'))
+ continue;
+ (void) strncpy(_res.defdname, cp, sizeof (_res.defdname) - 1);
+#ifdef SYSV
+ if ((cp = strchr(_res.defdname, (int)'\n')) != NULL)
+#else
+ if ((cp = index(_res.defdname, '\n')) != NULL)
+#endif
+ *cp = '\0';
+ havesearch = 0;
+ continue;
+ }
+ /* set search list */
+ if (!strncmp(buf, "search", sizeof ("search") - 1)) {
+ if (haveenv) /* skip if have from environ */
+ continue;
+ cp = buf + sizeof ("search") - 1;
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ if ((*cp == '\0') || (*cp == '\n'))
+ continue;
+ (void) strncpy(_res.defdname, cp, sizeof (_res.defdname) - 1);
+#ifdef SYSV
+ if ((cp = strchr(_res.defdname, (int)'\n')) != NULL)
+#else
+ if ((cp = index(_res.defdname, '\n')) != NULL)
+#endif
+ *cp = '\0';
+ /*
+ * Set search list to be blank-separated strings
+ * on rest of line.
+ */
+ cp = _res.defdname;
+ pp = _res.dnsrch;
+ *pp++ = cp;
+ for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) {
+ if (*cp == ' ' || *cp == '\t') {
+ *cp = 0;
+ n = 1;
+ } else if (n) {
+ *pp++ = cp;
+ n = 0;
+ }
+ }
+ /* null terminate last domain if there are excess */
+ while (*cp != '\0' && *cp != ' ' && *cp != '\t')
+ cp++;
+ *cp = '\0';
+ *pp++ = 0;
+ havesearch = 1;
+ continue;
+ }
+ /* read nameservers to query */
+ if (!strncmp(buf, "nameserver", sizeof ("nameserver") - 1) &&
+ (nserv < MAXNS)) {
+ cp = buf + sizeof ("nameserver") - 1;
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ if ((*cp == '\0') || (*cp == '\n'))
+ continue;
+ if ((_res.nsaddr_list[nserv].sin_addr.s_addr =
+ inet_addr(cp)) == (unsigned) -1) {
+ _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY;
+ continue;
+ }
+ _res.nsaddr_list[nserv].sin_family = AF_INET;
+ _res.nsaddr_list[nserv].sin_port = htons(NAMESERVER_PORT);
+ nserv++;
+ continue;
+ }
+ }
+ if (nserv > 1)
+ _res.nscount = nserv;
+ (void) fclose(fp);
+ }
+ if (_res.defdname[0] == 0) {
+ if (gethostname(buf, sizeof (_res.defdname)) == 0 &&
+#ifdef SYSV
+ (cp = strchr(buf, (int)'.')))
+#else
+ (cp = index(buf, '.')))
+#endif
+ (void) strcpy(_res.defdname, cp + 1);
+ }
+
+ /* find components of local domain that might be searched */
+ if (havesearch == 0) {
+ pp = _res.dnsrch;
+ *pp++ = _res.defdname;
+ for (cp = _res.defdname, n = 0; *cp; cp++)
+ if (*cp == '.')
+ n++;
+ cp = _res.defdname;
+ for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDFLSRCH; n--) {
+#ifdef SYSV
+ cp = strchr(cp, (int)'.');
+#else
+ cp = index(cp, '.');
+#endif
+ *pp++ = ++cp;
+ }
+ *pp++ = 0;
+ }
+ _res.options |= RES_INIT;
+ return (0);
+}
diff --git a/usr/src/lib/libresolv/res_mkquery.c b/usr/src/lib/libresolv/res_mkquery.c
new file mode 100644
index 0000000000..acbd0ee6ed
--- /dev/null
+++ b/usr/src/lib/libresolv/res_mkquery.c
@@ -0,0 +1,310 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1998 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "synonyms.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include <errno.h>
+#include <netdb.h>
+
+/*
+ * Kludge to time out quickly if there is no /etc/resolv.conf
+ * and a TCP connection to the local DNS server fails.
+ *
+ * Moved function from res_send.c to res_mkquery.c. This
+ * solves a long timeout problem with nslookup.
+ *
+ * __areweinnamed is needed because there is a possibility that the
+ * user might do bad things to resolv.conf and cause in.named to call
+ * _confcheck and deadlock the server.
+ */
+
+int __areweinnamed()
+{
+ return (0);
+}
+
+static int _confcheck()
+{
+ int ns;
+ struct stat rc_stat;
+ struct sockaddr_in ns_sin;
+
+
+ /* First, we check to see if /etc/resolv.conf exists.
+ * If it doesn't, then localhost is mostlikely to be
+ * the nameserver.
+ */
+ if (stat(_PATH_RESCONF, &rc_stat) == -1 && errno == ENOENT) {
+
+ /* Next, we check to see if _res.nsaddr is set to loopback.
+ * If it isn't, it has been altered by the application
+ * explicitly and we then want to bail with success.
+ */
+ if (__areweinnamed())
+ return (0);
+
+ if (_res.nsaddr.sin_addr.S_un.S_addr == htonl(INADDR_LOOPBACK)) {
+
+ /* Lastly, we try to connect to the TCP port of the
+ * nameserver. If this fails, then we know that
+ * DNS is misconfigured and we can quickly exit.
+ */
+ ns = socket(AF_INET, SOCK_STREAM, 0);
+ IN_SET_LOOPBACK_ADDR(&ns_sin);
+ ns_sin.sin_port = htons(NAMESERVER_PORT);
+ if (connect(ns, (struct sockaddr *) &ns_sin,
+ sizeof ns_sin) == -1) {
+ close(ns);
+ return(-1);
+ }
+ else {
+ close(ns);
+ return(0);
+ }
+ }
+
+ return(0);
+ }
+
+ return (0);
+}
+
+/*
+ * Form all types of queries.
+ * Returns the size of the result or -1.
+ */
+res_mkquery(op, dname, class, type, data, datalen, newrr, buf, buflen)
+ int op; /* opcode of query */
+ char *dname; /* domain name */
+ int class, type; /* class and type of query */
+ char *data; /* resource record data */
+ int datalen; /* length of data */
+ struct rrec *newrr; /* new rr for modify or append */
+ char *buf; /* buffer to put query */
+ int buflen; /* size of buffer */
+{
+ register HEADER *hp;
+ register char *cp;
+ register int n;
+ char *dnptrs[10], **dpp, **lastdnptr;
+
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type);
+#endif DEBUG
+
+ /*
+ * Check to see if we can bailout quickly.
+ * Also rerun res_init if we failed in the past.
+ */
+
+ if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
+ h_errno = NO_RECOVERY;
+ return(-1);
+ }
+
+ if (_confcheck() == -1) {
+ _res.options &= ~RES_INIT;
+ h_errno = NO_RECOVERY;
+ return(-1);
+ }
+
+ /*
+ * Initialize header fields.
+ */
+ if ((buf == NULL) || (buflen < sizeof (HEADER)))
+ return (-1);
+#ifdef SYSV
+ memset(buf, 0, sizeof (HEADER));
+#else
+ bzero(buf, sizeof (HEADER));
+#endif
+ hp = (HEADER *) buf;
+ hp->id = htons(++_res.id);
+ hp->opcode = op;
+ hp->pr = (_res.options & RES_PRIMARY) != 0;
+ hp->rd = (_res.options & RES_RECURSE) != 0;
+ hp->rcode = NOERROR;
+ cp = buf + sizeof (HEADER);
+ buflen -= sizeof (HEADER);
+ dpp = dnptrs;
+ *dpp++ = buf;
+ *dpp++ = NULL;
+ lastdnptr = dnptrs + sizeof (dnptrs) / sizeof (dnptrs[0]);
+ /*
+ * perform opcode specific processing
+ */
+ switch (op) {
+ case QUERY:
+ if ((buflen -= QFIXEDSZ) < 0)
+ return (-1);
+ if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
+ return (-1);
+ cp += n;
+ buflen -= n;
+ putshort(type, cp);
+ cp += sizeof (u_short);
+ putshort(class, cp);
+ cp += sizeof (u_short);
+ hp->qdcount = htons(1);
+ if (op == QUERY || data == NULL)
+ break;
+ /*
+ * Make an additional record for completion domain.
+ */
+ buflen -= RRFIXEDSZ;
+ if ((n = dn_comp(data, cp, buflen, dnptrs, lastdnptr)) < 0)
+ return (-1);
+ cp += n;
+ buflen -= n;
+ putshort(T_NULL, cp);
+ cp += sizeof (u_short);
+ putshort(class, cp);
+ cp += sizeof (u_short);
+ putlong(0, cp);
+ cp += sizeof (u_long);
+ putshort(0, cp);
+ cp += sizeof (u_short);
+ hp->arcount = htons(1);
+ break;
+
+ case IQUERY:
+ /*
+ * Initialize answer section
+ */
+ if (buflen < 1 + RRFIXEDSZ + datalen)
+ return (-1);
+ *cp++ = '\0'; /* no domain name */
+ putshort(type, cp);
+ cp += sizeof (u_short);
+ putshort(class, cp);
+ cp += sizeof (u_short);
+ putlong(0, cp);
+ cp += sizeof (u_long);
+ putshort(datalen, cp);
+ cp += sizeof (u_short);
+ if (datalen) {
+#ifdef SYSV
+ memcpy((void *)cp, (void *)data, datalen);
+#else
+ bcopy(data, cp, datalen);
+#endif
+ cp += datalen;
+ }
+ hp->ancount = htons(1);
+ break;
+
+#ifdef ALLOW_UPDATES
+ /*
+ * For UPDATEM/UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA
+ * (Record to be modified is followed by its replacement in msg.)
+ */
+ case UPDATEM:
+ case UPDATEMA:
+
+ case UPDATED:
+ /*
+ * The res code for UPDATED and UPDATEDA is the same; user
+ * calls them differently: specifies data for UPDATED; server
+ * ignores data if specified for UPDATEDA.
+ */
+ case UPDATEDA:
+ buflen -= RRFIXEDSZ + datalen;
+ if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
+ return (-1);
+ cp += n;
+ putshort(type, cp);
+ cp += sizeof (u_short);
+ putshort(class, cp);
+ cp += sizeof (u_short);
+ putlong(0, cp);
+ cp += sizeof (u_long);
+ putshort(datalen, cp);
+ cp += sizeof (u_short);
+ if (datalen) {
+#ifdef SYSV
+ memcpy((void *)cp, (void *)data, datalen);
+#else
+ bcopy(data, cp, datalen);
+#endif
+ cp += datalen;
+ }
+ if ((op == UPDATED) || (op == UPDATEDA)) {
+ hp->ancount = htons(0);
+ break;
+ }
+ /* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */
+
+ case UPDATEA: /* Add new resource record */
+ buflen -= RRFIXEDSZ + datalen;
+ if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
+ return (-1);
+ cp += n;
+ putshort(newrr->r_type, cp);
+ cp += sizeof (u_short);
+ putshort(newrr->r_class, cp);
+ cp += sizeof (u_short);
+ putlong(0, cp);
+ cp += sizeof (u_long);
+ putshort(newrr->r_size, cp);
+ cp += sizeof (u_short);
+ if (newrr->r_size) {
+#ifdef SYSV
+ memcpy((void *)cp, newrr->r_data, newrr->r_size);
+#else
+ bcopy(newrr->r_data, cp, newrr->r_size);
+#endif
+ cp += newrr->r_size;
+ }
+ hp->ancount = htons(0);
+ break;
+
+#endif ALLOW_UPDATES
+ }
+ return (cp - buf);
+}
diff --git a/usr/src/lib/libresolv/res_query.c b/usr/src/lib/libresolv/res_query.c
new file mode 100644
index 0000000000..320776bf18
--- /dev/null
+++ b/usr/src/lib/libresolv/res_query.c
@@ -0,0 +1,299 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "synonyms.h"
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <ctype.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+
+#if PACKETSZ > 1024
+#define MAXPACKET PACKETSZ
+#else
+#define MAXPACKET 1024
+#endif
+
+int h_errno;
+
+/*
+ * Formulate a normal query, send, and await answer.
+ * Returned answer is placed in supplied buffer "answer".
+ * Perform preliminary check of answer, returning success only
+ * if no error is indicated and the answer count is nonzero.
+ * Return the size of the response on success, -1 on error.
+ * Error number is left in h_errno.
+ * Caller must parse answer and determine whether it answers the question.
+ */
+res_query(name, class, type, answer, anslen)
+ char *name; /* domain name */
+ int class, type; /* class and type of query */
+ u_char *answer; /* buffer to put answer */
+ int anslen; /* size of answer buffer */
+{
+ char buf[MAXPACKET];
+ HEADER *hp;
+ int n;
+
+ if ((_res.options & RES_INIT) == 0 && res_init() == -1)
+ return (-1);
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("res_query(%s, %d, %d)\n", name, class, type);
+#endif
+ n = res_mkquery(QUERY, name, class, type, (char *)NULL, 0, NULL,
+ buf, sizeof (buf));
+
+ if (n <= 0) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("res_query: mkquery failed\n");
+#endif
+ h_errno = NO_RECOVERY;
+ return (n);
+ }
+ n = res_send(buf, n, answer, anslen);
+ if (n < 0) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("res_query: send error\n");
+#endif
+ h_errno = TRY_AGAIN;
+ return (n);
+ }
+
+ hp = (HEADER *) answer;
+ if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("rcode = %d, ancount=%d\n", hp->rcode,
+ ntohs(hp->ancount));
+#endif
+ switch (hp->rcode) {
+ case NXDOMAIN:
+ h_errno = HOST_NOT_FOUND;
+ break;
+ case SERVFAIL:
+ h_errno = TRY_AGAIN;
+ break;
+ case NOERROR:
+ h_errno = NO_DATA;
+ break;
+ case FORMERR:
+ case NOTIMP:
+ case REFUSED:
+ default:
+ h_errno = NO_RECOVERY;
+ break;
+ }
+ return (-1);
+ }
+ if (hp->rcode == NOERROR && ntohs(hp->ancount) > 0)
+ h_errno = 0;
+ return (n);
+}
+
+/*
+ * Formulate a normal query, send, and retrieve answer in supplied buffer.
+ * Return the size of the response on success, -1 on error.
+ * If enabled, implement search rules until answer or unrecoverable failure
+ * is detected. Error number is left in h_errno.
+ * Only useful for queries in the same name hierarchy as the local host
+ * (not, for example, for host address-to-name lookups in domain in-addr.arpa).
+ */
+res_search(name, class, type, answer, anslen)
+ char *name; /* domain name */
+ int class, type; /* class and type of query */
+ u_char *answer; /* buffer to put answer */
+ int anslen; /* size of answer */
+{
+ register char *cp, **domain;
+ int n, ret, got_nodata = 0;
+ char *hostalias();
+
+ if ((_res.options & RES_INIT) == 0 && res_init() == -1)
+ return (-1);
+
+ errno = 0;
+ h_errno = HOST_NOT_FOUND; /* default, if we never query */
+ for (cp = name, n = 0; *cp; cp++)
+ if (*cp == '.')
+ n++;
+ if (n == 0 && (cp = hostalias(name)))
+ return (res_query(cp, class, type, answer, anslen));
+
+ /*
+ * We do at least one level of search if
+ * - there is no dot and RES_DEFNAME is set, or
+ * - there is at least one dot, there is no trailing dot,
+ * and RES_DNSRCH is set.
+ */
+ if ((n == 0 && _res.options & RES_DEFNAMES) ||
+ (n != 0 && *--cp != '.' && _res.options & RES_DNSRCH)) {
+ for (domain = _res.dnsrch; *domain; domain++) {
+ ret = res_querydomain(name, *domain, class, type,
+ answer, anslen);
+ if (ret > 0)
+ return (ret);
+ /*
+ * If no server present, give up.
+ * If name isn't found in this domain,
+ * keep trying higher domains in the search list
+ * (if that's enabled).
+ * On a NO_DATA error, keep trying, otherwise
+ * a wildcard entry of another type could keep us
+ * from finding this entry higher in the domain.
+ * If we get some other error (negative answer or
+ * server failure), then stop searching up,
+ * but try the input name below in case it's fully-qualified.
+ */
+ if (errno == ECONNREFUSED) {
+ h_errno = TRY_AGAIN;
+ return (-1);
+ }
+ if (h_errno == NO_DATA)
+ got_nodata++;
+ if ((h_errno != HOST_NOT_FOUND && h_errno != NO_DATA) ||
+ (_res.options & RES_DNSRCH) == 0)
+ break;
+ }
+ }
+ /*
+ * If the search/default failed, try the name as fully-qualified,
+ * but only if it contained at least one dot (even trailing).
+ * This is purely a heuristic; we assume that any reasonable query
+ * about a top-level domain (for servers, SOA, etc) will not use
+ * res_search.
+ */
+ if (n && (ret = res_querydomain(name, (char *)NULL, class, type,
+ answer, anslen)) > 0)
+ return (ret);
+ if (got_nodata)
+ h_errno = NO_DATA;
+ return (-1);
+}
+
+/*
+ * Perform a call on res_query on the concatenation of name and domain,
+ * removing a trailing dot from name if domain is NULL.
+ */
+res_querydomain(name, domain, class, type, answer, anslen)
+ char *name, *domain;
+ int class, type; /* class and type of query */
+ u_char *answer; /* buffer to put answer */
+ int anslen; /* size of answer */
+{
+ char nbuf[2*MAXDNAME+2];
+ char *longname = nbuf;
+ int n;
+
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG) {
+ if (domain == (char *)NULL)
+ printf("res_querydomain(%s, NULL, %d, %d)\n",
+ name, class, type);
+ else
+ printf("res_querydomain(%s, %s, %d, %d)\n",
+ name, domain, class, type);
+ }
+#endif
+ if (domain == NULL) {
+ /*
+ * Check for trailing '.';
+ * copy without '.' if present.
+ */
+ n = strlen(name) - 1;
+ if (name[n] == '.' && n < sizeof (nbuf) - 1) {
+#ifdef SYSV
+ memcpy((void *)nbuf, (void *)name, n);
+#else
+ bcopy(name, nbuf, n);
+#endif
+ nbuf[n] = '\0';
+ } else
+ longname = name;
+ } else
+ (void) sprintf(nbuf, "%.*s.%.*s",
+ MAXDNAME, name, MAXDNAME, domain);
+
+ return (res_query(longname, class, type, answer, anslen));
+}
+
+char *
+hostalias(name)
+ register char *name;
+{
+ register char *C1, *C2;
+ FILE *fp;
+ char *file, *getenv(), *strcpy(), *strncpy();
+ char buf[BUFSIZ];
+ static char abuf[MAXDNAME];
+
+ file = getenv("HOSTALIASES");
+ if (file == NULL || (fp = fopen(file, "r")) == NULL)
+ return (NULL);
+ buf[sizeof (buf) - 1] = '\0';
+ while (fgets(buf, sizeof (buf), fp)) {
+ for (C1 = buf; *C1 && !isspace(*C1); ++C1);
+ if (!*C1)
+ break;
+ *C1 = '\0';
+ if (!strcasecmp(buf, name)) {
+ while (isspace(*++C1));
+ if (!*C1)
+ break;
+ for (C2 = C1 + 1; *C2 && !isspace(*C2); ++C2);
+ abuf[sizeof (abuf) - 1] = *C2 = '\0';
+ (void) strncpy(abuf, C1, sizeof (abuf) - 1);
+ fclose(fp);
+ return (abuf);
+ }
+ }
+ fclose(fp);
+ return (NULL);
+}
diff --git a/usr/src/lib/libresolv/res_send.c b/usr/src/lib/libresolv/res_send.c
new file mode 100644
index 0000000000..89a602f6d2
--- /dev/null
+++ b/usr/src/lib/libresolv/res_send.c
@@ -0,0 +1,516 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Send query to name server and wait for reply.
+ */
+
+#include "synonyms.h"
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <errno.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+
+
+static int s = -1; /* socket used for communications */
+static struct sockaddr no_addr;
+
+
+#ifndef FD_SET
+#define NFDBITS 32
+#define FD_SETSIZE 32
+#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
+#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
+#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
+#ifdef SYSV
+#define FD_ZERO(p) memset((void *)(p), 0, sizeof (*(p)))
+#else
+#define FD_ZERO(p) bzero((char *)(p), sizeof (*(p)))
+#endif
+#endif
+
+/*
+ * 1247019: Kludge to time out quickly if there is no /etc/resolv.conf
+ * and a TCP connection to the local DNS server fails.
+ */
+
+static int _confcheck()
+{
+ int ns;
+ struct stat rc_stat;
+ struct sockaddr_in ns_sin;
+
+
+ /* First, we check to see if /etc/resolv.conf exists.
+ * If it doesn't, then localhost is mostlikely to be
+ * the nameserver.
+ */
+ if (stat(_PATH_RESCONF, &rc_stat) == -1 && errno == ENOENT) {
+
+ /* Next, we check to see if _res.nsaddr is set to loopback.
+ * If it isn't, it has been altered by the application
+ * explicitly and we then want to bail with success.
+ */
+ if (_res.nsaddr.sin_addr.S_un.S_addr == htonl(INADDR_LOOPBACK)) {
+
+ /* Lastly, we try to connect to the TCP port of the
+ * nameserver. If this fails, then we know that
+ * DNS is misconfigured and we can quickly exit.
+ */
+ ns = socket(AF_INET, SOCK_STREAM, 0);
+ IN_SET_LOOPBACK_ADDR(&ns_sin);
+ ns_sin.sin_port = htons(NAMESERVER_PORT);
+ if (connect(ns, (struct sockaddr *) &ns_sin,
+ sizeof ns_sin) == -1) {
+ close(ns);
+ return(-1);
+ }
+ else {
+ close(ns);
+ return(0);
+ }
+ }
+
+ return(0);
+ }
+
+ return (0);
+}
+
+res_send(buf, buflen, answer, anslen)
+ char *buf;
+ int buflen;
+ char *answer;
+ int anslen;
+{
+ register int n;
+ int try, v_circuit, resplen, ns;
+ int gotsomewhere = 0, connected = 0;
+ int connreset = 0;
+ u_short id, len;
+ char *cp;
+ fd_set dsmask;
+ struct timeval timeout;
+ HEADER *hp = (HEADER *) buf;
+ HEADER *anhp = (HEADER *) answer;
+ struct iovec iov[2];
+ int terrno = ETIMEDOUT;
+ char junk[512];
+
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG) {
+ printf("res_send()\n");
+ p_query(buf);
+ }
+#endif DEBUG
+ if (!(_res.options & RES_INIT))
+ if (res_init() == -1) {
+ return (-1);
+ }
+
+ /* 1247019: Check to see if we can bailout quickly. */
+ if (_confcheck() == -1)
+ return(-1);
+
+ v_circuit = (_res.options & RES_USEVC) || buflen > PACKETSZ;
+ id = hp->id;
+ /*
+ * Send request, RETRY times, or until successful
+ */
+ for (try = 0; try < _res.retry; try++) {
+ for (ns = 0; ns < _res.nscount; ns++) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("Querying server (# %d) address = %s\n",
+ ns+1, inet_ntoa(_res.nsaddr_list[ns].sin_addr));
+#endif DEBUG
+ usevc:
+ if (v_circuit) {
+ int truncated = 0;
+
+ /*
+ * Use virtual circuit;
+ * at most one attempt per server.
+ */
+ try = _res.retry;
+ if (s < 0) {
+ s = _socket(AF_INET, SOCK_STREAM, 0);
+ if (s < 0) {
+ terrno = errno;
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG) {
+ perror("socket (vc) failed");
+ }
+#endif DEBUG
+ continue;
+ }
+ if (connect(s, (struct sockaddr *) &_res.nsaddr_list[ns],
+ sizeof (struct sockaddr)) < 0) {
+ terrno = errno;
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG) {
+ perror("connect failed");
+ }
+#endif DEBUG
+ (void) close(s);
+ s = -1;
+ continue;
+ }
+ }
+ /*
+ * Send length & message
+ */
+ len = htons((u_short)buflen);
+ iov[0].iov_base = (caddr_t)&len;
+ iov[0].iov_len = sizeof (len);
+ iov[1].iov_base = buf;
+ iov[1].iov_len = buflen;
+ if (writev(s, iov, 2) != sizeof (len) +
+ buflen) {
+ terrno = errno;
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ perror("write failed");
+#endif DEBUG
+ (void) close(s);
+ s = -1;
+ continue;
+ }
+ /*
+ * Receive length & response
+ */
+ cp = answer;
+ len = sizeof (short);
+ while (len != 0 && (n = read
+ (s, (char *)cp, (int)len)) > 0) {
+ cp += n;
+ len -= n;
+ }
+ if (n <= 0) {
+ terrno = errno;
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ perror("read failed");
+#endif DEBUG
+ (void) close(s);
+ s = -1;
+ /*
+ * A long running process might get its TCP
+ * connection reset if the remote server was
+ * restarted. Requery the server instead of
+ * trying a new one. When there is only one
+ * server, this means that a query might work
+ * instead of failing. We only allow one reset
+ * per query to prevent looping.
+ */
+ if (terrno == ECONNRESET &&
+ !connreset) {
+ connreset = 1;
+ ns--;
+ }
+ continue;
+ }
+ cp = answer;
+ if ((resplen = ntohs(*(u_short *)cp)) >
+ anslen) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ fprintf(stderr,
+ "response truncated\n");
+#endif DEBUG
+ len = anslen;
+ truncated = 1;
+ } else
+ len = resplen;
+ while (len != 0 &&
+ (n = read(s, (char *)cp,
+ (int)len)) > 0) {
+ cp += n;
+ len -= n;
+ }
+ if (n <= 0) {
+ terrno = errno;
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ perror("read failed");
+#endif DEBUG
+ (void) close(s);
+ s = -1;
+ continue;
+ }
+ if (truncated) {
+ /*
+ * Flush rest of answer
+ * so connection stays in synch.
+ */
+ anhp->tc = 1;
+ len = resplen - anslen;
+ /*
+ * set the value of resplen to anslen,
+ * this is done because the caller
+ * assumes resplen contains the size of
+ * message read into the "answer" buffer
+ * passed in.
+ */
+ resplen = anslen;
+
+ while (len != 0) {
+ n = (len > sizeof (junk) ?
+ sizeof (junk) : len);
+ if ((n = read(s, junk, n)) > 0)
+ len -= n;
+ else
+ break;
+ }
+ }
+ } else {
+ /*
+ * Use datagrams.
+ */
+ if (s < 0) {
+ s = _socket(AF_INET, SOCK_DGRAM, 0);
+ if (s < 0) {
+ terrno = errno;
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG) {
+ perror("socket (dg) failed");
+ }
+#endif DEBUG
+ continue;
+ }
+ }
+#if BSD >= 43
+ /*
+ * I'm tired of answering this question, so:
+ * On a 4.3BSD+ machine (client and server,
+ * actually), sending to a nameserver datagram
+ * port with no nameserver will cause an
+ * ICMP port unreachable message to be returned.
+ * If our datagram socket is "connected" to the
+ * server, we get an ECONNREFUSED error on the next
+ * socket operation, and select returns if the
+ * error message is received. We can thus detect
+ * the absence of a nameserver without timing out.
+ * If we have sent queries to at least two servers,
+ * however, we don't want to remain connected,
+ * as we wish to receive answers from the first
+ * server to respond.
+ */
+ if (_res.nscount == 1 ||
+ (try == 0 && ns == 0)) {
+ /*
+ * Don't use connect if we might
+ * still receive a response
+ * from another server.
+ */
+ if (connected == 0) {
+ if (connect(s,
+ (struct sockaddr *) &_res.nsaddr_list[ns],
+ sizeof (struct sockaddr)) < 0) {
+#ifdef DEBUG
+ if (_res.options &
+ RES_DEBUG) {
+ perror("connect");
+ }
+#endif DEBUG
+ continue;
+ }
+ connected = 1;
+ }
+ if (send(s, buf, buflen, 0) != buflen) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ perror("send");
+#endif DEBUG
+ continue;
+ }
+ } else {
+ /*
+ * Disconnect if we want to listen for
+ * responses from more than one server.
+ */
+ if (connected) {
+ (void) connect(s, &no_addr,
+ sizeof (no_addr));
+ connected = 0;
+ }
+#endif BSD
+ if (sendto(s, buf, buflen, 0,
+ (struct sockaddr *) &_res.nsaddr_list[ns],
+ sizeof (struct sockaddr)) != buflen) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ perror("sendto");
+#endif DEBUG
+ continue;
+ }
+#if BSD >= 43
+ }
+#endif
+
+ /*
+ * Wait for reply
+ */
+ timeout.tv_sec = (_res.retrans << try);
+ if (try > 0)
+ timeout.tv_sec /= _res.nscount;
+ if (timeout.tv_sec <= 0)
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+wait:
+ FD_ZERO(&dsmask);
+ FD_SET(s, &dsmask);
+ n = select(s+1, &dsmask, (fd_set *)NULL,
+ (fd_set *)NULL, &timeout);
+ if (n < 0) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ perror("select");
+#endif DEBUG
+ continue;
+ }
+ if (n == 0) {
+ /*
+ * timeout
+ */
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("timeout\n");
+#endif DEBUG
+#if BSD >= 43
+ gotsomewhere = 1;
+#endif
+ continue;
+ }
+ if ((resplen = recv(s, answer, anslen, 0))
+ <= 0) {
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ perror("recvfrom");
+#endif DEBUG
+ continue;
+ }
+ gotsomewhere = 1;
+ if (id != anhp->id) {
+ /*
+ * response from old query, ignore it
+ */
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG) {
+ printf("old answer:\n");
+ p_query(answer);
+ }
+#endif DEBUG
+ goto wait;
+ }
+ if (!(_res.options & RES_IGNTC) && anhp->tc) {
+ /*
+ * get rest of answer;
+ * use TCP with same server.
+ */
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG)
+ printf("truncated answer\n");
+#endif DEBUG
+ (void) close(s);
+ s = -1;
+ v_circuit = 1;
+ goto usevc;
+ }
+ }
+#ifdef DEBUG
+ if (_res.options & RES_DEBUG) {
+ printf("got answer:\n");
+ p_query(answer);
+ }
+#endif DEBUG
+ /*
+ * If using virtual circuits, we assume that the first server
+ * is preferred * over the rest (i.e. it is on the local
+ * machine) and only keep that one open.
+ * If we have temporarily opened a virtual circuit,
+ * or if we haven't been asked to keep a socket open,
+ * close the socket.
+ */
+ if ((v_circuit &&
+ ((_res.options & RES_USEVC) == 0 || ns != 0)) ||
+ (_res.options & RES_STAYOPEN) == 0) {
+ (void) close(s);
+ s = -1;
+ }
+ return (resplen);
+ }
+ }
+ if (s >= 0) {
+ (void) close(s);
+ s = -1;
+ }
+ if (v_circuit == 0)
+ if (gotsomewhere == 0)
+ errno = ECONNREFUSED; /* no nameservers found */
+ else
+ errno = ETIMEDOUT; /* no answer obtained */
+ else
+ errno = terrno;
+ return (-1);
+}
+
+/*
+ * This routine is for closing the socket if a virtual circuit is used and
+ * the program wants to close it. This provides support for endhostent()
+ * which expects to close the socket.
+ *
+ * This routine is not expected to be user visible.
+ */
+_res_close()
+{
+ if (s != -1) {
+ (void) close(s);
+ s = -1;
+ }
+}
diff --git a/usr/src/lib/libresolv/res_sethost.c b/usr/src/lib/libresolv/res_sethost.c
new file mode 100644
index 0000000000..4af3bd60e6
--- /dev/null
+++ b/usr/src/lib/libresolv/res_sethost.c
@@ -0,0 +1,67 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1996 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "synonyms.h"
+
+#include <sys/types.h>
+#include <arpa/nameser.h>
+#include <netinet/in.h>
+#include <resolv.h>
+
+res_sethostent(stayopen)
+{
+ if (stayopen)
+ _res.options |= RES_STAYOPEN | RES_USEVC;
+}
+
+res_endhostent()
+{
+ _res.options &= ~(RES_STAYOPEN | RES_USEVC);
+ _res_close();
+}
+
+res_sethostfile(name)
+char *name;
+{
+#ifdef lint
+name = name;
+#endif
+}
diff --git a/usr/src/lib/libresolv/resolv.h b/usr/src/lib/libresolv/resolv.h
new file mode 100644
index 0000000000..b8b8acdf98
--- /dev/null
+++ b/usr/src/lib/libresolv/resolv.h
@@ -0,0 +1,116 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1989 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+/*
+ * Global defines and variables for resolver stub.
+ */
+
+#ifndef _RESOLV_H
+#define _RESOLV_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Resolver configuration file.
+ * Normally not present, but may contain the address of the
+ * inital name server(s) to query and the domain search list.
+ */
+
+#ifndef _PATH_RESCONF
+#define _PATH_RESCONF "/etc/resolv.conf"
+#endif
+
+#define ADDRSORT 1 /* enable the address-sorting option */
+#define MAXADDR 10 /* max # addresses to sort by */
+
+#define MAXNS 3 /* max # name servers we'll track */
+#define MAXDFLSRCH 3 /* # default domain levels to try */
+#define MAXDNSRCH 6 /* max # default domain levels to try */
+#define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */
+
+#define RES_TIMEOUT 6 /* seconds between retries */
+
+struct state {
+ int retrans; /* retransmition time interval */
+ int retry; /* number of times to retransmit */
+ long options; /* option flags - see below. */
+ int nscount; /* number of name servers */
+ struct sockaddr_in nsaddr_list[MAXNS]; /* address of name server */
+#define nsaddr nsaddr_list[0] /* for backward compatibility */
+ u_short id; /* current packet id */
+ char defdname[MAXDNAME]; /* default domain */
+ char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
+ int ascount; /* number of addresses */
+ struct in_addr sort_list[MAXADDR]; /* address sorting list */
+};
+
+/*
+ * Resolver options
+ */
+#define RES_INIT 0x0001 /* address initialized */
+#define RES_DEBUG 0x0002 /* print debug messages */
+#define RES_AAONLY 0x0004 /* authoritative answers only */
+#define RES_USEVC 0x0008 /* use virtual circuit */
+#define RES_PRIMARY 0x0010 /* query primary server only */
+#define RES_IGNTC 0x0020 /* ignore trucation errors */
+#define RES_RECURSE 0x0040 /* recursion desired */
+#define RES_DEFNAMES 0x0080 /* use default domain name */
+#define RES_STAYOPEN 0x0100 /* Keep TCP socket open */
+#define RES_DNSRCH 0x0200 /* search up local domain tree */
+
+#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH)
+
+extern struct state _res;
+
+#ifdef __STDC__
+extern char *p_cdname(char *, char *, FILE *);
+extern char *p_rr(char *, char *, FILE *);
+extern char *p_type(int);
+extern char *p_class(int);
+extern char *p_time(unsigned long);
+#else
+extern char *p_cdname(), *p_rr(), *p_type(), *p_class(), *p_time();
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RESOLV_H */
diff --git a/usr/src/lib/libresolv/spec/Makefile b/usr/src/lib/libresolv/spec/Makefile
new file mode 100644
index 0000000000..cb7140006e
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/Makefile
@@ -0,0 +1,55 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1998-1999 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+# lib/libresolv/spec/Makefile
+
+#
+# no sparcv9 build of libresolv
+# if it is desirable to build one then uncomment the line below and delete
+# the rest of the lines.
+#
+#include $(SRC)/lib/Makefile.spec.arch
+
+i386_ARCHITECTURES = i386
+sparc_ARCHITECTURES = sparc
+
+all := TARGET= all
+install := TARGET= install
+clean := TARGET= clean
+clobber := TARGET= clobber
+lint := TARGET= lint
+
+.KEEP_STATE:
+
+all install clean clobber lint: $($(MACH)_ARCHITECTURES)
+
+# spec files do not have msgs or catalogs
+_msg catalog:
+
+$($(MACH)_ARCHITECTURES): FRC
+ @cd $@; pwd; $(MAKE) $(TARGET)
+
+FRC:
diff --git a/usr/src/lib/libresolv/spec/Makefile.targ b/usr/src/lib/libresolv/spec/Makefile.targ
new file mode 100644
index 0000000000..b9f97daf6e
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/Makefile.targ
@@ -0,0 +1,35 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1998-1999 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+# lib/libresolv/spec/Makefile.targ
+
+LIBRARY = libresolv.a
+VERS = .1
+
+OBJECTS = resolv.o \
+ res_mkquery.o
+
+SPECCPP = -I..
diff --git a/usr/src/lib/libresolv/spec/amd64/Makefile b/usr/src/lib/libresolv/spec/amd64/Makefile
new file mode 100644
index 0000000000..d334868181
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/amd64/Makefile
@@ -0,0 +1,44 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+
+.KEEP_STATE:
+
+include ../Makefile.targ
+
+# Add arch specific objects here
+OBJECTS +=
+
+include $(SRC)/lib/Makefile.lib
+include $(SRC)/lib/Makefile.lib.64
+
+# Uncomment the following if the linker complains
+#amd64_C_PICFLAGS = $(amd64_C_BIGPICFLAGS)
+
+include $(SRC)/lib/Makefile.spec
+
+install: $(ROOTABILIB64)
diff --git a/usr/src/lib/libresolv/spec/i386/Makefile b/usr/src/lib/libresolv/spec/i386/Makefile
new file mode 100644
index 0000000000..a3f2757746
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/i386/Makefile
@@ -0,0 +1,44 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1998-1999 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+# lib/libresolv/spec/i386/Makefile
+
+.KEEP_STATE:
+
+include ../Makefile.targ
+
+# Add arch specific objects here
+OBJECTS +=
+
+include $(SRC)/lib/Makefile.lib
+
+# Uncomment the following if the linker complains
+#i386_C_PICFLAGS = -K PIC
+
+include $(SRC)/lib/Makefile.spec
+
+install: $(ROOTABILIB)
diff --git a/usr/src/lib/libresolv/spec/res_mkquery.spec b/usr/src/lib/libresolv/spec/res_mkquery.spec
new file mode 100644
index 0000000000..bed047b457
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/res_mkquery.spec
@@ -0,0 +1,75 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#pragma ident "%Z%%M% %I% %E% SMI"
+#
+# lib/libresolv/spec/res_mkquery.spec
+
+function res_mkquery
+include <sys/types.h>, <struct_rrec_compat.h>
+declaration int res_mkquery(int op, const char *dname, int class, \
+ int type, const char *data, int datalen, \
+ struct rrec *newrr, uchar_t *buf, int buflen )
+version SUNW_0.7
+exception $return == -1
+end
+
+function _res
+version SUNW_0.7
+end
+
+# nss_dns.so.1
+function __res_set_no_hosts_fallback
+version SUNWprivate_1.1
+end
+
+# in.named
+function _res_opcodes
+version SUNWprivate_1.1
+end
+
+# in.named
+function _res_resultcodes
+version SUNWprivate_1.1
+end
+
+# nss_dns.so.1
+function res_endhostent
+version SUNWprivate_1.1
+end
+
+# nss_dns.so.1
+function res_gethostbyaddr
+version SUNWprivate_1.1
+end
+
+# nss_dns.so.1m hotjava
+function res_gethostbyname
+version SUNWprivate_1.1
+end
+
+# nss_dns.so.1
+function res_sethostent
+version SUNWprivate_1.1
+end
diff --git a/usr/src/lib/libresolv/spec/resolv.spec b/usr/src/lib/libresolv/spec/resolv.spec
new file mode 100644
index 0000000000..83db4e4b6d
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/resolv.spec
@@ -0,0 +1,135 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# lib/libresolv/spec/resolv.spec
+
+function _getlong
+version SUNW_0.7
+end
+
+function _getshort
+version SUNW_0.7
+end
+
+function res_querydomain
+version SUNW_0.7
+end
+
+function res_init
+include <sys/types.h>, <netinet/in.h>, <arpa/nameser.h>, <resolv.h>
+declaration int res_init(void)
+version SUNW_0.7
+end
+
+function res_query
+include <sys/types.h>, <netinet/in.h>, <arpa/nameser.h>, <resolv.h>
+declaration int res_query(const char *dname, int class, int type, \
+ u_char *answer, int anslen)
+version SUNW_0.7
+end
+
+function res_search
+include <sys/types.h>, <netinet/in.h>, <arpa/nameser.h>, <resolv.h>
+declaration int res_search(const char *dname, int class, int type, \
+ u_char *answer, int anslen)
+version SUNW_0.7
+end
+
+function res_send
+include <sys/types.h>, <netinet/in.h>, <arpa/nameser.h>, <resolv.h>
+declaration int res_send(const uchar_t *msg, int msglen, uchar_t *answer, \
+ int anslen)
+version SUNW_0.7
+exception $return == -1
+end
+
+function dn_comp
+include <sys/types.h>, <netinet/in.h>, <arpa/nameser.h>, <resolv.h>
+declaration int dn_comp(const char *exp_dn, u_char *comp_dn, \
+ int length, u_char **dnptrs, u_char **lastdnptr)
+version SUNW_0.7
+exception $return == -1
+end
+
+function dn_expand
+include <sys/types.h>, <netinet/in.h>, <arpa/nameser.h>, <resolv.h>
+declaration int dn_expand(const uchar_t *msg, const uchar_t *eomorig, \
+ const uchar_t *comp_dn, char *exp_dn, int length)
+version SUNW_0.7
+exception $return == -1
+end
+
+function strcasecmp
+version SUNW_0.7
+filter libc.so.1
+end
+
+function strncasecmp
+version SUNW_0.7
+filter libc.so.1
+end
+
+function dn_skipname
+version SUNW_0.7
+end
+
+function fp_query
+version SUNW_0.7
+end
+
+# h_errno moved to explicit mapfile definition to provide correct type and size.
+
+function hostalias
+version SUNW_0.7
+end
+
+function p_cdname
+version SUNW_0.7
+end
+
+function p_class
+version SUNW_0.7
+end
+
+function p_query
+version SUNW_0.7
+end
+
+function p_rr
+version SUNW_0.7
+end
+
+function p_time
+version SUNW_0.7
+end
+
+function p_type
+version SUNW_0.7
+end
+
+function putlong
+version SUNW_0.7
+end
diff --git a/usr/src/lib/libresolv/spec/sparc/Makefile b/usr/src/lib/libresolv/spec/sparc/Makefile
new file mode 100644
index 0000000000..3d23bad698
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/sparc/Makefile
@@ -0,0 +1,44 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1998-1999 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+# lib/libresolv/spec/sparc/Makefile
+
+.KEEP_STATE:
+
+include ../Makefile.targ
+
+# Add arch specific objects here
+OBJECTS +=
+
+include $(SRC)/lib/Makefile.lib
+
+# Uncomment the following if the linker complains
+#sparc_C_PICFLAGS = -K PIC
+
+include $(SRC)/lib/Makefile.spec
+
+install: $(ROOTABILIB)
diff --git a/usr/src/lib/libresolv/spec/sparcv9/Makefile b/usr/src/lib/libresolv/spec/sparcv9/Makefile
new file mode 100644
index 0000000000..e772bf503c
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/sparcv9/Makefile
@@ -0,0 +1,45 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+#ident "%Z%%M% %I% %E% SMI"
+#
+# Copyright (c) 1998-1999 by Sun Microsystems, Inc.
+# All rights reserved.
+#
+# lib/libresolv/spec/sparcv9/Makefile
+
+.KEEP_STATE:
+
+include ../Makefile.targ
+
+# Add arch specific objects here
+OBJECTS +=
+
+include $(SRC)/lib/Makefile.lib
+include $(SRC)/lib/Makefile.lib.64
+
+# Uncomment the following if the linker complains
+#sparcv9_C_PICFLAGS = -K PIC
+
+include $(SRC)/lib/Makefile.spec
+
+install: $(ROOTABILIB64)
diff --git a/usr/src/lib/libresolv/spec/versions b/usr/src/lib/libresolv/spec/versions
new file mode 100644
index 0000000000..23ec67427b
--- /dev/null
+++ b/usr/src/lib/libresolv/spec/versions
@@ -0,0 +1,51 @@
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# Note: Even though the SUNW_1.1 version now contains no symbols
+# beyond what was present at Solaris 2.3, the SUNW_1.1 version MUST be
+# present. This is because applications built on 2.6 Beta
+# (when it did contain symbols explicitly) may depend on it.
+#
+sparcv9 {
+ SUNW_1.1: {SUNW_0.7};
+ SUNW_0.7;
+ SUNWprivate_1.1;
+}
+sparc {
+ SUNW_1.1: {SUNW_0.7};
+ SUNW_0.7;
+ SUNWprivate_1.1;
+}
+i386 {
+ SUNW_1.1: {SUNW_0.7};
+ SUNW_0.7;
+ SUNWprivate_1.1;
+}
+amd64 {
+ SUNW_1.1: {SUNW_0.7};
+ SUNW_0.7;
+ SUNWprivate_1.1;
+}
diff --git a/usr/src/lib/libresolv/synonyms.h b/usr/src/lib/libresolv/synonyms.h
new file mode 100644
index 0000000000..6523a38db7
--- /dev/null
+++ b/usr/src/lib/libresolv/synonyms.h
@@ -0,0 +1,573 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1988 AT&T */
+/* All Rights Reserved */
+
+
+#ifndef _LIBRESOLV_SYNONYMS_H
+#define _LIBRESOLV_SYNONYMS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(__STDC__)
+
+/* external data */
+#define altzone _altzone
+#define daylight _daylight
+#define lone _lone
+#define lten _lten
+#define lzero _lzero
+#define timezone _timezone
+#define tzname _tzname
+
+/* functions */
+#define Msgdb _Msgdb
+#define a64l _a64l
+#define access _access
+#define acct _acct
+#define acl _acl
+#define addseverity _addseverity
+#define adjtime _adjtime
+#define alarm _alarm
+#define ascftime _ascftime
+#define basename _basename
+#define brk _brk
+#define brkbase _brkbase
+#define bsd_signal _bsd_signal
+#define catclose _catclose
+#define catgets _catgets
+#define catopen _catopen
+#define cfgetispeed _cfgetispeed
+#define cfgetospeed _cfgetospeed
+#define cfree _cfree
+#define cfsetispeed _cfsetispeed
+#define cfsetospeed _cfsetospeed
+#define cftime _cftime
+#define chdir _chdir
+#define chmod _chmod
+#define chown _chown
+#define chroot _chroot
+#define close _close
+#define closedir _closedir
+#define closelog _closelog
+#define countbase _countbase
+#define creat _creat
+#define crypt _crypt
+#define ctermid _ctermid
+#define cuserid _cuserid
+#define dial _dial
+#define dirname _dirname
+#define door_bind _door_bind
+#define door_call _door_call
+#define door_create _door_create
+#define door_cred _door_cred
+#define door_getparam _door_getparam
+#define door_info _door_info
+#define door_return _door_return
+#define door_revoke _door_revoke
+#define door_setparam _door_setparam
+#define door_server_create _door_server_create
+#define door_ucred _door_ucred
+#define door_unbind _door_unbind
+#define drand48 _drand48
+#define dup _dup
+#define dup2 _dup2
+#define ecvt _ecvt
+#define edata _edata
+#define encrypt _encrypt
+#define end _end
+#define endgrent _endgrent
+#define endpwent _endpwent
+#define endspent _endspent
+#define endutent _endutent
+#define endutxent _endutxent
+#define environ _environ
+#define erand48 _erand48
+#define etext _etext
+#define execl _execl
+#define execle _execle
+#define execlp _execlp
+#define execv _execv
+#define execve _execve
+#define execvp _execvp
+#define exportfs _exportfs
+#define facl _facl
+#define fattach _fattach
+#define fchdir _fchdir
+#define fchmod _fchmod
+#define fchown _fchown
+#define fchroot _fchroot
+#define fcntl _fcntl
+#define fcvt _fcvt
+#define fdetach _fdetach
+#define fdopen _fdopen
+#define ffs _ffs
+#define fgetgrent _fgetgrent
+#define fgetgrent_r _fgetgrent_r
+#define fgetpwent _fgetpwent
+#define fgetpwent_r _fgetpwent_r
+#define fgetspent _fgetspent
+#define fgetspent_r _fgetspent_r
+#define finite _finite
+#define fmtmsg _fmtmsg
+#define fork _fork
+#define fork1 _fork1
+#define fpathconf _fpathconf
+#define fpclass _fpclass
+#define fpgetmask _fpgetmask
+#define fpgetround _fpgetround
+#define fpgetsticky _fpgetsticky
+#define fprintf _fprintf
+#define fpsetmask _fpsetmask
+#define fpsetround _fpsetround
+#define fpsetsticky _fpsetsticky
+#define fstat _fstat
+#define fstatfs _fstatfs
+#define fstatvfs _fstatvfs
+#define fsync _fsync
+#define ftell _ftell
+#define ftello _ftello
+#define fseek _fseek
+#define fseeko _fseeko
+#define ftok _ftok
+#define ftruncate _ftruncate
+#define gcvt _gcvt
+#define getcontext _getcontext
+#define getcwd _getcwd
+#define getdate _getdate
+#if !defined(_REENTRANT)
+#define getdate_err _getdate_err
+#else /* defined(_REENTRANT) */
+#define _getdate_err getdate_err
+#endif /* !defined(_REENTRANT) */
+#define getdents _getdents
+#define getegid _getegid
+#define geteuid _geteuid
+#define getgid _getgid
+#define getgrent _getgrent
+#define getgrent_r _getgrent_r
+#define getgrgid _getgrgid
+#define getgrgid_r _getgrgid_r
+#define getgrnam _getgrnam
+#define getgrnam_r _getgrnam_r
+#define getgroups _getgroups
+#define gethz _gethz
+#define getitimer _getitimer
+#define getlogin _getlogin
+#define getmntany _getmntany
+#define getmntent _getmntent
+#define getmsg _getmsg
+#define getopt _getopt
+#define getpass _getpass
+#define getpassphrase _getpassphrase
+#define getpgid _getpgid
+#define getpgrp _getpgrp
+#define getpid _getpid
+#define getpmsg _getpmsg
+#define getppid _getppid
+#define getpw _getpw
+#define getpwent _getpwent
+#define getpwent_r _getpwent_r
+#define getpwnam _getpwnam
+#define getpwnam_r _getpwnam_r
+#define getpwuid _getpwuid
+#define getpwuid_r _getpwuid_r
+#define getrlimit _getrlimit
+#define getsid _getsid
+#define getspent _getspent
+#define getspent_r _getspent_r
+#define getspnam _getspnam
+#define getspnam_r _getspnam_r
+#define getsubopt _getsubopt
+#define gettimeofday _gettimeofday
+#define gettxt _gettxt
+#define getuid _getuid
+#define getutent _getutent
+#define getutid _getutid
+#define getutline _getutline
+#define getutmp _getutmp
+#define getutmpx _getutmpx
+#define getutxent _getutxent
+#define getutxid _getutxid
+#define getutxline _getutxline
+#define getvfsany _getvfsany
+#define getvfsent _getvfsent
+#define getvfsfile _getvfsfile
+#define getvfsspec _getvfsspec
+#define getw _getw
+#define grantpt _grantpt
+#define gsignal _gsignal
+#define gtty _gtty
+#define hasmntopt _hasmntopt
+#define hcreate _hcreate
+#define hdestroy _hdestroy
+#define hsearch _hsearch
+#define id2str _id2str
+#define initgroups _initgroups
+#define insque _insque
+#define install_utrap _install_utrap
+#define ioctl _ioctl
+#define isastream _isastream
+#define isatty _isatty
+#define jrand48 _jrand48
+#define kaio _kaio
+#define kill _kill
+#define l64a _l64a
+#define ladd _ladd
+#define lchown _lchown
+#define lckpwdf _lckpwdf
+#define lcong48 _lcong48
+#define ldivide _ldivide
+#define lexp10 _lexp10
+#define lfind _lfind
+#define link _link
+#define llog10 _llog10
+#define llseek _llseek
+#define lmul _lmul
+#define lockf _lockf
+#define longjmp _longjmp
+#define lrand48 _lrand48
+#define lsearch _lsearch
+#define lseek _lseek
+#define lshiftl _lshiftl
+#define lsign _lsign
+#define lstat _lstat
+#define lsub _lsub
+#define ltol3 _ltol3
+#define madvise _madvise
+#define makecontext _makecontext
+#define makeut _makeut
+#define makeutx _makeutx
+#define memalign _memalign
+#define memccpy _memccpy
+#define memcntl _memcntl
+#define memcmp _memcmp
+#define memcpy _memcpy
+#define memmove _memmove
+#define memset _memset
+#define mincore _mincore
+#define mkdir _mkdir
+#define mkfifo _mkfifo
+#define mknod _mknod
+#define mktemp _mktemp
+#define mkstemp _mkstemp
+#define mlock _mlock
+#define mlockall _mlockall
+#define mmap _mmap
+#define modut _modut
+#define modutx _modutx
+#define monitor _monitor
+#define mount _mount
+#define mprotect _mprotect
+#define mrand48 _mrand48
+#define msgctl _msgctl
+#define msgget _msgget
+#define msgrcv _msgrcv
+#define msgsnd _msgsnd
+#define msync _msync
+#define munlock _munlock
+#define munlockall _munlockall
+#define munmap _munmap
+#define nfs_getfh _nfs_getfh
+#define nfssvc _nfssvc
+#define nftw _nftw
+#define nice _nice
+#define nrand48 _nrand48
+#define nss_delete _nss_delete
+#define nss_endent _nss_endent
+#define nss_getent _nss_getent
+#define nss_search _nss_search
+#define nss_setent _nss_setent
+#define open _open
+#define opendir _opendir
+#define openlog _openlog
+#define pathconf _pathconf
+#define pause _pause
+#define pclose _pclose
+#define pipe _pipe
+#define plock _plock
+#define poll _poll
+#define popen _popen
+#define pread _pread
+#define pset_create _pset_create
+#define pset_destroy _pset_destroy
+#define pset_assign _pset_assign
+#define pset_info _pset_info
+#define pset_bind _pset_bind
+#define profil _profil
+#define psiginfo _psiginfo
+#define psignal _psignal
+#define ptrace _ptrace
+#define ptsname _ptsname
+#define pwrite _pwrite
+#define putenv _putenv
+#define putmsg _putmsg
+#define putpmsg _putpmsg
+#define putpwent _putpwent
+#define putspent _putspent
+#define pututline _pututline
+#define pututxline _pututxline
+#define putw _putw
+#define read _read
+#define readdir _readdir
+#define readdir_r _readdir_r
+#define readlink _readlink
+#define readv _readv
+#define realpath _realpath
+#define regcmp _regcmp
+#define regex _regex
+#define remque _remque
+#define rmdir _rmdir
+#define sbrk _sbrk
+#define seed48 _seed48
+#define seekdir _seekdir
+#define select _select
+#define semctl _semctl
+#define semget _semget
+#define semop _semop
+#define setcontext _setcontext
+#define setegid _setegid
+#define seteuid _seteuid
+#define setgid _setgid
+#define setgrent _setgrent
+#define setgroups _setgroups
+#define setitimer _setitimer
+#define setjmp _setjmp
+#define setkey _setkey
+#define setlocale _setlocale
+#define setlogmask _setlogmask
+#define setpgid _setpgid
+#define setpgrp _setpgrp
+#define setpwent _setpwent
+#define setregid _setregid
+#define setreuid _setreuid
+#define setrlimit _setrlimit
+#define setsid _setsid
+#define setspent _setspent
+#define settimeofday _settimeofday
+#define setuid _setuid
+#define setutent _setutent
+#define setutxent _setutxent
+#define shmat _shmat
+#define shmctl _shmctl
+#define shmdt _shmdt
+#define shmget _shmget
+#define sig2str _sig2str
+#define sigaction _sigaction
+#define sigaddset _sigaddset
+#define sigaltstack _sigaltstack
+#define sigdelset _sigdelset
+#define sigemptyset _sigemptyset
+#define sigfillset _sigfillset
+#define sigflag _sigflag
+#define sigfpe _sigfpe
+#define sighold _sighold
+#define sigignore _sigignore
+#define siginterrupt _siginterrupt
+#define sigismember _sigismember
+#define siglongjmp _siglongjmp
+#define sigpause _sigpause
+#define sigpending _sigpending
+#define sigprocmask _sigprocmask
+#define sigrelse _sigrelse
+#define sigsend _sigsend
+#define sigsendset _sigsendset
+#define sigset _sigset
+#define signal _signal
+#define sigsetjmp _sigsetjmp
+#define sigsuspend _sigsuspend
+#define sigwait _sigwait
+#define sleep _sleep
+#define srand48 _srand48
+#define ssignal _ssignal
+#define stat _stat
+#define statfs _statfs
+#define statvfs _statvfs
+#define stime _stime
+#define str2id _str2id
+#define str2sig _str2sig
+#define strdup _strdup
+#define stty _stty
+#define swab _swab
+#define swapcontext _swapcontext
+#define swapctl _swapctl
+#define symlink _symlink
+#define sync _sync
+#define synchutmp _synchutmp
+#define syssun _syssun
+#define sys_errlist _sys_errlist
+#define sys_nerr _sys_nerr
+#define syscall _syscall
+#define sysconf _sysconf
+#define sysfs _sysfs
+#define sysinfo _sysinfo
+#define syslog _syslog
+#define tcdrain _tcdrain
+#define tcflow _tcflow
+#define tcflush _tcflush
+#define tcgetattr _tcgetattr
+#define tcgetpgrp _tcgetpgrp
+#define tcgetsid _tcgetsid
+#define tcsendbreak _tcsendbreak
+#define tcsetattr _tcsetattr
+#define tcsetpgrp _tcsetpgrp
+#define tdelete _tdelete
+#define tell _tell
+#define telldir _telldir
+#define tempnam _tempnam
+#define tfind _tfind
+#define time _time
+#define times _times
+#define truncate _truncate
+#define tsearch _tsearch
+#define ttyname _ttyname
+#define ttyslot _ttyslot
+#define twalk _twalk
+#define tzname _tzname
+#define tzset _tzset
+#define uadmin _uadmin
+#define ulckpwdf _ulckpwdf
+#define ulimit _ulimit
+#define umask _umask
+#define umount _umount
+#define uname _uname
+#define undial _undial
+#define unlink _unlink
+#define unlockpt _unlockpt
+#define unordered _unordered
+#define updutfile _updutfile
+#define updutxfile _updutxfile
+#define updutmp _updutmp
+#define updutmpx _updutmpx
+#define updwtmp _updwtmp
+#define updwtmpx _updwtmpx
+#define ustat _ustat
+#define utime _utime
+#define utimes _utimes
+#define utmpname _utmpname
+#define utmpxname _utmpxname
+#define utssys _utssys
+#define valloc _valloc
+#define vfork _vfork
+#define vhangup _vhangup
+#define vsyslog _vsyslog
+#define wait _wait
+#define waitid _waitid
+#define waitpid _waitpid
+#define write _write
+#define writev _writev
+#define yield _yield
+#define _assert __assert
+#define _ctype __ctype
+#define _filbuf __filbuf
+#define _flsbuf __flsbuf
+#define _iob __iob
+
+/* fp and ll functions */
+#define decimal_to_double _decimal_to_double
+#define decimal_to_extended _decimal_to_extended
+#define decimal_to_quadruple _decimal_to_quadruple
+#define decimal_to_single _decimal_to_single
+#define double_to_decimal _double_to_decimal
+#define econvert _econvert
+#define extended_to_decimal _extended_to_decimal
+#define fconvert _fconvert
+#define file_to_decimal _file_to_decimal
+#define func_to_decimal _func_to_decimal
+#define gconvert _gconvert
+#define qeconvert _qeconvert
+#define qecvt _qecvt
+#define qfconvert _qfconvert
+#define qfcvt _qfcvt
+#define qgconvert _qgconvert
+#define qgcvt _qgcvt
+#define quadruple_to_decimal _quadruple_to_decimal
+#define seconvert _seconvert
+#define sfconvert _sfconvert
+#define sgconvert _sgconvert
+#define single_to_decimal _single_to_decimal
+#define string_to_decimal _string_to_decimal
+#define atoll _atoll
+#define llabs _llabs
+#define lldiv _lldiv
+#define lltostr _lltostr
+#define strtoll _strtoll
+#define strtoull _strtoull
+#define ulltostr _ulltostr
+
+#if !defined(_LP64)
+/* transitional large file interfaces */
+#define creat64 _creat64
+#define ftello64 _ftello64
+#define fseeko64 _fseeko64
+#define fstat64 _fstat64
+#define ftw64 _ftw64
+#define fstatvfs64 _fstatvfs64
+#define ftruncate64 _ftruncate64
+#define getdents64 _getdents64
+#define getrlimit64 _getrlimit64
+#define lockf64 _lockf64
+#define lseek64 _lseek64
+#define lstat64 _lstat64
+#define mkstemp64 _mkstemp64
+#define mmap64 _mmap64
+#define nftw64 _nftw64
+#define open64 _open64
+#define pread64 _pread64
+#define pwrite64 _pwrite64
+#define readdir64 _readdir64
+#define readdir64_r _readdir64_r
+#define seekdir64 _seekdir64
+#define telldir64 _telldir64
+#define setrlimit64 _setrlimit64
+#define stat64 _stat64
+#define statvfs64 _statvfs64
+#define truncate64 _truncate64
+#endif /* !_LP64 */
+
+#else /* !defined(__STDC__) */
+
+#if !defined(_ASM)
+#define const
+
+#if !defined(_SIZE_T)
+#define _SIZE_T
+typedef unsigned int size_t;
+#endif /* !defined(_SIZE_T) */
+#endif /* !defined(_ASM) */
+
+#endif /* defined(__STDC__) */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LIBRESOLV_SYNONYMS_H */