From 2b07ec316a0e25a3e10c270c7f6baee9e0187bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 22 Aug 2020 18:24:43 +0200 Subject: [PATCH] sd-bus: add a variant of sd_bus_error_has_name() that takes multiple names --- man/rules/meson.build | 2 ++ man/sd_bus_error.xml | 27 +++++++++++++++++++++----- src/libsystemd/libsystemd.sym | 5 +++++ src/libsystemd/sd-bus/bus-error.c | 19 +++++++++++++++--- src/libsystemd/sd-bus/test-bus-error.c | 8 ++++++++ src/systemd/sd-bus.h | 2 ++ 6 files changed, 55 insertions(+), 8 deletions(-) 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) \ { \