chiark / gitweb /
udevd: set incoming socket buffer SO_RCVBUF to maximum
[elogind.git] / udev_rules.c
index 932a5b9c6fa9330ddd2797aef4ff3858c536fd09..77b97d7f99de9469bc03bbacaa2f625ad28d9147 100644 (file)
@@ -31,6 +31,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <sys/wait.h>
+#include <sys/stat.h>
 
 #include "libsysfs/sysfs/libsysfs.h"
 #include "list.h"
@@ -605,8 +606,8 @@ found:
                        pos = getenv(attr);
                        if (pos == NULL)
                                break;
-                       strlcat(string, pos, maxsize);
                        dbg("substitute env '%s=%s'", attr, pos);
+                       strlcat(string, pos, maxsize);
                        break;
                default:
                        err("unknown substitution type=%i", type);
@@ -857,6 +858,7 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev, struct s
        struct sysfs_class_device *class_dev_parent;
        struct sysfs_device *sysfs_device = NULL;
        struct udev_rule *rule;
+       int name_set = 0;
 
        dbg("class_dev->name='%s'", class_dev->name);
 
@@ -888,7 +890,7 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev, struct s
                if (rule == NULL)
                        break;
 
-               if (udev->name_set && rule->name.operation != KEY_OP_UNSET) {
+               if (name_set && rule->name.operation != KEY_OP_UNSET) {
                        dbg("node name already set, rule ignored");
                        continue;
                }
@@ -956,21 +958,27 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev, struct s
 
                                /* add multiple symlinks separated by spaces */
                                pos = temp;
-                               next = strchr(temp, ' ');
+                               while (isspace(pos[0]))
+                                       pos++;
+                               next = strchr(pos, ' ');
                                while (next) {
                                        next[0] = '\0';
                                        info("add symlink '%s'", pos);
                                        name_list_add(&udev->symlink_list, pos, 0);
+                                       while (isspace(next[1]))
+                                               next++;
                                        pos = &next[1];
                                        next = strchr(pos, ' ');
                                }
-                               info("add symlink '%s'", pos);
-                               name_list_add(&udev->symlink_list, pos, 0);
+                               if (pos[0] != '\0') {
+                                       info("add symlink '%s'", pos);
+                                       name_list_add(&udev->symlink_list, pos, 0);
+                               }
                        }
 
                        /* set name, later rules with name set will be ignored */
                        if (rule->name.operation != KEY_OP_UNSET) {
-                               udev->name_set = 1;
+                               name_set = 1;
                                strlcpy(udev->name, key_val(rule, &rule->name), sizeof(udev->name));
                                apply_format(udev, udev->name, sizeof(udev->name), class_dev, sysfs_device);
 
@@ -1008,7 +1016,7 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev, struct s
                }
        }
 
-       if (udev->name[0] == '\0') {
+       if (!name_set) {
                strlcpy(udev->name, udev->kernel_name, sizeof(udev->name));
                info("no rule found, will use kernel name '%s'", udev->name);
        }