X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=server.c;h=18b3a080c94655003094b39326492a814e027e8e;hp=7a9b0a447d306b0e1be0928d2635c4e19a14b96a;hb=19417edaa23ea4bcdb1388e12eecd5ea39db8803;hpb=332dab7091640eebcb2414c4e8d7f4921e9ec3e2 diff --git a/server.c b/server.c index 7a9b0a44..18b3a080 100644 --- a/server.c +++ b/server.c @@ -21,6 +21,7 @@ #endif #include "fio.h" +#include "options.h" #include "server.h" #include "crc/crc16.h" #include "lib/ieee754.h" @@ -936,6 +937,39 @@ static int handle_connection(int sk) _exit(ret); } +/* get the address on this host bound by the input socket, + * whether it is ipv6 or ipv4 */ + +int get_my_addr_str( int sk ) +{ + int ret; + struct sockaddr * sockaddr_p; + struct sockaddr_in myaddr4 = {0}; + struct sockaddr_in6 myaddr6 = {0}; + char * net_addr; + socklen_t len = use_ipv6 ? sizeof(myaddr6) : sizeof(myaddr4); + + if (use_ipv6) + sockaddr_p = (struct sockaddr * )&myaddr6; + else + sockaddr_p = (struct sockaddr * )&myaddr4; + ret = getsockname(sk, sockaddr_p, &len); + if (ret) { + log_err("fio: getsockaddr: %s\n", strerror(errno)); + return -1; + } + if (use_ipv6) + net_addr = (char * )&myaddr6.sin6_addr; + else + net_addr = (char * )&myaddr4.sin_addr; + if (NULL == inet_ntop(use_ipv6?AF_INET6:AF_INET, net_addr, client_sockaddr_str, INET6_ADDRSTRLEN-1)) { + log_err("inet_ntop: failed to convert addr to string\n"); + return -1; + } + dprint(FD_NET, "fio server bound to addr %s\n", client_sockaddr_str); + return 0; +} + static int accept_loop(int listen_sk) { struct sockaddr_in addr; @@ -1007,7 +1041,7 @@ static int accept_loop(int listen_sk) } /* exits */ - strncpy(client_sockaddr_str, from, INET6_ADDRSTRLEN); + get_my_addr_str(sk); /* if error, it's already logged, non-fatal */ handle_connection(sk); } @@ -1376,7 +1410,7 @@ void fio_server_send_start(struct thread_data *td) } int fio_server_get_verify_state(const char *name, int threadnumber, - void **datap) + void **datap, int *version) { struct thread_io_list *s; struct cmd_sendfile out; @@ -1424,7 +1458,7 @@ fail: * the header, and the thread_io_list checksum */ s = rep->data + sizeof(struct verify_state_hdr); - if (verify_state_hdr(rep->data, s)) + if (verify_state_hdr(rep->data, s, version)) goto fail; /* @@ -1461,13 +1495,13 @@ static int fio_init_server_ip(void) opt = 1; if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)) < 0) { - log_err("fio: setsockopt: %s\n", strerror(errno)); + log_err("fio: setsockopt(REUSEADDR): %s\n", strerror(errno)); close(sk); return -1; } #ifdef SO_REUSEPORT if (setsockopt(sk, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) { - log_err("fio: setsockopt: %s\n", strerror(errno)); + log_err("fio: setsockopt(REUSEPORT): %s\n", strerror(errno)); close(sk); return -1; }