The branch, master has been updated
       via  83948bc nwrap: Add a destructor to free resources.
       via  50b0fd9 cmake: Check for printf format attribute.
      from  4ad5d31 cmake: Fix the env name for the module variables.

http://gitweb.samba.org/?p=nss_wrapper.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 83948bc7c16bbb4ceefaf4e1f4634e8510c2d3ad
Author: Andreas Schneider <[email protected]>
Date:   Fri Dec 20 10:35:38 2013 +0100

    nwrap: Add a destructor to free resources.

commit 50b0fd9153dd2ffe7ec5428e5b64d87406a76130
Author: Andreas Schneider <[email protected]>
Date:   Fri Dec 20 09:33:00 2013 +0100

    cmake: Check for printf format attribute.

-----------------------------------------------------------------------

Summary of changes:
 ConfigureChecks.cmake |   19 +++++++++++
 config.h.cmake        |    3 ++
 src/nss_wrapper.c     |   87 +++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 107 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 8c7539a..afee1f8 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -218,6 +218,25 @@ int main(void) {
     return 0;
 }" HAVE_IPV6)
 
+check_c_source_compiles("
+void log_fn(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+int main(void) {
+    return 0;
+}" HAVE_ATTRIBUTE_PRINTF_FORMAT)
+
+check_c_source_compiles("
+void test_destructor_attribute(void) __attribute__ ((destructor));
+
+void test_destructor_attribute(void)
+{
+    return;
+}
+
+int main(void) {
+    return 0;
+}" HAVE_DESTRUCTOR_ATTRIBUTE)
+
 check_library_exists(dl dlopen "" HAVE_LIBDL)
 if (HAVE_LIBDL)
     find_library(DLFCN_LIBRARY dl)
diff --git a/config.h.cmake b/config.h.cmake
index 1fd9281..06e5738 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -78,6 +78,9 @@
 #cmakedefine HAVE_STRUCT_SOCKADDR_SA_LEN 1
 #cmakedefine HAVE_IPV6 1
 
+#cmakedefine HAVE_ATTRIBUTE_PRINTF_FORMAT 1
+#cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1
+
 /*************************** ENDIAN *****************************/
 
 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
diff --git a/src/nss_wrapper.c b/src/nss_wrapper.c
index 3e6d072..6b50c68 100644
--- a/src/nss_wrapper.c
+++ b/src/nss_wrapper.c
@@ -122,11 +122,17 @@ typedef nss_status_t NSS_STATUS;
 #endif
 
 /* GCC have printf type attribute check. */
-#ifdef __GNUC__
+#ifdef HAVE_ATTRIBUTE_PRINTF_FORMAT
 #define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
 #else
 #define PRINTF_ATTRIBUTE(a,b)
-#endif /* __GNUC__ */
+#endif /* HAVE_ATTRIBUTE_PRINTF_FORMAT */
+
+#ifdef HAVE_DESTRUCTOR_ATTRIBUTE
+#define DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
+#else
+#define DESTRUCTOR_ATTRIBUTE
+#endif /* HAVE_DESTRUCTOR_ATTRIBUTE */
 
 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, 
sizeof(*(x))); } while(0)
 
@@ -505,9 +511,15 @@ struct nwrap_he {
 struct nwrap_cache __nwrap_cache_he;
 struct nwrap_he nwrap_he_global;
 
+
+/*********************************************************
+ * NWRAP PROTOTYPES
+ *********************************************************/
+
 static void nwrap_init(void);
 static bool nwrap_gr_parse_line(struct nwrap_cache *nwrap, char *line);
 static void nwrap_gr_unload(struct nwrap_cache *nwrap);
+void nwrap_destructor(void) DESTRUCTOR_ATTRIBUTE;
 
 /*********************************************************
  * NWRAP LIBC LOADER FUNCTIONS
@@ -4127,3 +4139,74 @@ int gethostname(char *name, size_t len)
 
        return nwrap_gethostname(name, len);
 }
+
+/****************************
+ * DESTRUCTOR
+ ***************************/
+
+/*
+ * This function is called when the library is unloaded and makes sure that
+ * sockets get closed and the unix file for the socket are unlinked.
+ */
+void nwrap_destructor(void)
+{
+       int i;
+
+       if (nwrap_main_global != NULL) {
+               struct nwrap_main *m = nwrap_main_global;
+
+               /* libc */
+               SAFE_FREE(m->libc->fns);
+               if (m->libc->handle != NULL) {
+                       dlclose(m->libc->handle);
+               }
+               if (m->libc->nsl_handle != NULL) {
+                       dlclose(m->libc->nsl_handle);
+               }
+               if (m->libc->sock_handle != NULL) {
+                       dlclose(m->libc->sock_handle);
+               }
+               SAFE_FREE(m->libc);
+
+               /* backends */
+               for (i = 0; i < m->num_backends; i++) {
+                       struct nwrap_backend *b = &(m->backends[i]);
+
+                       if (b->so_handle != NULL) {
+                               dlclose(b->so_handle);
+                       }
+                       SAFE_FREE(b->fns);
+               }
+               SAFE_FREE(m->backends);
+       }
+
+       if (nwrap_pw_global.cache != NULL) {
+               struct nwrap_cache *c = nwrap_pw_global.cache;
+
+               nwrap_files_cache_unload(c);
+               close(c->fd);
+
+               SAFE_FREE(nwrap_pw_global.list);
+               nwrap_pw_global.num = 0;
+       }
+
+       if (nwrap_gr_global.cache != NULL) {
+               struct nwrap_cache *c = nwrap_gr_global.cache;
+
+               nwrap_files_cache_unload(c);
+               close(c->fd);
+
+               SAFE_FREE(nwrap_gr_global.list);
+               nwrap_pw_global.num = 0;
+       }
+
+       if (nwrap_he_global.cache != NULL) {
+               struct nwrap_cache *c = nwrap_he_global.cache;
+
+               nwrap_files_cache_unload(c);
+               close(c->fd);
+
+               SAFE_FREE(nwrap_he_global.list);
+               nwrap_he_global.num = 0;
+       }
+}


-- 
NSS Wrapper Repository

Reply via email to