24 #include <baseapp/daemonize.h>
25 #include <sys/types.h>
26 #include <utils/system/argparser.h>
31 # include <libdaemon/dfork.h>
32 # include <libdaemon/dlog.h>
33 # include <libdaemon/dpid.h>
34 # include <sys/stat.h>
35 # include <sys/wait.h>
48 const char *fawkes_pid_file;
54 fawkes_daemon_pid_file_proc()
56 return fawkes_pid_file;
58 #endif // HAVE_LIBDAEMON
65 mode_t old_umask = umask(0);
71 if ((pid = daemon_fork()) < 0) {
78 if ((ret = daemon_retval_wait(20)) < 0) {
79 daemon_log(LOG_ERR,
"Could not recieve return value from daemon process.");
84 daemon_log(LOG_ERR,
"*** Daemon startup failed, see syslog for details. ***");
86 case 1: daemon_log(LOG_ERR,
"Daemon failed to close file descriptors");
break;
87 case 2: daemon_log(LOG_ERR,
"Daemon failed to create PID file");
break;
95 # ifdef DAEMON_CLOSE_ALL_AVAILABLE
96 if (daemon_close_all(-1) < 0) {
97 daemon_log(LOG_ERR,
"Failed to close all file descriptors: %s", strerror(errno));
99 daemon_retval_send(1);
105 if (daemon_pid_file_create() < 0) {
106 printf(
"Could not create PID file (%s).", strerror(errno));
107 daemon_log(LOG_ERR,
"Could not create PID file (%s).", strerror(errno));
110 daemon_retval_send(2);
115 daemon_retval_send(0);
117 daemon_log(LOG_INFO,
"Sucessfully started");
123 throw Exception(
"Daemonizing support is not available.\n"
124 "(libdaemon[-devel] was not available at compile time)\n");
129 init(
const char *pidfile,
const char *progname)
131 #ifdef HAVE_LIBDAEMON
133 daemon_pid_file_ident = daemon_log_ident = daemon_ident_from_argv0((
char *)progname);
134 if (pidfile != NULL) {
135 fawkes_pid_file = pidfile;
136 daemon_pid_file_proc = fawkes_daemon_pid_file_proc;
139 throw Exception(
"Daemonizing support is not available.\n"
140 "(libdaemon[-devel] was not available at compile time)\n");
147 #ifdef HAVE_LIBDAEMON
151 if ((pid = daemon_pid_file_is_running()) >= 0) {
152 daemon_log(LOG_ERR,
"Daemon already running on (PID %u)", pid);
153 throw Exception(
"Daemon already running on (PID %u)", pid);
159 throw Exception(
"Failed to daemonize");
168 throw Exception(
"Daemonizing support is not available.\n"
169 "(libdaemon[-devel] was not available at compile time)\n");
176 #ifdef HAVE_LIBDAEMON
177 return (daemon_pid_file_is_running() >= 0);
179 throw Exception(
"Daemonizing support is not available.\n"
180 "(libdaemon[-devel] was not available at compile time)\n");
187 #ifdef HAVE_LIBDAEMON
192 if ((pid = daemon_pid_file_is_running()) < 0) {
193 daemon_log(LOG_WARNING,
"Fawkes daemon not running.");
197 if ((ret = daemon_pid_file_kill_wait(SIGINT, 5)) < 0) {
198 daemon_log(LOG_WARNING,
"Failed to kill daemon");
201 daemon_pid_file_remove();
203 throw Exception(
"Daemonizing support is not available.\n"
204 "(libdaemon[-devel] was not available at compile time)\n");
211 #ifdef HAVE_LIBDAEMON
212 daemon_retval_send(-1);
213 daemon_retval_done();
214 daemon_pid_file_remove();
216 throw Exception(
"Daemonizing support is not available.\n"
217 "(libdaemon[-devel] was not available at compile time)\n");