From e60d4dedac5d10de225be569fcaa6db4a409e72d Mon Sep 17 00:00:00 2001 From: wenceslao Date: Tue, 22 Sep 2026 01:53:31 +0200 Subject: [PATCH 1/4] fix: multiple polls for bonus and strict fcntl --- includes/Server.hpp | 1 + srcs/bonus/TransferManager.cpp | 4 +-- srcs/server/Server.cpp | 46 ++++++++++++++++++++++++++-------- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/includes/Server.hpp b/includes/Server.hpp index 7235612..09661e1 100644 --- a/includes/Server.hpp +++ b/includes/Server.hpp @@ -49,6 +49,7 @@ class Server { TransferManager tm_; Bot bot_; void processTransferSocket_(); + void syncTransferPollFds_(); //before poll call we put listener/data fd in pollFds_ #endif size_t numServerSockets_; diff --git a/srcs/bonus/TransferManager.cpp b/srcs/bonus/TransferManager.cpp index 5fc35cf..0e1ff9f 100644 --- a/srcs/bonus/TransferManager.cpp +++ b/srcs/bonus/TransferManager.cpp @@ -201,9 +201,7 @@ bool TransferManager::fileSize_(const std::string &path, off_t &size) const { } void TransferManager::setNonBlocking_(int fd) { - int flags = ::fcntl(fd, F_GETFL, 0); - if (flags != -1) - ::fcntl(fd, F_SETFL, flags | O_NONBLOCK); + ::fcntl(fd, F_SETFL, O_NONBLOCK); } #endif diff --git a/srcs/server/Server.cpp b/srcs/server/Server.cpp index 0da1309..fe68a24 100644 --- a/srcs/server/Server.cpp +++ b/srcs/server/Server.cpp @@ -120,9 +120,8 @@ void Server::processClientSockets_() { ++idx) { pollfd &pfd = pollFds_.at(idx); #ifdef BONUS - // Transfer listener/data fds are never registered in pollfds_, so this - // never fires today. Kept as future-proofing: if transfer_fd is ever added - // to pollfds_ + // Transfer listener/data fds are in pollFds_ too (syncTransferPollFds_) + // but are not clients: processTransferSocket_ handles their revents. if (tm_.ownsFd(pfd.fd)) continue; #endif @@ -336,6 +335,7 @@ void Server::run() { // so wake it up every 1000. int timeout = 1000; #ifdef BONUS + syncTransferPollFds_(); if (tm_.isActive()) timeout = 100; #endif @@ -388,6 +388,27 @@ Bot &Server::getBot() { return bot_; } +// Keeps the transfer listener/data fds inside the single poll() set: +// drops the ones the TransferManager already closed, adds the live ones. +void Server::syncTransferPollFds_() { + for (size_t i = numServerSockets_; i < pollFds_.size();) { + int const fd = pollFds_.at(i).fd; + if (!sockets_.checkSocketData(fd) && !tm_.ownsFd(fd)) + pollFds_.erase(pollFds_.begin() + i); + else + ++i; + } + if (!tm_.isActive()) + return; + int const fds[2] = {tm_.getListenerFd(), tm_.current()->dataFd}; + short const events[2] = {POLLIN, POLLOUT}; + for (int i = 0; i < 2; ++i) + if (fds[i] != -1 && + std::find_if(pollFds_.begin(), pollFds_.end(), + srvHelp::PfdHasFd(fds[i])) == pollFds_.end()) + pollFds_.push_back(PollFd(fds[i], events[i]).pfd); +} + void Server::processTransferSocket_() { if (!tm_.isActive()) return; @@ -398,7 +419,7 @@ void Server::processTransferSocket_() { int listener = tm_.getListenerFd(); if (listener == -1) return; - int dataFd = tm_.getDataFd(); + int dataFd = tm_.current()->dataFd; struct pollfd pfds[2]; int n = 1; pfds[0] = PollFd(listener, POLLIN).pfd; @@ -406,8 +427,14 @@ void Server::processTransferSocket_() { pfds[1] = PollFd(dataFd, POLLOUT).pfd; n = 2; } - if (poll(pfds, n, 0) <= 0) - return; + for (int i = 0; i < n; ++i) { // revents from the main poll() + std::vector::iterator it = std::find_if( + pollFds_.begin(), pollFds_.end(), srvHelp::PfdHasFd(pfds[i].fd)); + if (it == pollFds_.end()) + pfds[i].revents = 0; + else + pfds[i].revents = it->revents; + } if (pfds[0].revents & (POLLERR | POLLNVAL)) { tm_.closeOffer(); return; @@ -416,10 +443,9 @@ void Server::processTransferSocket_() { dataFd = tm_.getDataFd(); if (dataFd < 0) return; - pfds[1] = PollFd(dataFd, POLLOUT).pfd; - n = 2; - if (poll(pfds, n, 0) <= 0) - return; + // pfds[1] = PollFd(dataFd, POLLOUT).pfd; + // n = 2; + return; // the data fd joins the poll set on the next iteration } if (n != 2) return; From 599bbf41f1a41ad417fc54bc8b193a4bd9524aae Mon Sep 17 00:00:00 2001 From: wenceslao Date: Tue, 22 Sep 2026 02:12:44 +0200 Subject: [PATCH 2/4] fix: clang format --- includes/Server.hpp | 3 ++- srcs/server/Server.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/includes/Server.hpp b/includes/Server.hpp index 09661e1..d83a5dd 100644 --- a/includes/Server.hpp +++ b/includes/Server.hpp @@ -49,7 +49,8 @@ class Server { TransferManager tm_; Bot bot_; void processTransferSocket_(); - void syncTransferPollFds_(); //before poll call we put listener/data fd in pollFds_ + void + syncTransferPollFds_(); //before poll call we put listener/data fd in pollFds_ #endif size_t numServerSockets_; diff --git a/srcs/server/Server.cpp b/srcs/server/Server.cpp index fe68a24..241941b 100644 --- a/srcs/server/Server.cpp +++ b/srcs/server/Server.cpp @@ -120,7 +120,7 @@ void Server::processClientSockets_() { ++idx) { pollfd &pfd = pollFds_.at(idx); #ifdef BONUS - // Transfer listener/data fds are in pollFds_ too (syncTransferPollFds_) + // Transfer listener/data fds are in pollFds_ too (syncTransferPollFds_) // but are not clients: processTransferSocket_ handles their revents. if (tm_.ownsFd(pfd.fd)) continue; From edf1eb5a96551486f97bbbcb907354c497f69378 Mon Sep 17 00:00:00 2001 From: wenceslao <117309234+numorb@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:44:19 +0200 Subject: [PATCH 3/4] Update srcs/server/Server.cpp Co-authored-by: Kiruthika Murugananthan --- srcs/server/Server.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/srcs/server/Server.cpp b/srcs/server/Server.cpp index 241941b..78fffa2 100644 --- a/srcs/server/Server.cpp +++ b/srcs/server/Server.cpp @@ -219,6 +219,10 @@ void Server::processClientSockets_() { } void Server::removeClientSocketPfd_(int const fd, std::string const &msg) { + if (!sockets_.checkSocketData(fd)) { + removePollFd_(fd); + return; + } if (!sockets_.isServerSocket(fd)) { if (!msg.empty()) { Client *client = clients_.find(fd); From 8c998dbdb89259f5bc7f629e6135e9fc872f9ae4 Mon Sep 17 00:00:00 2001 From: wenceslao <117309234+numorb@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:51:44 +0200 Subject: [PATCH 4/4] Update srcs/server/Server.cpp Co-authored-by: Kiruthika Murugananthan --- srcs/server/Server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcs/server/Server.cpp b/srcs/server/Server.cpp index 78fffa2..3031fae 100644 --- a/srcs/server/Server.cpp +++ b/srcs/server/Server.cpp @@ -122,7 +122,7 @@ void Server::processClientSockets_() { #ifdef BONUS // Transfer listener/data fds are in pollFds_ too (syncTransferPollFds_) // but are not clients: processTransferSocket_ handles their revents. - if (tm_.ownsFd(pfd.fd)) + if (!sockets_.checkSocketData(pfd.fd) || tm_.ownsFd(pfd.fd)) continue; #endif