• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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