const struct bb_applet *current_applet;
const char *applet_name ATTRIBUTE_EXTERNALLY_VISIBLE;
-#ifdef BB_NOMMU
+#if !BB_MMU
bool re_execed;
#endif
{
const char *s;
-#ifdef BB_NOMMU
+#if !BB_MMU
/* NOMMU re-exec trick sets high-order bit in first byte of name */
if (argv[0][0] & 0x80) {
re_execed = 1;
char *xmalloc_readlink_or_warn(const char *path);
char *xmalloc_realpath(const char *path);
+
+//TODO: signal(sid, f) is the same? then why?
extern void sig_catch(int,void (*)(int));
//#define sig_ignore(s) (sig_catch((s), SIG_IGN))
//#define sig_uncatch(s) (sig_catch((s), SIG_DFL))
extern void sig_pause(void);
-
void xsetgid(gid_t gid);
void xsetuid(uid_t uid);
void xchdir(const char *path);
/* Unlike waitpid, waits ONLY for one process,
* It's safe to pass negative 'pids' from failed [v]fork -
- * wait4pid will return -1 and ECHILD in errno.
+ * wait4pid will return -1 (and will not clobber [v]fork's errno).
* IOW: rc = wait4pid(spawn(argv));
* if (rc < 0) bb_perror_msg("%s", argv[0]);
* if (rc > 0) bb_error_msg("exit code: %d", rc);
*/
+int wait4pid(int pid);
int wait_pid(int *wstat, int pid);
int wait_nohang(int *wstat);
-int wait4pid(int pid);
-//TODO: signal(sid, f) is the same? then why?
#define wait_crashed(w) ((w) & 127)
#define wait_exitcode(w) ((w) >> 8)
#define wait_stopsig(w) ((w) >> 8)
DAEMON_CLOSE_EXTRA_FDS = 4,
DAEMON_ONLY_SANITIZE = 8, /* internal use */
};
-#ifndef BB_NOMMU
+#if BB_MMU
void forkexit_or_rexec(void);
# define forkexit_or_rexec(argv) forkexit_or_rexec()
# define bb_daemonize_or_rexec(flags, argv) bb_daemonize_or_rexec(flags)
*/
#if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \
__UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__
-#define BB_NOMMU
+#define BB_MMU 0
+#define BB_NOMMU 1
+#define USE_FOR_NOMMU(...) __VA_ARGS__
+#define USE_FOR_MMU(...)
+#else
+#define BB_MMU 1
+/* BB_NOMMU is not defined in this case! */
+#define USE_FOR_NOMMU(...)
+#define USE_FOR_MMU(...) __VA_ARGS__
#endif
/* Platforms that haven't got dprintf need to implement fdprintf() in
}
#endif
-/* Don't use lchown with glibc older than 2.1.x ... uC-libc lacks it */
+/* Don't use lchown with glibc older than 2.1.x ... uClibc lacks it */
#if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \
defined __UC_LIBC__
# define lchown chown
const struct bb_applet *a = find_applet_by_name(argv[0]);
if (a && (a->nofork
-#ifndef BB_NOMMU
- || a->noexec /* NOEXEC cannot be used on NOMMU */
+#if BB_MMU
+ || a->noexec /* NOEXEC trick needs fork() */
#endif
)) {
int argc = 1;
char **pp = argv;
while (*++pp)
argc++;
-#ifndef BB_NOMMU
+#if BB_MMU
if (a->nofork)
#endif
{
applet_name = a->name;
// what else should we save/restore?
// TODO: what if applet will mangle argv vector?
-// xargs needs argv untouched because it frees the vector!
+// xargs needs argv untouched because it frees argv[i]!
// shouldn't we pass a copy?
rc = a->main(argc, argv);
current_applet = old_a;
option_mask32 = old_m;
return rc;
}
-#ifndef BB_NOMMU /* MMU only */
+#if BB_MMU
+ /* MMU only */
/* a->noexec is true */
rc = fork();
- if (rc)
- goto w;
+ if (rc) /* parent or error */
+ return wait4pid(rc);
/* child */
xfunc_error_retval = EXIT_FAILURE;
current_applet = a;
run_current_applet_and_exit(argc, argv);
#endif
}
+#endif /* FEATURE_PREFER_APPLETS */
rc = spawn(argv);
-#ifndef BB_NOMMU
- w:
-#endif
return wait4pid(rc);
-#else /* !FEATURE_PREFER_APPLETS */
- return wait4pid(spawn(argv));
-#endif
}
-#ifdef BB_NOMMU
+#if !BB_MMU
void forkexit_or_rexec(char **argv)
{
pid_t pid;
#define forkexit_or_rexec(argv) forkexit_or_rexec()
#endif
-
/* Due to a #define in libbb.h on MMU systems we actually have 1 argument -
* char **argv "vanishes" */
void bb_daemonize_or_rexec(int flags, char **argv)
* since httpd is run from inetd (and it can't run standalone
* in uClinux).
*/
-#ifdef BB_NOMMU
+#if !BB_MMU
pid = vfork();
#else
pid = fork();
}
}
// On NOMMU reexec early (or else we will rerun things twice)
-#ifdef BB_NOMMU
+#if !BB_MMU
if (!FOREGROUND)
bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
#endif
// daemonize now; don't delay system startup
if (!FOREGROUND) {
-#ifndef BB_NOMMU
+#if BB_MMU
bb_daemonize(DAEMON_CHDIR_ROOT);
#endif
bb_info_msg("start, interface %s", intf);