chiark / gitweb /
udev: builtin - do not fail builtin initialization if one of them returns an error
[elogind.git] / src / udev / udev-builtin-hwdb.c
index 4c3d5aea62d481b2424cc67573f8409f6dca034e..14e9edab8239af323cacb19b9552ba56da03b174 100644 (file)
@@ -277,6 +277,9 @@ static int builtin_hwdb(struct udev_device *dev, int argc, char *argv[], bool te
         };
         const char *subsys = NULL;
 
+        if (!trie.f)
+                return EXIT_SUCCESS;
+
         for (;;) {
                 int option;
 
@@ -304,12 +307,18 @@ static int builtin_hwdb_init(struct udev *udev)
         struct stat st;
         const char sig[] = HWDB_SIG;
 
+        if (trie.f)
+                return 0;
+
         trie.f = fopen(SYSCONFDIR "/udev/hwdb.bin", "re");
-        if (!trie.f)
+        if (!trie.f) {
+                if (errno != EEXIST)
+                        log_error("Error reading " SYSCONFDIR "/udev/hwdb.bin: %m");
                 return -errno;
+        }
 
         if (fstat(fileno(trie.f), &st) < 0 || (size_t)st.st_size < offsetof(struct trie_header_f, strings_len) + 8) {
-                log_error("Error reading '%s'.", SYSCONFDIR "/udev/hwdb.bin: %m");
+                log_error("Error reading " SYSCONFDIR "/udev/hwdb.bin: %m");
                 fclose(trie.f);
                 zero(trie);
                 return -EINVAL;
@@ -317,7 +326,7 @@ static int builtin_hwdb_init(struct udev *udev)
 
         trie.map = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fileno(trie.f), 0);
         if (trie.map == MAP_FAILED) {
-                log_error("Error mapping '%s'.", SYSCONFDIR "/udev/hwdb.bin: %m");
+                log_error("Error mapping " SYSCONFDIR "/udev/hwdb.bin: %m");
                 fclose(trie.f);
                 return -EINVAL;
         }
@@ -325,7 +334,7 @@ static int builtin_hwdb_init(struct udev *udev)
         trie.map_size = st.st_size;
 
         if (memcmp(trie.map, sig, sizeof(trie.head->signature)) != 0 || (size_t)st.st_size != le64toh(trie.head->file_size)) {
-                log_error("Unable to recognize the format of '%s'.", SYSCONFDIR "/udev/hwdb.bin");
+                log_error("Unable to recognize the format of " SYSCONFDIR "/udev/hwdb.bin.");
                 log_error("Please try 'udevadm hwdb --update' to re-create it.");
                 munmap((void *)trie.map, st.st_size);
                 fclose(trie.f);
@@ -357,6 +366,8 @@ static bool builtin_hwdb_validate(struct udev *udev)
 {
         struct stat st;
 
+        if (!trie.f)
+                return false;
         if (fstat(fileno(trie.f), &st) < 0)
                 return true;
         if (trie.file_time_usec != ts_usec(&st.st_mtim))