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