From eb83eb63b8074e352935b61867702e6a01270005 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Sat, 23 Jan 2021 15:16:57 +0000 Subject: [PATCH] sd-bus: Add sd_bus_reply() While sd-bus already provides sd_bus_call() for calling a method from a complete bus message object, We don't have an equivalent function for replying from a method with a complete bus message object. Currently, we use sd_bus_send(call->bus, m, NULL) instead. Let's add a shorthand for this pattern and name it sd_bus_reply(). --- man/rules/meson.build | 9 ++++++--- man/sd-bus.xml | 1 + man/sd_bus_reply_method_return.xml | 14 ++++++++++++++ src/libsystemd/libsystemd.sym | 1 + src/libsystemd/sd-bus/bus-convenience.c | 4 ++-- src/libsystemd/sd-bus/sd-bus.c | 14 ++++++++++++++ src/systemd/sd-bus.h | 1 + 7 files changed, 39 insertions(+), 5 deletions(-) diff --git a/man/rules/meson.build b/man/rules/meson.build index 38d58307fe..4a23648a21 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -11,7 +11,6 @@ manpages = [ ['coredump.conf', '5', ['coredump.conf.d'], 'ENABLE_COREDUMP'], ['coredumpctl', '1', [], 'ENABLE_COREDUMP'], ['crypttab', '5', [], 'HAVE_LIBCRYPTSETUP'], - ['veritytab', '5', [], 'HAVE_LIBCRYPTSETUP'], ['daemon', '7', [], ''], ['dnssec-trust-anchors.d', '5', @@ -405,7 +404,10 @@ manpages = [ 'sd_bus_reply_method_errorf', 'sd_bus_reply_method_errorfv'], ''], - ['sd_bus_reply_method_return', '3', ['sd_bus_reply_method_returnv'], ''], + ['sd_bus_reply_method_return', + '3', + ['sd_bus_reply', 'sd_bus_reply_method_returnv'], + ''], ['sd_bus_request_name', '3', ['sd_bus_release_name', @@ -1128,6 +1130,7 @@ manpages = [ ['systemd-user-runtime-dir', 'user-runtime-dir@.service'], ''], ['userdbctl', '1', [], 'ENABLE_USERDB'], - ['vconsole.conf', '5', [], 'ENABLE_VCONSOLE'] + ['vconsole.conf', '5', [], 'ENABLE_VCONSOLE'], + ['veritytab', '5', [], 'HAVE_LIBCRYPTSETUP'] ] # Really, do not edit. diff --git a/man/sd-bus.xml b/man/sd-bus.xml index 05fce44acf..bfe07e88ca 100644 --- a/man/sd-bus.xml +++ b/man/sd-bus.xml @@ -144,6 +144,7 @@ sd_bus_query_sender_privilege3, sd_bus_reply_method_return3, sd_bus_reply_method_error3, +sd_bus_reply3, sd_bus_request_name3, sd_bus_send3, sd_bus_send_to3, diff --git a/man/sd_bus_reply_method_return.xml b/man/sd_bus_reply_method_return.xml index 76e4adecd5..ffeef3d2b8 100644 --- a/man/sd_bus_reply_method_return.xml +++ b/man/sd_bus_reply_method_return.xml @@ -19,6 +19,7 @@ sd_bus_reply_method_return sd_bus_reply_method_returnv + sd_bus_reply Reply to a D-Bus method call @@ -40,6 +41,12 @@ const char *types va_list ap + + + int sd_bus_reply + const sd_bus_message *call + sd_bus_message *m + @@ -52,6 +59,11 @@ sd_bus_message_append3. If no reply is expected to call, this function succeeds without sending a reply. + + sd_bus_reply() takes a complete bus message object created with either + sd_bus_new_method_return3 or + sd_bus_new_method_error3 + and sends it as a reply to the call message. @@ -76,6 +88,8 @@ Message call is not attached to a bus. + + Message m is not a method reply message. diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 9e9e8fd372..198b933d9d 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -740,6 +740,7 @@ global: LIBSYSTEMD_248 { global: sd_bus_open_user_machine; + sd_bus_reply; sd_event_source_set_ratelimit; sd_event_source_get_ratelimit; diff --git a/src/libsystemd/sd-bus/bus-convenience.c b/src/libsystemd/sd-bus/bus-convenience.c index 3e1143b187..08f61ecc15 100644 --- a/src/libsystemd/sd-bus/bus-convenience.c +++ b/src/libsystemd/sd-bus/bus-convenience.c @@ -198,7 +198,7 @@ _public_ int sd_bus_reply_method_returnv( return r; } - return sd_bus_send(call->bus, m, NULL); + return sd_bus_reply(call, m); } _public_ int sd_bus_reply_method_return( @@ -239,7 +239,7 @@ _public_ int sd_bus_reply_method_error( if (r < 0) return r; - return sd_bus_send(call->bus, m, NULL); + return sd_bus_reply(call, m); } _public_ int sd_bus_reply_method_errorfv( diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 6b1f25cc02..1f7e71c66e 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -2604,6 +2604,20 @@ _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) { } } +int sd_bus_reply(const sd_bus_message *call, sd_bus_message *reply) { + assert_return(call, -EINVAL); + assert_return(call->sealed, -EPERM); + assert_return(call->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL); + assert_return(call->bus, -EINVAL); + assert_return(!bus_pid_changed(call->bus), -ECHILD); + assert_return(reply, -EINVAL); + assert_return( + IN_SET(reply->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR), + -EINVAL); + + return sd_bus_send(call->bus, reply, NULL); +} + static int process_timeout(sd_bus *bus) { _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL; diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index c51df2908d..1829861397 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -201,6 +201,7 @@ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie); int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie); int sd_bus_call(sd_bus *bus, sd_bus_message *m, uint64_t usec, sd_bus_error *ret_error, sd_bus_message **reply); int sd_bus_call_async(sd_bus *bus, sd_bus_slot **slot, sd_bus_message *m, sd_bus_message_handler_t callback, void *userdata, uint64_t usec); +int sd_bus_reply(const sd_bus_message *call, sd_bus_message *reply); int sd_bus_get_fd(sd_bus *bus); int sd_bus_get_events(sd_bus *bus);