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