1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <assert.h>
20: #include <errno.h>
21: #include <bits/libc-lock.h>
22: #include <stdlib.h>
23: #include <resolv.h>
24:
25: #include "nsswitch.h"
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52: #define REENTRANT_NAME APPEND_R (FUNCTION_NAME)
53: #define APPEND_R(name) APPEND_R1 (name)
54: #define APPEND_R1(name) name##_r
55: #define INTERNAL(name) INTERNAL1 (name)
56: #define INTERNAL1(name) __##name
57:
58:
59: #ifdef NEED_H_ERRNO
60: # define H_ERRNO_PARM , int *h_errnop
61: # define H_ERRNO_VAR , &h_errno_tmp
62: # define H_ERRNO_VAR_P &h_errno_tmp
63: #else
64: # define H_ERRNO_PARM
65: # define H_ERRNO_VAR
66: # define H_ERRNO_VAR_P NULL
67: #endif
68:
69: #ifdef HAVE_AF
70: # define AF_VAL af
71: #else
72: # define AF_VAL AF_INET
73: #endif
74:
75:
76: extern int INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf,
77: char *buffer, size_t buflen,
78: LOOKUP_TYPE **result H_ERRNO_PARM);
79:
80:
81: __libc_lock_define_initialized (static, lock);
82:
83:
84: libc_freeres_ptr (static char *buffer);
85:
86:
87: LOOKUP_TYPE *
88: FUNCTION_NAME (ADD_PARAMS)
89: {
90: static size_t buffer_size;
91: static LOOKUP_TYPE resbuf;
92: LOOKUP_TYPE *result;
93: #ifdef NEED_H_ERRNO
94: int h_errno_tmp = 0;
95: #endif
96:
97:
98: __libc_lock_lock (lock);
99:
100: if (buffer == NULL)
101: {
102: buffer_size = BUFLEN;
103: buffer = (char *) malloc (buffer_size);
104: }
105:
106: #ifdef HANDLE_DIGITS_DOTS
107: if (buffer != NULL)
108: {
109: if (__nss_hostname_digits_dots (name, &resbuf, &buffer,
110: &buffer_size, 0, &result, NULL, AF_VAL,
111: H_ERRNO_VAR_P))
112: goto done;
113: }
114: #endif
115:
116: while (buffer != NULL
117: && (INTERNAL (REENTRANT_NAME) (ADD_VARIABLES, &resbuf, buffer,
118: buffer_size, &result H_ERRNO_VAR)
119: == ERANGE)
120: #ifdef NEED_H_ERRNO
121: && h_errno_tmp == NETDB_INTERNAL
122: #endif
123: )
124: {
125: char *new_buf;
126: buffer_size *= 2;
127: new_buf = (char *) realloc (buffer, buffer_size);
128: if (new_buf == NULL)
129: {
130:
131:
132: free (buffer);
133: __set_errno (ENOMEM);
134: }
135: buffer = new_buf;
136: }
137:
138: if (buffer == NULL)
139: result = NULL;
140:
141: #ifdef HANDLE_DIGITS_DOTS
142: done:
143: #endif
144:
145: __libc_lock_unlock (lock);
146:
147: #ifdef NEED_H_ERRNO
148: if (h_errno_tmp != 0)
149: __set_h_errno (h_errno_tmp);
150: #endif
151:
152: return result;
153: }
154:
155: static_link_warning (FUNCTION_NAME)