1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_ 6 #define NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/macros.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "net/base/completion_callback.h" 14 #include "net/base/net_export.h" 15 #include "net/base/net_log.h" 16 #include "net/socket/socket_descriptor.h" 17 #include "net/socket/stream_socket.h" 18 19 namespace net { 20 21 class SocketLibevent; 22 struct SockaddrStorage; 23 24 // A client socket that uses unix domain socket as the transport layer. 25 class NET_EXPORT UnixDomainClientSocket : public StreamSocket { 26 public: 27 // Builds a client socket with |socket_path|. The caller should call Connect() 28 // to connect to a server socket. 29 UnixDomainClientSocket(const std::string& socket_path, 30 bool use_abstract_namespace); 31 // Builds a client socket with socket libevent which is already connected. 32 // UnixDomainServerSocket uses this after it accepts a connection. 33 explicit UnixDomainClientSocket(scoped_ptr<SocketLibevent> socket); 34 35 virtual ~UnixDomainClientSocket(); 36 37 // Fills |address| with |socket_path| and its length. For Android or Linux 38 // platform, this supports abstract namespaces. 39 static bool FillAddress(const std::string& socket_path, 40 bool use_abstract_namespace, 41 SockaddrStorage* address); 42 43 // StreamSocket implementation. 44 virtual int Connect(const CompletionCallback& callback) OVERRIDE; 45 virtual void Disconnect() OVERRIDE; 46 virtual bool IsConnected() const OVERRIDE; 47 virtual bool IsConnectedAndIdle() const OVERRIDE; 48 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE; 49 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE; 50 virtual const BoundNetLog& NetLog() const OVERRIDE; 51 virtual void SetSubresourceSpeculation() OVERRIDE; 52 virtual void SetOmniboxSpeculation() OVERRIDE; 53 virtual bool WasEverUsed() const OVERRIDE; 54 virtual bool UsingTCPFastOpen() const OVERRIDE; 55 virtual bool WasNpnNegotiated() const OVERRIDE; 56 virtual NextProto GetNegotiatedProtocol() const OVERRIDE; 57 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE; 58 59 // Socket implementation. 60 virtual int Read(IOBuffer* buf, int buf_len, 61 const CompletionCallback& callback) OVERRIDE; 62 virtual int Write(IOBuffer* buf, int buf_len, 63 const CompletionCallback& callback) OVERRIDE; 64 virtual int SetReceiveBufferSize(int32 size) OVERRIDE; 65 virtual int SetSendBufferSize(int32 size) OVERRIDE; 66 67 // Releases ownership of underlying SocketDescriptor to caller. 68 // Internal state is reset so that this object can be used again. 69 // Socket must be connected in order to release it. 70 SocketDescriptor ReleaseConnectedSocket(); 71 72 private: 73 const std::string socket_path_; 74 const bool use_abstract_namespace_; 75 scoped_ptr<SocketLibevent> socket_; 76 // This net log is just to comply StreamSocket::NetLog(). It throws away 77 // everything. 78 BoundNetLog net_log_; 79 80 DISALLOW_COPY_AND_ASSIGN(UnixDomainClientSocket); 81 }; 82 83 } // namespace net 84 85 #endif // NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_ 86