Fixed, close() forgottens fds after fork
+ minors changes + Super new epoll loop output :)
This commit is contained in:
@@ -11,7 +11,6 @@ void Webserv::_read_cgi_output(Client *client)
|
||||
{
|
||||
char buf[BUFSIZE];
|
||||
ssize_t ret;
|
||||
pid_t wait_ret;
|
||||
std::cerr << "_read_cgi_output()" << "\n";
|
||||
std::cerr << "cgi_pid = " << client->cgi_pid << "\n";
|
||||
std::cerr << "client fd = " << client->get_cl_fd() << "\n";
|
||||
@@ -37,23 +36,23 @@ void Webserv::_handle_epoll_error_cgi_fd(uint32_t events, Client *client)
|
||||
std::cerr << "cgi_pid = " << client->cgi_pid << "\n";
|
||||
std::cerr << "client fd = " << client->get_cl_fd() << "\n";
|
||||
std::cerr << "cgi fd = " << client->cgi_pipe_rfd << "\n";
|
||||
|
||||
|
||||
client->cgi_output = STATUS_500;
|
||||
|
||||
pid_t wait_ret;
|
||||
wait_ret = ::waitpid(client->cgi_pid, NULL, WNOHANG);
|
||||
std::cerr << "cgi EPOLLHUP waitpid ret = " << wait_ret << "\n";
|
||||
if (wait_ret == 0)
|
||||
std::cerr << "cgi EPOLLERR waitpid ret = " << wait_ret << "\n";
|
||||
if (wait_ret == client->cgi_pid)
|
||||
{
|
||||
if (client->cgi_pipe_rfd)
|
||||
{
|
||||
if (::close(client->cgi_pipe_rfd) == -1)
|
||||
std::perror("err close()");
|
||||
}
|
||||
client->cgi_pipe_rfd = 0;
|
||||
_epoll_update(client->get_cl_fd(), EPOLLOUT, EPOLL_CTL_ADD);
|
||||
if (::close(client->cgi_pipe_rfd) == -1)
|
||||
std::perror("err close()");
|
||||
// TODO: kill the child :)
|
||||
}
|
||||
else if (wait_ret == client->cgi_pid)
|
||||
{
|
||||
_epoll_update(client->get_cl_fd(), EPOLLOUT, EPOLL_CTL_ADD);
|
||||
if (::close(client->cgi_pipe_rfd) == -1)
|
||||
std::perror("err close()");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Webserv::_cgi_epollhup(uint32_t events, Client *client)
|
||||
@@ -61,22 +60,22 @@ void Webserv::_cgi_epollhup(uint32_t events, Client *client)
|
||||
(void)events;
|
||||
(void)client;
|
||||
|
||||
std::cerr << "cgi EPOLLHUP" << "\n";
|
||||
/* std::cerr << "cgi EPOLLHUP" << "\n";
|
||||
std::cerr << "cgi_pid = " << client->cgi_pid << "\n";
|
||||
std::cerr << "client fd = " << client->get_cl_fd() << "\n";
|
||||
std::cerr << "cgi fd = " << client->cgi_pipe_rfd << "\n";
|
||||
if (client->cgi_pipe_rfd)
|
||||
{
|
||||
if (::close(client->cgi_pipe_rfd) == -1)
|
||||
std::perror("err close()");
|
||||
}
|
||||
client->cgi_pipe_rfd = 0;
|
||||
std::cerr << "cgi fd = " << client->cgi_pipe_rfd << "\n"; */
|
||||
|
||||
pid_t wait_ret;
|
||||
wait_ret = ::waitpid(client->cgi_pid, NULL, WNOHANG);
|
||||
std::cerr << "cgi EPOLLHUP waitpid ret = " << wait_ret << "\n";
|
||||
// std::cerr << "cgi EPOLLHUP waitpid ret = " << wait_ret << "\n";
|
||||
if (wait_ret == client->cgi_pid)
|
||||
{
|
||||
if (client->cgi_pipe_rfd)
|
||||
{
|
||||
if (::close(client->cgi_pipe_rfd) == -1)
|
||||
std::perror("err close()");
|
||||
}
|
||||
client->cgi_pipe_rfd = 0;
|
||||
_epoll_update(client->get_cl_fd(), EPOLLOUT, EPOLL_CTL_ADD);
|
||||
}
|
||||
}
|
||||
@@ -107,8 +106,9 @@ void Webserv::run()
|
||||
g_run = true;
|
||||
while (g_run)
|
||||
{
|
||||
std::cerr << ++count_loop << "----loop epoll()\n";
|
||||
std::cerr << ++count_loop << "----loop epoll() ";
|
||||
nfds = ::epoll_wait(_epfd, events, MAX_EVENTS, TIMEOUT);
|
||||
std::cerr << "(nfds=" << nfds << ")\n";
|
||||
if (nfds == -1)
|
||||
{
|
||||
int errno_copy = errno;
|
||||
@@ -142,7 +142,7 @@ void Webserv::run()
|
||||
else if ( (events[i].events & EPOLLHUP) && !(events[i].events & EPOLLIN) )
|
||||
_cgi_epollhup(events[i].events, client_cgi);
|
||||
}
|
||||
else
|
||||
else if (std::find(_clients.begin(), _clients.end(), events[i].data.fd) != _clients.end()) // TODO: save the it in var to avoid multiples find()
|
||||
{
|
||||
if (events[i].events & EPOLLERR || events[i].events & EPOLLHUP)
|
||||
_handle_epoll_error_client(events[i].events, events[i].data.fd);
|
||||
|
||||
Reference in New Issue
Block a user