mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-04 23:25:01 +02:00
[package] hotplug2: Fix forking (#7033)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@20681 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
244cbc3b69
commit
7c258fffb9
59
package/hotplug2/patches/140-worker_fork_fix.patch
Normal file
59
package/hotplug2/patches/140-worker_fork_fix.patch
Normal file
@ -0,0 +1,59 @@
|
||||
diff -x '*~' -Naur hotplug2-201/action.c hotplug2-201.patched/action.c
|
||||
--- hotplug2-201/action.c 2010-04-01 04:48:10.000000000 +0300
|
||||
+++ hotplug2-201.patched/action.c 2010-04-01 04:53:49.000000000 +0300
|
||||
@@ -39,7 +39,7 @@
|
||||
* Returns: Newly allocated string in "key=value" form
|
||||
*
|
||||
*/
|
||||
-static char* alloc_env(const char *key, const char *value) {
|
||||
+char* alloc_env(const char *key, const char *value) {
|
||||
size_t keylen, vallen;
|
||||
char *combined;
|
||||
|
||||
diff -x '*~' -Naur hotplug2-201/action.h hotplug2-201.patched/action.h
|
||||
--- hotplug2-201/action.h 2009-12-09 20:44:14.000000000 +0200
|
||||
+++ hotplug2-201.patched/action.h 2010-04-01 04:54:14.000000000 +0300
|
||||
@@ -12,5 +12,6 @@
|
||||
#include "settings.h"
|
||||
|
||||
void action_perform(struct settings_t *, struct uevent_t *);
|
||||
+char* alloc_env(const char *, const char *);
|
||||
#endif /* ifndef ACTION_H */
|
||||
|
||||
diff -x '*~' -Naur hotplug2-201/workers/worker_fork.c hotplug2-201.patched/workers/worker_fork.c
|
||||
--- hotplug2-201/workers/worker_fork.c 2010-04-01 04:52:26.000000000 +0300
|
||||
+++ hotplug2-201.patched/workers/worker_fork.c 2010-04-01 04:51:49.000000000 +0300
|
||||
@@ -380,6 +380,7 @@
|
||||
|
||||
|
||||
static int worker_fork_process(void *in_ctx, struct uevent_t *uevent) {
|
||||
+ char **env;
|
||||
int i;
|
||||
struct worker_fork_child_t *child;
|
||||
struct worker_fork_ctx_t *ctx = in_ctx;
|
||||
@@ -406,6 +407,12 @@
|
||||
* No child process is currently available.
|
||||
*/
|
||||
if (child == NULL) {
|
||||
+ env = xmalloc(sizeof(char *) * uevent->env_vars_c);
|
||||
+ for (i = 0; i < uevent->env_vars_c; i++) {
|
||||
+ env[i] = alloc_env(uevent->env_vars[i].key, uevent->env_vars[i].value);
|
||||
+ putenv(env[i]);
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Are the matching rules trivial enough that we
|
||||
* can execute them in the main process?
|
||||
@@ -421,6 +428,12 @@
|
||||
*/
|
||||
if (ctx->children_count < ctx->max_children)
|
||||
child = worker_fork_spawn(ctx);
|
||||
+
|
||||
+ for (i = 0; i < uevent->env_vars_c; i++) {
|
||||
+ unsetenv(uevent->env_vars[i].key);
|
||||
+ free(env[i]);
|
||||
+ }
|
||||
+ free(env);
|
||||
}
|
||||
|
||||
/*
|
Loading…
Reference in New Issue
Block a user