X-Git-Url: http://git.samba.org/samba.git/?p=sfrench%2Fsamba-autobuild%2F.git;a=blobdiff_plain;f=lib%2Futil%2Fbecome_daemon.c;h=7b84299dc2841788c15f94ae5515a8732194caea;hp=92a75862bdde295bc948c955191944b367c584e1;hb=298af748ac09963f0bcacdba200ee43e081bbaa8;hpb=c0288e0612187ecbfc4a81d071fd504ea8737b7a diff --git a/lib/util/become_daemon.c b/lib/util/become_daemon.c index 92a75862bdd..7b84299dc28 100644 --- a/lib/util/become_daemon.c +++ b/lib/util/become_daemon.c @@ -21,9 +21,17 @@ along with this program. If not, see . */ -#include "includes.h" +#include "replace.h" #include "system/filesys.h" #include "system/locale.h" +#if defined(HAVE_LIBSYSTEMD_DAEMON) || defined(HAVE_LIBSYSTEMD) +#include +#endif + +#include "close_low_fd.h" +#include "debug.h" + +#include "become_daemon.h" /******************************************************************* Close the low 3 fd's and open dev/null in their place. @@ -31,41 +39,28 @@ _PUBLIC_ void close_low_fds(bool stdin_too, bool stdout_too, bool stderr_too) { -#ifndef VALGRIND - int fd; - int i; - - if (stdin_too) - close(0); - if (stdout_too) - close(1); - if (stderr_too) - close(2); - - /* try and use up these file descriptors, so silly - library routines writing to stdout etc won't cause havoc */ - for (i=0;i<3;i++) { - if (i == 0 && !stdin_too) - continue; - if (i == 1 && !stdout_too) - continue; - if (i == 2 && !stderr_too) - continue; - - fd = open("/dev/null",O_RDWR,0); - if (fd < 0) - fd = open("/dev/null",O_WRONLY,0); - if (fd < 0) { - DEBUG(0,("Can't open /dev/null\n")); - return; + if (stdin_too) { + int ret = close_low_fd(0); + if (ret != 0) { + DEBUG(0, ("%s: close_low_fd(0) failed: %s\n", + __func__, strerror(ret))); } - if (fd != i) { - DEBUG(0,("Didn't get file descriptor %d\n",i)); - return; + } + if (stdout_too) { + int ret = close_low_fd(1); + if (ret != 0) { + DEBUG(0, ("%s: close_low_fd(1) failed: %s\n", + __func__, strerror(ret))); + } + } + if (stderr_too) { + int ret = close_low_fd(2); + if (ret != 0) { + DEBUG(0, ("%s: close_low_fd(2) failed: %s\n", + __func__, strerror(ret))); } } -#endif } /**************************************************************************** @@ -74,8 +69,13 @@ _PUBLIC_ void close_low_fds(bool stdin_too, bool stdout_too, bool stderr_too) _PUBLIC_ void become_daemon(bool do_fork, bool no_process_group, bool log_stdout) { + pid_t newpid; if (do_fork) { - if (fork()) { + newpid = fork(); + if (newpid) { +#if defined(HAVE_LIBSYSTEMD_DAEMON) || defined(HAVE_LIBSYSTEMD) + sd_notifyf(0, "READY=0\nSTATUS=Starting process...\nMAINPID=%lu", (unsigned long) newpid); +#endif /* HAVE_LIBSYSTEMD_DAEMON */ _exit(0); } } @@ -85,7 +85,7 @@ _PUBLIC_ void become_daemon(bool do_fork, bool no_process_group, bool log_stdout if (!no_process_group) setsid(); #elif defined(TIOCNOTTY) if (!no_process_group) { - int i = sys_open("/dev/tty", O_RDWR, 0); + int i = open("/dev/tty", O_RDWR, 0); if (i != -1) { ioctl(i, (int) TIOCNOTTY, (char *)0); close(i); @@ -99,3 +99,42 @@ _PUBLIC_ void become_daemon(bool do_fork, bool no_process_group, bool log_stdout * never close stderr (but debug might dup it onto a log file) */ close_low_fds(do_fork, !log_stdout, false); } + +_PUBLIC_ void exit_daemon(const char *msg, int error) +{ +#if defined(HAVE_LIBSYSTEMD_DAEMON) || defined(HAVE_LIBSYSTEMD) + if (msg == NULL) { + msg = strerror(error); + } + + sd_notifyf(0, "STATUS=daemon failed to start: %s\n" + "ERRNO=%i", + msg, + error); +#endif + DEBUG(0, ("STATUS=daemon failed to start: %s, error code %d\n", msg, error)); + exit(1); +} + +_PUBLIC_ void daemon_ready(const char *name) +{ + if (name == NULL) { + name = "Samba"; + } +#if defined(HAVE_LIBSYSTEMD_DAEMON) || defined(HAVE_LIBSYSTEMD) + sd_notifyf(0, "READY=1\nSTATUS=%s: ready to serve connections...", name); +#endif + DEBUG(0, ("STATUS=daemon '%s' finished starting up and ready to serve " + "connections\n", name)); +} + +_PUBLIC_ void daemon_status(const char *name, const char *msg) +{ + if (name == NULL) { + name = "Samba"; + } +#if defined(HAVE_LIBSYSTEMD_DAEMON) || defined(HAVE_LIBSYSTEMD) + sd_notifyf(0, "\nSTATUS=%s: %s", name, msg); +#endif + DEBUG(0, ("STATUS=daemon '%s' : %s", name, msg)); +}