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