From d264f516533751356e265a70b9f9e5ae23dd3bdc Mon Sep 17 00:00:00 2001 From: Martin Schanzenbach Date: Tue, 8 May 2012 15:11:29 +0000 Subject: [PATCH] -preliminary nss plugin AKA works for me --- src/gns/nss/Makefile.am | 4 +- src/gns/nss/nss_gns.c | 88 ++++++++++------------------------------- src/gns/nss/query.c | 49 +++++++++++++++++++++++ src/gns/nss/query.h | 33 +++++++--------- 4 files changed, 86 insertions(+), 88 deletions(-) create mode 100644 src/gns/nss/query.c diff --git a/src/gns/nss/Makefile.am b/src/gns/nss/Makefile.am index f77743e5c..a75a85670 100644 --- a/src/gns/nss/Makefile.am +++ b/src/gns/nss/Makefile.am @@ -31,11 +31,11 @@ lib_LTLIBRARIES += \ libnss_gns4.la \ libnss_gns6.la -sources = util.c util.h query.h +sources = util.c util.h query.h query.c # GNU Libc libnss_gns_la_SOURCES= $(sources) nss_gns.c -libnss_gns_la_CFLAGS=$(AM_CFLAGS) +libnss_gns_la_CFLAGS=$(AM_CFLAGS) -D_GNU_SOURCE libnss_gns_la_LDFLAGS=$(AM_LDFLAGS) -shrext .so.2 -Wl,-version-script=$(srcdir)/map-file libnss_gns4_la_SOURCES=$(libnss_gns_la_SOURCES) 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 @@ #include "query.h" -#ifdef NSS_IPV4_ONLY -#define _nss_mdns_gethostbyname2_r _nss_gns4_minimal_gethostbyname2_r -#define _nss_mdns_gethostbyname_r _nss_gns4_minimal_gethostbyname_r -#define _nss_mdns_gethostbyaddr_r _nss_gns4_minimal_gethostbyaddr_r -#endif - -#ifdef NSS_IPV6_ONLY -#define _nss_mdns_gethostbyname2_r _nss_gns6_gethostbyname2_r -#define _nss_mdns_gethostbyname_r _nss_gns6_gethostbyname_r -#define _nss_mdns_gethostbyaddr_r _nss_gns6_gethostbyaddr_r -#endif - -#ifndef NSS_IPV4_ONLY -#ifndef NSS_IPV6_ONLY -#define _nss_mdns_gethostbyname2_r _nss_gns_gethostbyname2_r -#define _nss_mdns_gethostbyname_r _nss_gns_gethostbyname_r -#define _nss_mdns_gethostbyaddr_r _nss_gns_gethostbyaddr_r -#endif -#endif - -/* Maximum number of entries to return */ -#define MAX_ENTRIES 16 +#include #define ALIGN(idx) do { \ if (idx % sizeof(void*)) \ idx += (sizeof(void*) - idx % sizeof(void*)); /* Align on 32 bit boundary */ \ } while(0) -struct userdata { - int count; - int data_len; /* only valid when doing reverse lookup */ - union { - ipv4_address_t ipv4[MAX_ENTRIES]; - ipv6_address_t ipv6[MAX_ENTRIES]; - char *name[MAX_ENTRIES]; - } data; -}; - #ifndef NSS_IPV6_ONLY static void ipv4_callback(const ipv4_address_t *ipv4, void *userdata) { struct userdata *u = userdata; - assert(ipv4 && userdata); + + /*test!*/ + ipv4_address_t *ipv4_test; + struct in_addr testaddr; + inet_pton(AF_INET, "5.5.5.5", &testaddr); + ipv4_test = (ipv4_address_t *)&testaddr; + /*test!*/ + /*assert(ipv4 && userdata);*/ if (u->count >= MAX_ENTRIES) return; - u->data.ipv4[u->count++] = *ipv4; + u->data.ipv4[u->count++] = *ipv4_test; u->data_len += sizeof(ipv4_address_t); } #endif @@ -135,9 +111,9 @@ enum nss_status _nss_gns_gethostbyname2_r( enum nss_status status = NSS_STATUS_UNAVAIL; int i; size_t address_length, l, idx, astart; - void (*ipv4_func)(const ipv4_address_t *ipv4, void *userdata); - void (*ipv6_func)(const ipv6_address_t *ipv6, void *userdata); int name_allowed; + + printf("v6: %d\n", af == AF_INET6); if (af == AF_UNSPEC) #ifdef NSS_IPV6_ONLY @@ -175,43 +151,25 @@ enum nss_status _nss_gns_gethostbyname2_r( u.count = 0; u.data_len = 0; -#ifdef NSS_IPV6_ONLY - ipv4_func = NULL; -#else - ipv4_func = af == AF_INET ? ipv4_callback : NULL; -#endif - -#ifdef NSS_IPV4_ONLY - ipv6_func = NULL; -#else - ipv6_func = af == AF_INET6 ? ipv6_callback : NULL; -#endif - -#ifdef ENABLE_GNS name_allowed = verify_name_allowed(name); - if (gns_works && name_allowed) { - int r; - - if ((r = gns_resolve_name(af, name, data)) < 0) - gns_works = 0; - else if (r == 0) { - if (af == AF_INET && ipv4_func) - ipv4_func((ipv4_address_t*) data, &u); - if (af == AF_INET6 && ipv6_func) - ipv6_func((ipv6_address_t*)data, &u); + if (name_allowed) { + + if (gns_resolve_name(af, name, &u) == 0) + { + printf("GNS success\n"); } else status = NSS_STATUS_NOTFOUND; } -#endif /* ENABLE_GNS */ - if (u.count == 0) { *errnop = ETIMEDOUT; *h_errnop = HOST_NOT_FOUND; + printf("not found\n"); goto finish; } - + + /* Alias names */ *((char**) buffer) = NULL; result->h_aliases = (char**) buffer; @@ -285,17 +243,11 @@ enum nss_status _nss_gns_gethostbyaddr_r( /* we dont do this */ - struct userdata u; enum nss_status status = NSS_STATUS_UNAVAIL; - int r; - size_t address_length, idx, astart; *errnop = EINVAL; *h_errnop = NO_RECOVERY; - u.count = 0; - u.data_len = 0; - /* Check for address types */ *h_errnop = NO_RECOVERY; diff --git a/src/gns/nss/query.c b/src/gns/nss/query.c new file mode 100644 index 000000000..231e0d877 --- /dev/null +++ b/src/gns/nss/query.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include "query.h" +#include + +int gns_resolve_name(int af, const char *name, struct userdata *u) +{ + FILE *p; + char *cmd; + char line[128]; + + if (af == AF_INET6) + asprintf(&cmd, "%s -t AAAA -u %s\n", "gnunet-gns -r", name); + else + asprintf(&cmd, "%s %s\n", "gnunet-gns -r -u", name); + + p = popen(cmd,"r"); + + if (p != NULL ) + { + while (fgets( line, sizeof(line), p ) != NULL) + { + + if (u->count >= MAX_ENTRIES) + break; + + if (line[strlen(line)-1] == '\n') + { + line[strlen(line)-1] = '\0'; + if (af == AF_INET) + { + inet_pton(af, line, &(u->data.ipv4[u->count++])); + u->data_len += sizeof(ipv4_address_t); + } + else if ((af == AF_INET6)) + { + inet_pton(af, line, &(u->data.ipv6[u->count++])); + u->data_len += sizeof(ipv6_address_t); + } + } + } + } + fclose(p); + free(cmd); + + return 0; + +} diff --git a/src/gns/nss/query.h b/src/gns/nss/query.h index 03148f60b..ab8b6cb43 100644 --- a/src/gns/nss/query.h +++ b/src/gns/nss/query.h @@ -24,6 +24,9 @@ #include +/* Maximum number of entries to return */ +#define MAX_ENTRIES 16 + typedef struct { uint32_t address; } ipv4_address_t; @@ -32,25 +35,19 @@ typedef struct { uint8_t address[16]; } ipv6_address_t; -int gns_open_socket(void); -int gns_query_name(int fd, +struct userdata { + int count; + int data_len; /* only valid when doing reverse lookup */ + union { + ipv4_address_t ipv4[MAX_ENTRIES]; + ipv6_address_t ipv6[MAX_ENTRIES]; + char *name[MAX_ENTRIES]; + } data; +}; + +int gns_resolve_name(int af, const char *name, - void (*ipv4_func)(const ipv4_address_t *ipv4, void *userdata), - void (*ipv6_func)(const ipv6_address_t *ipv6, void *userdata), - void *userdata); - -#ifndef NSS_IPV6_ONLY -int gns_query_ipv4(int fd, - const ipv4_address_t *ipv4, - void (*name_func)(const char *name, void *userdata), - void *userdata); -#endif -#ifndef NSS_IPV4_ONLY -int gns_query_ipv6(int fd, - const ipv6_address_t *ipv6, - void (*name_func)(const char *name, void *userdata), - void *userdata); -#endif + struct userdata *userdata); #endif -- 2.25.1