2003-02-21 Roland McGrath <roland@redhat.com>
authorroland <roland>
Sat, 22 Feb 2003 01:57:48 +0000 (01:57 +0000)
committerroland <roland>
Sat, 22 Feb 2003 01:57:48 +0000 (01:57 +0000)
* include/resolv.h: Add libc_hidden_proto for __res_nclose.
* resolv/res_init.c (__res_nclose): Add libc_hidden_def.
(res_thread_freeres): New function, on __libc_thread_subfreeres and
__libc_subfreeres.

include/resolv.h
resolv/res_init.c

index f9635dd..9d7bb8b 100644 (file)
@@ -45,6 +45,7 @@ extern void res_send_setrhook (res_send_rhook __hook);
 extern int res_ourserver_p (const res_state __statp,
                            const struct sockaddr_in6 *__inp);
 libc_hidden_proto (__res_ninit)
+libc_hidden_proto (__res_nclose)
 libc_hidden_proto (__res_randomid)
 libc_hidden_proto (__res_state)
 
index 764e571..459694f 100644 (file)
@@ -528,6 +528,7 @@ res_randomid(void) {
 libc_hidden_def (__res_randomid)
 #endif
 
+
 /*
  * This routine is for closing the socket if a virtual circuit is used and
  * the program wants to close it.  This provides support for endhostent()
@@ -556,3 +557,26 @@ res_nclose(res_state statp) {
                }
        statp->_u._ext.nsinit = 0;
 }
+#ifdef _LIBC
+libc_hidden_def (__res_nclose)
+#endif
+
+#ifdef _LIBC
+# ifdef _LIBC_REENTRANT
+/* This is called when a thread is exiting to free resources held in _res.  */
+static void __attribute__ ((section ("__libc_thread_freeres_fn")))
+res_thread_freeres (void)
+{
+  __res_nclose (&_res);                /* Close any VC sockets.  */
+
+  for (int ns = 0; ns < MAXNS; ns++)
+    if (_res._u._ext.nsaddrs[ns] != NULL)
+      {
+       free (_res._u._ext.nsaddrs[ns]);
+       _res._u._ext.nsaddrs[ns] = NULL;
+      }
+}
+text_set_element (__libc_thread_subfreeres, res_thread_freeres);
+text_set_element (__libc_subfreeres, res_thread_freeres);
+# endif
+#endif