Optimize the code that copies strings
[fio.git] / engines / net.c
index 7a0fe696c1b81c7ff0dba9539387a0f16c5d7bdb..91f25774690a16ec9e20576ebb95e3e4e2e9f82e 100644 (file)
@@ -9,19 +9,18 @@
 #include <unistd.h>
 #include <signal.h>
 #include <errno.h>
-#include <assert.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 #include <arpa/inet.h>
 #include <netdb.h>
-#include <sys/poll.h>
-#include <sys/types.h>
+#include <poll.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 
 #include "../fio.h"
 #include "../verify.h"
+#include "../optgroup.h"
 
 struct netio_data {
        int listenfd;
@@ -134,6 +133,7 @@ static struct fio_option options[] = {
 #ifdef CONFIG_TCP_NODELAY
        {
                .name   = "nodelay",
+               .lname  = "No Delay",
                .type   = FIO_OPT_BOOL,
                .off1   = offsetof(struct netio_options, nodelay),
                .help   = "Use TCP_NODELAY on TCP connections",
@@ -152,6 +152,7 @@ static struct fio_option options[] = {
        },
        {
                .name   = "pingpong",
+               .lname  = "Ping Pong",
                .type   = FIO_OPT_STR_SET,
                .off1   = offsetof(struct netio_options, pingpong),
                .help   = "Ping-pong IO requests",
@@ -373,7 +374,7 @@ static int splice_io_u(int fdin, int fdout, unsigned int len)
  */
 static int splice_in(struct thread_data *td, struct io_u *io_u)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
 
        return splice_io_u(io_u->file->fd, nd->pipes[1], io_u->xfer_buflen);
 }
@@ -384,7 +385,7 @@ static int splice_in(struct thread_data *td, struct io_u *io_u)
 static int splice_out(struct thread_data *td, struct io_u *io_u,
                      unsigned int len)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
 
        return splice_io_u(nd->pipes[0], io_u->file->fd, len);
 }
@@ -422,7 +423,7 @@ static int vmsplice_io_u(struct io_u *io_u, int fd, unsigned int len)
 static int vmsplice_io_u_out(struct thread_data *td, struct io_u *io_u,
                             unsigned int len)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
 
        return vmsplice_io_u(io_u, nd->pipes[0], len);
 }
@@ -432,7 +433,7 @@ static int vmsplice_io_u_out(struct thread_data *td, struct io_u *io_u,
  */
 static int vmsplice_io_u_in(struct thread_data *td, struct io_u *io_u)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
 
        return vmsplice_io_u(io_u, nd->pipes[1], io_u->xfer_buflen);
 }
@@ -484,6 +485,9 @@ static void store_udp_seq(struct netio_data *nd, struct io_u *io_u)
 {
        struct udp_seq *us;
 
+       if (io_u->xfer_buflen < sizeof(*us))
+               return;
+
        us = io_u->xfer_buf + io_u->xfer_buflen - sizeof(*us);
        us->magic = cpu_to_le64((uint64_t) FIO_UDP_SEQ_MAGIC);
        us->bs = cpu_to_le64((uint64_t) io_u->xfer_buflen);
@@ -496,6 +500,9 @@ static void verify_udp_seq(struct thread_data *td, struct netio_data *nd,
        struct udp_seq *us;
        uint64_t seq;
 
+       if (io_u->xfer_buflen < sizeof(*us))
+               return;
+
        if (nd->seq_off)
                return;
 
@@ -517,7 +524,7 @@ static void verify_udp_seq(struct thread_data *td, struct netio_data *nd,
 
 static int fio_netio_send(struct thread_data *td, struct io_u *io_u)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        int ret, flags = 0;
 
@@ -580,7 +587,7 @@ static int is_close_msg(struct io_u *io_u, int len)
 
 static int fio_netio_recv(struct thread_data *td, struct io_u *io_u)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        int ret, flags = 0;
 
@@ -635,10 +642,11 @@ static int fio_netio_recv(struct thread_data *td, struct io_u *io_u)
        return ret;
 }
 
-static int __fio_netio_queue(struct thread_data *td, struct io_u *io_u,
-                            enum fio_ddir ddir)
+static enum fio_q_status __fio_netio_queue(struct thread_data *td,
+                                          struct io_u *io_u,
+                                          enum fio_ddir ddir)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        int ret;
 
@@ -680,7 +688,8 @@ static int __fio_netio_queue(struct thread_data *td, struct io_u *io_u,
        return FIO_Q_COMPLETED;
 }
 
-static int fio_netio_queue(struct thread_data *td, struct io_u *io_u)
+static enum fio_q_status fio_netio_queue(struct thread_data *td,
+                                        struct io_u *io_u)
 {
        struct netio_options *o = td->eo;
        int ret;
@@ -704,7 +713,7 @@ static int fio_netio_queue(struct thread_data *td, struct io_u *io_u)
 
 static int fio_netio_connect(struct thread_data *td, struct fio_file *f)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        int type, domain;
 
@@ -819,7 +828,7 @@ static int fio_netio_connect(struct thread_data *td, struct fio_file *f)
 
 static int fio_netio_accept(struct thread_data *td, struct fio_file *f)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        socklen_t socklen;
        int state;
@@ -871,7 +880,7 @@ err:
 
 static void fio_netio_send_close(struct thread_data *td, struct fio_file *f)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        struct udp_close_msg msg;
        struct sockaddr *to;
@@ -906,7 +915,7 @@ static int fio_netio_close_file(struct thread_data *td, struct fio_file *f)
 
 static int fio_netio_udp_recv_open(struct thread_data *td, struct fio_file *f)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        struct udp_close_msg msg;
        struct sockaddr *to;
@@ -940,7 +949,7 @@ static int fio_netio_udp_recv_open(struct thread_data *td, struct fio_file *f)
 
 static int fio_netio_send_open(struct thread_data *td, struct fio_file *f)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        struct udp_close_msg msg;
        struct sockaddr *to;
@@ -1042,7 +1051,7 @@ static int fio_fill_addr(struct thread_data *td, const char *host, int af,
 static int fio_netio_setup_connect_inet(struct thread_data *td,
                                        const char *host, unsigned short port)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        struct addrinfo *res = NULL;
        void *dst, *src;
@@ -1092,12 +1101,11 @@ static int fio_netio_setup_connect_inet(struct thread_data *td,
 static int fio_netio_setup_connect_unix(struct thread_data *td,
                                        const char *path)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct sockaddr_un *soun = &nd->addr_un;
 
        soun->sun_family = AF_UNIX;
-       memset(soun->sun_path, 0, sizeof(soun->sun_path));
-       strncpy(soun->sun_path, path, sizeof(soun->sun_path) - 1);
+       snprintf(soun->sun_path, sizeof(soun->sun_path), "%s", path);
        return 0;
 }
 
@@ -1113,7 +1121,7 @@ static int fio_netio_setup_connect(struct thread_data *td)
 
 static int fio_netio_setup_listen_unix(struct thread_data *td, const char *path)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct sockaddr_un *addr = &nd->addr_un;
        mode_t mode;
        int len, fd;
@@ -1126,9 +1134,8 @@ static int fio_netio_setup_listen_unix(struct thread_data *td, const char *path)
 
        mode = umask(000);
 
-       memset(addr, 0, sizeof(*addr));
        addr->sun_family = AF_UNIX;
-       strncpy(addr->sun_path, path, sizeof(addr->sun_path) - 1);
+       snprintf(addr->sun_path, sizeof(addr->sun_path), "%s", path);
        unlink(path);
 
        len = sizeof(addr->sun_family) + strlen(path) + 1;
@@ -1146,7 +1153,7 @@ static int fio_netio_setup_listen_unix(struct thread_data *td, const char *path)
 
 static int fio_netio_setup_listen_inet(struct thread_data *td, short port)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        struct ip_mreq mr;
        struct sockaddr_in sin;
@@ -1209,7 +1216,7 @@ static int fio_netio_setup_listen_inet(struct thread_data *td, short port)
                        return 1;
                }
                if (is_ipv6(o)) {
-                       log_err("fio: IPv6 not supported for multicast network IO");
+                       log_err("fio: IPv6 not supported for multicast network IO\n");
                        close(fd);
                        return 1;
                }
@@ -1262,7 +1269,7 @@ static int fio_netio_setup_listen_inet(struct thread_data *td, short port)
 
 static int fio_netio_setup_listen(struct thread_data *td)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
        struct netio_options *o = td->eo;
        int ret;
 
@@ -1337,7 +1344,7 @@ static int fio_netio_init(struct thread_data *td)
 
 static void fio_netio_cleanup(struct thread_data *td)
 {
-       struct netio_data *nd = td->io_ops->data;
+       struct netio_data *nd = td->io_ops_data;
 
        if (nd) {
                if (nd->listenfd != -1)
@@ -1361,13 +1368,13 @@ static int fio_netio_setup(struct thread_data *td)
                td->o.open_files++;
        }
 
-       if (!td->io_ops->data) {
-               nd = malloc(sizeof(*nd));;
+       if (!td->io_ops_data) {
+               nd = malloc(sizeof(*nd));
 
                memset(nd, 0, sizeof(*nd));
                nd->listenfd = -1;
                nd->pipes[0] = nd->pipes[1] = -1;
-               td->io_ops->data = nd;
+               td->io_ops_data = nd;
        }
 
        return 0;
@@ -1385,7 +1392,7 @@ static int fio_netio_setup_splice(struct thread_data *td)
 
        fio_netio_setup(td);
 
-       nd = td->io_ops->data;
+       nd = td->io_ops_data;
        if (nd) {
                if (pipe(nd->pipes) < 0)
                        return 1;