summaryrefslogtreecommitdiffstats
path: root/src/hwdb
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-12-01 16:55:32 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-12-01 17:56:50 +0100
commit49141e0cd1a56e5f97e81e13a6d7be85138c134c (patch)
treee0c26a4832657a796464eb04330da6e71e52b267 /src/hwdb
parenthwdb-test: properly print error output from systemd-hwdb update (diff)
downloadsystemd-49141e0cd1a56e5f97e81e13a6d7be85138c134c.tar.xz
systemd-49141e0cd1a56e5f97e81e13a6d7be85138c134c.zip
hwdb: improve and test syntax error messages
Since syntax error are non-fatal, downgrade them to warnings. Use log_syntax to have uniform formatting including the line number. State machine states like DATA and MATCH are internal, user-facing messages should use the names from hwdb(7): match, property, record. Also change "key/value" to "key-value", since there's no alternative here, both parts must be present. [/tmp/tmp.KFwEhm74n4/etc/udev/hwdb.d/10-bad.hwdb:2] Property expected, ignoring record with no properties [/tmp/tmp.KFwEhm74n4/etc/udev/hwdb.d/10-bad.hwdb:5] Property expected, ignoring record with no properties [/tmp/tmp.KFwEhm74n4/etc/udev/hwdb.d/10-bad.hwdb:9] Property expected, ignoring record with no properties [/tmp/tmp.KFwEhm74n4/etc/udev/hwdb.d/10-bad.hwdb:11] Key/value pair expected but got " NO_VALUE", ignoring [/tmp/tmp.KFwEhm74n4/etc/udev/hwdb.d/10-bad.hwdb:18] Property or empty line expected, got "BAD:7:match at wrong place", ignoring record [/tmp/tmp.KFwEhm74n4/etc/udev/hwdb.d/10-bad.hwdb:22] Property or empty line expected, got "BAD:8:match at wrong place", ignoring record [/tmp/tmp.KFwEhm74n4/etc/udev/hwdb.d/10-bad.hwdb:23] Match expected but got indented property " Z=z", ignoring line squash! hwdb: improve syntax error messages
Diffstat (limited to 'src/hwdb')
-rw-r--r--src/hwdb/hwdb.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/hwdb/hwdb.c b/src/hwdb/hwdb.c
index 0fbde28d10..6d4a03bedb 100644
--- a/src/hwdb/hwdb.c
+++ b/src/hwdb/hwdb.c
@@ -39,7 +39,7 @@
#include "verbs.h"
/*
- * Generic udev properties, key/value database based on modalias strings.
+ * Generic udev properties, key-value database based on modalias strings.
* Uses a Patricia/radix trie to index all matches for efficient lookup.
*/
@@ -70,7 +70,7 @@ struct trie_node {
struct trie_child_entry *children;
uint8_t children_count;
- /* sorted array of key/value pairs */
+ /* sorted array of key-value pairs */
struct trie_value_entry *values;
size_t values_count;
};
@@ -81,7 +81,7 @@ struct trie_child_entry {
struct trie_node *child;
};
-/* value array item with key/value pairs */
+/* value array item with key-value pairs */
struct trie_value_entry {
size_t key_off;
size_t value_off;
@@ -457,10 +457,9 @@ static int insert_data(struct trie *trie, char **match_list, char *line,
char *value, **entry;
value = strchr(line, '=');
- if (!value) {
- log_error("Error, key/value pair expected but got '%s' in '%s':", line, filename);
- return -EINVAL;
- }
+ if (!value)
+ return log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+ "Key-value pair expected but got \"%s\", ignoring", line);
value[0] = '\0';
value++;
@@ -469,10 +468,9 @@ static int insert_data(struct trie *trie, char **match_list, char *line,
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);
- return -EINVAL;
- }
+ if (line[0] == '\0' || value[0] == '\0')
+ return log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+ "Empty %s in \"%s\", ignoring", line[0] == '\0' ? "key" : "value", line);
STRV_FOREACH(entry, match_list)
trie_insert(trie, trie->root, *entry, line, value, filename, file_priority, line_number);
@@ -524,7 +522,8 @@ static int import_file(struct trie *trie, const char *filename, uint16_t file_pr
break;
if (line[0] == ' ') {
- log_error("Error, MATCH expected but got '%s' in '%s':", line, filename);
+ log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+ "Match expected but got indented property \"%s\", ignoring line", line);
break;
}
@@ -543,7 +542,9 @@ static int import_file(struct trie *trie, const char *filename, uint16_t file_pr
case HW_MATCH:
if (len == 0) {
- log_error("Error, DATA expected but got empty line in '%s':", filename);
+ log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+ "Property expected, ignoring record with no properties");
+
state = HW_NONE;
strv_clear(match_list);
break;
@@ -576,7 +577,8 @@ static int import_file(struct trie *trie, const char *filename, uint16_t file_pr
}
if (line[0] != ' ') {
- log_error("Error, DATA expected but got '%s' in '%s':", line, filename);
+ log_syntax(NULL, LOG_WARNING, filename, line_number, EINVAL,
+ "Property or empty line expected, got \"%s\", ignoring record", line);
state = HW_NONE;
strv_clear(match_list);
break;