udev: udevadm hwdb - add --root=

https://bugs.freedesktop.org/show_bug.cgi?id=60398
This commit is contained in:
Kay Sievers 2013-02-08 12:00:05 +01:00
parent e02caf30ac
commit 3e49f2ecb5
2 changed files with 23 additions and 6 deletions

View File

@ -443,6 +443,12 @@
retrieved properties.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--root=<replaceable>string</replaceable></option></term>
<listitem>
<para>Alternative root path in the filesystem for reading and writing files.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect2>

View File

@ -471,18 +471,21 @@ static int import_file(struct trie *trie, const char *filename) {
static void help(void) {
printf("Usage: udevadm hwdb OPTIONS\n"
" --update update the hardware database\n"
" --test <modalias> query database and print result\n"
" --test=<modalias> query database and print result\n"
" --root=<path> alternative root path in the filesystem\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' },
{ "root", required_argument, NULL, 'r' },
{ "test", required_argument, NULL, 't' },
{ "help", no_argument, NULL, 'h' },
{}
};
const char *test = NULL;
const char *root = "";
bool update = false;
struct trie *trie = NULL;
int err;
@ -491,7 +494,7 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
for (;;) {
int option;
option = getopt_long(argc, argv, "ut:h", options, NULL);
option = getopt_long(argc, argv, "ut:r:h", options, NULL);
if (option == -1)
break;
@ -502,6 +505,9 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
case 't':
test = optarg;
break;
case 'r':
root = optarg;
break;
case 'h':
help();
return EXIT_SUCCESS;
@ -515,6 +521,7 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
if (update) {
char **files, **f;
_cleanup_free_ char *hwdb_bin = NULL;
trie = calloc(sizeof(struct trie), 1);
if (!trie) {
@ -537,7 +544,7 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
}
trie->nodes_count++;
err = conf_files_list_strv(&files, ".hwdb", NULL, (const char **)conf_file_dirs);
err = conf_files_list_strv(&files, ".hwdb", root, (const char **)conf_file_dirs);
if (err < 0) {
log_error("failed to enumerate hwdb files: %s\n", strerror(-err));
rc = EXIT_FAILURE;
@ -565,10 +572,14 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) {
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 (asprintf(&hwdb_bin, "%s/etc/udev/hwdb.bin", root) < 0) {
rc = EXIT_FAILURE;
goto out;
}
mkdir_parents(hwdb_bin, 0755);
err = trie_store(trie, hwdb_bin);
if (err < 0) {
log_error("Failure writing database /etc/udev/hwdb.bin: %s", strerror(-err));
log_error("Failure writing database %s: %s", hwdb_bin, strerror(-err));
rc = EXIT_FAILURE;
}
}