From 2912ade365b2f3192f42af5aca9edd29256e0956 Mon Sep 17 00:00:00 2001 From: Martin Schanzenbach Date: Tue, 8 May 2012 12:02:49 +0000 Subject: [PATCH] -nss build files --- src/gns/Makefile.am | 2 + src/gns/nss/Makefile.am | 57 +++++++++++ src/gns/nss/map-file | 14 +++ src/gns/nss/nss_gns.c | 7 +- src/gns/nss/query.h | 56 +++++++++++ src/gns/nss/util.c | 207 ++++++++++++++++++++++++++++++++++++++++ src/gns/nss/util.h | 47 +++++++++ 7 files changed, 386 insertions(+), 4 deletions(-) create mode 100644 src/gns/nss/Makefile.am create mode 100644 src/gns/nss/map-file create mode 100644 src/gns/nss/query.h create mode 100644 src/gns/nss/util.c create mode 100644 src/gns/nss/util.h diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am index 64529b008..cc137c2dd 100644 --- a/src/gns/Makefile.am +++ b/src/gns/Makefile.am @@ -1,5 +1,7 @@ INCLUDES = -I$(top_srcdir)/src/include +#SUBDIRS=nss + if MINGW WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols endif diff --git a/src/gns/nss/Makefile.am b/src/gns/nss/Makefile.am new file mode 100644 index 000000000..f77743e5c --- /dev/null +++ b/src/gns/nss/Makefile.am @@ -0,0 +1,57 @@ +# $Id$ +# +# This file taken and modified from nss-gns. +# +# nss-gns is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# nss-gns is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with nss-gns; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. + +EXTRA_DIST = map-file + +# This cool debug trap works on i386/gcc only +AM_CFLAGS='-DDEBUG_TRAP=__asm__("int $$3")' + +AM_LDFLAGS=-avoid-version -module -export-dynamic + +lib_LTLIBRARIES = + +lib_LTLIBRARIES += \ + libnss_gns.la \ + libnss_gns4.la \ + libnss_gns6.la + +sources = util.c util.h query.h + +# GNU Libc +libnss_gns_la_SOURCES= $(sources) nss_gns.c +libnss_gns_la_CFLAGS=$(AM_CFLAGS) +libnss_gns_la_LDFLAGS=$(AM_LDFLAGS) -shrext .so.2 -Wl,-version-script=$(srcdir)/map-file + +libnss_gns4_la_SOURCES=$(libnss_gns_la_SOURCES) +libnss_gns4_la_CFLAGS=$(libnss_gns_la_CFLAGS) -DNSS_IPV4_ONLY=1 +libnss_gns4_la_LDFLAGS=$(libnss_gns_la_LDFLAGS) + +libnss_gns6_la_SOURCES=$(libnss_gns_la_SOURCES) +libnss_gns6_la_CFLAGS=$(libnss_gns_la_CFLAGS) -DNSS_IPV6_ONLY=1 +libnss_gns6_la_LDFLAGS=$(libnss_gns_la_LDFLAGS) + +install-exec-hook: + rm -f $(DESTDIR)$(libdir)/libnss_gns.la + rm -f $(DESTDIR)$(libdir)/libnss_gns4.la + rm -f $(DESTDIR)$(libdir)/libnss_gns6.la + +uninstall-hook: + rm -f $(DESTDIR)$(libdir)/libnss_gns.so.2 + rm -f $(DESTDIR)$(libdir)/libnss_gns4.so.2 + rm -f $(DESTDIR)$(libdir)/libnss_gns6.so.2 diff --git a/src/gns/nss/map-file b/src/gns/nss/map-file new file mode 100644 index 000000000..476d0ac3e --- /dev/null +++ b/src/gns/nss/map-file @@ -0,0 +1,14 @@ +NSSGNS_0 { +global: +_nss_gns_gethostbyaddr_r; +_nss_gns4_gethostbyaddr_r; +_nss_gns6_gethostbyaddr_r; +_nss_gns_gethostbyname_r; +_nss_gns4_gethostbyname_r; +_nss_gns6_gethostbyname_r; +_nss_gns_gethostbyname2_r; +_nss_gns4_gethostbyname2_r; +_nss_gns6_gethostbyname2_r; +local: +*; +}; diff --git a/src/gns/nss/nss_gns.c b/src/gns/nss/nss_gns.c index 9755ea111..0fe8a75ba 100644 --- a/src/gns/nss/nss_gns.c +++ b/src/gns/nss/nss_gns.c @@ -19,10 +19,7 @@ USA. ***/ -#ifdef HAVE_CONFIG_H -#include -#endif - +#include #include #include #include @@ -33,6 +30,8 @@ #include #include +#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 diff --git a/src/gns/nss/query.h b/src/gns/nss/query.h new file mode 100644 index 000000000..03148f60b --- /dev/null +++ b/src/gns/nss/query.h @@ -0,0 +1,56 @@ +#ifndef fooqueryhfoo +#define fooqueryhfoo + +/* $Id$ */ + +/*** + This file is part of nss-mdns. + + nss-mdns is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + nss-mdns is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with nss-mdns; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include + +typedef struct { + uint32_t address; +} ipv4_address_t; + +typedef struct { + uint8_t address[16]; +} ipv6_address_t; + +int gns_open_socket(void); + +int gns_query_name(int fd, + 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 + +#endif diff --git a/src/gns/nss/util.c b/src/gns/nss/util.c new file mode 100644 index 000000000..7349d6b1f --- /dev/null +++ b/src/gns/nss/util.c @@ -0,0 +1,207 @@ +/* $Id$ */ + +/*** + This file is part of nss-mdns. + + nss-mdns is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + nss-mdns is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with nss-mdns; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include + +#include +#include +#include +#include +#include + +#include "util.h" + +#ifdef ENABLE_LEGACY + +/* Calculate the difference between the two specfified timeval + * timestamsps. */ +usec_t timeval_diff(const struct timeval *a, const struct timeval *b) { + usec_t r; + assert(a && b); + + /* Check which whan is the earlier time and swap the two arguments if reuqired. */ + if (timeval_cmp(a, b) < 0) { + const struct timeval *c; + c = a; + a = b; + b = c; + } + + /* Calculate the second difference*/ + r = ((usec_t) a->tv_sec - b->tv_sec)* 1000000; + + /* Calculate the microsecond difference */ + if (a->tv_usec > b->tv_usec) + r += ((usec_t) a->tv_usec - b->tv_usec); + else if (a->tv_usec < b->tv_usec) + r -= ((usec_t) b->tv_usec - a->tv_usec); + + return r; +} + +/* Compare the two timeval structs and return 0 when equal, negative when a < b, positive otherwse */ +int timeval_cmp(const struct timeval *a, const struct timeval *b) { + assert(a && b); + + if (a->tv_sec < b->tv_sec) + return -1; + + if (a->tv_sec > b->tv_sec) + return 1; + + if (a->tv_usec < b->tv_usec) + return -1; + + if (a->tv_usec > b->tv_usec) + return 1; + + return 0; +} + +/* Return the time difference between now and the specified timestamp */ +usec_t timeval_age(const struct timeval *tv) { + struct timeval now; + assert(tv); + gettimeofday(&now, NULL); + return timeval_diff(&now, tv); +} + +/* Add the specified time inmicroseconds to the specified timeval structure */ +void timeval_add(struct timeval *tv, usec_t v) { + unsigned long secs; + assert(tv); + + secs = (v/1000000); + tv->tv_sec += (unsigned long) secs; + v -= secs*1000000; + + tv->tv_usec += v; + + /* Normalize */ + while (tv->tv_usec >= 1000000) { + tv->tv_sec++; + tv->tv_usec -= 1000000; + } +} + +int set_nonblock(int fd) { + int n; + assert(fd >= 0); + + if ((n = fcntl(fd, F_GETFL)) < 0) + return -1; + + if (n & O_NONBLOCK) + return 0; + + return fcntl(fd, F_SETFL, n|O_NONBLOCK); +} + +int wait_for_write(int fd, struct timeval *end) { + struct timeval now; + + if (end) + gettimeofday(&now, NULL); + + for (;;) { + struct timeval tv; + fd_set fds; + int r; + + FD_ZERO(&fds); + FD_SET(fd, &fds); + + if (end) { + if (timeval_cmp(&now, end) >= 0) + return 1; + + tv.tv_sec = tv.tv_usec = 0; + timeval_add(&tv, timeval_diff(end, &now)); + } + + if ((r = select(fd+1, NULL, &fds, NULL, end ? &tv : NULL)) < 0) { + if (errno != EINTR) + return -1; + } else if (r == 0) + return 1; + else { + if (FD_ISSET(fd, &fds)) + return 0; + } + + if (end) + gettimeofday(&now, NULL); + } +} + +int wait_for_read(int fd, struct timeval *end) { + struct timeval now; + + if (end) + gettimeofday(&now, NULL); + + for (;;) { + struct timeval tv; + fd_set fds; + int r; + + FD_ZERO(&fds); + FD_SET(fd, &fds); + + if (end) { + if (timeval_cmp(&now, end) >= 0) + return 1; + + tv.tv_sec = tv.tv_usec = 0; + timeval_add(&tv, timeval_diff(end, &now)); + } + + if ((r = select(fd+1, &fds, NULL, NULL, end ? &tv : NULL)) < 0) { + if (errno != EINTR) + return -1; + } else if (r == 0) + return 1; + else { + + if (FD_ISSET(fd, &fds)) + return 0; + } + + if (end) + gettimeofday(&now, NULL); + } +} + +#endif + +int set_cloexec(int fd) { + int n; + assert(fd >= 0); + + if ((n = fcntl(fd, F_GETFD)) < 0) + return -1; + + if (n & FD_CLOEXEC) + return 0; + + return fcntl(fd, F_SETFD, n|FD_CLOEXEC); +} + diff --git a/src/gns/nss/util.h b/src/gns/nss/util.h new file mode 100644 index 000000000..e2334ad23 --- /dev/null +++ b/src/gns/nss/util.h @@ -0,0 +1,47 @@ +#ifndef fooutilhfoo +#define fooutilhfoo + +/* $Id$ */ + +/*** + This file is part of nss-mdns. + + nss-mdns is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + nss-mdns is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with nss-mdns; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include +#include +#include + +#ifdef ENABLE_LEGACY +typedef uint64_t usec_t; + +usec_t timeval_diff(const struct timeval *a, const struct timeval *b); +int timeval_cmp(const struct timeval *a, const struct timeval *b); +usec_t timeval_age(const struct timeval *tv); +void timeval_add(struct timeval *tv, usec_t v); + +int set_nonblock(int fd); + +int wait_for_write(int fd, struct timeval *end); +int wait_for_read(int fd, struct timeval *end); + +#endif + +int set_cloexec(int fd); + + +#endif -- 2.25.1