Fix EINTR handling

This commit is contained in:
2025-08-23 17:28:34 -04:00
parent 5b4a28a8ca
commit a820efa2e6
6 changed files with 131 additions and 24 deletions

View File

@@ -48,7 +48,10 @@ std::vector<int> create_listen_sockets(const weaseldb::Config &config) {
addr.sun_family = AF_UNIX;
if (config.server.unix_socket_path.length() >= sizeof(addr.sun_path)) {
close(sfd);
int e;
do {
e = close(sfd);
} while (e == -1 && errno == EINTR);
std::fprintf(stderr, "Unix socket path too long\n");
std::abort();
}
@@ -58,13 +61,19 @@ std::vector<int> create_listen_sockets(const weaseldb::Config &config) {
if (bind(sfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
perror("bind");
close(sfd);
int e;
do {
e = close(sfd);
} while (e == -1 && errno == EINTR);
std::abort();
}
if (listen(sfd, SOMAXCONN) == -1) {
perror("listen");
close(sfd);
int e;
do {
e = close(sfd);
} while (e == -1 && errno == EINTR);
std::abort();
}
@@ -103,7 +112,10 @@ std::vector<int> create_listen_sockets(const weaseldb::Config &config) {
int val = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) == -1) {
perror("setsockopt SO_REUSEADDR");
close(sfd);
int e;
do {
e = close(sfd);
} while (e == -1 && errno == EINTR);
continue;
}
@@ -111,7 +123,10 @@ std::vector<int> create_listen_sockets(const weaseldb::Config &config) {
if (rp->ai_family == AF_INET || rp->ai_family == AF_INET6) {
if (setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)) == -1) {
perror("setsockopt TCP_NODELAY");
close(sfd);
int e;
do {
e = close(sfd);
} while (e == -1 && errno == EINTR);
continue;
}
}
@@ -120,7 +135,10 @@ std::vector<int> create_listen_sockets(const weaseldb::Config &config) {
break; /* Success */
}
close(sfd);
int e;
do {
e = close(sfd);
} while (e == -1 && errno == EINTR);
sfd = -1;
}
@@ -133,7 +151,10 @@ std::vector<int> create_listen_sockets(const weaseldb::Config &config) {
if (listen(sfd, SOMAXCONN) == -1) {
perror("listen");
close(sfd);
int e;
do {
e = close(sfd);
} while (e == -1 && errno == EINTR);
std::abort();
}