#include "alloc-util.h"
#include "conf-files.h"
+#include "env-util.h"
#include "fd-util.h"
#include "fileio.h"
#include "fs-util.h"
for (size_t i = 0;; i++) {
size_t p;
- uint8_t c;
+ char c;
struct trie_node *child;
for (p = 0; (c = trie->strings->buf[node->prefix_off + p]); p++) {
return -errno;
fwrite(&h, sizeof(struct trie_header_f), 1, f);
- r = flink_tmpfile(f, filename_tmp, filename, /* replace= */ true);
+ r = flink_tmpfile(f, filename_tmp, filename, LINK_TMPFILE_REPLACE|LINK_TMPFILE_SYNC);
if (r < 0)
return r;
if (r == 0)
break;
- line_number ++;
+ line_number++;
/* comment line */
if (line[0] == '#')
* 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;
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);
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)
return true;
return false;
}
+
+int hwdb_bypass(void) {
+ int r;
+
+ r = getenv_bool("SYSTEMD_HWDB_UPDATE_BYPASS");
+ if (r < 0 && r != -ENXIO)
+ log_debug_errno(r, "Failed to parse $SYSTEMD_HWDB_UPDATE_BYPASS, assuming no.");
+ if (r <= 0)
+ return false;
+
+ log_debug("$SYSTEMD_HWDB_UPDATE_BYPASS is enabled, skipping execution.");
+ return true;
+}