mirror of
https://github.com/systemd/systemd.git
synced 2025-02-22 09:57:34 +03:00
sd-bus: add a variant of sd_bus_error_has_name() that takes multiple names
This commit is contained in:
parent
eea63c03b9
commit
2b07ec316a
@ -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',
|
||||
|
@ -31,6 +31,8 @@
|
||||
<refname>sd_bus_error_move</refname>
|
||||
<refname>sd_bus_error_is_set</refname>
|
||||
<refname>sd_bus_error_has_name</refname>
|
||||
<refname>sd_bus_error_has_names_sentinel</refname>
|
||||
<refname>sd_bus_error_has_names</refname>
|
||||
|
||||
<refpurpose>sd-bus error handling</refpurpose>
|
||||
</refnamediv>
|
||||
@ -128,6 +130,16 @@
|
||||
<paramdef>const sd_bus_error *<parameter>e</parameter></paramdef>
|
||||
<paramdef>const char *<parameter>name</parameter></paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<funcprototype>
|
||||
<funcdef>int <function>sd_bus_error_has_names_sentinel</function></funcdef>
|
||||
<paramdef>const sd_bus_error *<parameter>e</parameter></paramdef>
|
||||
<paramdef>...</paramdef>
|
||||
</funcprototype>
|
||||
|
||||
<para>
|
||||
#define sd_bus_error_has_names(e, ...) sd_bus_error_has_names_sentinel(e, ..., NULL)
|
||||
</para>
|
||||
</funcsynopsis>
|
||||
|
||||
</refsynopsisdiv>
|
||||
@ -268,6 +280,12 @@
|
||||
<parameter>name</parameter> has been set,
|
||||
<constant>false</constant> otherwise.</para>
|
||||
|
||||
<para><function>sd_bus_error_has_names_sentinel()</function> is similar to
|
||||
<function>sd_bus_error_has_name()</function>, but takes multiple names to check against. The list must be
|
||||
terminated with <constant>NULL</constant>. <function>sd_bus_error_has_names()</function>
|
||||
is a macro wrapper around <function>sd_bus_error_has_names_sentinel()</function> that adds the
|
||||
<constant>NULL</constant> sentinel automatically.</para>
|
||||
|
||||
<para><function>sd_bus_error_free()</function> will destroy
|
||||
resources held by <parameter>e</parameter>. The parameter itself
|
||||
will not be deallocated, and must be <citerefentry
|
||||
@ -307,11 +325,10 @@
|
||||
<structfield>name</structfield> field are
|
||||
non-<constant>NULL</constant>, zero otherwise.</para>
|
||||
|
||||
<para><function>sd_bus_error_has_name()</function> returns a
|
||||
non-zero value when <parameter>e</parameter> is
|
||||
non-<constant>NULL</constant> and the
|
||||
<structfield>name</structfield> field is equal to
|
||||
<parameter>name</parameter>, zero otherwise.</para>
|
||||
<para><function>sd_bus_error_has_name()</function>, <function>sd_bus_error_has_names()</function>, and
|
||||
<function>sd_bus_error_has_names_sentinel()</function> return a non-zero value when <parameter>e</parameter> is
|
||||
non-<constant>NULL</constant> and the <structfield>name</structfield> field is equal to one of the given
|
||||
names, zero otherwise.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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) \
|
||||
{ \
|
||||
|
Loading…
x
Reference in New Issue
Block a user