From 33a2de703db162af0c3d77593d560f3a8e7f1b95 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 4 Jun 2012 14:54:50 +0200 Subject: Add pidfile support --- src/config.c | 9 +++++++++ src/fastd.c | 33 +++++++++++++++++++++++++++++++-- src/fastd.h | 2 ++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index a77c258..c28de7f 100644 --- a/src/config.c +++ b/src/config.c @@ -92,6 +92,8 @@ static void default_config(fastd_config *conf) { conf->on_disestablish_dir = NULL; conf->daemon = false; + conf->pid_file = NULL; + conf->machine_readable = false; conf->generate_key = false; conf->show_key = false; @@ -374,6 +376,7 @@ static void count_peers(fastd_context *ctx, fastd_config *conf) { OPTION(usage, "--help" OR "-h", "Shows this help text") \ OPTION(version, "--version" OR "-v", "Shows the fastd version") \ OPTION(option_daemon, "--daemon" OR "-d", "Runs fastd in the background") \ + OPTION_ARG(option_pid_file, "--pid-file", "", "Writes fastd's PID to the specified file") \ OPTION_ARG(option_log_level, "--log-level", "error|warn|info|verbose|debug", "Sets the stderr log level; default is info, if no alternative log destination ist configured") \ OPTION_ARG(option_syslog_level, "--syslog-level", "error|warn|info|verbose|debug", "Sets the log level for syslog output; default is not to use syslog") \ OPTION_ARG(option_syslog_ident, "--syslog-ident", "", "Sets the syslog identification; default is 'fastd'") \ @@ -614,6 +617,12 @@ static void option_on_disestablish(fastd_context *ctx, fastd_config *conf, const static void option_daemon(fastd_context *ctx, fastd_config *conf) { conf->daemon = true; } + +static void option_pid_file(fastd_context *ctx, fastd_config *conf, const char *arg) { + free(conf->pid_file); + conf->pid_file = strdup(arg); +} + static void option_generate_key(fastd_context *ctx, fastd_config *conf) { conf->generate_key = true; conf->show_key = false; diff --git a/src/fastd.c b/src/fastd.c index 9f92ddb..aa7ed44 100644 --- a/src/fastd.c +++ b/src/fastd.c @@ -667,6 +667,23 @@ static void close_fds(fastd_context *ctx) { } } +static void write_pid(fastd_context *ctx, pid_t pid) { + if (!ctx->conf->pid_file) + return; + + int fd = open(ctx->conf->pid_file, O_WRONLY|O_CREAT, 0666); + if (fd < 0) { + pr_error_errno(ctx, "can't write PID file: open"); + return; + } + + if (dprintf(fd, "%i", pid) < 0) + pr_error_errno(ctx, "can't write PID file: dprintf"); + + if (close(fd) < 0) + pr_warn_errno(ctx, "close"); +} + int main(int argc, char *argv[]) { fastd_context ctx; memset(&ctx, 0, sizeof(ctx)); @@ -704,8 +721,20 @@ int main(int argc, char *argv[]) { init_peers(&ctx); if (conf.daemon) { - if (daemon(1, 1) < 0) - exit_errno(&ctx, "daemon"); + pid_t pid = fork(); + if (pid < 0) { + exit_errno(&ctx, "fork"); + } + else if (pid > 0) { + write_pid(&ctx, pid); + exit(0); + } + + if (setsid() < 0) + pr_error_errno(&ctx, "setsid"); + } + else { + write_pid(&ctx, getpid()); } on_up(&ctx); diff --git a/src/fastd.h b/src/fastd.h index fbf86ab..2edfcfe 100644 --- a/src/fastd.h +++ b/src/fastd.h @@ -174,6 +174,8 @@ struct _fastd_config { char *on_disestablish_dir; bool daemon; + char *pid_file; + bool machine_readable; bool generate_key; bool show_key; -- cgit v1.2.3