X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_rules.c;h=35db958c8df4959fbb68664b1aed7afb0124a3aa;hp=3674a27d636a71785793ac4087ed611fcb905b13;hb=79ef8431c952349d9f31c899adb579c3ff83a80b;hpb=fea9b2d2924235a459e888ecd35a8b43093b9542 diff --git a/udev_rules.c b/udev_rules.c index 3674a27d6..35db958c8 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -475,10 +475,12 @@ static int pass_env_to_socket(const char *sockname, const char *devpath, const c bufpos = snprintf(buf, sizeof(buf)-1, "%s@%s", action, devpath); bufpos++; - for (i = 0; environ[i] != NULL && bufpos < sizeof(buf); i++) { + for (i = 0; environ[i] != NULL && bufpos < (sizeof(buf)-1); i++) { bufpos += strlcpy(&buf[bufpos], environ[i], sizeof(buf) - bufpos-1); bufpos++; } + if (bufpos > sizeof(buf)) + bufpos = sizeof(buf); count = sendto(sock, &buf, bufpos, 0, (struct sockaddr *)&saddr, addrlen); if (count < 0) @@ -948,6 +950,7 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule) if (match_key("DRIVER", rule, &rule->driver, udev->dev->driver)) goto nomatch; + /* match NAME against a value assigned by an earlier rule */ if (match_key("NAME", rule, &rule->name, udev->name)) goto nomatch; @@ -1002,6 +1005,14 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule) strlcat(filename, "/", sizeof(filename)); strlcat(filename, attr, sizeof(filename)); } + } else if (filename[0] != '/') { + char tmp[PATH_SIZE]; + + strlcpy(tmp, sysfs_path, sizeof(tmp)); + strlcat(tmp, udev->dev->devpath, sizeof(tmp)); + strlcat(tmp, "/", sizeof(tmp)); + strlcat(tmp, filename, sizeof(tmp)); + strlcpy(filename, tmp, sizeof(filename)); } match = (stat(filename, &statbuf) == 0); @@ -1273,9 +1284,6 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev) dbg("udev->dev->devpath='%s'", udev->dev->devpath); dbg("udev->dev->kernel='%s'", udev->dev->kernel); - /* use kernel name as default node name */ - strlcpy(udev->name, udev->dev->kernel, sizeof(udev->name)); - /* look for a matching rule to apply */ udev_rules_iter_init(rules); while (1) { @@ -1430,8 +1438,10 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev) } } - if (!name_set) + if (!name_set) { info("no node name set, will use kernel name '%s'", udev->name); + strlcpy(udev->name, udev->dev->kernel, sizeof(udev->name)); + } if (udev->tmp_node[0] != '\0') { dbg("removing temporary device node");