// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_TOOLS_FLIP_SERVER_CREATE_LISTENER_H__
#define NET_TOOLS_FLIP_SERVER_CREATE_LISTENER_H__

#include <iosfwd>
#include <string>

namespace net {

void FlipSetNonBlocking(int fd);

// Summary:
//   creates a socket for listening, and bind()s and listen()s it.
// Args:
//   host - hostname or numeric address, or empty-string if you want
//          to bind to listen on all addresses
//   port - a port number or service name. By service name I mean a
//          -real- service name, not a Google service name. I'd suggest
//          you just stick to a numeric representation like "80"
//   is_numeric_host_address -
//           if you know that the host address has already been looked-up,
//           and will be provided in numeric form like "130.207.244.244",
//           then you can set this to true, and it will save you the time
//           of a DNS lookup.
//   backlog - passed into listen. This is the number of pending incoming
//             connections a socket which is listening may have acquired before
//             the OS starts rejecting new incoming connections.
//   reuseaddr - if true sets SO_REUSEADDR on the listening socket
//   reuseport - if true sets SO_REUSEPORT on the listening socket
//   wait_for_iface - A boolean indicating that CreateListeningSocket should
//                    block until the interface that it will bind to has been
//                    raised. This is intended for HA environments.
//   disable_nagle - if true sets TCP_NODELAY on the listening socket.
//   listen_fd - this will be assigned a positive value if the socket is
//               successfully created, else it will be assigned -1.
int CreateListeningSocket(const std::string& host,
                          const std::string& port,
                          bool is_numeric_host_address,
                          int backlog,
                          bool reuseaddr,
                          bool reuseport,
                          bool wait_for_iface,
                          bool disable_nagle,
                          int* listen_fd);

int CreateConnectedSocket(int* connect_fd,
                          const std::string& host,
                          const std::string& port,
                          bool is_numeric_host_address,
                          bool disable_nagle);
}  // namespace net

#endif  // NET_TOOLS_FLIP_SERVER_CREATE_LISTENER_H__
