From: Yu Watanabe Date: Sat, 3 Nov 2018 15:56:58 +0000 (+0900) Subject: sd-resolve: introduce sd_resolve_query_{get,set}_destroy_callback() X-Git-Tag: v240~404^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a8319dea1d34f4117ea57ea32d85e0eb528358d0;p=thirdparty%2Fsystemd.git sd-resolve: introduce sd_resolve_query_{get,set}_destroy_callback() --- diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c index 61876781c0e..dd33314f536 100644 --- a/src/libsystemd/sd-resolve/sd-resolve.c +++ b/src/libsystemd/sd-resolve/sd-resolve.c @@ -94,6 +94,7 @@ struct sd_resolve_query { }; void *userdata; + sd_resolve_destroy_t destroy_callback; LIST_FIELDS(sd_resolve_query, queries); }; @@ -1095,6 +1096,9 @@ static sd_resolve_query *resolve_query_free(sd_resolve_query *q) { resolve_query_disconnect(q); + if (q->destroy_callback) + q->destroy_callback(q->userdata); + resolve_freeaddrinfo(q->addrinfo); free(q->host); free(q->serv); @@ -1137,6 +1141,22 @@ _public_ sd_resolve *sd_resolve_query_get_resolve(sd_resolve_query *q) { return q->resolve; } +_public_ int sd_resolve_query_get_destroy_callback(sd_resolve_query *q, sd_resolve_destroy_t *destroy_callback) { + assert_return(q, -EINVAL); + + if (destroy_callback) + *destroy_callback = q->destroy_callback; + + return !!q->destroy_callback; +} + +_public_ int sd_resolve_query_set_destroy_callback(sd_resolve_query *q, sd_resolve_destroy_t destroy_callback) { + assert_return(q, -EINVAL); + + q->destroy_callback = destroy_callback; + return 0; +} + static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) { sd_resolve *resolve = userdata; int r; diff --git a/src/systemd/sd-resolve.h b/src/systemd/sd-resolve.h index 5695119b401..2696562d772 100644 --- a/src/systemd/sd-resolve.h +++ b/src/systemd/sd-resolve.h @@ -42,6 +42,7 @@ typedef struct sd_resolve_query sd_resolve_query; /* A callback on completion */ typedef int (*sd_resolve_getaddrinfo_handler_t)(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata); typedef int (*sd_resolve_getnameinfo_handler_t)(sd_resolve_query *q, int ret, const char *host, const char *serv, void *userdata); +typedef void (*sd_resolve_destroy_t)(void *userdata); enum { SD_RESOLVE_GET_HOST = 1 << 0, @@ -108,6 +109,8 @@ int sd_resolve_query_is_done(sd_resolve_query*q); void *sd_resolve_query_get_userdata(sd_resolve_query *q); void *sd_resolve_query_set_userdata(sd_resolve_query *q, void *userdata); +int sd_resolve_query_get_destroy_callback(sd_resolve_query *q, sd_resolve_destroy_t *destroy_callback); +int sd_resolve_query_set_destroy_callback(sd_resolve_query *q, sd_resolve_destroy_t destroy_callback); sd_resolve *sd_resolve_query_get_resolve(sd_resolve_query *q);