111 lines
2.8 KiB
C++
111 lines
2.8 KiB
C++
|
|
#include "Webserv.hpp"
|
|
|
|
|
|
#define BUFSIZE 8192 // (8Ko)
|
|
void Webserv::_read_cgi_output(Client *client)
|
|
{
|
|
char buf[BUFSIZE];
|
|
ssize_t ret;
|
|
|
|
ret = ::read(client->cgi_pipe_r_from_child, buf, BUFSIZE);
|
|
if (ret == -1)
|
|
{
|
|
std::perror("err read(cgi_fd)");
|
|
client->status = 500;
|
|
client->cgi_state = CGI_NO_CGI;
|
|
}
|
|
else if (ret == 0)
|
|
std::cerr << "Madame s'il vous plait, du Ketchup pour mon hamburger" << " (AKA:ret=0)" << "\n"; // :)
|
|
else
|
|
client->cgi_output.append(buf, ret);
|
|
}
|
|
|
|
void Webserv::_handle_epollerr_cgi_output(uint32_t events, Client *client)
|
|
{
|
|
(void)events;
|
|
|
|
client->status = 500;
|
|
client->cgi_state = CGI_NO_CGI;
|
|
|
|
// Common with EPOLLHUP
|
|
pid_t wait_ret;
|
|
wait_ret = ::waitpid(client->cgi_pid, NULL, WNOHANG);
|
|
if (wait_ret == client->cgi_pid)
|
|
{
|
|
_epoll_update(client->cgi_pipe_r_from_child, 0, EPOLL_CTL_DEL);
|
|
|
|
std::cerr << family << "| (" << std::setw(2) << client->get_cl_fd() << ") close pipe rfc [" << client->cgi_pipe_r_from_child << "]\n";
|
|
if (::close(client->cgi_pipe_r_from_child) == -1)
|
|
std::perror("err close()");
|
|
client->cgi_pipe_r_from_child = -1;
|
|
|
|
_epoll_update(client->get_cl_fd(), EPOLLOUT, EPOLL_CTL_ADD);
|
|
}
|
|
|
|
}
|
|
|
|
void Webserv::_handle_epollhup_cgi_output(uint32_t events, Client *client)
|
|
{
|
|
(void)events;
|
|
|
|
// Common with EPOLLERR
|
|
pid_t wait_ret;
|
|
wait_ret = ::waitpid(client->cgi_pid, NULL, WNOHANG);
|
|
if (wait_ret == client->cgi_pid)
|
|
{
|
|
_epoll_update(client->cgi_pipe_r_from_child, 0, EPOLL_CTL_DEL);
|
|
|
|
std::cerr << family << "| (" << std::setw(2) << client->get_cl_fd() << ") close pipe rfc [" << client->cgi_pipe_r_from_child << "]\n";
|
|
if (::close(client->cgi_pipe_r_from_child) == -1)
|
|
std::perror("err close()");
|
|
client->cgi_pipe_r_from_child = -1;
|
|
|
|
_epoll_update(client->get_cl_fd(), EPOLLOUT, EPOLL_CTL_ADD);
|
|
client->cgi_state = CGI_OUTPUT_COMPLETE;
|
|
}
|
|
}
|
|
|
|
void Webserv::_cgi_input_ready(Client *client)
|
|
{
|
|
client->cgi_state = CGI_READY_TO_EXEC;
|
|
_epoll_update(client->cgi_pipe_w_to_child, 0, EPOLL_CTL_DEL);
|
|
_epoll_update(client->get_cl_fd(), EPOLLOUT, EPOLL_CTL_ADD);
|
|
}
|
|
|
|
void Webserv::_handle_epollerr_cgi_input(uint32_t events, Client *client)
|
|
{
|
|
(void)events;
|
|
|
|
client->status = 500;
|
|
client->cgi_state = CGI_NO_CGI;
|
|
_close_client_cgi_pipes(client);
|
|
_epoll_update(client->get_cl_fd(), EPOLLOUT, EPOLL_CTL_ADD);
|
|
}
|
|
|
|
Client *Webserv::_find_cgi_output_fd(int fd)
|
|
{
|
|
std::vector<Client>::iterator it = _clients.begin();
|
|
std::vector<Client>::iterator it_end = _clients.end();
|
|
while (it != it_end)
|
|
{
|
|
if (it->cgi_pipe_r_from_child == fd)
|
|
return (&(*it));
|
|
++it;
|
|
}
|
|
return (NULL);
|
|
}
|
|
|
|
Client *Webserv::_find_cgi_input_fd(int fd)
|
|
{
|
|
std::vector<Client>::iterator it = _clients.begin();
|
|
std::vector<Client>::iterator it_end = _clients.end();
|
|
while (it != it_end)
|
|
{
|
|
if (it->cgi_pipe_w_to_child == fd)
|
|
return (&(*it));
|
|
++it;
|
|
}
|
|
return (NULL);
|
|
}
|