- patch from Denis Vlasenko to add and use bb_xdaemon()
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 12 Apr 2006 18:09:26 +0000 (18:09 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 12 Apr 2006 18:09:26 +0000 (18:09 -0000)
12 files changed:
debianutils/start_stop_daemon.c
include/libbb.h
libbb/Makefile.in
libbb/bb_xdaemon.c [new file with mode: 0644]
miscutils/crond.c
miscutils/watchdog.c
networking/dnsd.c
networking/httpd.c
networking/inetd.c
networking/telnetd.c
sysklogd/klogd.c
sysklogd/syslogd.c

index 5b689740e6239f324c6867ddb99dfb9c0ce4c2fd..b44a23b4bc5429dc465ce67d41511e57ec9555d5 100644 (file)
@@ -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) {
index c031f28415af71f90f9477a550048b8dcd602671..650002b7b015d1aed12f727257525e2b3e9dc960 100644 (file)
@@ -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;
index c699783703f26d865345127b08c069b313874466..3fb945e31fab04519b1d46b0b440b475364485be 100644 (file)
@@ -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 (file)
index 0000000..a40f4f9
--- /dev/null
@@ -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");
+}
+
index 7e50b61c7b54a86985a545573f8ecccbabaa0480..06b8769fab5bb58a2c99c891e7149de00f03cd03 100644 (file)
@@ -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 */
        }
 
index 55dd69857e1ec1fb9406f2ad686f67c860a18f82..58a6065536f1d5c5b4da7ae28e38269eaaa69719 100644 (file)
@@ -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);
index 9c51938207a3b3fd72e7bb291aa2b3d453cb084b..d78ea04c09196a23f9bdfc5e6d989dbf2ce4a127 100644 (file)
@@ -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());
index fde8ae4bddd8f133cbca142ac7025889949c8050..354c199e7902d28ea2b22bda989efe57bf0934bb 100644 (file)
@@ -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
index cc700832cbc165dac3e465eba166d55c2444ca0b..39a2b24cb9fce8d8ba68fb3e552d857985df4ad8 100644 (file)
@@ -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: */
index 3e4b42cfaad9d0e8af1754c28da7506b9c5cbbe5..d53f56b14edc9e92b95f82a73e5cf0d65cdc5dfa 100644 (file)
@@ -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 */
index 51b01430e947885cb2e7ebd3639be41f0b4a1dcb..6dc5457af80dd152069c756c4b3a903a02e90767 100644 (file)
@@ -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);
index b43c72d660d8e39d85f90ad8fe781fbfc15f1353..0fcbb48bcbdf5a9f1949598e1e69dee80e7e8a01 100644 (file)
@@ -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();