xref: /minix3/external/bsd/bind/dist/contrib/idn/idnkit-1.0-src/tools/runidn/stub.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: stub.c,v 1.4 2014/12/10 04:37:56 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek #ifndef lint
4*00b67f09SDavid van Moolenbroek static char *rcsid = "Id: stub.c,v 1.1 2003/06/04 00:27:13 marka Exp ";
5*00b67f09SDavid van Moolenbroek #endif
6*00b67f09SDavid van Moolenbroek 
7*00b67f09SDavid van Moolenbroek /*
8*00b67f09SDavid van Moolenbroek  * Copyright (c) 2001 Japan Network Information Center.  All rights reserved.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * By using this file, you agree to the terms and conditions set forth bellow.
11*00b67f09SDavid van Moolenbroek  *
12*00b67f09SDavid van Moolenbroek  * 			LICENSE TERMS AND CONDITIONS
13*00b67f09SDavid van Moolenbroek  *
14*00b67f09SDavid van Moolenbroek  * The following License Terms and Conditions apply, unless a different
15*00b67f09SDavid van Moolenbroek  * license is obtained from Japan Network Information Center ("JPNIC"),
16*00b67f09SDavid van Moolenbroek  * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
17*00b67f09SDavid van Moolenbroek  * Chiyoda-ku, Tokyo 101-0047, Japan.
18*00b67f09SDavid van Moolenbroek  *
19*00b67f09SDavid van Moolenbroek  * 1. Use, Modification and Redistribution (including distribution of any
20*00b67f09SDavid van Moolenbroek  *    modified or derived work) in source and/or binary forms is permitted
21*00b67f09SDavid van Moolenbroek  *    under this License Terms and Conditions.
22*00b67f09SDavid van Moolenbroek  *
23*00b67f09SDavid van Moolenbroek  * 2. Redistribution of source code must retain the copyright notices as they
24*00b67f09SDavid van Moolenbroek  *    appear in each source code file, this License Terms and Conditions.
25*00b67f09SDavid van Moolenbroek  *
26*00b67f09SDavid van Moolenbroek  * 3. Redistribution in binary form must reproduce the Copyright Notice,
27*00b67f09SDavid van Moolenbroek  *    this License Terms and Conditions, in the documentation and/or other
28*00b67f09SDavid van Moolenbroek  *    materials provided with the distribution.  For the purposes of binary
29*00b67f09SDavid van Moolenbroek  *    distribution the "Copyright Notice" refers to the following language:
30*00b67f09SDavid van Moolenbroek  *    "Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved."
31*00b67f09SDavid van Moolenbroek  *
32*00b67f09SDavid van Moolenbroek  * 4. The name of JPNIC may not be used to endorse or promote products
33*00b67f09SDavid van Moolenbroek  *    derived from this Software without specific prior written approval of
34*00b67f09SDavid van Moolenbroek  *    JPNIC.
35*00b67f09SDavid van Moolenbroek  *
36*00b67f09SDavid van Moolenbroek  * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
37*00b67f09SDavid van Moolenbroek  *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
38*00b67f09SDavid van Moolenbroek  *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
39*00b67f09SDavid van Moolenbroek  *    PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JPNIC BE LIABLE
40*00b67f09SDavid van Moolenbroek  *    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
41*00b67f09SDavid van Moolenbroek  *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
42*00b67f09SDavid van Moolenbroek  *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
43*00b67f09SDavid van Moolenbroek  *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
44*00b67f09SDavid van Moolenbroek  *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
45*00b67f09SDavid van Moolenbroek  *    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
46*00b67f09SDavid van Moolenbroek  *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
47*00b67f09SDavid van Moolenbroek  */
48*00b67f09SDavid van Moolenbroek 
49*00b67f09SDavid van Moolenbroek #include <config.h>
50*00b67f09SDavid van Moolenbroek 
51*00b67f09SDavid van Moolenbroek #include <stdarg.h>
52*00b67f09SDavid van Moolenbroek #include <stdlib.h>
53*00b67f09SDavid van Moolenbroek #include <string.h>
54*00b67f09SDavid van Moolenbroek #include <sys/types.h>
55*00b67f09SDavid van Moolenbroek #include <sys/socket.h>
56*00b67f09SDavid van Moolenbroek #include <netdb.h>
57*00b67f09SDavid van Moolenbroek #include <errno.h>
58*00b67f09SDavid van Moolenbroek #ifdef HAVE_DLFCN_H
59*00b67f09SDavid van Moolenbroek #include <dlfcn.h>
60*00b67f09SDavid van Moolenbroek #endif
61*00b67f09SDavid van Moolenbroek 
62*00b67f09SDavid van Moolenbroek #include <idn/logmacro.h>
63*00b67f09SDavid van Moolenbroek #include <idn/debug.h>
64*00b67f09SDavid van Moolenbroek 
65*00b67f09SDavid van Moolenbroek #include "stub.h"
66*00b67f09SDavid van Moolenbroek 
67*00b67f09SDavid van Moolenbroek #ifndef RTLD_NEXT
68*00b67f09SDavid van Moolenbroek typedef struct {
69*00b67f09SDavid van Moolenbroek 	const char *name;
70*00b67f09SDavid van Moolenbroek 	void *handle;
71*00b67f09SDavid van Moolenbroek } shared_obj_t;
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek static shared_obj_t shobj[] = {
74*00b67f09SDavid van Moolenbroek #ifdef SOPATH_LIBC
75*00b67f09SDavid van Moolenbroek 	{ SOPATH_LIBC },
76*00b67f09SDavid van Moolenbroek #endif
77*00b67f09SDavid van Moolenbroek #ifdef SOPATH_LIBNSL
78*00b67f09SDavid van Moolenbroek 	{ SOPATH_LIBNSL },
79*00b67f09SDavid van Moolenbroek #endif
80*00b67f09SDavid van Moolenbroek 	{ NULL },
81*00b67f09SDavid van Moolenbroek };
82*00b67f09SDavid van Moolenbroek #endif
83*00b67f09SDavid van Moolenbroek 
84*00b67f09SDavid van Moolenbroek static void	*shared_obj_findsym(void *handle, const char *name);
85*00b67f09SDavid van Moolenbroek static void	*shared_obj_findsymx(void *handle, const char *name);
86*00b67f09SDavid van Moolenbroek static void	*get_func_addr(const char *name);
87*00b67f09SDavid van Moolenbroek 
88*00b67f09SDavid van Moolenbroek #ifndef RTLD_NEXT
89*00b67f09SDavid van Moolenbroek static void *
shared_obj_open(const char * path)90*00b67f09SDavid van Moolenbroek shared_obj_open(const char *path) {
91*00b67f09SDavid van Moolenbroek #ifdef HAVE_DLOPEN
92*00b67f09SDavid van Moolenbroek 	return (dlopen(path, RTLD_LAZY));
93*00b67f09SDavid van Moolenbroek #endif
94*00b67f09SDavid van Moolenbroek 	FATAL(("stub: no way to load shared object file\n"));
95*00b67f09SDavid van Moolenbroek 	return (NULL);
96*00b67f09SDavid van Moolenbroek }
97*00b67f09SDavid van Moolenbroek #endif
98*00b67f09SDavid van Moolenbroek 
99*00b67f09SDavid van Moolenbroek static void *
shared_obj_findsym(void * handle,const char * name)100*00b67f09SDavid van Moolenbroek shared_obj_findsym(void *handle, const char *name) {
101*00b67f09SDavid van Moolenbroek 	char namebuf[100];
102*00b67f09SDavid van Moolenbroek 	void *addr;
103*00b67f09SDavid van Moolenbroek 	static int need_leading_underscore = -1;
104*00b67f09SDavid van Moolenbroek 
105*00b67f09SDavid van Moolenbroek 	/* Prepend underscore. */
106*00b67f09SDavid van Moolenbroek 	namebuf[0] = '_';
107*00b67f09SDavid van Moolenbroek 	(void)strcpy(namebuf + 1, name);
108*00b67f09SDavid van Moolenbroek 	name = namebuf;
109*00b67f09SDavid van Moolenbroek 
110*00b67f09SDavid van Moolenbroek 	if (need_leading_underscore < 0) {
111*00b67f09SDavid van Moolenbroek 		/* First try without one. */
112*00b67f09SDavid van Moolenbroek 		if ((addr = shared_obj_findsymx(handle, name + 1)) != NULL) {
113*00b67f09SDavid van Moolenbroek 			need_leading_underscore = 0;
114*00b67f09SDavid van Moolenbroek 			return (addr);
115*00b67f09SDavid van Moolenbroek 		}
116*00b67f09SDavid van Moolenbroek 		/* Then try with one. */
117*00b67f09SDavid van Moolenbroek 		if ((addr = shared_obj_findsymx(handle, name)) != NULL) {
118*00b67f09SDavid van Moolenbroek 			need_leading_underscore = 1;
119*00b67f09SDavid van Moolenbroek 			return (addr);
120*00b67f09SDavid van Moolenbroek 		}
121*00b67f09SDavid van Moolenbroek 	} else if (need_leading_underscore) {
122*00b67f09SDavid van Moolenbroek 		return (shared_obj_findsymx(handle, name));
123*00b67f09SDavid van Moolenbroek 	} else {
124*00b67f09SDavid van Moolenbroek 		return (shared_obj_findsymx(handle, name + 1));
125*00b67f09SDavid van Moolenbroek 	}
126*00b67f09SDavid van Moolenbroek 	return (NULL);
127*00b67f09SDavid van Moolenbroek }
128*00b67f09SDavid van Moolenbroek 
129*00b67f09SDavid van Moolenbroek static void *
shared_obj_findsymx(void * handle,const char * name)130*00b67f09SDavid van Moolenbroek shared_obj_findsymx(void *handle, const char *name) {
131*00b67f09SDavid van Moolenbroek #ifdef HAVE_DLSYM
132*00b67f09SDavid van Moolenbroek 	return (dlsym(handle, name));
133*00b67f09SDavid van Moolenbroek #endif
134*00b67f09SDavid van Moolenbroek 	/* logging */
135*00b67f09SDavid van Moolenbroek 	FATAL(("stub: no way to get symbol address\n"));
136*00b67f09SDavid van Moolenbroek 	return (NULL);
137*00b67f09SDavid van Moolenbroek }
138*00b67f09SDavid van Moolenbroek 
139*00b67f09SDavid van Moolenbroek static void *
get_func_addr(const char * name)140*00b67f09SDavid van Moolenbroek get_func_addr(const char *name) {
141*00b67f09SDavid van Moolenbroek #ifdef RTLD_NEXT
142*00b67f09SDavid van Moolenbroek 	void *addr = shared_obj_findsym(RTLD_NEXT, name);
143*00b67f09SDavid van Moolenbroek 
144*00b67f09SDavid van Moolenbroek 	if (addr != NULL) {
145*00b67f09SDavid van Moolenbroek 		TRACE(("stub: %s found in the subsequent objects\n", name));
146*00b67f09SDavid van Moolenbroek 		return (addr);
147*00b67f09SDavid van Moolenbroek 	}
148*00b67f09SDavid van Moolenbroek #else
149*00b67f09SDavid van Moolenbroek 	int i;
150*00b67f09SDavid van Moolenbroek 
151*00b67f09SDavid van Moolenbroek 	for (i = 0; shobj[i].name != NULL; i++) {
152*00b67f09SDavid van Moolenbroek 		if (shobj[i].handle == NULL) {
153*00b67f09SDavid van Moolenbroek 			TRACE(("stub: loading %s\n", shobj[i].name));
154*00b67f09SDavid van Moolenbroek 			shobj[i].handle = shared_obj_open(shobj[i].name);
155*00b67f09SDavid van Moolenbroek 		}
156*00b67f09SDavid van Moolenbroek 		if (shobj[i].handle != NULL) {
157*00b67f09SDavid van Moolenbroek 			void *addr = shared_obj_findsym(shobj[i].handle, name);
158*00b67f09SDavid van Moolenbroek 			if (addr != NULL) {
159*00b67f09SDavid van Moolenbroek 				TRACE(("stub: %s found in %s\n",
160*00b67f09SDavid van Moolenbroek 				       name, shobj[i].name));
161*00b67f09SDavid van Moolenbroek 				return (addr);
162*00b67f09SDavid van Moolenbroek 			}
163*00b67f09SDavid van Moolenbroek 		}
164*00b67f09SDavid van Moolenbroek 	}
165*00b67f09SDavid van Moolenbroek #endif
166*00b67f09SDavid van Moolenbroek 	TRACE(("stub: %s not found\n", name));
167*00b67f09SDavid van Moolenbroek 	return (NULL);
168*00b67f09SDavid van Moolenbroek }
169*00b67f09SDavid van Moolenbroek 
170*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYNAME
171*00b67f09SDavid van Moolenbroek struct hostent *
idn_stub_gethostbyname(const char * name)172*00b67f09SDavid van Moolenbroek idn_stub_gethostbyname(const char *name) {
173*00b67f09SDavid van Moolenbroek 	static struct hostent *(*fp)(const char *name);
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
176*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyname");
177*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
178*00b67f09SDavid van Moolenbroek 		return ((*fp)(name));
179*00b67f09SDavid van Moolenbroek 	return (NULL);
180*00b67f09SDavid van Moolenbroek }
181*00b67f09SDavid van Moolenbroek #endif
182*00b67f09SDavid van Moolenbroek 
183*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYNAME2
184*00b67f09SDavid van Moolenbroek struct hostent *
idn_stub_gethostbyname2(const char * name,int af)185*00b67f09SDavid van Moolenbroek idn_stub_gethostbyname2(const char *name, int af) {
186*00b67f09SDavid van Moolenbroek 	static struct hostent *(*fp)(const char *name, int af);
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
189*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyname2");
190*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
191*00b67f09SDavid van Moolenbroek 		return ((*fp)(name, af));
192*00b67f09SDavid van Moolenbroek 	return (NULL);
193*00b67f09SDavid van Moolenbroek }
194*00b67f09SDavid van Moolenbroek #endif
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYADDR
197*00b67f09SDavid van Moolenbroek struct hostent *
idn_stub_gethostbyaddr(GHBA_ADDR_T addr,GHBA_ADDRLEN_T len,int type)198*00b67f09SDavid van Moolenbroek idn_stub_gethostbyaddr(GHBA_ADDR_T addr, GHBA_ADDRLEN_T len, int type) {
199*00b67f09SDavid van Moolenbroek 	static struct hostent *(*fp)(GHBA_ADDR_T name,
200*00b67f09SDavid van Moolenbroek 				     GHBA_ADDRLEN_T len, int type);
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
203*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyaddr");
204*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
205*00b67f09SDavid van Moolenbroek 		return ((*fp)(addr, len, type));
206*00b67f09SDavid van Moolenbroek 	return (NULL);
207*00b67f09SDavid van Moolenbroek }
208*00b67f09SDavid van Moolenbroek #endif
209*00b67f09SDavid van Moolenbroek 
210*00b67f09SDavid van Moolenbroek #ifdef GETHOST_R_GLIBC_FLAVOR
211*00b67f09SDavid van Moolenbroek 
212*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYNAME_R
213*00b67f09SDavid van Moolenbroek int
idn_stub_gethostbyname_r(const char * name,struct hostent * result,char * buffer,size_t buflen,struct hostent ** rp,int * errp)214*00b67f09SDavid van Moolenbroek idn_stub_gethostbyname_r(const char *name, struct hostent *result,
215*00b67f09SDavid van Moolenbroek 			 char *buffer, size_t buflen,
216*00b67f09SDavid van Moolenbroek 			 struct hostent **rp, int *errp)
217*00b67f09SDavid van Moolenbroek {
218*00b67f09SDavid van Moolenbroek 	static int (*fp)(const char *name, struct hostent *result,
219*00b67f09SDavid van Moolenbroek 			 char *buffer, size_t buflen,
220*00b67f09SDavid van Moolenbroek 			 struct hostent **rp, int *errp);
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
223*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyname_r");
224*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
225*00b67f09SDavid van Moolenbroek 		return ((*fp)(name, result, buffer, buflen, rp, errp));
226*00b67f09SDavid van Moolenbroek 	return (ENOENT);	/* ??? */
227*00b67f09SDavid van Moolenbroek }
228*00b67f09SDavid van Moolenbroek #endif
229*00b67f09SDavid van Moolenbroek 
230*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYNAME2_R
231*00b67f09SDavid van Moolenbroek int
idn_stub_gethostbyname2_r(const char * name,int af,struct hostent * result,char * buffer,size_t buflen,struct hostent ** rp,int * errp)232*00b67f09SDavid van Moolenbroek idn_stub_gethostbyname2_r(const char *name, int af, struct hostent *result,
233*00b67f09SDavid van Moolenbroek 			  char *buffer, size_t buflen,
234*00b67f09SDavid van Moolenbroek 			  struct hostent **rp, int *errp)
235*00b67f09SDavid van Moolenbroek {
236*00b67f09SDavid van Moolenbroek 	static int (*fp)(const char *name, int af, struct hostent *result,
237*00b67f09SDavid van Moolenbroek 			 char *buffer, size_t buflen,
238*00b67f09SDavid van Moolenbroek 			 struct hostent **rp, int *errp);
239*00b67f09SDavid van Moolenbroek 
240*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
241*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyname2_r");
242*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
243*00b67f09SDavid van Moolenbroek 		return ((*fp)(name, af, result, buffer, buflen, rp, errp));
244*00b67f09SDavid van Moolenbroek 	return (ENOENT);	/* ??? */
245*00b67f09SDavid van Moolenbroek }
246*00b67f09SDavid van Moolenbroek #endif
247*00b67f09SDavid van Moolenbroek 
248*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYADDR_R
249*00b67f09SDavid van Moolenbroek int
idn_stub_gethostbyaddr_r(GHBA_ADDR_T addr,GHBA_ADDRLEN_T len,int type,struct hostent * result,char * buffer,size_t buflen,struct hostent ** rp,int * errp)250*00b67f09SDavid van Moolenbroek idn_stub_gethostbyaddr_r(GHBA_ADDR_T addr, GHBA_ADDRLEN_T len, int type,
251*00b67f09SDavid van Moolenbroek 			 struct hostent *result, char *buffer,
252*00b67f09SDavid van Moolenbroek 			 size_t buflen, struct hostent **rp, int *errp)
253*00b67f09SDavid van Moolenbroek {
254*00b67f09SDavid van Moolenbroek 	static int (*fp)(GHBA_ADDR_T addr, GHBA_ADDRLEN_T len, int type,
255*00b67f09SDavid van Moolenbroek 			 struct hostent *result, char *buffer,
256*00b67f09SDavid van Moolenbroek 			 size_t buflen, struct hostent **rp, int *errp);
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
259*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyaddr_r");
260*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
261*00b67f09SDavid van Moolenbroek 		return ((*fp)(addr, len, type, result,
262*00b67f09SDavid van Moolenbroek 			      buffer, buflen, rp, errp));
263*00b67f09SDavid van Moolenbroek 	return (ENOENT);	/* ??? */
264*00b67f09SDavid van Moolenbroek }
265*00b67f09SDavid van Moolenbroek #endif
266*00b67f09SDavid van Moolenbroek 
267*00b67f09SDavid van Moolenbroek #else /* GETHOST_R_GLIBC_FLAVOR */
268*00b67f09SDavid van Moolenbroek 
269*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYNAME_R
270*00b67f09SDavid van Moolenbroek struct hostent *
idn_stub_gethostbyname_r(const char * name,struct hostent * result,char * buffer,int buflen,int * errp)271*00b67f09SDavid van Moolenbroek idn_stub_gethostbyname_r(const char *name, struct hostent *result,
272*00b67f09SDavid van Moolenbroek 			 char *buffer, int buflen, int *errp)
273*00b67f09SDavid van Moolenbroek {
274*00b67f09SDavid van Moolenbroek 	static struct hostent *(*fp)(const char *name, struct hostent *result,
275*00b67f09SDavid van Moolenbroek 				     char *buffer, int buflen, int *errp);
276*00b67f09SDavid van Moolenbroek 
277*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
278*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyname_r");
279*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
280*00b67f09SDavid van Moolenbroek 		return ((*fp)(name, result, buffer, buflen, errp));
281*00b67f09SDavid van Moolenbroek 	return (NULL);
282*00b67f09SDavid van Moolenbroek }
283*00b67f09SDavid van Moolenbroek #endif
284*00b67f09SDavid van Moolenbroek 
285*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETHOSTBYADDR_R
286*00b67f09SDavid van Moolenbroek struct hostent *
idn_stub_gethostbyaddr_r(GHBA_ADDR_T addr,int len,int type,struct hostent * result,char * buffer,int buflen,int * errp)287*00b67f09SDavid van Moolenbroek idn_stub_gethostbyaddr_r(GHBA_ADDR_T addr, int len, int type,
288*00b67f09SDavid van Moolenbroek 			 struct hostent *result, char *buffer,
289*00b67f09SDavid van Moolenbroek 			 int buflen, int *errp)
290*00b67f09SDavid van Moolenbroek {
291*00b67f09SDavid van Moolenbroek 	static struct hostent *(*fp)(GHBA_ADDR_T addr, int len, int type,
292*00b67f09SDavid van Moolenbroek 				     struct hostent *result, char *buffer,
293*00b67f09SDavid van Moolenbroek 				     int buflen, int *errp);
294*00b67f09SDavid van Moolenbroek 
295*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
296*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("gethostbyaddr_r");
297*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
298*00b67f09SDavid van Moolenbroek 		return ((*fp)(addr, len, type, result, buffer, buflen, errp));
299*00b67f09SDavid van Moolenbroek 	return (NULL);
300*00b67f09SDavid van Moolenbroek }
301*00b67f09SDavid van Moolenbroek #endif
302*00b67f09SDavid van Moolenbroek 
303*00b67f09SDavid van Moolenbroek #endif /* GETHOST_R_GLIBC_FLAVOR */
304*00b67f09SDavid van Moolenbroek 
305*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETIPNODEBYNAME
306*00b67f09SDavid van Moolenbroek struct hostent *
idn_stub_getipnodebyname(const char * name,int af,int flags,int * errp)307*00b67f09SDavid van Moolenbroek idn_stub_getipnodebyname(const char *name, int af, int flags, int *errp) {
308*00b67f09SDavid van Moolenbroek 	static struct hostent *(*fp)(const char *name, int af, int flags,
309*00b67f09SDavid van Moolenbroek 				     int *errp);
310*00b67f09SDavid van Moolenbroek 
311*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
312*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("getipnodebyname");
313*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
314*00b67f09SDavid van Moolenbroek 		return ((*fp)(name, af, flags, errp));
315*00b67f09SDavid van Moolenbroek 	return (NULL);
316*00b67f09SDavid van Moolenbroek }
317*00b67f09SDavid van Moolenbroek #endif
318*00b67f09SDavid van Moolenbroek 
319*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETIPNODEBYADDR
320*00b67f09SDavid van Moolenbroek struct hostent *
idn_stub_getipnodebyaddr(const void * src,size_t len,int af,int * errp)321*00b67f09SDavid van Moolenbroek idn_stub_getipnodebyaddr(const void *src, size_t len, int af, int *errp) {
322*00b67f09SDavid van Moolenbroek 	static struct hostent *(*fp)(const void *src, size_t len, int af,
323*00b67f09SDavid van Moolenbroek 				     int *errp);
324*00b67f09SDavid van Moolenbroek 
325*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
326*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("getipnodebyaddr");
327*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
328*00b67f09SDavid van Moolenbroek 		return ((*fp)(src, len, af, errp));
329*00b67f09SDavid van Moolenbroek 	return (NULL);
330*00b67f09SDavid van Moolenbroek }
331*00b67f09SDavid van Moolenbroek #endif
332*00b67f09SDavid van Moolenbroek 
333*00b67f09SDavid van Moolenbroek #ifdef HAVE_FREEHOSTENT
334*00b67f09SDavid van Moolenbroek void
idn_stub_freehostent(struct hostent * hp)335*00b67f09SDavid van Moolenbroek idn_stub_freehostent(struct hostent *hp) {
336*00b67f09SDavid van Moolenbroek 	static void (*fp)(struct hostent *hp);
337*00b67f09SDavid van Moolenbroek 
338*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
339*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("freehostent");
340*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
341*00b67f09SDavid van Moolenbroek 		(*fp)(hp);
342*00b67f09SDavid van Moolenbroek }
343*00b67f09SDavid van Moolenbroek #endif
344*00b67f09SDavid van Moolenbroek 
345*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETADDRINFO
346*00b67f09SDavid van Moolenbroek int
idn_stub_getaddrinfo(const char * nodename,const char * servname,const struct addrinfo * hints,struct addrinfo ** res)347*00b67f09SDavid van Moolenbroek idn_stub_getaddrinfo(const char *nodename, const char *servname,
348*00b67f09SDavid van Moolenbroek 		     const struct addrinfo *hints, struct addrinfo **res)
349*00b67f09SDavid van Moolenbroek {
350*00b67f09SDavid van Moolenbroek 	static int (*fp)(const char *nodename, const char *servname,
351*00b67f09SDavid van Moolenbroek 			 const struct addrinfo *hints, struct addrinfo **res);
352*00b67f09SDavid van Moolenbroek 
353*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
354*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("getaddrinfo");
355*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
356*00b67f09SDavid van Moolenbroek 		return ((*fp)(nodename, servname, hints, res));
357*00b67f09SDavid van Moolenbroek 	return (EAI_FAIL);
358*00b67f09SDavid van Moolenbroek }
359*00b67f09SDavid van Moolenbroek #endif
360*00b67f09SDavid van Moolenbroek 
361*00b67f09SDavid van Moolenbroek #ifdef HAVE_FREEADDRINFO
362*00b67f09SDavid van Moolenbroek void
idn_stub_freeaddrinfo(struct addrinfo * aip)363*00b67f09SDavid van Moolenbroek idn_stub_freeaddrinfo(struct addrinfo *aip) {
364*00b67f09SDavid van Moolenbroek 	static void (*fp)(struct addrinfo *aip);
365*00b67f09SDavid van Moolenbroek 
366*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
367*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("freeaddrinfo");
368*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
369*00b67f09SDavid van Moolenbroek 		(*fp)(aip);
370*00b67f09SDavid van Moolenbroek }
371*00b67f09SDavid van Moolenbroek #endif
372*00b67f09SDavid van Moolenbroek 
373*00b67f09SDavid van Moolenbroek #ifdef HAVE_GETNAMEINFO
374*00b67f09SDavid van Moolenbroek int
idn_stub_getnameinfo(const struct sockaddr * sa,GNI_SALEN_T salen,char * host,GNI_HOSTLEN_T hostlen,char * serv,GNI_SERVLEN_T servlen,GNI_FLAGS_T flags)375*00b67f09SDavid van Moolenbroek idn_stub_getnameinfo(const struct sockaddr *sa, GNI_SALEN_T salen,
376*00b67f09SDavid van Moolenbroek 		     char *host, GNI_HOSTLEN_T hostlen,
377*00b67f09SDavid van Moolenbroek 		     char *serv, GNI_SERVLEN_T servlen, GNI_FLAGS_T flags) {
378*00b67f09SDavid van Moolenbroek 	static int (*fp)(const struct sockaddr *sa, GNI_SALEN_T salen,
379*00b67f09SDavid van Moolenbroek 			 char *host, GNI_HOSTLEN_T hostlen,
380*00b67f09SDavid van Moolenbroek 			 char *serv, GNI_SERVLEN_T servlen,
381*00b67f09SDavid van Moolenbroek 			 GNI_FLAGS_T flags);
382*00b67f09SDavid van Moolenbroek 
383*00b67f09SDavid van Moolenbroek 	if (fp == NULL)
384*00b67f09SDavid van Moolenbroek 		fp = get_func_addr("getnameinfo");
385*00b67f09SDavid van Moolenbroek 	if (fp != NULL)
386*00b67f09SDavid van Moolenbroek 		return ((*fp)(sa, salen, host, hostlen, serv, servlen, flags));
387*00b67f09SDavid van Moolenbroek 	return (EAI_FAIL);
388*00b67f09SDavid van Moolenbroek }
389*00b67f09SDavid van Moolenbroek #endif
390