From f10dda3b82dd493eada52bcc52b790a1cc1094e6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 5 Apr 2013 14:48:43 +0200 Subject: [PATCH] bus: add convenience calls for method replies, too --- src/libsystemd-bus/sd-bus.c | 63 +++++++++++++++++++++++++++++++++++++ src/systemd/sd-bus.h | 2 ++ 2 files changed, 65 insertions(+) diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c index fde39e0ca..8b8ce3c03 100644 --- a/src/libsystemd-bus/sd-bus.c +++ b/src/libsystemd-bus/sd-bus.c @@ -2265,3 +2265,66 @@ int sd_bus_call_method( return sd_bus_send_with_reply_and_block(bus, m, 0, error, reply); } + +int sd_bus_reply_method_return( + sd_bus *bus, + sd_bus_message *call, + const char *types, ...) { + + _cleanup_bus_message_unref_ sd_bus_message *m = NULL; + va_list ap; + int r; + + if (!bus) + return -EINVAL; + if (!call) + return -EINVAL; + if (!call->sealed) + return -EPERM; + if (call->header->type != SD_BUS_MESSAGE_TYPE_METHOD_CALL) + return -EINVAL; + + if (call->header->flags & SD_BUS_MESSAGE_NO_REPLY_EXPECTED) + return 0; + + r = sd_bus_message_new_method_return(bus, call, &m); + if (r < 0) + return r; + + va_start(ap, types); + r = bus_message_append_ap(m, types, ap); + va_end(ap); + if (r < 0) + return r; + + return sd_bus_send(bus, m, NULL); +} + +int sd_bus_reply_method_error( + sd_bus *bus, + sd_bus_message *call, + const sd_bus_error *e) { + + _cleanup_bus_message_unref_ sd_bus_message *m = NULL; + int r; + + if (!bus) + return -EINVAL; + if (!call) + return -EINVAL; + if (!call->sealed) + return -EPERM; + if (call->header->type != SD_BUS_MESSAGE_TYPE_METHOD_CALL) + return -EINVAL; + if (!sd_bus_error_is_set(e)) + return -EINVAL; + + if (call->header->flags & SD_BUS_MESSAGE_NO_REPLY_EXPECTED) + return 0; + + r = sd_bus_message_new_method_error(bus, call, e, &m); + if (r < 0) + return r; + + return sd_bus_send(bus, m, NULL); +} diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index 27226a92e..5dcc5014c 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -149,6 +149,8 @@ int sd_bus_message_rewind(sd_bus_message *m, int complete); int sd_bus_emit_signal(sd_bus *bus, const char *path, const char *interface, const char *member, const char *types, ...); int sd_bus_call_method(sd_bus *bus, const char *destination, const char *path, const char *interface, const char *member, sd_bus_error *error, sd_bus_message **reply, const char *types, ...); +int sd_bus_reply_method_return(sd_bus *bus, sd_bus_message *call, const char *types, ...); +int sd_bus_reply_method_error(sd_bus *bus, sd_bus_message *call, const sd_bus_error *e); /* Bus management */ -- 2.30.2