]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-resolve: introduce sd_resolve_query_{get,set}_destroy_callback()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 3 Nov 2018 15:56:58 +0000 (00:56 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 5 Nov 2018 04:19:02 +0000 (13:19 +0900)
src/libsystemd/sd-resolve/sd-resolve.c
src/systemd/sd-resolve.h

index 61876781c0e63ab009caa081660728c0e0e53e66..dd33314f536f8850ef93b200f9ef88afe1b8dfd9 100644 (file)
@@ -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;
index 5695119b40198059aa568cf4793ce3c048d7af3d..2696562d7722b8771ac7fb05da3d22f05a0fcca4 100644 (file)
@@ -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);