diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libresolv | |
download | illumos-gate-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz |
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libresolv')
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 */ |