X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudev-rules-parse.c;h=16bb91573a115af6d5b2c5109ae6317846f5e5c0;hb=9dcf7ec8a0411aeb432eee20035e6c0f385ae7fe;hp=737bbf4d9207874dd3745742f497a87ace96dd6b;hpb=daa849db6faf73fd712b6ff8fc63adcd7d82f178;p=elogind.git diff --git a/udev/udev-rules-parse.c b/udev/udev-rules-parse.c index 737bbf4d9..16bb91573 100644 --- a/udev/udev-rules-parse.c +++ b/udev/udev-rules-parse.c @@ -139,29 +139,28 @@ static int get_key(struct udev_rules *rules, char **line, char **key, enum key_o if (linepos[0] == '=' && linepos[1] == '=') { *operation = KEY_OP_MATCH; linepos += 2; - dbg(rules->udev, "operator=match\n"); + dbg(rules->udev, "match:\n"); } else if (linepos[0] == '!' && linepos[1] == '=') { *operation = KEY_OP_NOMATCH; linepos += 2; - dbg(rules->udev, "operator=nomatch\n"); + dbg(rules->udev, "nomatch:\n"); } else if (linepos[0] == '+' && linepos[1] == '=') { *operation = KEY_OP_ADD; linepos += 2; - dbg(rules->udev, "operator=add\n"); + dbg(rules->udev, "add:\n"); } else if (linepos[0] == '=') { *operation = KEY_OP_ASSIGN; linepos++; - dbg(rules->udev, "operator=assign\n"); + dbg(rules->udev, "assign:\n"); } else if (linepos[0] == ':' && linepos[1] == '=') { *operation = KEY_OP_ASSIGN_FINAL; linepos += 2; - dbg(rules->udev, "operator=assign_final\n"); + dbg(rules->udev, "assign_final:\n"); } else return -1; /* terminate key */ temp[0] = '\0'; - dbg(rules->udev, "key='%s'\n", *key); /* skip whitespace after operator */ while (isspace(linepos[0])) @@ -181,7 +180,7 @@ static int get_key(struct udev_rules *rules, char **line, char **key, enum key_o return -1; temp[0] = '\0'; temp++; - dbg(rules->udev, "value='%s'\n", *value); + dbg(rules->udev, "'%s'-'%s'\n", *key, *value); /* move line to next key */ *line = temp; @@ -678,68 +677,55 @@ invalid: static int parse_file(struct udev_rules *rules, const char *filename) { + FILE *f; char line[UTIL_LINE_SIZE]; - char *bufline; - unsigned int lineno; - char *buf; - size_t bufsize; - size_t cur; - size_t count; - int retval = 0; size_t start; struct udev_rule *rule; struct udev_rules_iter iter; start = rules->bufsize; + info(rules->udev, "reading '%s' as rules file\n", filename); - if (file_map(filename, &buf, &bufsize) != 0) { - err(rules->udev, "can't open '%s' as rules file: %m\n", filename); + f = fopen(filename, "r"); + if (f == NULL) return -1; - } - info(rules->udev, "reading '%s' as rules file\n", filename); - /* loop through the whole file */ - cur = 0; - lineno = 0; - while (cur < bufsize) { - unsigned int i, j; + while(fgets(line, sizeof(line), f) != NULL) { + int line_nr = 0; + char *key; + size_t len; - count = buf_get_line(buf, bufsize, cur); - bufline = &buf[cur]; - cur += count+1; - lineno++; + /* skip whitespace */ + line_nr++; + key = line; + while (isspace(key[0])) + key++; - /* eat the whitespace */ - while ((count > 0) && isspace(bufline[0])) { - bufline++; - count--; - } - if (count == 0) + /* comment */ + if (key[0] == '#') continue; - /* see if this is a comment */ - if (bufline[0] == '#') + len = strlen(line); + if (len < 3) continue; - if (count >= sizeof(line)) { - err(rules->udev, "line too long, rule skipped '%s:%u'\n", filename, lineno); - continue; + /* continue reading if backslash+newline is found */ + while (line[len-2] == '\\') { + if (fgets(&line[len-2], (sizeof(line)-len)+2, f) == NULL) + break; + line_nr++; + len = strlen(line); } - /* skip backslash and newline from multiline rules */ - for (i = j = 0; i < count; i++) { - if (bufline[i] == '\\' && bufline[i+1] == '\n') - continue; - - line[j++] = bufline[i]; + if (len+1 >= sizeof(line)) { + err(rules->udev, "line too long '%s':%u, ignored\n", filename, line_nr); + continue; } - line[j] = '\0'; - - dbg(rules->udev, "read '%s'\n", line); - add_to_rules(rules, line, filename, lineno); + add_to_rules(rules, key, filename, line_nr); } + fclose(f); - /* Compute all goto targets within this file */ + /* compute all goto targets within this file */ udev_rules_iter_init(&iter, rules); udev_rules_iter_goto(&iter, start); while((rule = udev_rules_iter_next(&iter))) { @@ -755,9 +741,7 @@ static int parse_file(struct udev_rules *rules, const char *filename) } } } - - file_unmap(buf, bufsize); - return retval; + return 0; } static int add_matching_files(struct udev *udev, struct udev_list_node *file_list, const char *dirname, const char *suffix) @@ -854,20 +838,18 @@ int udev_rules_init(struct udev *udev, struct udev_rules *rules, int resolve_nam if (file_base == NULL) continue; - if (strcmp(file_base, sort_base) == 0) { info(udev, "rule file basename '%s' already added, ignoring '%s'\n", file_name, sort_name); udev_list_entry_remove(sort_loop); sort_loop = NULL; - continue; + break; } - if (strcmp(file_base, sort_base) > 0) break; } if (sort_loop != NULL) - udev_list_entry_move_to_list(sort_loop, &file_list); + udev_list_entry_move_before(sort_loop, file_loop); } } @@ -878,7 +860,7 @@ int udev_rules_init(struct udev *udev, struct udev_rules *rules, int resolve_nam if (stat(file_name, &statbuf) == 0 && statbuf.st_size > 0) parse_file(rules, file_name); else - err(udev, "could not read '%s': %m\n", file_name); + info(udev, "can not read '%s'\n", file_name); udev_list_entry_remove(file_loop); } return retval;