summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemy Noulin <loader2x@gmail.com>2022-11-22 08:03:22 +0100
committerDrew DeVault <sir@cmpwn.com>2022-12-19 12:02:08 +0100
commit95138564acbc347c0a5f4f86d9280e3ab1484fd2 (patch)
tree9dcbf8e4f127f4281be47c2cffc6a11d0017323c
parent132f2ececc012cf4744ca5b8044fb637fed96a0c (diff)
downloadgmnisrv-95138564acbc347c0a5f4f86d9280e3ab1484fd2.tar.gz
gmnisrv-95138564acbc347c0a5f4f86d9280e3ab1484fd2.tar.xz
gmnisrv-95138564acbc347c0a5f4f86d9280e3ab1484fd2.zip
Close some files when too many are open
-rw-r--r--src/server.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/server.c b/src/server.c
index 56e11c9..359300a 100644
--- a/src/server.c
+++ b/src/server.c
@@ -115,8 +115,19 @@ accept_client(struct gmnisrv_server *server, int fd)
int sockfd = accept(fd, &addr, &addrlen);
if (sockfd == -1) {
server_error("accept error: %s", strerror(errno));
+ if (errno == EMFILE) {
+ for (int i = 1; i < 4; i++) {
+ struct gmnisrv_client *client = &server->clients[server->nclients-i];
+ disconnect_client(server, client);
+ }
+ sockfd = accept(fd, &addr, &addrlen);
+ if (sockfd != -1) {
+ goto accepted;
+ }
+ }
return;
}
+accepted:;
int flags = fcntl(fd, F_GETFL);
int r = fcntl(fd, F_SETFL, flags | O_NONBLOCK);