diff options
author | 2021-02-09 13:17:06 +0100 | |
---|---|---|
committer | 2021-02-09 14:07:34 -0500 | |
commit | 14748acf5e6e11db07e61ac188d6d1e799f29c6a (patch) | |
tree | 419794da1b56cb0ab73084896d6cc43da8f2d8c7 | |
parent | Revert bad 78-sound-card.rules update causing path_id skip (diff) | |
download | eudev-14748acf5e6e11db07e61ac188d6d1e799f29c6a.tar.gz eudev-14748acf5e6e11db07e61ac188d6d1e799f29c6a.tar.bz2 eudev-14748acf5e6e11db07e61ac188d6d1e799f29c6a.zip |
udevadm: hwdb: sync with systemd
Backports some changes from https://github.com/systemd/systemd/commit/6a34639e76b8b59233a97533b13836d5a44e8d4a.
Signed-off-by: Thomas Deutschmann <whissi@gentoo.org>
Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
-rw-r--r-- | src/udev/udevadm-hwdb.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/src/udev/udevadm-hwdb.c b/src/udev/udevadm-hwdb.c index 9df043835..6bc108783 100644 --- a/src/udev/udevadm-hwdb.c +++ b/src/udev/udevadm-hwdb.c @@ -426,21 +426,25 @@ static int insert_data(struct trie *trie, struct udev_list *match_list, char *value; struct udev_list_entry *entry; + assert(line[0] == ' '); + value = strchr(line, '='); if (!value) { - log_error("Error, key/value pair expected but got '%s' in '%s':", line, filename); + log_error("Warning, key-value pair expected but got \"%s\", ignoring", line); return -EINVAL; } value[0] = '\0'; value++; - /* libudev requires properties to start with a space */ + /* Replace multiple leading spaces by a single space */ while (isblank(line[0]) && isblank(line[1])) line++; - if (line[0] == '\0' || value[0] == '\0') { - log_error("Error, empty key or value '%s' in '%s':", line, filename); + if (isempty(line + 1) || isempty(value)) { + log_error("Warning, empty %s in \"%s=%s\", ignoring", + isempty(line + 1) ? "key" : "value", + line, value); return -EINVAL; } @@ -459,17 +463,21 @@ static int import_file(struct udev *udev, struct trie *trie, const char *filenam FILE *f; char line[LINE_MAX]; struct udev_list match_list; + uint32_t line_number = 0; + int r = 0, err; udev_list_init(udev, &match_list, false); f = fopen(filename, "re"); - if (f == NULL) + if (!f) return -errno; while (fgets(line, sizeof(line), f)) { size_t len; char *pos; + ++line_number; + /* comment line */ if (line[0] == '#') continue; @@ -491,7 +499,8 @@ static int import_file(struct udev *udev, struct trie *trie, const char *filenam break; if (line[0] == ' ') { - log_error("Error, MATCH expected but got '%s' in '%s':", line, filename); + log_error("Warning, match expected but got indented property \"%s\", ignoring line", line); + r = -EINVAL; break; } @@ -502,46 +511,55 @@ static int import_file(struct udev *udev, struct trie *trie, const char *filenam case HW_MATCH: if (len == 0) { - log_error("Error, DATA expected but got empty line in '%s':", filename); + log_error("Warning, property expected, ignoring record with no properties"); + r = -EINVAL; state = HW_NONE; udev_list_cleanup(&match_list); break; } - /* another match */ if (line[0] != ' ') { + /* another match */ udev_list_entry_add(&match_list, line, NULL); break; } /* first data */ state = HW_DATA; - insert_data(trie, &match_list, line, filename); + err = insert_data(trie, &match_list, line, filename); + if (err < 0) + r = err; break; case HW_DATA: - /* end of record */ if (len == 0) { + /* end of record */ state = HW_NONE; udev_list_cleanup(&match_list); break; } if (line[0] != ' ') { - log_error("Error, DATA expected but got '%s' in '%s':", line, filename); + log_error("Warning, property or empty line expected, got \"%s\", ignoring record", line); + r = -EINVAL; state = HW_NONE; udev_list_cleanup(&match_list); break; } - insert_data(trie, &match_list, line, filename); + err = insert_data(trie, &match_list, line, filename); + if (err < 0) + r = err; break; }; } + if (state == HW_MATCH) + log_error("Warning, property expected, ignoring record with no properties"); + fclose(f); udev_list_cleanup(&match_list); - return 0; + return r; } static void help(void) { |