1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-31 14:50:15 +03:00

Merge pull request #23518 from enr0n/sd-hwdb-from-path

Implement --root option for systemd-hwdb query
This commit is contained in:
Luca Boccassi 2022-05-27 22:51:36 +01:00 committed by GitHub
commit 5ad69b04bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 89 additions and 22 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

@ -18,7 +18,7 @@ static const char *arg_root = NULL;
static bool arg_strict = false;
static int verb_query(int argc, char *argv[], void *userdata) {
return hwdb_query(argv[1]);
return hwdb_query(argv[1], arg_root);
}
static int verb_update(int argc, char *argv[], void *userdata) {

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

@ -2,6 +2,7 @@
#pragma once
#include <stdint.h>
#include <sys/stat.h>
#include "def.h"
#include "hashmap.h"

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

@ -650,14 +650,27 @@ int hwdb_update(const char *root, const char *hwdb_bin_dir, bool strict, bool co
return r;
}
int hwdb_query(const char *modalias) {
int hwdb_query(const char *modalias, const char *root) {
_cleanup_(sd_hwdb_unrefp) sd_hwdb *hwdb = NULL;
const char *key, *value;
const char *key, *value, *p;
int r;
assert(modalias);
r = sd_hwdb_new(&hwdb);
if (!isempty(root))
NULSTR_FOREACH(p, hwdb_bin_paths) {
_cleanup_free_ char *hwdb_bin = NULL;
hwdb_bin = path_join(root, p);
if (!hwdb_bin)
return -ENOMEM;
r = sd_hwdb_new_from_path(hwdb_bin, &hwdb);
if (r >= 0)
break;
}
else
r = sd_hwdb_new(&hwdb);
if (r < 0)
return r;

View File

@ -7,4 +7,4 @@
bool hwdb_validate(sd_hwdb *hwdb);
int hwdb_update(const char *root, const char *hwdb_bin_dir, bool strict, bool compat);
int hwdb_query(const char *modalias);
int hwdb_query(const char *modalias, const char *root);

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;

View File

@ -95,7 +95,7 @@ int hwdb_main(int argc, char *argv[], void *userdata) {
}
if (arg_test)
return hwdb_query(arg_test);
return hwdb_query(arg_test, NULL);
return 0;
}