sd-hwdb: add sd_hwdb_new_from_path

Origin: upstream, 60f0ba7556

The existing sd_hwdb_new function always initializes the hwdb from the
first successful hwdb.bin it finds from hwdb_bin_paths. This means there
is currently no way to initialize a hwdb from an explicit path, which
would be useful for systemd-hwdb query.

Add sd_hwdb_new_from_path to allow a sd_hwdb to be initialized from a
custom path outside of hwdb_bin_paths.

Gbp-Pq: Name sd-hwdb-add-sd_hwdb_new_from_path.patch
This commit is contained in:
Nick Rosbrook 2022-05-24 13:08:06 -04:00 committed by liaoxianfu
parent dd1b8d8f17
commit 30a3e9744c
5 changed files with 69 additions and 16 deletions

View File

@ -16,6 +16,7 @@
<refnamediv>
<refname>sd_hwdb_new</refname>
<refname>sd_hwdb_new_from_path</refname>
<refname>sd_hwdb_ref</refname>
<refname>sd_hwdb_unref</refname>
@ -31,6 +32,12 @@
<paramdef>sd_hwdb **<parameter>hwdb</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>int <function>sd_hwdb_new_from_path</function></funcdef>
<paramdef>const char *<parameter>path</parameter></paramdef>
<paramdef>sd_hwdb **<parameter>hwdb</parameter></paramdef>
</funcprototype>
<funcprototype>
<funcdef>sd_hwdb* <function>sd_hwdb_ref</function></funcdef>
<paramdef>sd_hwdb *<parameter>hwdb</parameter></paramdef>
@ -50,6 +57,9 @@
database. Upon initialization, the file containing the binary representation of the hardware database is
located and opened. The new object is returned in <parameter>hwdb</parameter>.</para>
<para><function>sd_hwdb_new_from_path()</function> may be used to specify the path from which the binary
hardware database should be opened.</para>
<para>The <parameter>hwdb</parameter> object is reference counted. <function>sd_hwdb_ref()</function> and
<function>sd_hwdb_unref()</function> may be used to get a new reference or destroy an existing reference
to an object. The caller must dispose of the reference acquired with <function>sd_hwdb_new()</function>
@ -65,8 +75,8 @@
<refsect1>
<title>Return Value</title>
<para>On success, <function>sd_hwdb_new()</function> returns a non-negative integer. On
failure, it returns a negative errno-style error code.</para>
<para>On success, <function>sd_hwdb_new()</function> and <function>sd_hwdb_new_from_path()</function>
return a non-negative integer. On failure, a negative errno-style error code is returned.</para>
<para><function>sd_hwdb_ref()</function> always returns the argument.
</para>

View File

@ -778,3 +778,8 @@ global:
sd_device_open;
sd_device_enumerator_add_nomatch_sysname;
} LIBSYSTEMD_250;
LIBSYSTEMD_252 {
global:
sd_hwdb_new_from_path;
} LIBSYSTEMD_251;

View File

@ -281,9 +281,9 @@ static int trie_search_f(sd_hwdb *hwdb, const char *search) {
return 0;
}
_public_ int sd_hwdb_new(sd_hwdb **ret) {
static int hwdb_new(const char *path, sd_hwdb **ret) {
_cleanup_(sd_hwdb_unrefp) sd_hwdb *hwdb = NULL;
const char *hwdb_bin_path;
const char *hwdb_bin_path = NULL;
const char sig[] = HWDB_SIG;
assert_return(ret, -EINVAL);
@ -294,19 +294,26 @@ _public_ int sd_hwdb_new(sd_hwdb **ret) {
hwdb->n_ref = 1;
/* find hwdb.bin in hwdb_bin_paths */
NULSTR_FOREACH(hwdb_bin_path, hwdb_bin_paths) {
log_debug("Trying to open \"%s\"...", hwdb_bin_path);
hwdb->f = fopen(hwdb_bin_path, "re");
if (hwdb->f)
break;
if (errno != ENOENT)
return log_debug_errno(errno, "Failed to open %s: %m", hwdb_bin_path);
}
/* find hwdb.bin in hwdb_bin_paths, or from an explicit path if provided */
if (!isempty(path)) {
log_debug("Trying to open \"%s\"...", path);
hwdb->f = fopen(path, "re");
if (!hwdb->f)
return log_debug_errno(errno, "Failed to open %s: %m", path);
} else {
NULSTR_FOREACH(hwdb_bin_path, hwdb_bin_paths) {
log_debug("Trying to open \"%s\"...", hwdb_bin_path);
hwdb->f = fopen(hwdb_bin_path, "re");
if (hwdb->f)
break;
if (errno != ENOENT)
return log_debug_errno(errno, "Failed to open %s: %m", hwdb_bin_path);
}
if (!hwdb->f)
return log_debug_errno(SYNTHETIC_ERRNO(ENOENT),
"hwdb.bin does not exist, please run 'systemd-hwdb update'");
if (!hwdb->f)
return log_debug_errno(SYNTHETIC_ERRNO(ENOENT),
"hwdb.bin does not exist, please run 'systemd-hwdb update'");
}
if (fstat(fileno(hwdb->f), &hwdb->st) < 0)
return log_debug_errno(errno, "Failed to stat %s: %m", hwdb_bin_path);
@ -339,6 +346,16 @@ _public_ int sd_hwdb_new(sd_hwdb **ret) {
return 0;
}
_public_ int sd_hwdb_new_from_path(const char *path, sd_hwdb **ret) {
assert_return(!isempty(path), -EINVAL);
return hwdb_new(path, ret);
}
_public_ int sd_hwdb_new(sd_hwdb **ret) {
return hwdb_new(NULL, ret);
}
static sd_hwdb *hwdb_free(sd_hwdb *hwdb) {
assert(hwdb);

View File

@ -27,6 +27,7 @@ sd_hwdb *sd_hwdb_ref(sd_hwdb *hwdb);
sd_hwdb *sd_hwdb_unref(sd_hwdb *hwdb);
int sd_hwdb_new(sd_hwdb **ret);
int sd_hwdb_new_from_path(const char *path, sd_hwdb **ret);
int sd_hwdb_get(sd_hwdb *hwdb, const char *modalias, const char *key, const char **value);

View File

@ -5,6 +5,8 @@
#include "alloc-util.h"
#include "errno-util.h"
#include "errno.h"
#include "hwdb-internal.h"
#include "nulstr-util.h"
#include "tests.h"
TEST(failed_enumerate) {
@ -52,6 +54,24 @@ TEST(basic_enumerate) {
assert_se(len1 == len2);
}
TEST(sd_hwdb_new_from_path) {
_cleanup_(sd_hwdb_unrefp) sd_hwdb *hwdb = NULL;
const char *hwdb_bin_path = NULL;
int r;
assert_se(sd_hwdb_new_from_path(NULL, &hwdb) == -EINVAL);
assert_se(sd_hwdb_new_from_path("", &hwdb) == -EINVAL);
assert_se(sd_hwdb_new_from_path("/path/that/should/not/exist", &hwdb) < 0);
NULSTR_FOREACH(hwdb_bin_path, hwdb_bin_paths) {
r = sd_hwdb_new_from_path(hwdb_bin_path, &hwdb);
if (r >= 0)
break;
}
assert_se(r >= 0);
}
static int intro(void) {
_cleanup_(sd_hwdb_unrefp) sd_hwdb *hwdb = NULL;
int r;