X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=namedev_parse.c;h=b19a5f26f5a7eee908cf556423fc55af5f96068b;hb=138068d690d79e71239d3e776f01560afbabc1cb;hp=981daa7b3b1d3e5e6a173c2e75e8b3d308d37ee3;hpb=fd9efc00a2e477423185c993b8ec4570ef3ee07d;p=elogind.git diff --git a/namedev_parse.c b/namedev_parse.c index 981daa7b3..b19a5f26f 100644 --- a/namedev_parse.c +++ b/namedev_parse.c @@ -36,6 +36,7 @@ #include #include +#include "udev_libc_wrapper.h" #include "udev.h" #include "udev_utils.h" #include "logging.h" @@ -98,7 +99,7 @@ static char *get_key_attribute(char *str) return NULL; } -static int namedev_parse(const char *filename, void *data) +static int namedev_parse(struct udevice *udev, const char *filename) { char line[LINE_SIZE]; char *bufline; @@ -134,7 +135,7 @@ static int namedev_parse(const char *filename, void *data) cur += count+1; lineno++; - if (count >= LINE_SIZE) { + if (count >= sizeof(line)) { info("line too long, rule skipped %s, line %d", filename, lineno); continue; } @@ -153,7 +154,7 @@ static int namedev_parse(const char *filename, void *data) /* skip backslash and newline from multi line rules */ for (i = j = 0; i < count; i++) { - if (bufline[i] == '\\' || bufline[i] == '\n') + if (bufline[i] == '\\' && bufline[i+1] == '\n') continue; line[j++] = bufline[i]; @@ -171,20 +172,32 @@ static int namedev_parse(const char *filename, void *data) if (retval) break; + if (strcasecmp(temp2, FIELD_KERNEL) == 0) { + strlcpy(dev.kernel, temp3, sizeof(dev.kernel)); + valid = 1; + continue; + } + + if (strcasecmp(temp2, FIELD_SUBSYSTEM) == 0) { + strlcpy(dev.subsystem, temp3, sizeof(dev.subsystem)); + valid = 1; + continue; + } + if (strcasecmp(temp2, FIELD_BUS) == 0) { - strfieldcpy(dev.bus, temp3); + strlcpy(dev.bus, temp3, sizeof(dev.bus)); valid = 1; continue; } if (strcasecmp(temp2, FIELD_ID) == 0) { - strfieldcpy(dev.id, temp3); + strlcpy(dev.id, temp3, sizeof(dev.id)); valid = 1; continue; } if (strcasecmp(temp2, FIELD_PLACE) == 0) { - strfieldcpy(dev.place, temp3); + strlcpy(dev.place, temp3, sizeof(dev.place)); valid = 1; continue; } @@ -208,40 +221,28 @@ static int namedev_parse(const char *filename, void *data) dbg("error parsing " FIELD_SYSFS " attribute"); continue; } - strfieldcpy(pair->file, attr); - strfieldcpy(pair->value, temp3); + strlcpy(pair->file, attr, sizeof(pair->file)); + strlcpy(pair->value, temp3, sizeof(pair->value)); valid = 1; } continue; } - if (strcasecmp(temp2, FIELD_KERNEL) == 0) { - strfieldcpy(dev.kernel, temp3); - valid = 1; - continue; - } - - if (strcasecmp(temp2, FIELD_SUBSYSTEM) == 0) { - strfieldcpy(dev.subsystem, temp3); - valid = 1; - continue; - } - if (strcasecmp(temp2, FIELD_DRIVER) == 0) { - strfieldcpy(dev.driver, temp3); + strlcpy(dev.driver, temp3, sizeof(dev.driver)); valid = 1; continue; } if (strcasecmp(temp2, FIELD_PROGRAM) == 0) { program_given = 1; - strfieldcpy(dev.program, temp3); + strlcpy(dev.program, temp3, sizeof(dev.program)); valid = 1; continue; } if (strcasecmp(temp2, FIELD_RESULT) == 0) { - strfieldcpy(dev.result, temp3); + strlcpy(dev.result, temp3, sizeof(dev.result)); valid = 1; continue; } @@ -250,34 +251,37 @@ static int namedev_parse(const char *filename, void *data) attr = get_key_attribute(temp2 + sizeof(FIELD_NAME)-1); /* FIXME: remove old style options and make OPTIONS= mandatory */ if (attr != NULL) { - if (strstr(attr, ATTR_PARTITIONS) != NULL) { + if (strstr(attr, OPTION_PARTITIONS) != NULL) { dbg_parse("creation of partition nodes requested"); dev.partitions = DEFAULT_PARTITIONS_COUNT; } - if (strstr(attr, ATTR_IGNORE_REMOVE) != NULL) { + if (strstr(attr, OPTION_IGNORE_REMOVE) != NULL) { dbg_parse("remove event should be ignored"); dev.ignore_remove = 1; } } - strfieldcpy(dev.name, temp3); + if (temp3[0] != '\0') + strlcpy(dev.name, temp3, sizeof(dev.name)); + else + dev.ignore_device = 1; valid = 1; continue; } if (strcasecmp(temp2, FIELD_SYMLINK) == 0) { - strfieldcpy(dev.symlink, temp3); + strlcpy(dev.symlink, temp3, sizeof(dev.symlink)); valid = 1; continue; } if (strcasecmp(temp2, FIELD_OWNER) == 0) { - strfieldcpy(dev.owner, temp3); + strlcpy(dev.owner, temp3, sizeof(dev.owner)); valid = 1; continue; } if (strcasecmp(temp2, FIELD_GROUP) == 0) { - strfieldcpy(dev.group, temp3); + strlcpy(dev.group, temp3, sizeof(dev.group)); valid = 1; continue; } @@ -289,15 +293,15 @@ static int namedev_parse(const char *filename, void *data) } if (strcasecmp(temp2, FIELD_OPTIONS) == 0) { - if (strstr(temp3, ATTR_IGNORE_DEVICE) != NULL) { + if (strstr(temp3, OPTION_IGNORE_DEVICE) != NULL) { dbg_parse("device should be ignored"); dev.ignore_device = 1; } - if (strstr(temp3, ATTR_IGNORE_REMOVE) != NULL) { + if (strstr(temp3, OPTION_IGNORE_REMOVE) != NULL) { dbg_parse("remove event should be ignored"); dev.ignore_remove = 1; } - if (strstr(temp3, ATTR_PARTITIONS) != NULL) { + if (strstr(temp3, OPTION_PARTITIONS) != NULL) { dbg_parse("creation of partition nodes requested"); dev.partitions = DEFAULT_PARTITIONS_COUNT; } @@ -327,14 +331,14 @@ static int namedev_parse(const char *filename, void *data) } dev.config_line = lineno; - strfieldcpy(dev.config_file, filename); + strlcpy(dev.config_file, filename, sizeof(dev.config_file)); retval = add_config_dev(&dev); if (retval) { dbg("add_config_dev returned with error %d", retval); continue; error: info("parse error %s, line %d:%d, rule skipped", - filename, lineno, temp - line); + filename, lineno, (int) (temp - line)); } } @@ -351,9 +355,9 @@ int namedev_init(void) return -1; if ((stats.st_mode & S_IFMT) != S_IFDIR) - retval = namedev_parse(udev_rules_filename, NULL); + retval = namedev_parse(NULL, udev_rules_filename); else - retval = call_foreach_file(namedev_parse, udev_rules_filename, RULEFILE_SUFFIX, NULL); + retval = call_foreach_file(namedev_parse, NULL, udev_rules_filename, RULEFILE_SUFFIX); return retval; } @@ -361,8 +365,9 @@ int namedev_init(void) void namedev_close(void) { struct config_device *dev; + struct config_device *temp_dev; - list_for_each_entry(dev, &config_device_list, node) { + list_for_each_entry_safe(dev, temp_dev, &config_device_list, node) { list_del(&dev->node); free(dev); }