From: Daan De Meyer Date: Sat, 23 Jan 2021 15:16:57 +0000 (+0000) Subject: sd-bus: Add sd_bus_reply() X-Git-Tag: v248-rc1~262 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb83eb63b8074e352935b61867702e6a01270005;p=thirdparty%2Fsystemd.git 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(). --- diff --git a/man/rules/meson.build b/man/rules/meson.build index 38d58307fe0..4a23648a215 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 05fce44acf0..bfe07e88ca2 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 76e4adecd5e..ffeef3d2b89 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 9e9e8fd3723..198b933d9d5 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 3e1143b187c..08f61ecc158 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 6b1f25cc028..1f7e71c66e2 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 c51df2908d8..1829861397d 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);