#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); print_secure(client->get_cl_fd(), "close pipe rfc [" + ::itos(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); print_secure(client->get_cl_fd(), "close pipe rfc [" + ::itos(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::iterator it = _clients.begin(); std::vector::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::iterator it = _clients.begin(); std::vector::iterator it_end = _clients.end(); while (it != it_end) { if (it->cgi_pipe_w_to_child == fd) return (&(*it)); ++it; } return (NULL); }