|
|
@@ -0,0 +1,57 @@
|
|
|
+From: Felix Fietkau <[email protected]>
|
|
|
+Date: Wed, 8 Oct 2025 19:11:46 +0200
|
|
|
+Subject: [PATCH] uloop: allow reusing the existing environment
|
|
|
+
|
|
|
+When passing null as environment argument, reuse existing environ.
|
|
|
+This makes it possible to avoid having to duplicate and convert it
|
|
|
+by passing the output of getenv().
|
|
|
+
|
|
|
+Signed-off-by: Felix Fietkau <[email protected]>
|
|
|
+---
|
|
|
+
|
|
|
+--- a/lib/uloop.c
|
|
|
++++ b/lib/uloop.c
|
|
|
+@@ -1016,7 +1016,22 @@ uc_uloop_process(uc_vm_t *vm, size_t nar
|
|
|
+
|
|
|
+ if (pid == 0) {
|
|
|
+ argp = calloc(ucv_array_length(arguments) + 2, sizeof(char *));
|
|
|
+- envp = calloc(ucv_object_length(env_arg) + 1, sizeof(char *));
|
|
|
++ envp = environ;
|
|
|
++
|
|
|
++ if (env_arg) {
|
|
|
++ envp = calloc(ucv_object_length(env_arg) + 1, sizeof(char *));
|
|
|
++ i = 0;
|
|
|
++ ucv_object_foreach(env_arg, envk, envv) {
|
|
|
++ buf = xprintbuf_new();
|
|
|
++
|
|
|
++ ucv_stringbuf_printf(buf, "%s=", envk);
|
|
|
++ ucv_to_stringbuf(vm, buf, envv, false);
|
|
|
++
|
|
|
++ envp[i++] = buf->buf;
|
|
|
++
|
|
|
++ free(buf);
|
|
|
++ }
|
|
|
++ }
|
|
|
+
|
|
|
+ if (!argp || !envp)
|
|
|
+ _exit(-1);
|
|
|
+@@ -1026,19 +1041,6 @@ uc_uloop_process(uc_vm_t *vm, size_t nar
|
|
|
+ for (i = 0; i < ucv_array_length(arguments); i++)
|
|
|
+ argp[i+1] = ucv_to_string(vm, ucv_array_get(arguments, i));
|
|
|
+
|
|
|
+- i = 0;
|
|
|
+-
|
|
|
+- ucv_object_foreach(env_arg, envk, envv) {
|
|
|
+- buf = xprintbuf_new();
|
|
|
+-
|
|
|
+- ucv_stringbuf_printf(buf, "%s=", envk);
|
|
|
+- ucv_to_stringbuf(vm, buf, envv, false);
|
|
|
+-
|
|
|
+- envp[i++] = buf->buf;
|
|
|
+-
|
|
|
+- free(buf);
|
|
|
+- }
|
|
|
+-
|
|
|
+ execvpe((const char *)ucv_string_get(executable),
|
|
|
+ (char * const *)argp, (char * const *)envp);
|
|
|
+
|