diff --git a/man/rules/meson.build b/man/rules/meson.build
index 80412269c7..c702d88f74 100644
--- a/man/rules/meson.build
+++ b/man/rules/meson.build
@@ -241,6 +241,8 @@ manpages = [
'sd_bus_error_free',
'sd_bus_error_get_errno',
'sd_bus_error_has_name',
+ 'sd_bus_error_has_names',
+ 'sd_bus_error_has_names_sentinel',
'sd_bus_error_is_set',
'sd_bus_error_move',
'sd_bus_error_set',
diff --git a/man/sd_bus_error.xml b/man/sd_bus_error.xml
index 8616f7ee43..3ce375bb2b 100644
--- a/man/sd_bus_error.xml
+++ b/man/sd_bus_error.xml
@@ -31,6 +31,8 @@
sd_bus_error_move
sd_bus_error_is_set
sd_bus_error_has_name
+ sd_bus_error_has_names_sentinel
+ sd_bus_error_has_names
sd-bus error handling
@@ -128,6 +130,16 @@
const sd_bus_error *e
const char *name
+
+
+ int sd_bus_error_has_names_sentinel
+ const sd_bus_error *e
+ ...
+
+
+
+ #define sd_bus_error_has_names(e, ...) sd_bus_error_has_names_sentinel(e, ..., NULL)
+
@@ -268,6 +280,12 @@
name has been set,
false otherwise.
+ sd_bus_error_has_names_sentinel() is similar to
+ sd_bus_error_has_name(), but takes multiple names to check against. The list must be
+ terminated with NULL. sd_bus_error_has_names()
+ is a macro wrapper around sd_bus_error_has_names_sentinel() that adds the
+ NULL sentinel automatically.
+
sd_bus_error_free() will destroy
resources held by e. The parameter itself
will not be deallocated, and must be name field are
non-NULL, zero otherwise.
- sd_bus_error_has_name() returns a
- non-zero value when e is
- non-NULL and the
- name field is equal to
- name, zero otherwise.
+ sd_bus_error_has_name(), sd_bus_error_has_names(), and
+ sd_bus_error_has_names_sentinel() return a non-zero value when e is
+ non-NULL and the name field is equal to one of the given
+ names, zero otherwise.
diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym
index 3168a4dcc4..e2b0d118b0 100644
--- a/src/libsystemd/libsystemd.sym
+++ b/src/libsystemd/libsystemd.sym
@@ -727,3 +727,8 @@ global:
sd_event_add_time_relative;
sd_event_source_set_time_relative;
} LIBSYSTEMD_246;
+
+LIBSYSTEMD_248 {
+global:
+ sd_bus_error_has_names_sentinel;
+} LIBSYSTEMD_247;
diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c
index f760f0fdd2..63f5097161 100644
--- a/src/libsystemd/sd-bus/bus-error.c
+++ b/src/libsystemd/sd-bus/bus-error.c
@@ -13,6 +13,7 @@
#include "errno-list.h"
#include "errno-util.h"
#include "string-util.h"
+#include "strv.h"
#include "util.h"
BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_standard_errors[] = {
@@ -355,11 +356,23 @@ _public_ int sd_bus_error_has_name(const sd_bus_error *e, const char *name) {
return streq_ptr(e->name, name);
}
-_public_ int sd_bus_error_get_errno(const sd_bus_error* e) {
- if (!e)
+_public_ int sd_bus_error_has_names_sentinel(const sd_bus_error *e, ...) {
+ if (!e || !e->name)
return 0;
- if (!e->name)
+ va_list ap;
+ const char *p;
+
+ va_start(ap, e);
+ while ((p = va_arg(ap, const char *)))
+ if (streq(p, e->name))
+ break;
+ va_end(ap);
+ return !!p;
+}
+
+_public_ int sd_bus_error_get_errno(const sd_bus_error* e) {
+ if (!e || !e->name)
return 0;
return bus_error_name_to_errno(e->name);
diff --git a/src/libsystemd/sd-bus/test-bus-error.c b/src/libsystemd/sd-bus/test-bus-error.c
index cb5d620993..52d30c85ad 100644
--- a/src/libsystemd/sd-bus/test-bus-error.c
+++ b/src/libsystemd/sd-bus/test-bus-error.c
@@ -22,6 +22,11 @@ static void test_error(void) {
assert_se(streq(error.name, SD_BUS_ERROR_NOT_SUPPORTED));
assert_se(streq(error.message, "xxx"));
assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_NOT_SUPPORTED));
+ assert_se(sd_bus_error_has_names_sentinel(&error, SD_BUS_ERROR_NOT_SUPPORTED, NULL));
+ assert_se(sd_bus_error_has_names(&error, SD_BUS_ERROR_NOT_SUPPORTED));
+ assert_se(sd_bus_error_has_names(&error, SD_BUS_ERROR_NOT_SUPPORTED, SD_BUS_ERROR_FILE_NOT_FOUND));
+ assert_se(sd_bus_error_has_names(&error, SD_BUS_ERROR_FILE_NOT_FOUND, SD_BUS_ERROR_NOT_SUPPORTED, NULL));
+ assert_se(!sd_bus_error_has_names(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
assert_se(sd_bus_error_get_errno(&error) == EOPNOTSUPP);
assert_se(sd_bus_error_is_set(&error));
sd_bus_error_free(&error);
@@ -32,6 +37,7 @@ static void test_error(void) {
assert_se(error.name == NULL);
assert_se(error.message == NULL);
assert_se(!sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
+ assert_se(!sd_bus_error_has_names(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
assert_se(sd_bus_error_get_errno(&error) == 0);
assert_se(!sd_bus_error_is_set(&error));
@@ -39,6 +45,7 @@ static void test_error(void) {
assert_se(streq(error.name, SD_BUS_ERROR_FILE_NOT_FOUND));
assert_se(streq(error.message, "yyy -1"));
assert_se(sd_bus_error_has_name(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
+ assert_se(sd_bus_error_has_names(&error, SD_BUS_ERROR_FILE_NOT_FOUND));
assert_se(sd_bus_error_get_errno(&error) == ENOENT);
assert_se(sd_bus_error_is_set(&error));
@@ -51,6 +58,7 @@ static void test_error(void) {
assert_se(streq(error.message, second.message));
assert_se(sd_bus_error_get_errno(&second) == ENOENT);
assert_se(sd_bus_error_has_name(&second, SD_BUS_ERROR_FILE_NOT_FOUND));
+ assert_se(sd_bus_error_has_names(&second, SD_BUS_ERROR_FILE_NOT_FOUND));
assert_se(sd_bus_error_is_set(&second));
sd_bus_error_free(&error);
diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h
index d4b6befc8c..787bc71271 100644
--- a/src/systemd/sd-bus.h
+++ b/src/systemd/sd-bus.h
@@ -458,6 +458,8 @@ 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);
+int sd_bus_error_has_names_sentinel(const sd_bus_error *e, ...) _sd_sentinel_;
+#define sd_bus_error_has_names(e, ...) sd_bus_error_has_names_sentinel(e, __VA_ARGS__, NULL)
#define SD_BUS_ERROR_MAP(_name, _code) \
{ \