mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 22:23:27 +00:00
3b57cccb71
SVN-Revision: 20462
64 lines
1.4 KiB
Diff
64 lines
1.4 KiB
Diff
--- a/action.c
|
|
+++ b/action.c
|
|
@@ -31,6 +31,30 @@ static void action_dumb(const struct set
|
|
}
|
|
|
|
/**
|
|
+ * 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 @@ static void action_dumb(const struct set
|
|
*/
|
|
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);
|
|
}
|