X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=server.c;h=b6961fd58d9281030d9afea117571eb9f6796a60;hb=47c7c1f526f1038abe7df350d02231220b3eecb9;hp=832454305d1f5f65e01fedfd13bc1785caad3282;hpb=6348b5dee54f24f2e78872948653942336f4c14e;p=fio.git diff --git a/server.c b/server.c index 83245430..b6961fd5 100644 --- a/server.c +++ b/server.c @@ -840,7 +840,8 @@ static int handle_connection(int sk) static int accept_loop(int listen_sk) { struct sockaddr_in addr; - socklen_t len = sizeof(addr); + struct sockaddr_in6 addr6; + socklen_t len = use_ipv6 ? sizeof(addr6) : sizeof(addr); struct pollfd pfd; int ret = 0, sk, flags, exitval = 0; FLIST_HEAD(conn_list); @@ -852,6 +853,8 @@ static int accept_loop(int listen_sk) fcntl(listen_sk, F_SETFL, flags); while (!exit_backend) { + const char *from; + char buf[64]; pid_t pid; pfd.fd = listen_sk; @@ -882,13 +885,22 @@ static int accept_loop(int listen_sk) if (exit_backend || ret < 0) break; - sk = accept(listen_sk, (struct sockaddr *) &addr, &len); + if (use_ipv6) + sk = accept(listen_sk, (struct sockaddr *) &addr6, &len); + else + sk = accept(listen_sk, (struct sockaddr *) &addr, &len); + if (sk < 0) { log_err("fio: accept: %s\n", strerror(errno)); return -1; } - dprint(FD_NET, "server: connect from %s\n", inet_ntoa(addr.sin_addr)); + if (use_ipv6) + from = inet_ntop(AF_INET6, (struct sockaddr *) &addr6.sin6_addr, buf, sizeof(buf)); + else + from = inet_ntop(AF_INET, (struct sockaddr *) &addr.sin_addr, buf, sizeof(buf)); + + dprint(FD_NET, "server: connect from %s\n", from); pid = fork(); if (pid) { @@ -1042,6 +1054,11 @@ void fio_server_send_ts(struct thread_stat *ts, struct group_run_stats *rs) p.ts.kb_base = cpu_to_le32(ts->kb_base); p.ts.unit_base = cpu_to_le32(ts->unit_base); + p.ts.latency_depth = cpu_to_le32(ts->latency_depth); + p.ts.latency_target = cpu_to_le64(ts->latency_target); + p.ts.latency_window = cpu_to_le64(ts->latency_window); + p.ts.latency_percentile.u.i = __cpu_to_le64(fio_double_to_uint64(ts->latency_percentile.u.f)); + convert_gs(&p.rs, rs); fio_net_send_cmd(server_fd, FIO_NET_CMD_TS, &p, sizeof(p), NULL, NULL); @@ -1375,41 +1392,38 @@ static int fio_init_server_connection(void) return sk; } -int fio_server_parse_host(const char *host, int *ipv6, struct in_addr *inp, +int fio_server_parse_host(const char *host, int ipv6, struct in_addr *inp, struct in6_addr *inp6) { int ret = 0; - if (*ipv6) + if (ipv6) ret = inet_pton(AF_INET6, host, inp6); else ret = inet_pton(AF_INET, host, inp); if (ret != 1) { - struct hostent *hent; + struct addrinfo hints, *res; - hent = gethostbyname(host); - if (!hent) { - log_err("fio: failed to resolve <%s>\n", host); - return 0; - } + memset(&hints, 0, sizeof(hints)); + hints.ai_family = ipv6 ? AF_INET6 : AF_INET; + hints.ai_socktype = SOCK_STREAM; - if (*ipv6) { - if (hent->h_addrtype != AF_INET6) { - log_info("fio: falling back to IPv4\n"); - *ipv6 = 0; - } else - memcpy(inp6, hent->h_addr_list[0], 16); - } - if (!*ipv6) { - if (hent->h_addrtype != AF_INET) { - log_err("fio: lookup type mismatch\n"); - return 0; - } - memcpy(inp, hent->h_addr_list[0], 4); + ret = getaddrinfo(host, NULL, &hints, &res); + if (ret) { + log_err("fio: failed to resolve <%s> (%s)\n", host, + gai_strerror(ret)); + return 1; } + + if (ipv6) + memcpy(inp6, &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr, sizeof(*inp6)); + else + memcpy(inp, &((struct sockaddr_in *) res->ai_addr)->sin_addr, sizeof(*inp)); + ret = 1; + freeaddrinfo(res); } return !(ret == 1); @@ -1494,7 +1508,7 @@ int fio_server_parse_string(const char *str, char **ptr, int *is_sock, *ptr = strdup(host); - if (fio_server_parse_host(*ptr, ipv6, inp, inp6)) { + if (fio_server_parse_host(*ptr, *ipv6, inp, inp6)) { free(*ptr); *ptr = NULL; return 1;