aboutsummaryrefslogtreecommitdiff
path: root/src/gns/nss/nss_gns.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gns/nss/nss_gns.c')
-rw-r--r--src/gns/nss/nss_gns.c88
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
63struct 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
74static void ipv4_callback(const ipv4_address_t *ipv4, void *userdata) { 43static 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;