X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=namedev.c;h=dfeadee18a7e5100b1e3ff35ac67ec1e41cafc55;hp=505264554db3b041b18d31fddb2ef2cffdfd528c;hb=d5f91372dd3241f8b4bbe2a99aaaeda541a76bad;hpb=63ead27c228f9306f175b14a49df2415d09ece10 diff --git a/namedev.c b/namedev.c index 505264554..dfeadee18 100644 --- a/namedev.c +++ b/namedev.c @@ -198,7 +198,7 @@ static int get_format_len(char **str) if (isdigit(*str[0])) { num = (int) strtoul(*str, &tail, 10); - if (tail != NULL) { + if (num > 0) { *str = tail; dbg("format length=%i", num); return num; @@ -214,15 +214,15 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize, struct sysfs_device *sysfs_device) { char temp[NAME_SIZE]; - char temp1[NAME_SIZE]; + char temp2[NAME_SIZE]; char *tail; char *pos; - char *pos2; - char *pos3; char *attr; int len; int i; char c; + char *spos; + int slen; struct sysfs_attribute *tmpattr; pos = string; @@ -278,20 +278,18 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize, if (attr != NULL) i = atoi(attr); if (i > 0) { - strfieldcpy(temp1, udev->program_result); - pos2 = temp1; - while (i) { + foreach_strpart(udev->program_result, " \n\r", spos, slen) { i--; - pos3 = strsep(&pos2, " "); - if (pos3 == NULL) { - dbg("requested part of result string not found"); + if (i == 0) break; - } } - if (pos3) { - strnfieldcat(string, pos3, maxsize); - dbg("substitute part of result string '%s'", pos3); + if (i > 0) { + dbg("requested part of result string not found"); + break; } + strnfieldcpy(temp2, spos, slen+1); + strnfieldcat(string, temp2, maxsize); + dbg("substitute part of result string '%s'", temp2); } else { strnfieldcat(string, udev->program_result, maxsize); dbg("substitute result string '%s'", udev->program_result); @@ -527,6 +525,8 @@ attr_found: static int compare_sysfs_attribute(struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device, struct sysfs_pair *pair) { struct sysfs_attribute *tmpattr; + int i; + int len; if ((pair == NULL) || (pair->file[0] == '\0') || (pair->value == '\0')) return -ENODEV; @@ -535,6 +535,18 @@ static int compare_sysfs_attribute(struct sysfs_class_device *class_dev, struct if (tmpattr == NULL) return -ENODEV; + /* strip trailing whitespace of value, if not asked to match for it */ + if (! isspace(pair->value[strlen(pair->value)-1])) { + i = len = strlen(tmpattr->value); + while (i > 0 && isspace(tmpattr->value[i-1])) + i--; + if (i < len) { + tmpattr->value[i] = '\0'; + dbg("remove %i trailing whitespace chars from '%s'", + len - i, tmpattr->value); + } + } + dbg("compare attribute '%s' value '%s' with '%s'", pair->file, tmpattr->value, pair->value); if (strcmp_pattern(pair->value, tmpattr->value) != 0) @@ -822,7 +834,7 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud if (match_rule(dev, class_dev, udev, sysfs_device) == 0) { if (dev->name[0] == '\0' && dev->symlink[0] == '\0') { info("configured rule in '%s' at line %i applied, '%s' is ignored", - udev_rules_filename, dev->config_line, udev->kernel_name); + dev->config_file, dev->config_line, udev->kernel_name); return -1; } @@ -830,7 +842,7 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud char temp[NAME_MAX]; info("configured rule in '%s' at line %i applied, added symlink '%s'", - udev_rules_filename, dev->config_line, dev->symlink); + dev->config_file, dev->config_line, dev->symlink); /* do not clobber dev */ strfieldcpy(temp, dev->symlink); apply_format(udev, temp, sizeof(temp), @@ -841,7 +853,7 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud if (dev->name[0] != '\0') { info("configured rule in '%s' at line %i applied, '%s' becomes '%s'", - udev_rules_filename, dev->config_line, udev->kernel_name, dev->name); + dev->config_file, dev->config_line, udev->kernel_name, dev->name); strfieldcpy(udev->name, dev->name); goto found; }