forked from vitalif/vitastor
Use the larger sockaddr_storage structure
parent
46d2bc100f
commit
7d79c58095
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
#include "addr_util.h"
|
#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)
|
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)
|
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);
|
((struct sockaddr_in*)addr)->sin_port = htons(default_port);
|
||||||
return true;
|
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);
|
str = str.substr(1, str.length()-2);
|
||||||
if (inet_pton(AF_INET6, str.c_str(), &((struct sockaddr_in6*)addr)->sin6_addr) == 1)
|
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);
|
((struct sockaddr_in6*)addr)->sin6_port = htons(default_port);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string addr_to_string(const sockaddr &addr)
|
std::string addr_to_string(const sockaddr_storage &addr)
|
||||||
{
|
{
|
||||||
char peer_str[256];
|
char peer_str[256];
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
int port;
|
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);
|
ok = !!inet_ntop(AF_INET, &((sockaddr_in*)&addr)->sin_addr, peer_str, 256);
|
||||||
port = ntohs(((sockaddr_in*)&addr)->sin_port);
|
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);
|
ok = !!inet_ntop(AF_INET6, &((sockaddr_in6*)&addr)->sin6_addr, peer_str, 256);
|
||||||
port = ntohs(((sockaddr_in6*)&addr)->sin6_port);
|
port = ntohs(((sockaddr_in6*)&addr)->sin6_port);
|
||||||
}
|
}
|
||||||
else
|
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)
|
if (!ok)
|
||||||
throw std::runtime_error(std::string("inet_ntop: ") + strerror(errno));
|
throw std::runtime_error(std::string("inet_ntop: ") + strerror(errno));
|
||||||
return std::string(peer_str)+":"+std::to_string(port);
|
return std::string(peer_str)+":"+std::to_string(port);
|
||||||
|
@ -191,13 +191,13 @@ std::vector<std::string> getifaddr_list(std::vector<std::string> mask_cfg, bool
|
||||||
|
|
||||||
int create_and_bind_socket(std::string bind_address, int bind_port, int listen_backlog, int *listening_port)
|
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))
|
if (!string_to_addr(bind_address, 0, bind_port, &addr))
|
||||||
{
|
{
|
||||||
throw std::runtime_error("bind address "+bind_address+" is not valid");
|
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)
|
if (listen_fd < 0)
|
||||||
{
|
{
|
||||||
throw std::runtime_error(std::string("socket: ") + strerror(errno));
|
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;
|
int enable = 1;
|
||||||
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable));
|
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);
|
close(listen_fd);
|
||||||
throw std::runtime_error(std::string("bind: ") + strerror(errno));
|
throw std::runtime_error(std::string("bind: ") + strerror(errno));
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
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);
|
||||||
std::string addr_to_string(const sockaddr &addr);
|
std::string addr_to_string(const sockaddr_storage &addr);
|
||||||
std::vector<std::string> getifaddr_list(std::vector<std::string> mask_cfg = std::vector<std::string>(), bool include_v6 = false);
|
std::vector<std::string> getifaddr_list(std::vector<std::string> mask_cfg = std::vector<std::string>(), bool include_v6 = false);
|
||||||
int create_and_bind_socket(std::string bind_address, int bind_port, int listen_backlog, int *listening_port);
|
int create_and_bind_socket(std::string bind_address, int bind_port, int listen_backlog, int *listening_port);
|
||||||
|
|
|
@ -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_order = o->block_order == 0 ? 17 : o->block_order;
|
||||||
bsd->block_size = 1 << 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))
|
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");
|
fprintf(stderr, "server address: %s is not valid\n", o->host ? o->host : "127.0.0.1");
|
||||||
return 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)
|
if (bsd->connect_fd < 0)
|
||||||
{
|
{
|
||||||
perror("socket");
|
perror("socket");
|
||||||
|
|
|
@ -271,7 +271,7 @@ void http_co_t::close_connection()
|
||||||
void http_co_t::start_connection()
|
void http_co_t::start_connection()
|
||||||
{
|
{
|
||||||
stackin();
|
stackin();
|
||||||
struct sockaddr addr;
|
struct sockaddr_storage addr;
|
||||||
if (!string_to_addr(host.c_str(), 1, 80, &addr))
|
if (!string_to_addr(host.c_str(), 1, 80, &addr))
|
||||||
{
|
{
|
||||||
parsed = { .error = "Invalid address: "+host };
|
parsed = { .error = "Invalid address: "+host };
|
||||||
|
@ -279,7 +279,7 @@ void http_co_t::start_connection()
|
||||||
stackout();
|
stackout();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
peer_fd = socket(addr.sa_family, SOCK_STREAM, 0);
|
peer_fd = socket(addr.ss_family, SOCK_STREAM, 0);
|
||||||
if (peer_fd < 0)
|
if (peer_fd < 0)
|
||||||
{
|
{
|
||||||
parsed = { .error = std::string("socket: ")+strerror(errno) };
|
parsed = { .error = std::string("socket: ")+strerror(errno) };
|
||||||
|
|
|
@ -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)
|
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);
|
assert(peer_osd != this->osd_num);
|
||||||
struct sockaddr addr;
|
struct sockaddr_storage addr;
|
||||||
if (!string_to_addr(peer_host, 0, peer_port, &addr))
|
if (!string_to_addr(peer_host, 0, peer_port, &addr))
|
||||||
{
|
{
|
||||||
on_connect_peer(peer_osd, -EINVAL);
|
on_connect_peer(peer_osd, -EINVAL);
|
||||||
return;
|
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)
|
if (peer_fd < 0)
|
||||||
{
|
{
|
||||||
on_connect_peer(peer_osd, -errno);
|
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)
|
void osd_messenger_t::accept_connections(int listen_fd)
|
||||||
{
|
{
|
||||||
// Accept new connections
|
// Accept new connections
|
||||||
sockaddr addr;
|
sockaddr_storage addr;
|
||||||
socklen_t peer_addr_size = sizeof(addr);
|
socklen_t peer_addr_size = sizeof(addr);
|
||||||
int peer_fd;
|
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);
|
assert(peer_fd != 0);
|
||||||
fprintf(stderr, "[OSD %lu] new client %d: connection from %s\n", this->osd_num, peer_fd,
|
fprintf(stderr, "[OSD %lu] new client %d: connection from %s\n", this->osd_num, peer_fd,
|
||||||
|
|
|
@ -49,7 +49,7 @@ struct osd_client_t
|
||||||
{
|
{
|
||||||
int refs = 0;
|
int refs = 0;
|
||||||
|
|
||||||
sockaddr peer_addr;
|
sockaddr_storage peer_addr;
|
||||||
int peer_port;
|
int peer_port;
|
||||||
int peer_fd;
|
int peer_fd;
|
||||||
int peer_state;
|
int peer_state;
|
||||||
|
|
|
@ -134,14 +134,14 @@ int main(int narg, char *args[])
|
||||||
|
|
||||||
int connect_osd(const char *osd_address, int osd_port)
|
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))
|
if (!string_to_addr(osd_address, 0, osd_port, &addr))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "server address: %s is not valid\n", osd_address);
|
fprintf(stderr, "server address: %s is not valid\n", osd_address);
|
||||||
return -1;
|
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)
|
if (connect_fd < 0)
|
||||||
{
|
{
|
||||||
perror("socket");
|
perror("socket");
|
||||||
|
|
|
@ -67,14 +67,14 @@ int main(int narg, char *args[])
|
||||||
|
|
||||||
int connect_stub(const char *server_address, int server_port)
|
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))
|
if (!string_to_addr(server_address, 0, server_port, &addr))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "server address: %s is not valid\n", server_address);
|
fprintf(stderr, "server address: %s is not valid\n", server_address);
|
||||||
return -1;
|
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)
|
if (connect_fd < 0)
|
||||||
{
|
{
|
||||||
perror("socket");
|
perror("socket");
|
||||||
|
|
|
@ -47,13 +47,13 @@ int main(int narg, char *args[])
|
||||||
{
|
{
|
||||||
int listen_fd = create_and_bind_socket("0.0.0.0", 11203, 128, NULL);
|
int listen_fd = create_and_bind_socket("0.0.0.0", 11203, 128, NULL);
|
||||||
// Accept new connections
|
// Accept new connections
|
||||||
sockaddr addr;
|
sockaddr_storage addr;
|
||||||
socklen_t peer_addr_size = sizeof(addr);
|
socklen_t peer_addr_size = sizeof(addr);
|
||||||
int peer_fd;
|
int peer_fd;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
printf("stub_osd: waiting for 1 client\n");
|
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 (peer_fd == -1)
|
||||||
{
|
{
|
||||||
if (errno == EAGAIN)
|
if (errno == EAGAIN)
|
||||||
|
|
Loading…
Reference in New Issue