diff options
Diffstat (limited to 'src/gns/nss/nss_gns.c')
-rw-r--r-- | src/gns/nss/nss_gns.c | 88 |
1 files changed, 20 insertions, 68 deletions
diff --git a/src/gns/nss/nss_gns.c b/src/gns/nss/nss_gns.c index 0fe8a75ba..2e55980ff 100644 --- a/src/gns/nss/nss_gns.c +++ b/src/gns/nss/nss_gns.c | |||
@@ -32,53 +32,29 @@ | |||
32 | 32 | ||
33 | #include "query.h" | 33 | #include "query.h" |
34 | 34 | ||
35 | #ifdef NSS_IPV4_ONLY | 35 | #include <arpa/inet.h> |
36 | #define _nss_mdns_gethostbyname2_r _nss_gns4_minimal_gethostbyname2_r | ||
37 | #define _nss_mdns_gethostbyname_r _nss_gns4_minimal_gethostbyname_r | ||
38 | #define _nss_mdns_gethostbyaddr_r _nss_gns4_minimal_gethostbyaddr_r | ||
39 | #endif | ||
40 | |||
41 | #ifdef NSS_IPV6_ONLY | ||
42 | #define _nss_mdns_gethostbyname2_r _nss_gns6_gethostbyname2_r | ||
43 | #define _nss_mdns_gethostbyname_r _nss_gns6_gethostbyname_r | ||
44 | #define _nss_mdns_gethostbyaddr_r _nss_gns6_gethostbyaddr_r | ||
45 | #endif | ||
46 | |||
47 | #ifndef NSS_IPV4_ONLY | ||
48 | #ifndef NSS_IPV6_ONLY | ||
49 | #define _nss_mdns_gethostbyname2_r _nss_gns_gethostbyname2_r | ||
50 | #define _nss_mdns_gethostbyname_r _nss_gns_gethostbyname_r | ||
51 | #define _nss_mdns_gethostbyaddr_r _nss_gns_gethostbyaddr_r | ||
52 | #endif | ||
53 | #endif | ||
54 | |||
55 | /* Maximum number of entries to return */ | ||
56 | #define MAX_ENTRIES 16 | ||
57 | 36 | ||
58 | #define ALIGN(idx) do { \ | 37 | #define ALIGN(idx) do { \ |
59 | if (idx % sizeof(void*)) \ | 38 | if (idx % sizeof(void*)) \ |
60 | idx += (sizeof(void*) - idx % sizeof(void*)); /* Align on 32 bit boundary */ \ | 39 | idx += (sizeof(void*) - idx % sizeof(void*)); /* Align on 32 bit boundary */ \ |
61 | } while(0) | 40 | } while(0) |
62 | 41 | ||
63 | struct userdata { | ||
64 | int count; | ||
65 | int data_len; /* only valid when doing reverse lookup */ | ||
66 | union { | ||
67 | ipv4_address_t ipv4[MAX_ENTRIES]; | ||
68 | ipv6_address_t ipv6[MAX_ENTRIES]; | ||
69 | char *name[MAX_ENTRIES]; | ||
70 | } data; | ||
71 | }; | ||
72 | |||
73 | #ifndef NSS_IPV6_ONLY | 42 | #ifndef NSS_IPV6_ONLY |
74 | static void ipv4_callback(const ipv4_address_t *ipv4, void *userdata) { | 43 | static void ipv4_callback(const ipv4_address_t *ipv4, void *userdata) { |
75 | struct userdata *u = userdata; | 44 | struct userdata *u = userdata; |
76 | assert(ipv4 && userdata); | 45 | |
46 | /*test!*/ | ||
47 | ipv4_address_t *ipv4_test; | ||
48 | struct in_addr testaddr; | ||
49 | inet_pton(AF_INET, "5.5.5.5", &testaddr); | ||
50 | ipv4_test = (ipv4_address_t *)&testaddr; | ||
51 | /*test!*/ | ||
52 | /*assert(ipv4 && userdata);*/ | ||
77 | 53 | ||
78 | if (u->count >= MAX_ENTRIES) | 54 | if (u->count >= MAX_ENTRIES) |
79 | return; | 55 | return; |
80 | 56 | ||
81 | u->data.ipv4[u->count++] = *ipv4; | 57 | u->data.ipv4[u->count++] = *ipv4_test; |
82 | u->data_len += sizeof(ipv4_address_t); | 58 | u->data_len += sizeof(ipv4_address_t); |
83 | } | 59 | } |
84 | #endif | 60 | #endif |
@@ -135,9 +111,9 @@ enum nss_status _nss_gns_gethostbyname2_r( | |||
135 | enum nss_status status = NSS_STATUS_UNAVAIL; | 111 | enum nss_status status = NSS_STATUS_UNAVAIL; |
136 | int i; | 112 | int i; |
137 | size_t address_length, l, idx, astart; | 113 | size_t address_length, l, idx, astart; |
138 | void (*ipv4_func)(const ipv4_address_t *ipv4, void *userdata); | ||
139 | void (*ipv6_func)(const ipv6_address_t *ipv6, void *userdata); | ||
140 | int name_allowed; | 114 | int name_allowed; |
115 | |||
116 | printf("v6: %d\n", af == AF_INET6); | ||
141 | 117 | ||
142 | if (af == AF_UNSPEC) | 118 | if (af == AF_UNSPEC) |
143 | #ifdef NSS_IPV6_ONLY | 119 | #ifdef NSS_IPV6_ONLY |
@@ -175,43 +151,25 @@ enum nss_status _nss_gns_gethostbyname2_r( | |||
175 | u.count = 0; | 151 | u.count = 0; |
176 | u.data_len = 0; | 152 | u.data_len = 0; |
177 | 153 | ||
178 | #ifdef NSS_IPV6_ONLY | ||
179 | ipv4_func = NULL; | ||
180 | #else | ||
181 | ipv4_func = af == AF_INET ? ipv4_callback : NULL; | ||
182 | #endif | ||
183 | |||
184 | #ifdef NSS_IPV4_ONLY | ||
185 | ipv6_func = NULL; | ||
186 | #else | ||
187 | ipv6_func = af == AF_INET6 ? ipv6_callback : NULL; | ||
188 | #endif | ||
189 | |||
190 | #ifdef ENABLE_GNS | ||
191 | name_allowed = verify_name_allowed(name); | 154 | name_allowed = verify_name_allowed(name); |
192 | 155 | ||
193 | if (gns_works && name_allowed) { | 156 | if (name_allowed) { |
194 | int r; | 157 | |
195 | 158 | if (gns_resolve_name(af, name, &u) == 0) | |
196 | if ((r = gns_resolve_name(af, name, data)) < 0) | 159 | { |
197 | gns_works = 0; | 160 | printf("GNS success\n"); |
198 | else if (r == 0) { | ||
199 | if (af == AF_INET && ipv4_func) | ||
200 | ipv4_func((ipv4_address_t*) data, &u); | ||
201 | if (af == AF_INET6 && ipv6_func) | ||
202 | ipv6_func((ipv6_address_t*)data, &u); | ||
203 | } else | 161 | } else |
204 | status = NSS_STATUS_NOTFOUND; | 162 | status = NSS_STATUS_NOTFOUND; |
205 | } | 163 | } |
206 | 164 | ||
207 | #endif /* ENABLE_GNS */ | ||
208 | |||
209 | if (u.count == 0) { | 165 | if (u.count == 0) { |
210 | *errnop = ETIMEDOUT; | 166 | *errnop = ETIMEDOUT; |
211 | *h_errnop = HOST_NOT_FOUND; | 167 | *h_errnop = HOST_NOT_FOUND; |
168 | printf("not found\n"); | ||
212 | goto finish; | 169 | goto finish; |
213 | } | 170 | } |
214 | 171 | ||
172 | |||
215 | /* Alias names */ | 173 | /* Alias names */ |
216 | *((char**) buffer) = NULL; | 174 | *((char**) buffer) = NULL; |
217 | result->h_aliases = (char**) buffer; | 175 | result->h_aliases = (char**) buffer; |
@@ -285,17 +243,11 @@ enum nss_status _nss_gns_gethostbyaddr_r( | |||
285 | 243 | ||
286 | /* we dont do this */ | 244 | /* we dont do this */ |
287 | 245 | ||
288 | struct userdata u; | ||
289 | enum nss_status status = NSS_STATUS_UNAVAIL; | 246 | enum nss_status status = NSS_STATUS_UNAVAIL; |
290 | int r; | ||
291 | size_t address_length, idx, astart; | ||
292 | 247 | ||
293 | *errnop = EINVAL; | 248 | *errnop = EINVAL; |
294 | *h_errnop = NO_RECOVERY; | 249 | *h_errnop = NO_RECOVERY; |
295 | 250 | ||
296 | u.count = 0; | ||
297 | u.data_len = 0; | ||
298 | |||
299 | /* Check for address types */ | 251 | /* Check for address types */ |
300 | 252 | ||
301 | *h_errnop = NO_RECOVERY; | 253 | *h_errnop = NO_RECOVERY; |