aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debianutils/start_stop_daemon.c3
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/Makefile.in2
-rw-r--r--libbb/bb_xdaemon.c17
-rw-r--r--miscutils/crond.c5
-rw-r--r--miscutils/watchdog.c3
-rw-r--r--networking/dnsd.c5
-rw-r--r--networking/httpd.c4
-rw-r--r--networking/inetd.c3
-rw-r--r--networking/telnetd.c6
-rw-r--r--sysklogd/klogd.c3
-rw-r--r--sysklogd/syslogd.c3
12 files changed, 33 insertions, 22 deletions
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
index 5b689740e..b44a23b4b 100644
--- a/debianutils/start_stop_daemon.c
+++ b/debianutils/start_stop_daemon.c
@@ -275,8 +275,7 @@ start_stop_daemon_main(int argc, char **argv)
}
*--argv = startas;
if (opt & SSD_OPT_BACKGROUND) {
- if (daemon(0, 0) == -1)
- bb_perror_msg_and_die ("unable to fork");
+ bb_xdaemon(0, 0);
setsid();
}
if (opt & SSD_OPT_MAKEPID) {
diff --git a/include/libbb.h b/include/libbb.h
index c031f2841..650002b7b 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -146,6 +146,7 @@ extern void bb_fflush_stdout_and_exit(int retval) ATTRIBUTE_NORETURN;
extern void xstat(const char *filename, struct stat *buf);
extern int bb_xsocket(int domain, int type, int protocol);
+extern void bb_xdaemon(int nochdir, int noclose);
#define BB_GETOPT_ERROR 0x80000000UL
extern const char *bb_opt_complementally;
diff --git a/libbb/Makefile.in b/libbb/Makefile.in
index c69978370..3fb945e31 100644
--- a/libbb/Makefile.in
+++ b/libbb/Makefile.in
@@ -30,7 +30,7 @@ LIBBB-y:= \
trim.c u_signal_names.c vdprintf.c verror_msg.c \
vherror_msg.c vperror_msg.c wfopen.c xconnect.c xgetcwd.c xstat.c \
xgethostbyname.c xgethostbyname2.c xreadlink.c xregcomp.c xgetlarg.c \
- bb_xsocket.c \
+ bb_xsocket.c bb_xdaemon.c \
get_terminal_width_height.c fclose_nonstdin.c fflush_stdout_and_exit.c \
getopt_ulflags.c default_error_retval.c wfopen_input.c speed_table.c \
perror_nomsg_and_die.c perror_nomsg.c skip_whitespace.c bb_askpass.c \
diff --git a/libbb/bb_xdaemon.c b/libbb/bb_xdaemon.c
new file mode 100644
index 000000000..a40f4f993
--- /dev/null
+++ b/libbb/bb_xdaemon.c
@@ -0,0 +1,17 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * bb_xdaemon.c - a daemon() which dies on failure with error message
+ *
+ * Copyright (C) 2006 Denis Vlasenko
+ *
+ * Licensed under LGPL, see file docs/lesser.txt in this tarball for details.
+ */
+#include <unistd.h>
+#include "libbb.h"
+
+void bb_xdaemon(int nochdir, int noclose)
+{
+ if (daemon(nochdir, noclose))
+ bb_perror_msg_and_die("daemon");
+}
+
diff --git a/miscutils/crond.c b/miscutils/crond.c
index 7e50b61c7..06b8769fa 100644
--- a/miscutils/crond.c
+++ b/miscutils/crond.c
@@ -1,3 +1,4 @@
+/* vi: set sw=4 ts=4: */
/*
* crond -d[#] -c <crondir> -f -b
*
@@ -213,9 +214,7 @@ int crond_main(int ac, char **av)
/* reexec for vfork() do continue parent */
vfork_daemon_rexec(1, 0, ac, av, "-f");
#else /* uClinux */
- if (daemon(1, 0) < 0) {
- bb_perror_msg_and_die("daemon");
- }
+ bb_xdaemon(1, 0);
#endif /* uClinux */
}
diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c
index 55dd69857..58a606553 100644
--- a/miscutils/watchdog.c
+++ b/miscutils/watchdog.c
@@ -40,8 +40,7 @@ int watchdog_main(int argc, char **argv)
if (optind < argc - 1 || argc == 1)
bb_show_usage();
- if (daemon(0, 1) < 0)
- bb_perror_msg_and_die("Failed forking watchdog daemon");
+ bb_xdaemon(0, 1);
signal(SIGHUP, watchdog_shutdown);
signal(SIGINT, watchdog_shutdown);
diff --git a/networking/dnsd.c b/networking/dnsd.c
index 9c5193820..d78ea04c0 100644
--- a/networking/dnsd.c
+++ b/networking/dnsd.c
@@ -5,6 +5,7 @@
* Copyright (C) 2005 Roberto A. Foglietta (me@roberto.foglietta.name)
* Copyright (C) 2005 Odd Arild Olsen (oao at fibula dot no)
* Copyright (C) 2003 Paul Sheer
+ *
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*
* Odd Arild Olsen started out with the sheerdns [1] of Paul Sheer and rewrote
@@ -408,9 +409,7 @@ int dnsd_main(int argc, char **argv)
/* reexec for vfork() do continue parent */
vfork_daemon_rexec(1, 0, argc, argv, "-d");
#else /* uClinux */
- if (daemon(1, 0) < 0) {
- bb_perror_msg_and_die("daemon");
- }
+ bb_xdaemon(1, 0);
#endif /* uClinuvx */
dnsentryinit(is_verbose());
diff --git a/networking/httpd.c b/networking/httpd.c
index fde8ae4bd..354c199e7 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -1,3 +1,4 @@
+/* vi: set sw=4 ts=4: */
/*
* httpd implementation for busybox
*
@@ -2114,8 +2115,7 @@ int httpd_main(int argc, char *argv[])
#if !ENABLE_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
# if !DEBUG
- if (daemon(1, 0) < 0) /* don`t change curent directory */
- bb_perror_msg_and_die("daemon");
+ bb_xdaemon(1, 0); /* don`t change curent directory */
# endif
return miniHttpd(server);
#else
diff --git a/networking/inetd.c b/networking/inetd.c
index cc700832c..39a2b24cb 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -1314,7 +1314,7 @@ inetd_main (int argc, char *argv[])
/* reexec for vfork() do continue parent */
vfork_daemon_rexec (0, 0, argc, argv, "-f");
#else
- daemon (0, 0);
+ daemon (0, 0); /* bb_xdaemon? */
#endif /* uClinux */
} else {
setsid ();
@@ -1802,3 +1802,4 @@ daytime_dg (int s, servtab_t *sep ATTRIBUTE_UNUSED)
(void) sendto (s, buffer, strlen (buffer), 0, &sa, sizeof (sa));
}
#endif /* CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME */
+/* vi: set sw=4 ts=4: */
diff --git a/networking/telnetd.c b/networking/telnetd.c
index 3e4b42cfa..d53f56b14 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -1,4 +1,4 @@
-/* vi:set ts=4:*/
+/* vi: set sw=4 ts=4: */
/*
* Simple telnet server
* Bjorn Wesen, Axis Communications AB (bjornw@axis.com)
@@ -469,9 +469,7 @@ telnetd_main(int argc, char **argv)
bb_perror_msg_and_die("listen");
}
- if (daemon(0, 0) < 0)
- bb_perror_msg_and_die("daemon");
-
+ bb_xdaemon(0, 0);
maxfd = master_fd;
#endif /* CONFIG_FEATURE_TELNETD_INETD */
diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c
index 51b01430e..6dc5457af 100644
--- a/sysklogd/klogd.c
+++ b/sysklogd/klogd.c
@@ -121,8 +121,7 @@ int klogd_main(int argc, char **argv)
#if defined(__uClinux__)
vfork_daemon_rexec(0, 1, argc, argv, "-n");
#else /* __uClinux__ */
- if (daemon(0, 1) < 0)
- bb_perror_msg_and_die("daemon");
+ bb_xdaemon(0, 1);
#endif /* __uClinux__ */
}
doKlogd(console_log_level);
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index b43c72d66..0fcbb48bc 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -673,8 +673,7 @@ int syslogd_main(int argc, char **argv)
#if defined(__uClinux__)
vfork_daemon_rexec(0, 1, argc, argv, "-n");
#else /* __uClinux__ */
- if(daemon(0, 1) < 0)
- bb_perror_msg_and_die("daemon");
+ bb_xdaemon(0, 1);
#endif /* __uClinux__ */
}
doSyslogd();