diff options
-rw-r--r-- | include/resolv.h | 18 | ||||
-rw-r--r-- | libc/inet/resolv.c | 25 |
2 files changed, 43 insertions, 0 deletions
diff --git a/include/resolv.h b/include/resolv.h index 815b3a92a..e94247f91 100644 --- a/include/resolv.h +++ b/include/resolv.h @@ -217,7 +217,25 @@ typedef struct __res_state *res_state; /* 0x00008000 */ /* Internal (static) resolver context. */ +/* + * NPTL - This code was taken from 'include/resolve.h' + * and makes the assumption that our libraries + * are reentrant. + */ +#ifdef IS_IN_libpthread +#include <libc-symbols.h> +#include <tls.h> +#if USE___THREAD +# undef _res +# ifndef NOT_IN_libc +# define __resp __libc_resp +# endif +# define _res (*__resp) +extern __thread struct __res_state *__resp attribute_tls_model_ie; +#endif +#else extern struct __res_state _res; +#endif #ifndef __BIND_NOSTATIC diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index 27b60efea..695ee048b 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -1149,6 +1149,31 @@ void res_close( void ) return; } +/* + * NPTL - This code was taken from 'resolve/res_libc.c' and + * may still be incorrect. Our name resolver code is + * so out of date, we made not be able to correctly + * utilize it in multi-threaded programs. + */ +#ifdef IS_IN_libpthread + +/* This needs to be after the use of _res in res_init, above. */ +#undef _res + +/* 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"))); + +#if USE___THREAD +#undef __resp +__thread struct __res_state *__resp = &_res; +extern __thread struct __res_state *__libc_resp + __attribute__ ((alias ("__resp"))) attribute_hidden; +#endif +#endif + #endif |