aboutsummaryrefslogtreecommitdiff
path: root/libbb/vfork_daemon_rexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/vfork_daemon_rexec.c')
-rw-r--r--libbb/vfork_daemon_rexec.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
new file mode 100644
index 000000000..c8f9d277e
--- /dev/null
+++ b/libbb/vfork_daemon_rexec.c
@@ -0,0 +1,27 @@
1/*
2 * Rexec program for system have fork() as vfork() with foregound option
3 * Copyright (C) Vladminr Oleynik and many different people.
4 */
5
6#include <unistd.h>
7#include "libbb.h"
8
9
10#if defined(__uClinux__)
11void vfork_daemon_rexec(int argc, char **argv, char *foreground_opt)
12{
13 char **vfork_args;
14 int a = 0;
15
16 vfork_args = xcalloc(sizeof(char *), argc + 3);
17 while(*argv) {
18 vfork_args[a++] = *argv;
19 argv++;
20 }
21 vfork_args[a] = foreground_opt;
22 execvp("/proc/self/exe", vfork_args);
23 vfork_args[0] = "/bin/busybox";
24 execv(vfork_args[0], vfork_args);
25 bb_perror_msg_and_die("execv %s", vfork_args[0]);
26}
27#endif /* uClinux */