From e46d809110bd4ad2980ca64931b683673444454b Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 3 Oct 2011 09:11:02 +0200 Subject: [PATCH] server: initial support for daemonizing Signed-off-by: Jens Axboe --- fio.h | 1 + init.c | 11 ++++++++++- log.c | 27 ++++++++++++++++++++++++--- log.h | 3 +-- server.c | 28 +++++++++++++++++++++++++++- server.h | 2 +- 6 files changed, 64 insertions(+), 8 deletions(-) diff --git a/fio.h b/fio.h index 5928b45a..82dc118e 100644 --- a/fio.h +++ b/fio.h @@ -653,6 +653,7 @@ extern int warnings_fatal; extern int terse_version; extern int is_backend; extern int nr_clients; +extern int log_syslog; extern struct thread_data *threads; diff --git a/init.c b/init.c index 89c241f2..8efd7a4e 100644 --- a/init.c +++ b/init.c @@ -47,6 +47,7 @@ int warnings_fatal = 0; int terse_version = 2; int is_backend = 0; int nr_clients = 0; +int log_syslog = 0; int write_bw_log = 0; int read_only = 0; @@ -161,6 +162,10 @@ static struct option l_opts[FIO_NR_OPTIONS] = { .has_arg = no_argument, .val = 'S', }, + { .name = (char *) "daemonize", + .has_arg = no_argument, + .val = 'D', + }, { .name = (char *) "net-port", .has_arg = required_argument, @@ -1192,6 +1197,7 @@ static int parse_cmd_line(int argc, char *argv[]) struct thread_data *td = NULL; int c, ini_idx = 0, lidx, ret = 0, do_exit = 0, exit_val = 0; char *ostr = cmd_optstr; + int daemonize_server = 0; while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) { switch (c) { @@ -1317,6 +1323,9 @@ static int parse_cmd_line(int argc, char *argv[]) } is_backend = 1; break; + case 'D': + daemonize_server = 1; + break; case 'P': fio_net_port = atoi(optarg); break; @@ -1346,7 +1355,7 @@ static int parse_cmd_line(int argc, char *argv[]) } if (is_backend) - return fio_server(); + return fio_start_server(daemonize_server); if (td) { if (!ret) diff --git a/log.c b/log.c index 5d1d0b52..1dacac41 100644 --- a/log.c +++ b/log.c @@ -2,9 +2,24 @@ #include #include #include +#include #include "fio.h" +int log_valist(const char *str, va_list args) +{ + if (log_syslog) { + vsyslog(LOG_INFO, str, args); + return 0; + } else { + char buffer[1024]; + size_t len; + + len = vsnprintf(buffer, sizeof(buffer), str, args); + return fwrite(buffer, len, 1, f_out); + } +} + int log_local(const char *format, ...) { char buffer[1024]; @@ -12,10 +27,16 @@ int log_local(const char *format, ...) size_t len; va_start(args, format); - len = vsnprintf(buffer, sizeof(buffer), format, args); - va_end(args); - return fwrite(buffer, len, 1, f_out); + if (log_syslog) { + vsyslog(LOG_INFO, format, args); + va_end(args); + return 0; + } else { + len = vsnprintf(buffer, sizeof(buffer), format, args); + va_end(args); + return fwrite(buffer, len, 1, f_out); + } } int log_info(const char *format, ...) diff --git a/log.h b/log.h index f201191b..874c1d9d 100644 --- a/log.h +++ b/log.h @@ -9,7 +9,6 @@ extern FILE *f_err; extern int log_err(const char *format, ...); extern int log_info(const char *format, ...); extern int log_local(const char *format, ...); - -#define log_valist(str, args) vfprintf(f_out, (str), (args)) +extern int log_valist(const char *str, va_list); #endif diff --git a/server.c b/server.c index 648758e2..727666c9 100644 --- a/server.c +++ b/server.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "fio.h" #include "server.h" @@ -363,7 +364,7 @@ out: return exitval; } -int fio_server(void) +static int fio_server(void) { struct sockaddr_in saddr_in; struct sockaddr addr; @@ -435,3 +436,28 @@ int fio_server_log(const char *format, ...) return fio_server_text_output(buffer, len); } + +int fio_start_server(int daemonize) +{ + pid_t pid; + + if (!daemonize) + return fio_server(); + + openlog("fio", LOG_NDELAY|LOG_NOWAIT|LOG_PID, LOG_USER); + pid = fork(); + if (pid < 0) { + syslog(LOG_ERR, "failed server fork"); + return 1; + } else if (pid) + exit(0); + + setsid(); + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + f_out = NULL; + f_err = NULL; + log_syslog = 1; + return fio_server(); +} diff --git a/server.h b/server.h index 8e6852a5..008cb250 100644 --- a/server.h +++ b/server.h @@ -38,7 +38,7 @@ enum { 2 * sizeof(uint16_t), }; -extern int fio_server(void); +extern int fio_start_server(int); extern int fio_server_text_output(const char *, unsigned int len); extern int fio_server_log(const char *format, ...); extern int fio_net_send_cmd(int, uint16_t, const char *, off_t); -- 2.25.1