diff --git a/src/common.c b/src/common.c index 2fe807b8..9e64b616 100644 --- a/src/common.c +++ b/src/common.c @@ -177,6 +177,14 @@ int val; fcntl(fd, F_SETFL, val | O_NONBLOCK); } +void set_block(int fd) +{ +int val; + + val = fcntl(fd, F_GETFL, 0); + fcntl(fd, F_SETFL, val & (~O_NONBLOCK)); +} + ssize_t recv_timeout(int sockfd, void *buf, size_t len, unsigned sec) { int ret; diff --git a/src/common.h b/src/common.h index 1011c3ca..c78c1c98 100644 --- a/src/common.h +++ b/src/common.h @@ -36,6 +36,7 @@ void *_talloc_size2(void *ctx, size_t size); #define DEFAULT_SOCKET_TIMEOUT 10 void set_non_block(int fd); +void set_block(int fd); ssize_t force_write(int sockfd, const void *buf, size_t len); ssize_t force_read(int sockfd, void *buf, size_t len); diff --git a/src/main.c b/src/main.c index 6b974b74..3b2a51b8 100644 --- a/src/main.c +++ b/src/main.c @@ -1111,6 +1111,10 @@ int main(int argc, char** argv) continue; } set_cloexec_flag (fd, 1); +#ifndef __linux__ + /* OpenBSD sets the non-blocking flag if accept's fd is non-blocking */ + set_block(fd); +#endif if (s->config->max_clients > 0 && s->active_clients >= s->config->max_clients) { close(fd);