mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-30 18:47:06 +00:00
65 lines
1.5 KiB
Diff
65 lines
1.5 KiB
Diff
|
diff -Naur a/action.c b/action.c
|
||
|
--- a/action.c 2009-11-18 13:15:21.000000000 +0000
|
||
|
+++ b/action.c 2009-11-18 13:11:19.000000000 +0000
|
||
|
@@ -31,6 +31,30 @@
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
+ * Creates a "key=value" string from the given key and value
|
||
|
+ *
|
||
|
+ * @1 Key
|
||
|
+ * @2 Value
|
||
|
+ *
|
||
|
+ * Returns: Newly allocated string in "key=value" form
|
||
|
+ *
|
||
|
+ */
|
||
|
+static char* alloc_env(const char *key, const char *value) {
|
||
|
+ size_t keylen, vallen;
|
||
|
+ char *combined;
|
||
|
+
|
||
|
+ keylen = strlen(key);
|
||
|
+ vallen = strlen(value) + 1;
|
||
|
+
|
||
|
+ combined = xmalloc(keylen + vallen + 1);
|
||
|
+ memcpy(combined, key, keylen);
|
||
|
+ combined[keylen] = '=';
|
||
|
+ memcpy(&combined[keylen + 1], value, vallen);
|
||
|
+
|
||
|
+ return combined;
|
||
|
+}
|
||
|
+
|
||
|
+/**
|
||
|
* Choose what action should be taken according to passed settings.
|
||
|
*
|
||
|
* @1 Hotplug settings
|
||
|
@@ -41,16 +65,25 @@
|
||
|
*/
|
||
|
void action_perform(struct settings_t *settings, struct uevent_t *event) {
|
||
|
int i;
|
||
|
+ char **env;
|
||
|
+
|
||
|
+ env = xmalloc(sizeof(char *) * event->env_vars_c);
|
||
|
+
|
||
|
+ for (i = 0; i < event->env_vars_c; i++) {
|
||
|
+ env[i] = alloc_env(event->env_vars[i].key, event->env_vars[i].value);
|
||
|
+ putenv(env[i]);
|
||
|
+ }
|
||
|
|
||
|
- for (i = 0; i < event->env_vars_c; i++)
|
||
|
- setenv(event->env_vars[i].key, event->env_vars[i].value, 1);
|
||
|
-
|
||
|
if (settings->dumb == 0) {
|
||
|
ruleset_execute(&settings->rules, event, settings);
|
||
|
} else {
|
||
|
action_dumb(settings, event);
|
||
|
}
|
||
|
|
||
|
- for (i = 0; i < event->env_vars_c; i++)
|
||
|
+ for (i = 0; i < event->env_vars_c; i++) {
|
||
|
unsetenv(event->env_vars[i].key);
|
||
|
+ free(env[i]);
|
||
|
+ }
|
||
|
+
|
||
|
+ free(env);
|
||
|
}
|