47 lines
1.1 KiB
C++
47 lines
1.1 KiB
C++
|
|
#include "Webserv.hpp"
|
|
|
|
void Webserv::_accept_connection(listen_socket &lsocket)
|
|
{
|
|
struct sockaddr_in addr;
|
|
socklen_t addr_len;
|
|
int accepted_fd;
|
|
std::map<std::string, std::string> infos;
|
|
|
|
print_secure(" accept() socket (" + ::itos(lsocket.fd) + ")\n");
|
|
addr_len = sizeof addr;
|
|
accepted_fd = ::accept(lsocket.fd, (sockaddr*)&addr, &addr_len);
|
|
if (accepted_fd == -1)
|
|
{
|
|
std::perror("err accept()");
|
|
if (g_last_signal)
|
|
_handle_last_signal();
|
|
return ;
|
|
}
|
|
if (::fcntl(accepted_fd, F_SETFL, O_NONBLOCK) == -1)
|
|
{
|
|
std::perror("err fcntl()");
|
|
if (::close(accepted_fd) == -1)
|
|
std::perror("err close()");
|
|
}
|
|
|
|
infos = _extract_infos(addr);
|
|
Client new_client(accepted_fd, &lsocket, infos["port"], infos["ip"]);
|
|
_clients.push_back(new_client);
|
|
_epoll_update(accepted_fd, EPOLLIN, EPOLL_CTL_ADD);
|
|
}
|
|
|
|
std::map<std::string, std::string>
|
|
Webserv::_extract_infos(struct sockaddr_in addr)
|
|
{
|
|
struct in_addr ip_conversion;
|
|
std::map<std::string, std::string> infos;
|
|
|
|
infos["port"] = ::itos( addr.sin_port );
|
|
ip_conversion.s_addr = addr.sin_addr.s_addr;
|
|
infos["ip"] = inet_ntoa( ip_conversion );
|
|
|
|
return infos;
|
|
}
|
|
|