From 7d79c580959c68b6308782f6fabf1d15b8046a1f Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 12 Feb 2022 11:22:56 +0300 Subject: [PATCH] Use the larger sockaddr_storage structure --- src/addr_util.cpp | 20 ++++++++++---------- src/addr_util.h | 4 ++-- src/fio_sec_osd.cpp | 4 ++-- src/http_client.cpp | 4 ++-- src/messenger.cpp | 8 ++++---- src/messenger.h | 2 +- src/osd_test.cpp | 4 ++-- src/stub_bench.cpp | 4 ++-- src/stub_osd.cpp | 4 ++-- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/addr_util.cpp b/src/addr_util.cpp index 933eda73c..27232b919 100644 --- a/src/addr_util.cpp +++ b/src/addr_util.cpp @@ -11,7 +11,7 @@ #include "addr_util.h" -bool string_to_addr(std::string str, bool parse_port, int default_port, struct sockaddr *addr) +bool string_to_addr(std::string str, bool parse_port, int default_port, struct sockaddr_storage *addr) { if (parse_port) { @@ -27,7 +27,7 @@ bool string_to_addr(std::string str, bool parse_port, int default_port, struct s } if (inet_pton(AF_INET, str.c_str(), &((struct sockaddr_in*)addr)->sin_addr) == 1) { - addr->sa_family = AF_INET; + addr->ss_family = AF_INET; ((struct sockaddr_in*)addr)->sin_port = htons(default_port); return true; } @@ -35,30 +35,30 @@ bool string_to_addr(std::string str, bool parse_port, int default_port, struct s str = str.substr(1, str.length()-2); if (inet_pton(AF_INET6, str.c_str(), &((struct sockaddr_in6*)addr)->sin6_addr) == 1) { - addr->sa_family = AF_INET6; + addr->ss_family = AF_INET6; ((struct sockaddr_in6*)addr)->sin6_port = htons(default_port); return true; } return false; } -std::string addr_to_string(const sockaddr &addr) +std::string addr_to_string(const sockaddr_storage &addr) { char peer_str[256]; bool ok = false; int port; - if (addr.sa_family == AF_INET) + if (addr.ss_family == AF_INET) { ok = !!inet_ntop(AF_INET, &((sockaddr_in*)&addr)->sin_addr, peer_str, 256); port = ntohs(((sockaddr_in*)&addr)->sin_port); } - else if (addr.sa_family == AF_INET6) + else if (addr.ss_family == AF_INET6) { ok = !!inet_ntop(AF_INET6, &((sockaddr_in6*)&addr)->sin6_addr, peer_str, 256); port = ntohs(((sockaddr_in6*)&addr)->sin6_port); } else - throw std::runtime_error("Unknown address family "+std::to_string(addr.sa_family)); + throw std::runtime_error("Unknown address family "+std::to_string(addr.ss_family)); if (!ok) throw std::runtime_error(std::string("inet_ntop: ") + strerror(errno)); return std::string(peer_str)+":"+std::to_string(port); @@ -191,13 +191,13 @@ std::vector getifaddr_list(std::vector mask_cfg, bool int create_and_bind_socket(std::string bind_address, int bind_port, int listen_backlog, int *listening_port) { - sockaddr addr; + sockaddr_storage addr; if (!string_to_addr(bind_address, 0, bind_port, &addr)) { throw std::runtime_error("bind address "+bind_address+" is not valid"); } - int listen_fd = socket(addr.sa_family, SOCK_STREAM, 0); + int listen_fd = socket(addr.ss_family, SOCK_STREAM, 0); if (listen_fd < 0) { throw std::runtime_error(std::string("socket: ") + strerror(errno)); @@ -205,7 +205,7 @@ int create_and_bind_socket(std::string bind_address, int bind_port, int listen_b int enable = 1; setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)); - if (bind(listen_fd, &addr, sizeof(addr)) < 0) + if (bind(listen_fd, (sockaddr*)&addr, sizeof(addr)) < 0) { close(listen_fd); throw std::runtime_error(std::string("bind: ") + strerror(errno)); diff --git a/src/addr_util.h b/src/addr_util.h index 837755158..17f47f540 100644 --- a/src/addr_util.h +++ b/src/addr_util.h @@ -4,7 +4,7 @@ #include #include -bool string_to_addr(std::string str, bool parse_port, int default_port, struct sockaddr *addr); -std::string addr_to_string(const sockaddr &addr); +bool string_to_addr(std::string str, bool parse_port, int default_port, struct sockaddr_storage *addr); +std::string addr_to_string(const sockaddr_storage &addr); std::vector getifaddr_list(std::vector mask_cfg = std::vector(), bool include_v6 = false); int create_and_bind_socket(std::string bind_address, int bind_port, int listen_backlog, int *listening_port); diff --git a/src/fio_sec_osd.cpp b/src/fio_sec_osd.cpp index c9a6cb6cd..d43bdff09 100644 --- a/src/fio_sec_osd.cpp +++ b/src/fio_sec_osd.cpp @@ -170,14 +170,14 @@ static int sec_init(struct thread_data *td) bsd->block_order = o->block_order == 0 ? 17 : o->block_order; bsd->block_size = 1 << o->block_order; - sockaddr addr; + sockaddr_storage addr; if (!string_to_addr(std::string(o->host ? o->host : "127.0.0.1"), false, o->port > 0 ? o->port : 11203, &addr)) { fprintf(stderr, "server address: %s is not valid\n", o->host ? o->host : "127.0.0.1"); return 1; } - bsd->connect_fd = socket(addr.sa_family, SOCK_STREAM, 0); + bsd->connect_fd = socket(addr.ss_family, SOCK_STREAM, 0); if (bsd->connect_fd < 0) { perror("socket"); diff --git a/src/http_client.cpp b/src/http_client.cpp index eca2c255f..65d71f2af 100644 --- a/src/http_client.cpp +++ b/src/http_client.cpp @@ -271,7 +271,7 @@ void http_co_t::close_connection() void http_co_t::start_connection() { stackin(); - struct sockaddr addr; + struct sockaddr_storage addr; if (!string_to_addr(host.c_str(), 1, 80, &addr)) { parsed = { .error = "Invalid address: "+host }; @@ -279,7 +279,7 @@ void http_co_t::start_connection() stackout(); return; } - peer_fd = socket(addr.sa_family, SOCK_STREAM, 0); + peer_fd = socket(addr.ss_family, SOCK_STREAM, 0); if (peer_fd < 0) { parsed = { .error = std::string("socket: ")+strerror(errno) }; diff --git a/src/messenger.cpp b/src/messenger.cpp index 79c01028a..3850f0e26 100644 --- a/src/messenger.cpp +++ b/src/messenger.cpp @@ -222,13 +222,13 @@ void osd_messenger_t::try_connect_peer(uint64_t peer_osd) void osd_messenger_t::try_connect_peer_addr(osd_num_t peer_osd, const char *peer_host, int peer_port) { assert(peer_osd != this->osd_num); - struct sockaddr addr; + struct sockaddr_storage addr; if (!string_to_addr(peer_host, 0, peer_port, &addr)) { on_connect_peer(peer_osd, -EINVAL); return; } - int peer_fd = socket(addr.sa_family, SOCK_STREAM, 0); + int peer_fd = socket(addr.ss_family, SOCK_STREAM, 0); if (peer_fd < 0) { on_connect_peer(peer_osd, -errno); @@ -484,10 +484,10 @@ void osd_messenger_t::check_peer_config(osd_client_t *cl) void osd_messenger_t::accept_connections(int listen_fd) { // Accept new connections - sockaddr addr; + sockaddr_storage addr; socklen_t peer_addr_size = sizeof(addr); int peer_fd; - while ((peer_fd = accept(listen_fd, &addr, &peer_addr_size)) >= 0) + while ((peer_fd = accept(listen_fd, (sockaddr*)&addr, &peer_addr_size)) >= 0) { assert(peer_fd != 0); fprintf(stderr, "[OSD %lu] new client %d: connection from %s\n", this->osd_num, peer_fd, diff --git a/src/messenger.h b/src/messenger.h index 6b59325b2..d9d9e01ae 100644 --- a/src/messenger.h +++ b/src/messenger.h @@ -49,7 +49,7 @@ struct osd_client_t { int refs = 0; - sockaddr peer_addr; + sockaddr_storage peer_addr; int peer_port; int peer_fd; int peer_state; diff --git a/src/osd_test.cpp b/src/osd_test.cpp index 7d641389b..227995919 100644 --- a/src/osd_test.cpp +++ b/src/osd_test.cpp @@ -134,14 +134,14 @@ int main(int narg, char *args[]) int connect_osd(const char *osd_address, int osd_port) { - struct sockaddr addr; + struct sockaddr_storage addr; if (!string_to_addr(osd_address, 0, osd_port, &addr)) { fprintf(stderr, "server address: %s is not valid\n", osd_address); return -1; } - int connect_fd = socket(addr.sa_family, SOCK_STREAM, 0); + int connect_fd = socket(addr.ss_family, SOCK_STREAM, 0); if (connect_fd < 0) { perror("socket"); diff --git a/src/stub_bench.cpp b/src/stub_bench.cpp index 6ca922b5d..bd741bd42 100644 --- a/src/stub_bench.cpp +++ b/src/stub_bench.cpp @@ -67,14 +67,14 @@ int main(int narg, char *args[]) int connect_stub(const char *server_address, int server_port) { - struct sockaddr addr; + struct sockaddr_storage addr; if (!string_to_addr(server_address, 0, server_port, &addr)) { fprintf(stderr, "server address: %s is not valid\n", server_address); return -1; } - int connect_fd = socket(addr.sa_family, SOCK_STREAM, 0); + int connect_fd = socket(addr.ss_family, SOCK_STREAM, 0); if (connect_fd < 0) { perror("socket"); diff --git a/src/stub_osd.cpp b/src/stub_osd.cpp index cf61fa140..26263fb23 100644 --- a/src/stub_osd.cpp +++ b/src/stub_osd.cpp @@ -47,13 +47,13 @@ int main(int narg, char *args[]) { int listen_fd = create_and_bind_socket("0.0.0.0", 11203, 128, NULL); // Accept new connections - sockaddr addr; + sockaddr_storage addr; socklen_t peer_addr_size = sizeof(addr); int peer_fd; while (1) { printf("stub_osd: waiting for 1 client\n"); - peer_fd = accept(listen_fd, &addr, &peer_addr_size); + peer_fd = accept(listen_fd, (sockaddr*)&addr, &peer_addr_size); if (peer_fd == -1) { if (errno == EAGAIN)