diff --git a/src/shared/hwdb-util.c b/src/shared/hwdb-util.c index 59b678c424d..12621b7f89d 100644 --- a/src/shared/hwdb-util.c +++ b/src/shared/hwdb-util.c @@ -587,6 +587,10 @@ int hwdb_update(const char *root, const char *hwdb_bin_dir, bool strict, bool co * source. If true, then hwdb.bin will be created without the information. systemd-hwdb command * should set the argument false, and 'udevadm hwdb' command should set it true. */ + hwdb_bin = path_join(root, hwdb_bin_dir ?: "/etc/udev", "hwdb.bin"); + if (!hwdb_bin) + return -ENOMEM; + trie = new0(struct trie, 1); if (!trie) return -ENOMEM; @@ -607,6 +611,18 @@ int hwdb_update(const char *root, const char *hwdb_bin_dir, bool strict, bool co if (err < 0) return log_error_errno(err, "Failed to enumerate hwdb files: %m"); + if (strv_isempty(files)) { + if (unlink(hwdb_bin) < 0) { + if (errno != ENOENT) + return log_error_errno(errno, "Failed to remove compiled hwdb database %s: %m", hwdb_bin); + + log_info("No hwdb files found, skipping."); + } else + log_info("No hwdb files found, compiled hwdb database %s removed.", hwdb_bin); + + return 0; + } + STRV_FOREACH(f, files) { log_debug("Reading file \"%s\"", *f); err = import_file(trie, *f, file_priority++, compat); @@ -630,10 +646,6 @@ int hwdb_update(const char *root, const char *hwdb_bin_dir, bool strict, bool co log_debug("strings dedup'ed: %8zu bytes (%8zu)", trie->strings->dedup_len, trie->strings->dedup_count); - hwdb_bin = path_join(root, hwdb_bin_dir ?: "/etc/udev", "hwdb.bin"); - if (!hwdb_bin) - return -ENOMEM; - (void) mkdir_parents_label(hwdb_bin, 0755); err = trie_store(trie, hwdb_bin, compat); if (err < 0)