diff options
Diffstat (limited to 'libunbound')
| -rw-r--r-- | libunbound/context.c | 2 | ||||
| -rw-r--r-- | libunbound/context.h | 2 | ||||
| -rw-r--r-- | libunbound/libunbound.c | 61 | ||||
| -rw-r--r-- | libunbound/libworker.c | 8 | ||||
| -rw-r--r-- | libunbound/unbound.h | 40 |
5 files changed, 77 insertions, 36 deletions
diff --git a/libunbound/context.c b/libunbound/context.c index f28307971b4d..18f34e454143 100644 --- a/libunbound/context.c +++ b/libunbound/context.c @@ -124,7 +124,7 @@ find_id(struct ub_ctx* ctx, int* id) } struct ctx_query* -context_new(struct ub_ctx* ctx, char* name, int rrtype, int rrclass, +context_new(struct ub_ctx* ctx, const char* name, int rrtype, int rrclass, ub_callback_t cb, void* cbarg) { struct ctx_query* q = (struct ctx_query*)calloc(1, sizeof(*q)); diff --git a/libunbound/context.h b/libunbound/context.h index 8898f3ebfdf9..23db869ac751 100644 --- a/libunbound/context.h +++ b/libunbound/context.h @@ -234,7 +234,7 @@ void context_query_delete(struct ctx_query* q); * @param cbarg: user arg for async queries. * @return new ctx_query or NULL for malloc failure. */ -struct ctx_query* context_new(struct ub_ctx* ctx, char* name, int rrtype, +struct ctx_query* context_new(struct ub_ctx* ctx, const char* name, int rrtype, int rrclass, ub_callback_t cb, void* cbarg); /** diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c index 10d00ddc521d..999478ef38a2 100644 --- a/libunbound/libunbound.c +++ b/libunbound/libunbound.c @@ -60,6 +60,9 @@ #include "services/localzone.h" #include "services/cache/infra.h" #include "services/cache/rrset.h" +#ifdef HAVE_PTHREAD +#include <signal.h> +#endif #if defined(UB_ON_WINDOWS) && defined (HAVE_WINDOWS_H) #include <windows.h> @@ -155,11 +158,9 @@ delq(rbnode_t* n, void* ATTR_UNUSED(arg)) context_query_delete(q); } -void -ub_ctx_delete(struct ub_ctx* ctx) +/** stop the bg thread */ +static void ub_stop_bg(struct ub_ctx* ctx) { - struct alloc_cache* a, *na; - if(!ctx) return; /* stop the bg thread */ lock_basic_lock(&ctx->cfglock); if(ctx->created_bg) { @@ -195,7 +196,28 @@ ub_ctx_delete(struct ub_ctx* ctx) else { lock_basic_unlock(&ctx->cfglock); } +} + +void +ub_ctx_delete(struct ub_ctx* ctx) +{ + struct alloc_cache* a, *na; + int do_stop = 1; + if(!ctx) return; + /* see if bg thread is created and if threads have been killed */ + /* no locks, because those may be held by terminated threads */ + /* for processes the read pipe is closed and we see that on read */ +#ifdef HAVE_PTHREAD + if(ctx->created_bg && ctx->dothread) { + if(pthread_kill(ctx->bg_tid, 0) == ESRCH) { + /* thread has been killed */ + do_stop = 0; + } + } +#endif /* HAVE_PTHREAD */ + if(do_stop) + ub_stop_bg(ctx); modstack_desetup(&ctx->mods, ctx->env); a = ctx->alloc_list; @@ -229,7 +251,7 @@ ub_ctx_delete(struct ub_ctx* ctx) } int -ub_ctx_set_option(struct ub_ctx* ctx, char* opt, char* val) +ub_ctx_set_option(struct ub_ctx* ctx, const char* opt, const char* val) { lock_basic_lock(&ctx->cfglock); if(ctx->finalized) { @@ -245,7 +267,7 @@ ub_ctx_set_option(struct ub_ctx* ctx, char* opt, char* val) } int -ub_ctx_get_option(struct ub_ctx* ctx, char* opt, char** str) +ub_ctx_get_option(struct ub_ctx* ctx, const char* opt, char** str) { int r; lock_basic_lock(&ctx->cfglock); @@ -258,7 +280,7 @@ ub_ctx_get_option(struct ub_ctx* ctx, char* opt, char** str) } int -ub_ctx_config(struct ub_ctx* ctx, char* fname) +ub_ctx_config(struct ub_ctx* ctx, const char* fname) { lock_basic_lock(&ctx->cfglock); if(ctx->finalized) { @@ -274,7 +296,7 @@ ub_ctx_config(struct ub_ctx* ctx, char* fname) } int -ub_ctx_add_ta(struct ub_ctx* ctx, char* ta) +ub_ctx_add_ta(struct ub_ctx* ctx, const char* ta) { char* dup = strdup(ta); if(!dup) return UB_NOMEM; @@ -294,7 +316,7 @@ ub_ctx_add_ta(struct ub_ctx* ctx, char* ta) } int -ub_ctx_add_ta_file(struct ub_ctx* ctx, char* fname) +ub_ctx_add_ta_file(struct ub_ctx* ctx, const char* fname) { char* dup = strdup(fname); if(!dup) return UB_NOMEM; @@ -314,7 +336,7 @@ ub_ctx_add_ta_file(struct ub_ctx* ctx, char* fname) } int -ub_ctx_trustedkeys(struct ub_ctx* ctx, char* fname) +ub_ctx_trustedkeys(struct ub_ctx* ctx, const char* fname) { char* dup = strdup(fname); if(!dup) return UB_NOMEM; @@ -547,7 +569,7 @@ ub_wait(struct ub_ctx* ctx) } int -ub_resolve(struct ub_ctx* ctx, char* name, int rrtype, +ub_resolve(struct ub_ctx* ctx, const char* name, int rrtype, int rrclass, struct ub_result** result) { struct ctx_query* q; @@ -591,7 +613,7 @@ ub_resolve(struct ub_ctx* ctx, char* name, int rrtype, } int -ub_resolve_async(struct ub_ctx* ctx, char* name, int rrtype, +ub_resolve_async(struct ub_ctx* ctx, const char* name, int rrtype, int rrclass, void* mydata, ub_callback_t callback, int* async_id) { struct ctx_query* q; @@ -732,7 +754,7 @@ ub_strerror(int err) } int -ub_ctx_set_fwd(struct ub_ctx* ctx, char* addr) +ub_ctx_set_fwd(struct ub_ctx* ctx, const char* addr) { struct sockaddr_storage storage; socklen_t stlen; @@ -804,7 +826,7 @@ ub_ctx_set_fwd(struct ub_ctx* ctx, char* addr) } int -ub_ctx_resolvconf(struct ub_ctx* ctx, char* fname) +ub_ctx_resolvconf(struct ub_ctx* ctx, const char* fname) { FILE* in; int numserv = 0; @@ -890,7 +912,7 @@ ub_ctx_resolvconf(struct ub_ctx* ctx, char* fname) } int -ub_ctx_hosts(struct ub_ctx* ctx, char* fname) +ub_ctx_hosts(struct ub_ctx* ctx, const char* fname) { FILE* in; char buf[1024], ldata[1024]; @@ -1016,7 +1038,8 @@ int ub_ctx_print_local_zones(struct ub_ctx* ctx) } /* Add a new zone */ -int ub_ctx_zone_add(struct ub_ctx* ctx, char *zone_name, char *zone_type) +int ub_ctx_zone_add(struct ub_ctx* ctx, const char *zone_name, + const char *zone_type) { enum localzone_type t; struct local_zone* z; @@ -1056,7 +1079,7 @@ int ub_ctx_zone_add(struct ub_ctx* ctx, char *zone_name, char *zone_type) } /* Remove zone */ -int ub_ctx_zone_remove(struct ub_ctx* ctx, char *zone_name) +int ub_ctx_zone_remove(struct ub_ctx* ctx, const char *zone_name) { struct local_zone* z; uint8_t* nm; @@ -1082,7 +1105,7 @@ int ub_ctx_zone_remove(struct ub_ctx* ctx, char *zone_name) } /* Add new RR data */ -int ub_ctx_data_add(struct ub_ctx* ctx, char *data) +int ub_ctx_data_add(struct ub_ctx* ctx, const char *data) { ldns_buffer* buf; int res = ub_ctx_finalize(ctx); @@ -1100,7 +1123,7 @@ int ub_ctx_data_add(struct ub_ctx* ctx, char *data) } /* Remove RR data */ -int ub_ctx_data_remove(struct ub_ctx* ctx, char *data) +int ub_ctx_data_remove(struct ub_ctx* ctx, const char *data) { uint8_t* nm; int nmlabs; diff --git a/libunbound/libworker.c b/libunbound/libworker.c index bd61cea154a2..8f2aa489caf7 100644 --- a/libunbound/libworker.c +++ b/libunbound/libworker.c @@ -198,7 +198,10 @@ libworker_setup(struct ub_ctx* ctx, int is_bg) } numports = cfg_condense_ports(cfg, &ports); if(numports == 0) { + int locked = !w->is_bg || w->is_bg_thread; libworker_delete(w); + if(locked) + lock_basic_unlock(&ctx->cfglock); return NULL; } w->back = outside_network_create(w->base, cfg->msg_buffer_size, @@ -372,6 +375,11 @@ int libworker_bg(struct ub_ctx* ctx) case -1: return UB_FORKFAIL; default: + /* close non-used parts, so that the worker + * bgprocess gets 'pipe closed' when the + * main process exits */ + tube_close_read(ctx->qq_pipe); + tube_close_write(ctx->rr_pipe); break; } #endif /* HAVE_FORK */ diff --git a/libunbound/unbound.h b/libunbound/unbound.h index d435bf28d35e..191338706c3d 100644 --- a/libunbound/unbound.h +++ b/libunbound/unbound.h @@ -78,6 +78,10 @@ * ... same as async for non-threaded * ... the callbacks are called in the thread that calls process(ctx) * + * Openssl needs to have locking in place, and the application must set + * it up, because a mere library cannot do this, use the calls + * CRYPTO_set_id_callback and CRYPTO_set_locking_callback. + * * If no threading is compiled in, the above async example uses fork(2) to * create a process to perform the work. The forked process exits when the * calling process exits, or ctx_delete() is called. @@ -97,6 +101,11 @@ extern "C" { #endif +/** the version of this header file */ +#define UNBOUND_VERSION_MAJOR @UNBOUND_VERSION_MAJOR@ +#define UNBOUND_VERSION_MINOR @UNBOUND_VERSION_MINOR@ +#define UNBOUND_VERSION_MICRO @UNBOUND_VERSION_MICRO@ + /** * The validation context is created to hold the resolver status, * validation keys and a small cache (containing messages, rrsets, @@ -245,7 +254,7 @@ void ub_ctx_delete(struct ub_ctx* ctx); * @param val: value of the option. * @return: 0 if OK, else error. */ -int ub_ctx_set_option(struct ub_ctx* ctx, char* opt, char* val); +int ub_ctx_set_option(struct ub_ctx* ctx, const char* opt, const char* val); /** * Get an option from the context. @@ -261,7 +270,7 @@ int ub_ctx_set_option(struct ub_ctx* ctx, char* opt, char* val); * returned in the string. * @return 0 if OK else an error code (malloc failure, syntax error). */ -int ub_ctx_get_option(struct ub_ctx* ctx, char* opt, char** str); +int ub_ctx_get_option(struct ub_ctx* ctx, const char* opt, char** str); /** * setup configuration for the given context. @@ -273,7 +282,7 @@ int ub_ctx_get_option(struct ub_ctx* ctx, char* opt, char** str); * routines exist. * @return: 0 if OK, else error. */ -int ub_ctx_config(struct ub_ctx* ctx, char* fname); +int ub_ctx_config(struct ub_ctx* ctx, const char* fname); /** * Set machine to forward DNS queries to, the caching resolver to use. @@ -292,7 +301,7 @@ int ub_ctx_config(struct ub_ctx* ctx, char* fname); * If the addr is NULL, forwarding is disabled. * @return 0 if OK, else error. */ -int ub_ctx_set_fwd(struct ub_ctx* ctx, char* addr); +int ub_ctx_set_fwd(struct ub_ctx* ctx, const char* addr); /** * Read list of nameservers to use from the filename given. @@ -308,7 +317,7 @@ int ub_ctx_set_fwd(struct ub_ctx* ctx, char* addr); * @param fname: file name string. If NULL "/etc/resolv.conf" is used. * @return 0 if OK, else error. */ -int ub_ctx_resolvconf(struct ub_ctx* ctx, char* fname); +int ub_ctx_resolvconf(struct ub_ctx* ctx, const char* fname); /** * Read list of hosts from the filename given. @@ -321,7 +330,7 @@ int ub_ctx_resolvconf(struct ub_ctx* ctx, char* fname); * @param fname: file name string. If NULL "/etc/hosts" is used. * @return 0 if OK, else error. */ -int ub_ctx_hosts(struct ub_ctx* ctx, char* fname); +int ub_ctx_hosts(struct ub_ctx* ctx, const char* fname); /** * Add a trust anchor to the given context. @@ -334,7 +343,7 @@ int ub_ctx_hosts(struct ub_ctx* ctx, char* fname); * [domainname] [TTL optional] [type] [class optional] [rdata contents] * @return 0 if OK, else error. */ -int ub_ctx_add_ta(struct ub_ctx* ctx, char* ta); +int ub_ctx_add_ta(struct ub_ctx* ctx, const char* ta); /** * Add trust anchors to the given context. @@ -345,7 +354,7 @@ int ub_ctx_add_ta(struct ub_ctx* ctx, char* ta); * @param fname: filename of file with keyfile with trust anchors. * @return 0 if OK, else error. */ -int ub_ctx_add_ta_file(struct ub_ctx* ctx, char* fname); +int ub_ctx_add_ta_file(struct ub_ctx* ctx, const char* fname); /** * Add trust anchors to the given context. @@ -357,7 +366,7 @@ int ub_ctx_add_ta_file(struct ub_ctx* ctx, char* fname); * anchors. * @return 0 if OK, else error. */ -int ub_ctx_trustedkeys(struct ub_ctx* ctx, char* fname); +int ub_ctx_trustedkeys(struct ub_ctx* ctx, const char* fname); /** * Set debug output (and error output) to the specified stream. @@ -442,7 +451,7 @@ int ub_process(struct ub_ctx* ctx); * in that case (out of memory). * @return 0 if OK, else error. */ -int ub_resolve(struct ub_ctx* ctx, char* name, int rrtype, +int ub_resolve(struct ub_ctx* ctx, const char* name, int rrtype, int rrclass, struct ub_result** result); /** @@ -473,7 +482,7 @@ int ub_resolve(struct ub_ctx* ctx, char* name, int rrtype, * cancel the query. * @return 0 if OK, else error. */ -int ub_resolve_async(struct ub_ctx* ctx, char* name, int rrtype, +int ub_resolve_async(struct ub_ctx* ctx, const char* name, int rrtype, int rrclass, void* mydata, ub_callback_t callback, int* async_id); /** @@ -520,7 +529,8 @@ int ub_ctx_print_local_zones(struct ub_ctx* ctx); * @param zone_type: type of the zone (like for unbound.conf) in text. * @return 0 if OK, else error. */ -int ub_ctx_zone_add(struct ub_ctx* ctx, char *zone_name, char *zone_type); +int ub_ctx_zone_add(struct ub_ctx* ctx, const char *zone_name, + const char *zone_type); /** * Remove zone from local authority info of the library. @@ -529,7 +539,7 @@ int ub_ctx_zone_add(struct ub_ctx* ctx, char *zone_name, char *zone_type); * If it does not exist, nothing happens. * @return 0 if OK, else error. */ -int ub_ctx_zone_remove(struct ub_ctx* ctx, char *zone_name); +int ub_ctx_zone_remove(struct ub_ctx* ctx, const char *zone_name); /** * Add localdata to the library local authority info. @@ -539,7 +549,7 @@ int ub_ctx_zone_remove(struct ub_ctx* ctx, char *zone_name); * "www.example.com IN A 127.0.0.1" * @return 0 if OK, else error. */ -int ub_ctx_data_add(struct ub_ctx* ctx, char *data); +int ub_ctx_data_add(struct ub_ctx* ctx, const char *data); /** * Remove localdata from the library local authority info. @@ -547,7 +557,7 @@ int ub_ctx_data_add(struct ub_ctx* ctx, char *data); * @param data: the name to delete all data from, like "www.example.com". * @return 0 if OK, else error. */ -int ub_ctx_data_remove(struct ub_ctx* ctx, char *data); +int ub_ctx_data_remove(struct ub_ctx* ctx, const char *data); /** * Get a version string from the libunbound implementation. |
