From a2846362a081bd504b7c8f57e1b698bff1372664 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 10 Sep 2018 02:51:58 +0300 Subject: [PATCH] Remove copy-paste in socket initialization. GitOrigin-RevId: f4de36f6ec62378adc2cc0a7b7ad7afdd6b0573f --- tdutils/td/utils/port/SocketFd.cpp | 68 +++++++++++++----------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/tdutils/td/utils/port/SocketFd.cpp b/tdutils/td/utils/port/SocketFd.cpp index 446775a0..0a30a973 100644 --- a/tdutils/td/utils/port/SocketFd.cpp +++ b/tdutils/td/utils/port/SocketFd.cpp @@ -222,8 +222,7 @@ class SocketFdImpl : private IOCP::Callback { } void on_error(Status status) { - VLOG(fd) << get_native_fd().io_handle() << " " - << "on error " << status; + VLOG(fd) << get_native_fd().io_handle() << " on error " << status; { auto lock = lock_.lock(); pending_errors_.push(std::move(status)); @@ -431,9 +430,6 @@ void SocketFdImplDeleter::operator()(SocketFdImpl *impl) { delete impl; } -#endif - -#if TD_PORT_POSIX Status get_socket_pending_error(const NativeFd &fd) { int error = 0; socklen_t errlen = sizeof(error); @@ -447,39 +443,10 @@ Status get_socket_pending_error(const NativeFd &fd) { LOG(INFO) << "Can't load pending socket error: " << status; return status; } + #endif -} // namespace detail -SocketFd::SocketFd() = default; -SocketFd::SocketFd(SocketFd &&) = default; -SocketFd &SocketFd::operator=(SocketFd &&) = default; -SocketFd::~SocketFd() = default; - -SocketFd::SocketFd(std::unique_ptr impl) : impl_(impl.release()) { -} -Result SocketFd::from_native_fd(NativeFd fd) { - TRY_STATUS(fd.set_is_blocking(false)); - auto sock = fd.socket(); - - // TODO remove copypaste -#if TD_PORT_POSIX - int flags = 1; -#elif TD_PORT_WINDOWS - BOOL flags = TRUE; -#endif - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&flags), sizeof(flags)); - setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast(&flags), sizeof(flags)); - setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&flags), sizeof(flags)); - // TODO: SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY, SO_SNDBUF, SO_RCVBUF, TCP_QUICKACK, SO_LINGER - - return SocketFd(std::make_unique(std::move(fd))); -} - -Result SocketFd::open(const IPAddress &address) { - NativeFd native_fd{socket(address.get_address_family(), SOCK_STREAM, 0)}; - if (!native_fd) { - return OS_SOCKET_ERROR("Failed to create a socket"); - } +Status init_socket_options(NativeFd &native_fd) { TRY_STATUS(native_fd.set_is_blocking(false)); auto sock = native_fd.socket(); @@ -493,8 +460,33 @@ Result SocketFd::open(const IPAddress &address) { setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast(&flags), sizeof(flags)); // TODO: SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY, SO_SNDBUF, SO_RCVBUF, TCP_QUICKACK, SO_LINGER + return Status::OK(); +} + +} // namespace detail + +SocketFd::SocketFd() = default; +SocketFd::SocketFd(SocketFd &&) = default; +SocketFd &SocketFd::operator=(SocketFd &&) = default; +SocketFd::~SocketFd() = default; + +SocketFd::SocketFd(std::unique_ptr impl) : impl_(impl.release()) { +} + +Result SocketFd::from_native_fd(NativeFd fd) { + TRY_STATUS(detail::init_socket_options(fd)); + return SocketFd(std::make_unique(std::move(fd))); +} + +Result SocketFd::open(const IPAddress &address) { + NativeFd native_fd{socket(address.get_address_family(), SOCK_STREAM, 0)}; + if (!native_fd) { + return OS_SOCKET_ERROR("Failed to create a socket"); + } + TRY_STATUS(detail::init_socket_options(native_fd)); + #if TD_PORT_POSIX - int e_connect = connect(sock, address.get_sockaddr(), static_cast(address.get_sockaddr_len())); + int e_connect = connect(native_fd.fd(), address.get_sockaddr(), narrow_cast(address.get_sockaddr_len())); if (e_connect == -1) { auto connect_errno = errno; if (connect_errno != EINPROGRESS) { @@ -504,7 +496,7 @@ Result SocketFd::open(const IPAddress &address) { return SocketFd(std::make_unique(std::move(native_fd))); #elif TD_PORT_WINDOWS auto bind_addr = address.get_any_addr(); - auto e_bind = bind(sock, bind_addr.get_sockaddr(), narrow_cast(bind_addr.get_sockaddr_len())); + auto e_bind = bind(native_fd.socket(), bind_addr.get_sockaddr(), narrow_cast(bind_addr.get_sockaddr_len())); if (e_bind != 0) { return OS_SOCKET_ERROR("Failed to bind a socket"); }