int LibEventServer::getAcceptSocket() { if (m_accept_sock >= 0) { if (useExistingFd(m_server, m_accept_sock, true /* listen */) != 0) { m_accept_sock = -1; return -1; } return 0; } const char *address = m_address.empty() ? nullptr : m_address.c_str(); int ret = evhttp_bind_socket_backlog_fd(m_server, address, m_port, RuntimeOption::ServerBacklog); if (ret < 0) { if (errno == EADDRINUSE && m_takeover_agent) { ret = m_takeover_agent->takeover(); if (ret < 0) { return -1; } if (useExistingFd(m_server, ret, false /* no listen */) != 0) { return -1; } } else { Logger::Error("Fail to bind port %d", m_port); return -1; } } m_accept_sock = ret; if (m_takeover_agent) { m_takeover_agent->requestShutdown(); m_takeover_agent->setupFdServer(m_eventBase, m_accept_sock, this); } return 0; }
int LibEventServer::getAcceptSocketSSL() { int ret = evhttp_bind_socket_backlog_fd(m_server_ssl, m_address.c_str(), m_port_ssl, RuntimeOption::ServerBacklog); if (ret < 0) { Logger::Error("Failed to bind port %d for SSL", m_port_ssl); return -1; } Logger::Info("SSL enabled"); m_accept_sock_ssl = ret; return 0; }
int LibEventServer::getAcceptSocket() { int ret; ret = evhttp_bind_socket_backlog_fd(m_server, m_address.c_str(), m_port, RuntimeOption::ServerBacklog); if (ret < 0) { Logger::Error("Fail to bind port %d", m_port); return -1; } m_accept_sock = ret; return 0; }
int LibEventServer::getAcceptSocketSSL() { if (m_accept_sock_ssl >= 0) { if (useExistingFd(m_server_ssl, m_accept_sock_ssl, true /*listen*/) != 0) { m_accept_sock_ssl = -1; return -1; } return 0; } const char *address = m_address.empty() ? nullptr : m_address.c_str(); int ret = evhttp_bind_socket_backlog_fd(m_server_ssl, address, m_port_ssl, RuntimeOption::ServerBacklog); if (ret < 0) { Logger::Error("Failed to bind port %d for SSL", m_port_ssl); return -1; } Logger::Info("SSL enabled"); m_accept_sock_ssl = ret; return 0; }
int LibEventServerWithTakeover::getAcceptSocket() { int ret; const char *address = m_address.empty() ? nullptr : m_address.c_str(); if (m_accept_sock != -1) { Logger::Warning("LibEventServerWithTakeover trying to get a socket, " "but m_accept_sock is not -1. Possibly leaking file descriptors."); m_accept_sock = -1; } ret = evhttp_bind_socket_backlog_fd(m_server, address, m_port, RuntimeOption::ServerBacklog); if (ret >= 0) { Logger::Info("takeover: bound directly to port %d", m_port); m_accept_sock = ret; return 0; } else if (errno != EADDRINUSE) { return -1; } if (m_transfer_fname.empty()) { return -1; } Logger::Info("takeover: beginning listen socket acquisition"); uint8_t fd_request[3] = P_VERSION C_FD_REQ; uint8_t fd_response[3] = {0,0,0}; uint32_t response_len = sizeof(fd_response); afdt_error_t err = AFDT_ERROR_T_INIT; // TODO(dreiss): Make this timeout configurable. struct timeval timeout = { 2 , 0 }; ret = afdt_sync_client( m_transfer_fname.c_str(), fd_request, sizeof(fd_request) - 1, fd_response, &response_len, &m_accept_sock, &timeout, &err); if (ret < 0) { fd_transfer_error_hander(&err, nullptr); errno = EADDRINUSE; return -1; } else if (m_accept_sock < 0) { String resp((const char*)fd_response, response_len, CopyString); Logger::Error( "AFDT did not receive a file descriptor: " "response = '%s'", StringUtil::CEncode(resp, null_string).data()); errno = EADDRINUSE; return -1; } Logger::Info("takeover: acquired listen socket"); m_took_over = true; ret = evhttp_accept_socket(m_server, m_accept_sock); if (ret < 0) { Logger::Error("evhttp_accept_socket: %s", Util::safe_strerror(errno).c_str()); int errno_save = errno; close(m_accept_sock); m_accept_sock = -1; errno = errno_save; return -1; } return 0; }