chiark / gitweb /
run_program: log "info" not "error" if program is missing
[elogind.git] / udev_rules.c
index 6bd28ad4b7981a5ee136d38c6a80cd666b416fa6..edfe3fd94cb0102e8701c6f05cba23da7da70d07 100644 (file)
@@ -79,14 +79,9 @@ static int get_key(char **line, char **key, char **value)
        char *temp;
 
        linepos = *line;
-       if (!linepos)
+       if (linepos == NULL)
                return -1;
 
-       if (strchr(linepos, '\\')) {
-               dbg("escaped characters are not supported, skip");
-               return -1;
-       }
-
        /* skip whitespace */
        while (isspace(linepos[0]))
                linepos++;
@@ -217,7 +212,7 @@ static int import_file_into_env(struct udevice *udev, const char *filename)
 
 static int import_program_into_env(struct udevice *udev, const char *program)
 {
-       char result[1024];
+       char result[2048];
        size_t reslen;
 
        if (run_program(program, udev->dev->subsystem, result, sizeof(result), &reslen, (udev_log_priority >= LOG_INFO)) != 0)
@@ -532,7 +527,7 @@ found:
                        }
                        break;
                case SUBST_TEMP_NODE:
-                       if (udev->tmp_node[0] == '\0') {
+                       if (udev->tmp_node[0] == '\0' && major(udev->devt) > 0) {
                                dbg("create temporary device node for callout");
                                snprintf(udev->tmp_node, sizeof(udev->tmp_node), "%s/.tmp-%u-%u",
                                         udev_root, major(udev->devt), minor(udev->devt));
@@ -831,22 +826,27 @@ try_parent:
                        char temp_value[NAME_SIZE];
                        const char *key_name = key_pair_name(rule, pair);
                        const char *value = key_val(rule, &pair->key);
-                       char *key_value;
 
                        /* make sure we don't write to the same string we possibly read from */
                        strlcpy(temp_value, value, sizeof(temp_value));
                        udev_rules_apply_format(udev, temp_value, NAME_SIZE);
 
-                       key_value = name_list_key_add(&udev->env_list, key_name, temp_value);
-                       if (key_value == NULL)
-                               break;
+                       if (temp_value[0] == '\0') {
+                               name_list_key_remove(&udev->env_list, key_name);
+                               unsetenv(key_name);
+                               info("unset ENV '%s'", key_name);
+                       } else {
+                               char *key_value = name_list_key_add(&udev->env_list, key_name, temp_value);
 
-                       putenv(key_value);
-                       dbg("export ENV '%s'", key_value);
+                               if (key_value == NULL)
+                                       break;
+                               putenv(key_value);
+                               info("set ENV '%s'", key_value);
+                       }
                }
        }
 
-       /* if we have ATTR assignements write value to sysfs file */
+       /* if we have ATTR assignments, write value to sysfs file */
        for (i = 0; i < rule->attr.count; i++) {
                struct key_pair *pair = &rule->attr.keys[i];