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);