Properly log errors in server
[fio.git] / server.c
index bd49b9c5a5cd4100adc7bb03a1a685c61a5fe8bd..5ef0fe01dd808d5aecd69901f8ad6dec95f42f83 100644 (file)
--- a/server.c
+++ b/server.c
 
 static int net_port = 8765;
 
+int exit_backend = 0;
+
 static int accept_loop(int listen_sk)
 {
        struct sockaddr addr;
        unsigned int len = sizeof(addr);
-       int sk;
+       struct pollfd pfd;
+       int ret, sk, flags;
 
+       flags = fcntl(listen_sk, F_GETFL);
+       flags |= O_NONBLOCK;
+       fcntl(listen_sk, F_SETFL, flags);
 again:
+       pfd.fd = listen_sk;
+       pfd.events = POLLIN;
+       do {
+               ret = poll(&pfd, 1, 100);
+               if (ret < 0) {
+                       if (errno == EINTR)
+                               break;
+                       perror("poll");
+                       goto out;
+               } else if (!ret)
+                       continue;
+
+               if (pfd.revents & POLLIN)
+                       break;
+       } while (!exit_backend);
+
+       if (exit_backend)
+               goto out;
+
        sk = accept(listen_sk, &addr, &len);
-       printf("got a hit\n");
        if (sk < 0) {
-               log_err("fio: accept failed\n");
+               log_err("fio: accept: %s\n", strerror(errno));
                return -1;
        }
 
        /* read forever */
-       for (;;) {
+       while (!exit_backend) {
                char buf[131072];
-               int ret;
 
                ret = recv(sk, buf, 4096, 0);
                if (ret > 0) {
+                       if (!strncmp("FIO_QUIT", buf, 8)) {
+                               exit_backend = 1;
+                               break;
+                       }
                        parse_jobs_ini(buf, 1, 0);
                        exec_run();
                        reset_fio_state();
@@ -54,8 +81,12 @@ again:
        }
 
        close(sk);
-       printf("closed\n");
-       goto again;
+
+       if (!exit_backend)
+               goto again;
+
+out:
+       return 0;
 }
 
 int fio_server(void)
@@ -63,22 +94,22 @@ int fio_server(void)
        struct sockaddr_in saddr_in;
        struct sockaddr addr;
        unsigned int len;
-       int sk, opt;
+       int sk, opt, ret;
 
        sk = socket(AF_INET, SOCK_STREAM, 0);
        if (sk < 0) {
-               log_err("fio: socket\n");
+               log_err("fio: socket: %s\n", strerror(errno));
                return -1;
        }
 
        opt = 1;
        if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
-               log_err("fio: setsockopt\n");
+               log_err("fio: setsockopt: %s\n", strerror(errno));
                return -1;
        }
 #ifdef SO_REUSEPORT
        if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
-               td_verror(td, errno, "setsockopt");
+               log_err("fio: setsockopt: %s\n", strerror(errno));
                return 1;
        }
 #endif
@@ -88,21 +119,22 @@ int fio_server(void)
        saddr_in.sin_port = htons(net_port);
 
        if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) {
-               perror("bind");
-               log_err("fio: bind\n");
+               log_err("fio: bind: %s\n", strerror(errno));
                return -1;
        }
 
        if (listen(sk, 1) < 0) {
-               log_err("fio: listen\n");
+               log_err("fio: listen: %s\n", strerror(errno));
                return -1;
        }
 
        len = sizeof(addr);
        if (getsockname(sk, &addr, &len) < 0) {
-               log_err("fio: getsockname");
+               log_err("fio: getsockname: %s\n", strerror(errno));
                return -1;
        }
 
-       return accept_loop(sk);
+       ret = accept_loop(sk);
+       close(sk);
+       return ret;
 }