From: Stewart Smith Date: Fri, 11 Feb 2011 00:22:25 +0000 (+1100) Subject: rename source to match CCAN standards X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=11bbae90af6ae612ee91d52cebdbb6f1b92239be rename source to match CCAN standards --- diff --git a/ccan/daemon-with-notify/daemon-with-notify.c b/ccan/daemon-with-notify/daemon-with-notify.c new file mode 100644 index 00000000..625d6557 --- /dev/null +++ b/ccan/daemon-with-notify/daemon-with-notify.c @@ -0,0 +1,131 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 2010 + * Stewart Smith + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +void sigusr1_handler(int sig); + +pid_t parent_pid; + +void sigusr1_handler(int sig) +{ + if (sig == SIGUSR1) + _exit(EXIT_SUCCESS); +} + +int daemon_is_ready(void) +{ + kill(parent_pid, SIGUSR1); + return 0; +} + +int daemonize(int nochdir, int noclose, int wait_sigusr1) +{ + int fd; + pid_t child= -1; + + parent_pid= getpid(); + signal(SIGUSR1, sigusr1_handler); + + child= fork(); + + switch (child) + { + case -1: + return (-1); + case 0: + break; + default: + if (wait_sigusr1) + { + /* parent */ + int exit_code= -1; + int status; + while (waitpid(child, &status, 0) != child); + if (WIFEXITED(status)) + { + exit_code= WEXITSTATUS(status); + } + if (WIFSIGNALED(status)) + { + exit_code= -1; + } + _exit(exit_code); + } + else + { + _exit(EXIT_SUCCESS); + } + } + + /* child */ + if (setsid() == -1) + return (-1); + + if (nochdir == 0) { + if(chdir("/") != 0) { + perror("chdir"); + return (-1); + } + } + + if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) { + if(dup2(fd, STDIN_FILENO) < 0) { + perror("dup2 stdin"); + return (-1); + } + if(dup2(fd, STDOUT_FILENO) < 0) { + perror("dup2 stdout"); + return (-1); + } + if(dup2(fd, STDERR_FILENO) < 0) { + perror("dup2 stderr"); + return (-1); + } + + if (fd > STDERR_FILENO) { + if(close(fd) < 0) { + perror("close"); + return (-1); + } + } + } + return (0); +} diff --git a/ccan/daemon-with-notify/daemon-with-notify.h b/ccan/daemon-with-notify/daemon-with-notify.h new file mode 100644 index 00000000..f80e7f51 --- /dev/null +++ b/ccan/daemon-with-notify/daemon-with-notify.h @@ -0,0 +1,32 @@ +#ifndef CCAN_DAEMON_WITH_NOTIFY_H +#define CCAN_DAEMON_WITH_NOTIFY_H + +/** + * daemonize - turns this process into a daemon + * + * This routine will fork() us off to become a daemon. It will return + * -1 on error and 0 on success. + * + * It has a few optional behaviours: + * @nochdir: if nochdir is set, it won't chdir to / + * this means we could hold onto mounts + * @noclose: if noclose is set, we won't close stdout, stdin and stderr. + * @wait_sigusr1: if wait_sigusr1 is set, the parent will not exit until the + * child has either exited OR it receives a SIGUSR1 signal. You can use this + * to have the parent only exit when your process has done all the + * danegerous initialization that could cause it to fail to start + * (e.g. allocating large amounts of memory, replaying REDO logs). + * This allows init scripts starting the daemon to easily report + * success/failure. + */ +int daemonize(int nochdir, int noclose, int wait_sigusr1); + +/** + * daemon_is_ready - signals parent that it can exit, we started okay + * + * After a daemonize() call, this function will send a SIGUSR1 to the parent + * telling it to exit as we have started up okay. + */ +int daemon_is_ready(void); + +#endif /* CCAN_DAEMON_WITH_NOTIFY_H */ diff --git a/ccan/daemon-with-notify/daemon.c b/ccan/daemon-with-notify/daemon.c deleted file mode 100644 index 625d6557..00000000 --- a/ccan/daemon-with-notify/daemon.c +++ /dev/null @@ -1,131 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 2010 - * Stewart Smith - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -void sigusr1_handler(int sig); - -pid_t parent_pid; - -void sigusr1_handler(int sig) -{ - if (sig == SIGUSR1) - _exit(EXIT_SUCCESS); -} - -int daemon_is_ready(void) -{ - kill(parent_pid, SIGUSR1); - return 0; -} - -int daemonize(int nochdir, int noclose, int wait_sigusr1) -{ - int fd; - pid_t child= -1; - - parent_pid= getpid(); - signal(SIGUSR1, sigusr1_handler); - - child= fork(); - - switch (child) - { - case -1: - return (-1); - case 0: - break; - default: - if (wait_sigusr1) - { - /* parent */ - int exit_code= -1; - int status; - while (waitpid(child, &status, 0) != child); - if (WIFEXITED(status)) - { - exit_code= WEXITSTATUS(status); - } - if (WIFSIGNALED(status)) - { - exit_code= -1; - } - _exit(exit_code); - } - else - { - _exit(EXIT_SUCCESS); - } - } - - /* child */ - if (setsid() == -1) - return (-1); - - if (nochdir == 0) { - if(chdir("/") != 0) { - perror("chdir"); - return (-1); - } - } - - if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) { - if(dup2(fd, STDIN_FILENO) < 0) { - perror("dup2 stdin"); - return (-1); - } - if(dup2(fd, STDOUT_FILENO) < 0) { - perror("dup2 stdout"); - return (-1); - } - if(dup2(fd, STDERR_FILENO) < 0) { - perror("dup2 stderr"); - return (-1); - } - - if (fd > STDERR_FILENO) { - if(close(fd) < 0) { - perror("close"); - return (-1); - } - } - } - return (0); -} diff --git a/ccan/daemon-with-notify/daemon.h b/ccan/daemon-with-notify/daemon.h deleted file mode 100644 index f80e7f51..00000000 --- a/ccan/daemon-with-notify/daemon.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef CCAN_DAEMON_WITH_NOTIFY_H -#define CCAN_DAEMON_WITH_NOTIFY_H - -/** - * daemonize - turns this process into a daemon - * - * This routine will fork() us off to become a daemon. It will return - * -1 on error and 0 on success. - * - * It has a few optional behaviours: - * @nochdir: if nochdir is set, it won't chdir to / - * this means we could hold onto mounts - * @noclose: if noclose is set, we won't close stdout, stdin and stderr. - * @wait_sigusr1: if wait_sigusr1 is set, the parent will not exit until the - * child has either exited OR it receives a SIGUSR1 signal. You can use this - * to have the parent only exit when your process has done all the - * danegerous initialization that could cause it to fail to start - * (e.g. allocating large amounts of memory, replaying REDO logs). - * This allows init scripts starting the daemon to easily report - * success/failure. - */ -int daemonize(int nochdir, int noclose, int wait_sigusr1); - -/** - * daemon_is_ready - signals parent that it can exit, we started okay - * - * After a daemonize() call, this function will send a SIGUSR1 to the parent - * telling it to exit as we have started up okay. - */ -int daemon_is_ready(void); - -#endif /* CCAN_DAEMON_WITH_NOTIFY_H */