summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udev.h1
-rw-r--r--udev_rules.c17
-rw-r--r--udev_utils.c20
3 files changed, 32 insertions, 6 deletions
diff --git a/udev.h b/udev.h
index 5bd0e301c6..6ef95133d5 100644
--- a/udev.h
+++ b/udev.h
@@ -137,6 +137,7 @@ struct name_entry {
extern int log_priority(const char *priority);
extern char *name_list_add(struct list_head *name_list, const char *name, int sort);
extern char *name_list_key_add(struct list_head *name_list, const char *key, const char *value);
+extern int name_list_key_remove(struct list_head *name_list, const char *key);
extern void name_list_cleanup(struct list_head *name_list);
extern int add_matching_files(struct list_head *name_list, const char *dirname, const char *suffix);
extern uid_t lookup_user(const char *user);
diff --git a/udev_rules.c b/udev_rules.c
index 6bd28ad4b7..61b39b45c8 100644
--- a/udev_rules.c
+++ b/udev_rules.c
@@ -831,18 +831,23 @@ 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);
+ }
}
}
diff --git a/udev_utils.c b/udev_utils.c
index e892012132..6d646b0ee6 100644
--- a/udev_utils.c
+++ b/udev_utils.c
@@ -110,6 +110,26 @@ char *name_list_key_add(struct list_head *name_list, const char *key, const char
return new_name->name;
}
+int name_list_key_remove(struct list_head *name_list, const char *key)
+{
+ struct name_entry *name_loop;
+ struct name_entry *temp_loop;
+ size_t keylen = strlen(key);
+ int retval = 0;
+
+ list_for_each_entry_safe(name_loop, temp_loop, name_list, node) {
+ if (strncmp(name_loop->name, key, keylen) != 0)
+ continue;
+ if (name_loop->name[keylen] != '=')
+ continue;
+ list_del(&name_loop->node);
+ free(name_loop);
+ retval = 1;
+ break;
+ }
+ return retval;
+}
+
void name_list_cleanup(struct list_head *name_list)
{
struct name_entry *name_loop;