]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: make bus_add_match_full accept timeout
authorlicunlong <licunlong1@huawei.com>
Thu, 15 Jun 2023 08:28:28 +0000 (16:28 +0800)
committerlicunlong <licunlong1@huawei.com>
Thu, 15 Jun 2023 10:15:23 +0000 (18:15 +0800)
src/libsystemd/sd-bus/bus-control.c
src/libsystemd/sd-bus/bus-control.h
src/libsystemd/sd-bus/bus-internal.h
src/libsystemd/sd-bus/sd-bus.c

index 77b4b5bea61ab3c65a7f06eaf8c028c6ada2177d..1355e41ed08c6eb420ca91aa8543a767cc8adb3e 100644 (file)
@@ -876,9 +876,10 @@ _public_ int sd_bus_get_owner_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **r
 int bus_add_match_internal(
                 sd_bus *bus,
                 const char *match,
+                uint64_t timeout_usec,
                 uint64_t *ret_counter) {
 
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
         const char *e;
         int r;
 
@@ -889,16 +890,26 @@ int bus_add_match_internal(
 
         e = append_eavesdrop(bus, match);
 
-        r = sd_bus_call_method(
+        r = sd_bus_message_new_method_call(
                         bus,
+                        &m,
                         "org.freedesktop.DBus",
                         "/org/freedesktop/DBus",
                         "org.freedesktop.DBus",
-                        "AddMatch",
+                        "AddMatch");
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_append(m, "s", e);
+        if (r < 0)
+                return r;
+
+        r = sd_bus_call(
+                        bus,
+                        m,
+                        timeout_usec,
                         NULL,
-                        &reply,
-                        "s",
-                        e);
+                        &reply);
         if (r < 0)
                 return r;
 
@@ -914,9 +925,12 @@ int bus_add_match_internal_async(
                 sd_bus_slot **ret_slot,
                 const char *match,
                 sd_bus_message_handler_t callback,
-                void *userdata) {
+                void *userdata,
+                uint64_t timeout_usec) {
 
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
         const char *e;
+        int r;
 
         assert(bus);
 
@@ -925,17 +939,27 @@ int bus_add_match_internal_async(
 
         e = append_eavesdrop(bus, match);
 
-        return sd_bus_call_method_async(
+        r = sd_bus_message_new_method_call(
                         bus,
-                        ret_slot,
+                        &m,
                         "org.freedesktop.DBus",
                         "/org/freedesktop/DBus",
                         "org.freedesktop.DBus",
-                        "AddMatch",
+                        "AddMatch");
+        if (r < 0)
+                return r;
+
+        r = sd_bus_message_append(m, "s", e);
+        if (r < 0)
+                return r;
+
+        return sd_bus_call_async(
+                        bus,
+                        ret_slot,
+                        m,
                         callback,
                         userdata,
-                        "s",
-                        e);
+                        timeout_usec);
 }
 
 int bus_remove_match_internal(
index 8182b9cd632dd04bcf11091ef51b83968ff90c8e..1cd4fb88d96d3622e446642f00228bd6ac654dd0 100644 (file)
@@ -3,7 +3,7 @@
 
 #include "sd-bus.h"
 
-int bus_add_match_internal(sd_bus *bus, const char *match, uint64_t *ret_counter);
-int bus_add_match_internal_async(sd_bus *bus, sd_bus_slot **ret, const char *match, sd_bus_message_handler_t callback, void *userdata);
+int bus_add_match_internal(sd_bus *bus, const char *match, uint64_t timeout_usec, uint64_t *ret_counter);
+int bus_add_match_internal_async(sd_bus *bus, sd_bus_slot **ret, const char *match, sd_bus_message_handler_t callback, void *userdata, uint64_t timeout_usec);
 
 int bus_remove_match_internal(sd_bus *bus, const char *match);
index 1cf6974bff97e4c16c44fe3afaaaf7574e7f942d..098a51860587b80e00911cc23f9a84715682d4f2 100644 (file)
@@ -389,6 +389,16 @@ int bus_attach_inotify_event(sd_bus *b);
 void bus_close_inotify_fd(sd_bus *b);
 void bus_close_io_fds(sd_bus *b);
 
+int bus_add_match_full(
+                sd_bus *bus,
+                sd_bus_slot **slot,
+                bool asynchronous,
+                const char *match,
+                sd_bus_message_handler_t callback,
+                sd_bus_message_handler_t install_callback,
+                void *userdata,
+                uint64_t timeout_usec);
+
 #define OBJECT_PATH_FOREACH_PREFIX(prefix, path)                        \
         for (char *_slash = ({ strcpy((prefix), (path)); streq((prefix), "/") ? NULL : strrchr((prefix), '/'); }) ; \
              _slash && ((_slash[(_slash) == (prefix)] = 0), true);       \
index 91e7505cd95eba15e83cad23e274ab7b2805fc7e..d399509816d3ec11d5268cfff0485e8ec2ad8f91 100644 (file)
@@ -3531,14 +3531,15 @@ static int add_match_callback(
         return r;
 }
 
-static int bus_add_match_full(
+int bus_add_match_full(
                 sd_bus *bus,
                 sd_bus_slot **slot,
                 bool asynchronous,
                 const char *match,
                 sd_bus_message_handler_t callback,
                 sd_bus_message_handler_t install_callback,
-                void *userdata) {
+                void *userdata,
+                uint64_t timeout_usec) {
 
         struct bus_match_component *components = NULL;
         size_t n_components = 0;
@@ -3582,7 +3583,8 @@ static int bus_add_match_full(
                                                                  &s->match_callback.install_slot,
                                                                  s->match_callback.match_string,
                                                                  add_match_callback,
-                                                                 s);
+                                                                 s,
+                                                                 timeout_usec);
 
                                 if (r < 0)
                                         return r;
@@ -3592,7 +3594,10 @@ static int bus_add_match_full(
                                  * then make it floating. */
                                 r = sd_bus_slot_set_floating(s->match_callback.install_slot, true);
                         } else
-                                r = bus_add_match_internal(bus, s->match_callback.match_string, &s->match_callback.after);
+                                r = bus_add_match_internal(bus,
+                                                s->match_callback.match_string,
+                                                timeout_usec,
+                                                &s->match_callback.after);
                         if (r < 0)
                                 return r;
 
@@ -3619,7 +3624,7 @@ _public_ int sd_bus_add_match(
                 sd_bus_message_handler_t callback,
                 void *userdata) {
 
-        return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
+        return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata, 0);
 }
 
 _public_ int sd_bus_add_match_async(
@@ -3630,7 +3635,7 @@ _public_ int sd_bus_add_match_async(
                 sd_bus_message_handler_t install_callback,
                 void *userdata) {
 
-        return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
+        return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata, 0);
 }
 
 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {