#include <signal.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/unistd.h>
#include <sys/select.h>
int main(int argc, char *argv[]) {
pid_t pid;
daemon_log(LOG_ERR,
"Failed to reset all signal handlers: %s", strerror(errno));
return 1;
}
daemon_log(LOG_ERR,
"Failed to unblock all signals: %s", strerror(errno));
return 1;
}
if (argc >= 2 && !strcmp(argv[1], "-k")) {
int ret;
daemon_log(LOG_WARNING,
"Failed to kill daemon: %s", strerror(errno));
return ret < 0 ? 1 : 0;
}
daemon_log(LOG_ERR,
"Daemon already running on PID file %u", pid);
return 1;
}
return 1;
}
return 1;
} else if (pid) {
int ret;
daemon_log(LOG_ERR,
"Could not receive return value from daemon process: %s", strerror(errno));
return 255;
}
daemon_log(ret != 0 ? LOG_ERR : LOG_INFO,
"Daemon returned %i as return value.", ret);
return ret;
} else {
int fd, quit = 0;
fd_set fds;
daemon_log(LOG_ERR,
"Failed to close all file descriptors: %s", strerror(errno));
goto finish;
}
daemon_log(LOG_ERR,
"Could not create PID file (%s).", strerror(errno));
goto finish;
}
daemon_log(LOG_ERR,
"Could not register signal handlers (%s).", strerror(errno));
goto finish;
}
FD_ZERO(&fds);
FD_SET(fd, &fds);
while (!quit) {
fd_set fds2 = fds;
if (select(FD_SETSIZE, &fds2, 0, 0, 0) < 0) {
if (errno == EINTR)
continue;
daemon_log(LOG_ERR,
"select(): %s", strerror(errno));
break;
}
if (FD_ISSET(fd, &fds2)) {
int sig;
daemon_log(LOG_ERR,
"daemon_signal_next() failed: %s", strerror(errno));
break;
}
switch (sig) {
case SIGINT:
case SIGQUIT:
case SIGTERM:
daemon_log(LOG_WARNING,
"Got SIGINT, SIGQUIT or SIGTERM.");
quit = 1;
break;
case SIGHUP:
break;
}
}
}
finish:
return 0;
}
}
Contains a robust API for running sub processes with STDOUT and STDERR redirected to syslog.
int daemon_exec(const char *dir, int *ret, const char *prog,...) DAEMON_GCC_SENTINEL
Run the specified executable with the specified arguments in the specified directory and return the r...
Contains an API for doing a daemonizing fork().
int daemon_unblock_sigs(int except,...)
Unblock all signals except those passed.
void daemon_retval_done(void)
Frees the resources allocated by daemon_retval_init().
int daemon_reset_sigs(int except,...)
Reset all signal handlers except those passed.
int daemon_close_all(int except_fd,...)
Close all file descriptors except those passed.
pid_t daemon_fork(void)
Does a daemonizing fork().
int daemon_retval_wait(int timeout)
Return the value sent by the child via the daemon_retval_send() function, but wait only the specified...
int daemon_retval_send(int s)
Send the specified integer to the parent process.
int daemon_retval_init(void)
Allocate and initialize resources required by the daemon_retval_xxx() functions.
Contains a robust API for logging messages.
char * daemon_ident_from_argv0(char *argv0)
Return a sensible syslog identification for daemon_log_ident generated from argv[0].
const char * daemon_log_ident
Specifies the syslog identification, use daemon_ident_from_argv0() to set this to a sensible value or...
void daemon_log(int prio, const char *t,...) DAEMON_GCC_PRINTF_ATTR(2
Log a message using printf format strings using the specified syslog priority.
Contains an API for manipulating PID files.
int daemon_pid_file_create(void)
Creates PID pid file for the current process.
int daemon_pid_file_remove(void)
Removes the PID file of the current process.
pid_t daemon_pid_file_is_running(void)
Returns the PID file of a running daemon, if available.
const char * daemon_pid_file_ident
Identification string for the PID file name, only used when daemon_pid_file_proc is set to daemon_pid...
int daemon_pid_file_kill_wait(int s, int m)
Similar to daemon_pid_file_kill() but waits until the process died.
Contains the API for serializing signals to a pipe for usage with select() or poll().
void daemon_signal_done(void)
Free resources of signal handling, should be called before daemon exit.
int daemon_signal_next(void)
Return the next signal received.
int daemon_signal_fd(void)
Return the file descriptor the daemon should select() on for reading.
int daemon_signal_init(int s,...)
Installs signal handlers for the specified signals.