--- 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); }