Exemple #1
0
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;
}
Exemple #4
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;
}