server: initial support for daemonizing
authorJens Axboe <axboe@kernel.dk>
Mon, 3 Oct 2011 07:11:02 +0000 (09:11 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 3 Oct 2011 07:11:02 +0000 (09:11 +0200)
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fio.h
init.c
log.c
log.h
server.c
server.h

diff --git a/fio.h b/fio.h
index 5928b45a0fbb9b2811ab2341cc7f7a9002e9b730..82dc118e4bde3950ca71458797c215011adf3b93 100644 (file)
--- 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 89c241f2500b0c689ceb0ac952d2d53bdf2a6543..8efd7a4ef6777e429a9ee6d6d1b303f67d0e6e64 100644 (file)
--- 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 5d1d0b52d5f48ec09f705f3bea04dddb53d7160d..1dacac41f118fdd4678d3c7e0911518f0bab4c88 100644 (file)
--- a/log.c
+++ b/log.c
@@ -2,9 +2,24 @@
 #include <fcntl.h>
 #include <string.h>
 #include <stdarg.h>
+#include <syslog.h>
 
 #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 f201191b11eb552a302f3876e64750dfd4969856..874c1d9d5aa54a237bd2ee747b027ca5387a7e37 100644 (file)
--- 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
index 648758e2d8690175f9071b8eeaa681a86c735fa8..727666c9721d44cd51538d11402a00e7251125b7 100644 (file)
--- a/server.c
+++ b/server.c
@@ -12,6 +12,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <netdb.h>
+#include <syslog.h>
 
 #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();
+}
index 8e6852a528c22b3ec63bb6cf0a466c85a59c426e..008cb25055c2673364fbfb45cfd77a3eaf5ac675 100644 (file)
--- 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);