summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/udevadm.xml7
-rw-r--r--src/udev/udevadm-hwdb.c127
2 files changed, 82 insertions, 52 deletions
diff --git a/man/udevadm.xml b/man/udevadm.xml
index 46693f1dab..015980a63b 100644
--- a/man/udevadm.xml
+++ b/man/udevadm.xml
@@ -436,6 +436,13 @@
notified about it.</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>--test=<replaceable>string</replaceable></option></term>
+ <listitem>
+ <para>Query the database with a modalias string, and print the
+ retrieved properties.</para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect2>
diff --git a/src/udev/udevadm-hwdb.c b/src/udev/udevadm-hwdb.c
index 5587094e63..f620aa79dc 100644
--- a/src/udev/udevadm-hwdb.c
+++ b/src/udev/udevadm-hwdb.c
@@ -471,25 +471,27 @@ static int import_file(struct trie *trie, const char *filename) {
static void help(void) {
printf("Usage: udevadm hwdb [--create] [--help]\n"
" --update update the hardware database\n"
+ " --test <modalias> query database and print result\n"
" --help\n\n");
}
static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
static const struct option options[] = {
{ "update", no_argument, NULL, 'u' },
+ { "test", required_argument, NULL, 't' },
{ "help", no_argument, NULL, 'h' },
{}
};
+ const char *test = NULL;
bool update = false;
- struct trie *trie;
- char **files, **f;
+ struct trie *trie = NULL;
int err;
int rc = EXIT_SUCCESS;
for (;;) {
int option;
- option = getopt_long(argc, argv, "ch", options, NULL);
+ option = getopt_long(argc, argv, "ut:h", options, NULL);
if (option == -1)
break;
@@ -497,71 +499,92 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
case 'u':
update = true;
break;
+ case 't':
+ test = optarg;
+ break;
case 'h':
help();
return EXIT_SUCCESS;
}
}
- if (!update) {
+ if (!update && !test) {
help();
return EXIT_SUCCESS;
}
- trie = calloc(sizeof(struct trie), 1);
- if (!trie) {
- rc = EXIT_FAILURE;
- goto out;
- }
+ if (update) {
+ char **files, **f;
- /* string store */
- trie->strings = strbuf_new();
- if (!trie->strings) {
- rc = EXIT_FAILURE;
- goto out;
- }
+ trie = calloc(sizeof(struct trie), 1);
+ if (!trie) {
+ rc = EXIT_FAILURE;
+ goto out;
+ }
- /* index */
- trie->root = calloc(sizeof(struct trie_node), 1);
- if (!trie->root) {
- rc = EXIT_FAILURE;
- goto out;
- }
- trie->nodes_count++;
+ /* string store */
+ trie->strings = strbuf_new();
+ if (!trie->strings) {
+ rc = EXIT_FAILURE;
+ goto out;
+ }
- err = conf_files_list_strv(&files, ".hwdb", (const char **)conf_file_dirs);
- if (err < 0) {
- log_error("failed to enumerate hwdb files: %s\n", strerror(-err));
- rc = EXIT_FAILURE;
- goto out;
- }
- STRV_FOREACH(f, files) {
- log_debug("reading file '%s'", *f);
- import_file(trie, *f);
+ /* index */
+ trie->root = calloc(sizeof(struct trie_node), 1);
+ if (!trie->root) {
+ rc = EXIT_FAILURE;
+ goto out;
+ }
+ trie->nodes_count++;
+
+ err = conf_files_list_strv(&files, ".hwdb", (const char **)conf_file_dirs);
+ if (err < 0) {
+ log_error("failed to enumerate hwdb files: %s\n", strerror(-err));
+ rc = EXIT_FAILURE;
+ goto out;
+ }
+ STRV_FOREACH(f, files) {
+ log_debug("reading file '%s'", *f);
+ import_file(trie, *f);
+ }
+ strv_free(files);
+
+ strbuf_complete(trie->strings);
+
+ log_debug("=== trie in-memory ===\n");
+ log_debug("nodes: %8zu bytes (%8zu)\n", trie->nodes_count * sizeof(struct trie_node), trie->nodes_count);
+ log_debug("children arrays: %8zu bytes (%8zu)\n", trie->children_count * sizeof(struct trie_child_entry), trie->children_count);
+ log_debug("values arrays: %8zu bytes (%8zu)\n", trie->values_count * sizeof(struct trie_value_entry), trie->values_count);
+ log_debug("strings: %8zu bytes\n", trie->strings->len);
+ log_debug("strings incoming: %8zu bytes (%8zu)\n", trie->strings->in_len, trie->strings->in_count);
+ log_debug("strings dedup'ed: %8zu bytes (%8zu)\n", trie->strings->dedup_len, trie->strings->dedup_count);
+
+ mkdir_parents("/etc/udev/hwdb.bin", 0755);
+ err = trie_store(trie, "/etc/udev/hwdb.bin");
+ if (err < 0) {
+ log_error("Failure writing hardware database '%s': %s", "/etc/udev/hwdb.bin", strerror(-err));
+ rc = EXIT_FAILURE;
+ }
}
- strv_free(files);
-
- strbuf_complete(trie->strings);
-
- log_debug("=== trie in-memory ===\n");
- log_debug("nodes: %8zu bytes (%8zu)\n", trie->nodes_count * sizeof(struct trie_node), trie->nodes_count);
- log_debug("children arrays: %8zu bytes (%8zu)\n", trie->children_count * sizeof(struct trie_child_entry), trie->children_count);
- log_debug("values arrays: %8zu bytes (%8zu)\n", trie->values_count * sizeof(struct trie_value_entry), trie->values_count);
- log_debug("strings: %8zu bytes\n", trie->strings->len);
- log_debug("strings incoming: %8zu bytes (%8zu)\n", trie->strings->in_len, trie->strings->in_count);
- log_debug("strings dedup'ed: %8zu bytes (%8zu)\n", trie->strings->dedup_len, trie->strings->dedup_count);
-
- mkdir_parents("/etc/udev/hwdb.bin", 0755);
- err = trie_store(trie, "/etc/udev/hwdb.bin");
- if (err < 0) {
- log_error("Failure writing hardware database '%s': %s", "/etc/udev/hwdb.bin", strerror(-err));
- rc = EXIT_FAILURE;
+
+ if (test) {
+ struct udev_hwdb *hwdb = udev_hwdb_new(udev);
+
+ if (hwdb) {
+ struct udev_list_entry *entry;
+
+ udev_list_entry_foreach(entry, udev_hwdb_get_properties_list_entry(hwdb, test, 0))
+ printf("%s=%s\n", udev_list_entry_get_name(entry), udev_list_entry_get_value(entry));
+ hwdb = udev_hwdb_unref(hwdb);
+ }
}
out:
- if (trie->root)
- trie_node_cleanup(trie->root);
- strbuf_cleanup(trie->strings);
- free(trie);
+ if (trie) {
+ if (trie->root)
+ trie_node_cleanup(trie->root);
+ strbuf_cleanup(trie->strings);
+ free(trie);
+ }
return rc;
}