NOMMU re-exec trick shuld not depend on existence of "don't daemonize"
option for every affected applet (and dnsd, for example, don't have one). Thus rework re-exec support to not require it. Code got smaller too.
This commit is contained in:
parent
1b6fa4c57c
commit
9067f13be0
@ -7,6 +7,7 @@
|
|||||||
#include "busybox.h"
|
#include "busybox.h"
|
||||||
|
|
||||||
const char *applet_name ATTRIBUTE_EXTERNALLY_VISIBLE;
|
const char *applet_name ATTRIBUTE_EXTERNALLY_VISIBLE;
|
||||||
|
smallint re_execed;
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_INSTALLER
|
#ifdef CONFIG_FEATURE_INSTALLER
|
||||||
/*
|
/*
|
||||||
@ -59,6 +60,12 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
|
/* NOMMU re-exec trick sets high-order bit in first byte of name */
|
||||||
|
if (argv[0][0] & 0x80) {
|
||||||
|
re_execed = 1;
|
||||||
|
argv[0][0] &= 0x7f;
|
||||||
|
}
|
||||||
|
|
||||||
applet_name = argv[0];
|
applet_name = argv[0];
|
||||||
if (*applet_name == '-')
|
if (*applet_name == '-')
|
||||||
applet_name++;
|
applet_name++;
|
||||||
|
@ -9,12 +9,11 @@ const char *applet_name;
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
//Ok to remove? #include "bb_config.h"
|
|
||||||
#include "usage.h"
|
#include "usage.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
applet_name=argv[0];
|
applet_name = argv[0];
|
||||||
|
|
||||||
return APPLET_main(argc,argv);
|
return APPLET_main(argc,argv);
|
||||||
}
|
}
|
||||||
|
@ -616,9 +616,7 @@ extern int index_in_substr_array(const char * const string_array[], const char *
|
|||||||
extern void print_login_issue(const char *issue_file, const char *tty);
|
extern void print_login_issue(const char *issue_file, const char *tty);
|
||||||
extern void print_login_prompt(void);
|
extern void print_login_prompt(void);
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
extern void vfork_daemon(int nochdir, int noclose);
|
extern void vfork_daemon_rexec(int nochdir, int noclose, char **argv);
|
||||||
extern void vfork_daemon_rexec(int nochdir, int noclose,
|
|
||||||
int argc, char **argv, char *foreground_opt);
|
|
||||||
#endif
|
#endif
|
||||||
extern int get_terminal_width_height(const int fd, int *width, int *height);
|
extern int get_terminal_width_height(const int fd, int *width, int *height);
|
||||||
|
|
||||||
@ -763,6 +761,7 @@ enum { /* DO NOT CHANGE THESE VALUES! cp.c, mv.c, install.c depend on them. */
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define FILEUTILS_CP_OPTSTR "pdRfils" USE_SELINUX("c")
|
#define FILEUTILS_CP_OPTSTR "pdRfils" USE_SELINUX("c")
|
||||||
|
extern smallint re_execed;
|
||||||
extern const char *applet_name;
|
extern const char *applet_name;
|
||||||
extern const char BB_BANNER[];
|
extern const char BB_BANNER[];
|
||||||
|
|
||||||
|
@ -19,19 +19,18 @@
|
|||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
|
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
void vfork_daemon_rexec(int nochdir, int noclose,
|
void vfork_daemon_rexec(int nochdir, int noclose, char **argv)
|
||||||
int argc, char **argv, char *foreground_opt)
|
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
char **vfork_args;
|
|
||||||
int a = 0;
|
|
||||||
|
|
||||||
setsid();
|
setsid();
|
||||||
|
|
||||||
if (!nochdir)
|
if (!nochdir)
|
||||||
xchdir("/");
|
xchdir("/");
|
||||||
|
|
||||||
if (!noclose && (fd = open(bb_dev_null, O_RDWR, 0)) != -1) {
|
if (!noclose) {
|
||||||
|
/* if "/dev/null" doesn't exist, bail out! */
|
||||||
|
fd = xopen(bb_dev_null, O_RDWR);
|
||||||
dup2(fd, STDIN_FILENO);
|
dup2(fd, STDIN_FILENO);
|
||||||
dup2(fd, STDOUT_FILENO);
|
dup2(fd, STDOUT_FILENO);
|
||||||
dup2(fd, STDERR_FILENO);
|
dup2(fd, STDERR_FILENO);
|
||||||
@ -39,21 +38,17 @@ void vfork_daemon_rexec(int nochdir, int noclose,
|
|||||||
close(fd--);
|
close(fd--);
|
||||||
}
|
}
|
||||||
|
|
||||||
vfork_args = xzalloc(sizeof(char *) * (argc + 3));
|
|
||||||
vfork_args[a++] = CONFIG_BUSYBOX_EXEC_PATH;
|
|
||||||
while (*argv) {
|
|
||||||
vfork_args[a++] = *argv;
|
|
||||||
argv++;
|
|
||||||
}
|
|
||||||
vfork_args[a] = foreground_opt;
|
|
||||||
switch (vfork()) {
|
switch (vfork()) {
|
||||||
case 0: /* child */
|
case 0: /* child */
|
||||||
/* Make certain we are not a session leader, or else we
|
/* Make certain we are not a session leader, or else we
|
||||||
* might reacquire a controlling terminal */
|
* might reacquire a controlling terminal */
|
||||||
if (vfork())
|
if (vfork())
|
||||||
_exit(0);
|
_exit(0);
|
||||||
execv(vfork_args[0], vfork_args);
|
/* High-order bit of first char in argv[0] is a hidden
|
||||||
bb_perror_msg_and_die("execv %s", vfork_args[0]);
|
* "we have (alrealy) re-execed, don't do it again" flag */
|
||||||
|
argv[0][0] |= 0x80;
|
||||||
|
execv(CONFIG_BUSYBOX_EXEC_PATH, argv);
|
||||||
|
bb_perror_msg_and_die("exec %s", CONFIG_BUSYBOX_EXEC_PATH);
|
||||||
case -1: /* error */
|
case -1: /* error */
|
||||||
bb_perror_msg_and_die("vfork");
|
bb_perror_msg_and_die("vfork");
|
||||||
default: /* parent */
|
default: /* parent */
|
||||||
|
@ -191,8 +191,8 @@ int crond_main(int ac, char **av)
|
|||||||
|
|
||||||
if (!(opt & 4)) {
|
if (!(opt & 4)) {
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
/* reexec for vfork() do continue parent */
|
if (!re_execed)
|
||||||
vfork_daemon_rexec(1, 0, ac, av, "-f");
|
vfork_daemon_rexec(1, 0, av);
|
||||||
#else
|
#else
|
||||||
xdaemon(1, 0);
|
xdaemon(1, 0);
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,12 +38,14 @@ int watchdog_main(int argc, char **argv)
|
|||||||
if (optind < argc - 1 || argc == 1)
|
if (optind < argc - 1 || argc == 1)
|
||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
|
|
||||||
|
if (!(opts & OPT_FOREGROUND)) {
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
if (!(opts & OPT_FOREGROUND))
|
if (!re_execed)
|
||||||
vfork_daemon_rexec(0, 1, argc, argv, "-F");
|
vfork_daemon_rexec(0, 1, argv);
|
||||||
#else
|
#else
|
||||||
xdaemon(0, 1);
|
xdaemon(0, 1);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
signal(SIGHUP, watchdog_shutdown);
|
signal(SIGHUP, watchdog_shutdown);
|
||||||
signal(SIGINT, watchdog_shutdown);
|
signal(SIGINT, watchdog_shutdown);
|
||||||
|
@ -357,8 +357,8 @@ int dnsd_main(int argc, char **argv)
|
|||||||
if (OPT_daemon) {
|
if (OPT_daemon) {
|
||||||
//FIXME: NOMMU will NOT set LOGMODE_SYSLOG!
|
//FIXME: NOMMU will NOT set LOGMODE_SYSLOG!
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
/* reexec for vfork() do continue parent */
|
if (!re_execed)
|
||||||
vfork_daemon_rexec(1, 0, argc, argv, "-d");
|
vfork_daemon_rexec(1, 0, argv);
|
||||||
#else
|
#else
|
||||||
xdaemon(1, 0);
|
xdaemon(1, 0);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1289,8 +1289,8 @@ int inetd_main(int argc, char *argv[])
|
|||||||
|
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
if (!(opt & 2)) {
|
if (!(opt & 2)) {
|
||||||
/* reexec for vfork() do continue parent */
|
if (!re_execed)
|
||||||
vfork_daemon_rexec(0, 0, argc, argv, "-f");
|
vfork_daemon_rexec(0, 0, argv);
|
||||||
}
|
}
|
||||||
bb_sanitize_stdio();
|
bb_sanitize_stdio();
|
||||||
#else
|
#else
|
||||||
|
@ -51,7 +51,8 @@ int klogd_main(int argc, char **argv)
|
|||||||
|
|
||||||
if (!(option_mask32 & OPT_FOREGROUND)) {
|
if (!(option_mask32 & OPT_FOREGROUND)) {
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
vfork_daemon_rexec(0, 1, argc, argv, "-n");
|
if (!re_execed)
|
||||||
|
vfork_daemon_rexec(0, 1, argv);
|
||||||
#else
|
#else
|
||||||
bb_daemonize();
|
bb_daemonize();
|
||||||
#endif
|
#endif
|
||||||
|
@ -643,7 +643,8 @@ int syslogd_main(int argc, char **argv)
|
|||||||
|
|
||||||
if (!(option_mask32 & OPT_nofork)) {
|
if (!(option_mask32 & OPT_nofork)) {
|
||||||
#ifdef BB_NOMMU
|
#ifdef BB_NOMMU
|
||||||
vfork_daemon_rexec(0, 1, argc, argv, "-n");
|
if (!re_execed)
|
||||||
|
vfork_daemon_rexec(0, 1, argv);
|
||||||
#else
|
#else
|
||||||
bb_daemonize();
|
bb_daemonize();
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user