extern int terse_version;
extern int is_backend;
extern int nr_clients;
+extern int log_syslog;
extern struct thread_data *threads;
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;
.has_arg = no_argument,
.val = 'S',
},
+ { .name = (char *) "daemonize",
+ .has_arg = no_argument,
+ .val = 'D',
+ },
{
.name = (char *) "net-port",
.has_arg = required_argument,
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) {
}
is_backend = 1;
break;
+ case 'D':
+ daemonize_server = 1;
+ break;
case 'P':
fio_net_port = atoi(optarg);
break;
}
if (is_backend)
- return fio_server();
+ return fio_start_server(daemonize_server);
if (td) {
if (!ret)
#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];
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, ...)
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
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
+#include <syslog.h>
#include "fio.h"
#include "server.h"
return exitval;
}
-int fio_server(void)
+static int fio_server(void)
{
struct sockaddr_in saddr_in;
struct sockaddr addr;
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();
+}
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);