From 8c92f71d9aa53ba7955d0ec871a4915ee484a367 Mon Sep 17 00:00:00 2001 From: Jennifer Averett Date: Wed, 12 Sep 2012 14:05:27 -0500 Subject: [PATCH] Added __res_state to user space. --- freebsd-userspace/Makefile | 1 + freebsd-userspace/lib/libc/resolv/res_state.c | 89 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 freebsd-userspace/lib/libc/resolv/res_state.c diff --git a/freebsd-userspace/Makefile b/freebsd-userspace/Makefile index 5a0786b9..7055f0ad 100644 --- a/freebsd-userspace/Makefile +++ b/freebsd-userspace/Makefile @@ -82,6 +82,7 @@ C_FILES += lib/libc/resolv/res_mkquery.c C_FILES += lib/libc/resolv/res_mkupdate.c C_FILES += lib/libc/resolv/res_query.c C_FILES += lib/libc/resolv/res_send.c +C_FILES += lib/libc/resolv/res_state.c C_FILES += lib/libc/resolv/res_update.c C_FILES += lib/libc/string/strsep.c diff --git a/freebsd-userspace/lib/libc/resolv/res_state.c b/freebsd-userspace/lib/libc/resolv/res_state.c new file mode 100644 index 00000000..dc77a9ce --- /dev/null +++ b/freebsd-userspace/lib/libc/resolv/res_state.c @@ -0,0 +1,89 @@ +#include "port_before.h" + +/*- + * Copyright (c) 2006 The FreeBSD Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include + +#include "namespace.h" +#include "reentrant.h" +#include "un-namespace.h" + +#undef _res + +struct __res_state _res; + +static thread_key_t res_key; +static once_t res_init_once = ONCE_INITIALIZER; +static int res_thr_keycreated = 0; + +static void +free_res(void *ptr) +{ + res_state statp = ptr; + + if (statp->_u._ext.ext != NULL) + res_ndestroy(statp); + free(statp); +} + +static void +res_keycreate(void) +{ + res_thr_keycreated = thr_keycreate(&res_key, free_res) == 0; +} + +res_state +__res_state(void) +{ + res_state statp; + + if (thr_main() != 0) + return (&_res); + + if (thr_once(&res_init_once, res_keycreate) != 0 || + !res_thr_keycreated) + return (&_res); + + statp = thr_getspecific(res_key); + if (statp != NULL) + return (statp); + statp = calloc(1, sizeof(*statp)); + if (statp == NULL) + return (&_res); +#ifdef __BIND_RES_TEXT + statp->options = RES_TIMEOUT; /* Motorola, et al. */ +#endif + if (thr_setspecific(res_key, statp) == 0) + return (statp); + free(statp); + return (&_res); +}