diff --git a/man/rules/meson.build b/man/rules/meson.build
index 303b584654..3602bbaa1a 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 807ca86302..c208f04cb6 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 ba682b879a..8d0bebe2ad 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 0f79ddc427..e73f7057e1 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 5bc6965916..ce35756861 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);