1*cb14a3feSDimitry Andric //===-- llvm/Support/raw_socket_stream.h - Socket streams --*- C++ -*-===// 2*cb14a3feSDimitry Andric // 3*cb14a3feSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*cb14a3feSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*cb14a3feSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*cb14a3feSDimitry Andric // 7*cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 8*cb14a3feSDimitry Andric // 9*cb14a3feSDimitry Andric // This file contains raw_ostream implementations for streams to communicate 10*cb14a3feSDimitry Andric // via UNIX sockets 11*cb14a3feSDimitry Andric // 12*cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 13*cb14a3feSDimitry Andric 14*cb14a3feSDimitry Andric #ifndef LLVM_SUPPORT_RAW_SOCKET_STREAM_H 15*cb14a3feSDimitry Andric #define LLVM_SUPPORT_RAW_SOCKET_STREAM_H 16*cb14a3feSDimitry Andric 17*cb14a3feSDimitry Andric #include "llvm/Support/Threading.h" 18*cb14a3feSDimitry Andric #include "llvm/Support/raw_ostream.h" 19*cb14a3feSDimitry Andric 20*cb14a3feSDimitry Andric namespace llvm { 21*cb14a3feSDimitry Andric 22*cb14a3feSDimitry Andric class raw_socket_stream; 23*cb14a3feSDimitry Andric 24*cb14a3feSDimitry Andric // Make sure that calls to WSAStartup and WSACleanup are balanced. 25*cb14a3feSDimitry Andric #ifdef _WIN32 26*cb14a3feSDimitry Andric class WSABalancer { 27*cb14a3feSDimitry Andric public: 28*cb14a3feSDimitry Andric WSABalancer(); 29*cb14a3feSDimitry Andric ~WSABalancer(); 30*cb14a3feSDimitry Andric }; 31*cb14a3feSDimitry Andric #endif // _WIN32 32*cb14a3feSDimitry Andric 33*cb14a3feSDimitry Andric class ListeningSocket { 34*cb14a3feSDimitry Andric int FD; 35*cb14a3feSDimitry Andric std::string SocketPath; 36*cb14a3feSDimitry Andric ListeningSocket(int SocketFD, StringRef SocketPath); 37*cb14a3feSDimitry Andric #ifdef _WIN32 38*cb14a3feSDimitry Andric WSABalancer _; 39*cb14a3feSDimitry Andric #endif // _WIN32 40*cb14a3feSDimitry Andric 41*cb14a3feSDimitry Andric public: 42*cb14a3feSDimitry Andric static Expected<ListeningSocket> createUnix( 43*cb14a3feSDimitry Andric StringRef SocketPath, 44*cb14a3feSDimitry Andric int MaxBacklog = llvm::hardware_concurrency().compute_thread_count()); 45*cb14a3feSDimitry Andric Expected<std::unique_ptr<raw_socket_stream>> accept(); 46*cb14a3feSDimitry Andric ListeningSocket(ListeningSocket &&LS); 47*cb14a3feSDimitry Andric ~ListeningSocket(); 48*cb14a3feSDimitry Andric }; 49*cb14a3feSDimitry Andric class raw_socket_stream : public raw_fd_stream { current_pos()50*cb14a3feSDimitry Andric uint64_t current_pos() const override { return 0; } 51*cb14a3feSDimitry Andric #ifdef _WIN32 52*cb14a3feSDimitry Andric WSABalancer _; 53*cb14a3feSDimitry Andric #endif // _WIN32 54*cb14a3feSDimitry Andric 55*cb14a3feSDimitry Andric public: 56*cb14a3feSDimitry Andric raw_socket_stream(int SocketFD); 57*cb14a3feSDimitry Andric /// Create a \p raw_socket_stream connected to the Unix domain socket at \p 58*cb14a3feSDimitry Andric /// SocketPath. 59*cb14a3feSDimitry Andric static Expected<std::unique_ptr<raw_socket_stream>> 60*cb14a3feSDimitry Andric createConnectedUnix(StringRef SocketPath); 61*cb14a3feSDimitry Andric ~raw_socket_stream(); 62*cb14a3feSDimitry Andric }; 63*cb14a3feSDimitry Andric 64*cb14a3feSDimitry Andric } // end namespace llvm 65*cb14a3feSDimitry Andric 66*cb14a3feSDimitry Andric #endif 67