From 190128e407eb24a445554c0e1f956a1d51f97338 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 6 Aug 2018 18:54:03 +0200 Subject: [PATCH] sd-bus: add new API call sd_bus_error_move() This new call move an sd_bus_error into another one. --- man/rules/meson.build | 1 + man/sd_bus_error.xml | 20 +++++++++++++++++--- src/libsystemd/libsystemd.sym | 2 ++ src/libsystemd/sd-bus/bus-error.c | 22 ++++++++++++++++++++++ src/systemd/sd-bus.h | 1 + 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/man/rules/meson.build b/man/rules/meson.build index 303b5846549..3602bbaa1a8 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -180,6 +180,7 @@ manpages = [ 'sd_bus_error_get_errno', 'sd_bus_error_has_name', 'sd_bus_error_is_set', + 'sd_bus_error_move', 'sd_bus_error_set', 'sd_bus_error_set_const', 'sd_bus_error_set_errno', diff --git a/man/sd_bus_error.xml b/man/sd_bus_error.xml index 807ca86302d..c208f04cb67 100644 --- a/man/sd_bus_error.xml +++ b/man/sd_bus_error.xml @@ -31,6 +31,7 @@ sd_bus_error_set_errnofv sd_bus_error_get_errno sd_bus_error_copy + sd_bus_error_move sd_bus_error_is_set sd_bus_error_has_name @@ -114,6 +115,12 @@ const sd_bus_error *e + + int sd_bus_error_move + sd_bus_error *dst + sd_bus_error *e + + int sd_bus_error_is_set const sd_bus_error *e @@ -245,6 +252,14 @@ Otherwise, they will be copied. Returns a converted errno-like, negative error code. + sd_bus_error_move() is similar to sd_bus_error_copy(), but will + move any error information from e into dst, resetting the + former. This function cannot fail, as no new memory is allocated. Note that if e is not set + (or NULL) dst is initializated to + SD_BUS_ERROR_NULL. Moreover, if dst is NULL no + operation is executed on it and and resources held by e are freed and reset. Returns a + converted errno-like, negative error code. + sd_bus_error_is_set() will return a non-zero value if e is non-NULL and an error has been set, @@ -287,9 +302,8 @@ NULL, and a positive errno value mapped from e->name otherwise. - sd_bus_error_copy() returns 0 or a - positive integer on success, and a negative error value converted - from the error name otherwise. + sd_bus_error_copy() and sd_bus_error_move() return 0 or a positive + integer on success, and a negative error value converted from the error name otherwise. sd_bus_error_is_set() returns a non-zero value when e and the diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index ba682b879af..8d0bebe2adf 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -577,6 +577,8 @@ global: sd_bus_set_method_call_timeout; sd_bus_get_method_call_timeout; + sd_bus_error_move; + sd_device_ref; sd_device_unref; diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index 0f79ddc4278..e73f7057e1e 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -308,6 +308,28 @@ finish: return -bus_error_name_to_errno(e->name); } +_public_ int sd_bus_error_move(sd_bus_error *dest, sd_bus_error *e) { + int r; + + if (!sd_bus_error_is_set(e)) { + + if (dest) + *dest = SD_BUS_ERROR_NULL; + + return 0; + } + + r = -bus_error_name_to_errno(e->name); + + if (dest) { + *dest = *e; + *e = SD_BUS_ERROR_NULL; + } else + sd_bus_error_free(e); + + return r; +} + _public_ int sd_bus_error_set_const(sd_bus_error *e, const char *name, const char *message) { if (!name) return 0; diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index 5bc69659166..ce35756861d 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -422,6 +422,7 @@ int sd_bus_error_set_errnof(sd_bus_error *e, int error, const char *format, ...) int sd_bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_list ap) _sd_printf_(3,0); int sd_bus_error_get_errno(const sd_bus_error *e); int sd_bus_error_copy(sd_bus_error *dest, const sd_bus_error *e); +int sd_bus_error_move(sd_bus_error *dest, sd_bus_error *e); int sd_bus_error_is_set(const sd_bus_error *e); int sd_bus_error_has_name(const sd_bus_error *e, const char *name);