chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
update rules file parsing
[elogind.git]
/
udev
/
udev-rules-parse.c
diff --git
a/udev/udev-rules-parse.c
b/udev/udev-rules-parse.c
index 41dc85aba868008f040974bc1bc56095ed13686b..16bb91573a115af6d5b2c5109ae6317846f5e5c0 100644
(file)
--- 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;
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;
} 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;
} 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++;
} 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;
} 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';
} else
return -1;
/* terminate key */
temp[0] = '\0';
- dbg(rules->udev, "key='%s'\n", *key);
/* skip whitespace after operator */
while (isspace(linepos[0]))
/* 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++;
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;
/* move line to next key */
*line = temp;
@@
-678,68
+677,55
@@
invalid:
static int parse_file(struct udev_rules *rules, const char *filename)
{
static int parse_file(struct udev_rules *rules, const char *filename)
{
+ FILE *f;
char line[UTIL_LINE_SIZE];
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;
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;
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;
continue;
- /* see if this is a comment */
- if (
bufline[0] == '#'
)
+ len = strlen(line);
+ if (
len < 3
)
continue;
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);
- /*
C
ompute all goto targets within this file */
+ /*
c
ompute 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))) {
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)
}
static int add_matching_files(struct udev *udev, struct udev_list_node *file_list, const char *dirname, const char *suffix)