2003-03-15 Roland McGrath <roland@redhat.com>
[kopensolaris-gnu/glibc.git] / resolv / res_libc.c
index fde5f5c..763a887 100644 (file)
 #include <arpa/nameser.h>
 #include <resolv.h>
 
-#undef _res
-
-/* The resolver state for use by single-threaded programs.  */
-struct __res_state _res;
-
-/* This function is used to access the resolver state in
-   single-threaded programs.  */
-struct __res_state *
-weak_const_function
-__res_state (void)
-{
-  return &_res;
-}
-\f
 
 /* The following bit is copied from res_data.c (where it is #ifdef'ed
    out) since res_init() should go into libc.so but the rest of that
@@ -79,10 +65,38 @@ res_init(void) {
        return (__res_vinit(&_res, 1));
 }
 \f
+/* This needs to be after the use of _res in res_init, above.  */
+#undef _res
+
+#include <tls.h>
+
+#if USE___THREAD
+/* With __thread support, this per-thread variable is used in all cases.  */
+__thread struct __res_state _res;
+extern __thread struct __res_state __libc_res __attribute__ ((alias ("_res")))
+  attribute_hidden;
+# define _res __libc_res
+#else
+/* The resolver state for use by single-threaded programs.
+   This differs from plain `struct __res_state _res;' in that it doesn't
+   create a common definition, but a plain symbol that resides in .bss,
+   which can have an alias.  */
+struct __res_state _res __attribute__((section (".bss")));
+
+/* We declare this with compat_symbol so that it's not
+   visible at link time.  Programs must use the accessor functions.  */
+# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
+#  include <shlib-compat.h>
+compat_symbol (libc, _res, _res, GLIBC_2_0);
+# endif
+#endif
 
 #include <shlib-compat.h>
 
 #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2)
 # undef res_init
-weak_alias (__res_init, res_init);
+extern int __res_init_weak (void);
+weak_extern (__res_init_weak);
+strong_alias (__res_init, __res_init_weak);
+compat_symbol (libc, __res_init_weak, res_init, GLIBC_2_0);
 #endif