#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <grpc/support/port_platform.h>
#include "src/core/lib/iomgr/port.h"
#ifdef GRPC_POSIX_SOCKET_TCP_SERVER
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <string>
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include <grpc/byte_buffer.h>
#include <grpc/event_engine/endpoint_config.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
#include <grpc/support/time.h>
#include "src/core/lib/address_utils/sockaddr_utils.h"
#include "src/core/lib/event_engine/default_event_engine.h"
#include "src/core/lib/event_engine/resolved_address_internal.h"
#include "src/core/lib/event_engine/shim.h"
#include "src/core/lib/event_engine/tcp_socket_utils.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/gprpp/strerror.h"
#include "src/core/lib/iomgr/event_engine_shims/closure.h"
#include "src/core/lib/iomgr/event_engine_shims/endpoint.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/sockaddr.h"
#include "src/core/lib/iomgr/socket_utils_posix.h"
#include "src/core/lib/iomgr/systemd_utils.h"
#include "src/core/lib/iomgr/tcp_posix.h"
#include "src/core/lib/iomgr/tcp_server.h"
#include "src/core/lib/iomgr/tcp_server_utils_posix.h"
#include "src/core/lib/iomgr/unix_sockets_posix.h"
#include "src/core/lib/resource_quota/api.h"
#include "src/core/lib/transport/error_utils.h"
static std::atomic<int64_t> num_dropped_connections{ … };
EndpointConfig;
EventEngine;
MemoryAllocator;
PosixEventEngineWithFdSupport;
SliceBuffer;
class MemoryAllocatorFactoryWrapper
: public grpc_event_engine::experimental::MemoryAllocatorFactory { … };
static grpc_error_handle CreateEventEngineListener(
grpc_tcp_server* s, grpc_closure* shutdown_complete,
const EndpointConfig& config, grpc_tcp_server** server) { … }
static grpc_error_handle tcp_server_create(grpc_closure* shutdown_complete,
const EndpointConfig& config,
grpc_tcp_server_cb on_accept_cb,
void* on_accept_cb_arg,
grpc_tcp_server** server) { … }
static void finish_shutdown(grpc_tcp_server* s) { … }
static void destroyed_port(void* server, grpc_error_handle ) { … }
static void deactivated_all_ports(grpc_tcp_server* s) { … }
static void tcp_server_destroy(grpc_tcp_server* s) { … }
static void on_read(void* arg, grpc_error_handle err) { … }
static grpc_error_handle add_wildcard_addrs_to_server(grpc_tcp_server* s,
unsigned port_index,
int requested_port,
int* out_port) { … }
static grpc_error_handle clone_port(grpc_tcp_listener* listener,
unsigned count) { … }
static grpc_error_handle tcp_server_add_port(grpc_tcp_server* s,
const grpc_resolved_address* addr,
int* out_port) { … }
static grpc_tcp_listener* get_port_index(grpc_tcp_server* s,
unsigned port_index) { … }
unsigned tcp_server_port_fd_count(grpc_tcp_server* s, unsigned port_index) { … }
static int tcp_server_port_fd(grpc_tcp_server* s, unsigned port_index,
unsigned fd_index) { … }
static void tcp_server_start(grpc_tcp_server* s,
const std::vector<grpc_pollset*>* pollsets) { … }
grpc_tcp_server* tcp_server_ref(grpc_tcp_server* s) { … }
static void tcp_server_shutdown_starting_add(grpc_tcp_server* s,
grpc_closure* shutdown_starting) { … }
static void tcp_server_unref(grpc_tcp_server* s) { … }
static void tcp_server_shutdown_listeners(grpc_tcp_server* s) { … }
static int tcp_server_pre_allocated_fd(grpc_tcp_server* s) { … }
static void tcp_server_set_pre_allocated_fd(grpc_tcp_server* s, int fd) { … }
namespace {
class ExternalConnectionHandler : public grpc_core::TcpServerFdHandler { … };
}
static grpc_core::TcpServerFdHandler* tcp_server_create_fd_handler(
grpc_tcp_server* s) { … }
grpc_tcp_server_vtable grpc_posix_tcp_server_vtable = …;
#endif