server: endianness bug and exit command
[fio.git] / server.c
index ca37e3f6b9dd89894dd5babea42c4670fa8aaf7a..d1de0e48ad4aa44065a357db1c7f5693416d856a 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"
@@ -25,7 +26,7 @@ static char *job_buf;
 static unsigned int job_cur_len;
 static unsigned int job_max_len;
 
-static int server_fd;
+static int server_fd = -1;
 
 int fio_send_data(int sk, const void *p, unsigned int len)
 {
@@ -175,7 +176,7 @@ int fio_net_send_cmd(int fd, uint16_t opcode, const char *buf, off_t size)
                fio_init_net_cmd(cmd, opcode, buf, this_len);
 
                if (this_len < size)
-                       cmd->flags |= FIO_NET_CMD_F_MORE;
+                       cmd->flags = cpu_to_le32(FIO_NET_CMD_F_MORE);
 
                fio_net_cmd_crc(cmd);
 
@@ -222,6 +223,7 @@ static int nak_command(int sk, struct fio_net_cmd *cmd)
 
 static int send_quit_command(void)
 {
+       dprint(FD_NET, "server: sending quit\n");
        return send_simple_command(server_fd, FIO_NET_CMD_QUIT, 0);
 }
 
@@ -258,8 +260,12 @@ static int handle_command(struct fio_net_cmd *cmd)
 {
        int ret;
 
+       dprint(FD_NET, "server: got opcode %d\n", cmd->opcode);
+
        switch (cmd->opcode) {
        case FIO_NET_CMD_QUIT:
+               return 1;
+       case FIO_NET_CMD_EXIT:
                exit_backend = 1;
                return 1;
        case FIO_NET_CMD_ACK:
@@ -299,6 +305,7 @@ static int handle_connection(int sk)
                        break;
 
                free(cmd);
+               cmd = NULL;
        }
 
        if (cmd)
@@ -343,6 +350,8 @@ again:
                return -1;
        }
 
+       dprint(FD_NET, "server got a connection\n");
+
        server_fd = sk;
 
        exitval = handle_connection(sk);
@@ -357,13 +366,15 @@ out:
        return exitval;
 }
 
-int fio_server(void)
+static int fio_server(void)
 {
        struct sockaddr_in saddr_in;
        struct sockaddr addr;
        unsigned int len;
        int sk, opt, ret;
 
+       dprint(FD_NET, "starting server\n");
+
        sk = socket(AF_INET, SOCK_STREAM, 0);
        if (sk < 0) {
                log_err("fio: socket: %s\n", strerror(errno));
@@ -427,3 +438,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();
+}