15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_ 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_ 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string> 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/basictypes.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/macros.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/completion_callback.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/net_export.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/base/net_log.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/socket/socket_descriptor.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "net/socket/stream_socket.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace net { 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class SocketLibevent; 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct SockaddrStorage; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// A client socket that uses unix domain socket as the transport layer. 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class NET_EXPORT UnixDomainClientSocket : public StreamSocket { 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Builds a client socket with |socket_path|. The caller should call Connect() 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // to connect to a server socket. 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UnixDomainClientSocket(const std::string& socket_path, 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool use_abstract_namespace); 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Builds a client socket with socket libevent which is already connected. 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // UnixDomainServerSocket uses this after it accepts a connection. 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) explicit UnixDomainClientSocket(scoped_ptr<SocketLibevent> socket); 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~UnixDomainClientSocket(); 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Fills |address| with |socket_path| and its length. For Android or Linux 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // platform, this supports abstract namespaces. 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static bool FillAddress(const std::string& socket_path, 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool use_abstract_namespace, 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SockaddrStorage* address); 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // StreamSocket implementation. 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int Connect(const CompletionCallback& callback) OVERRIDE; 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void Disconnect() OVERRIDE; 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool IsConnected() const OVERRIDE; 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool IsConnectedAndIdle() const OVERRIDE; 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE; 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE; 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual const BoundNetLog& NetLog() const OVERRIDE; 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetSubresourceSpeculation() OVERRIDE; 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetOmniboxSpeculation() OVERRIDE; 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool WasEverUsed() const OVERRIDE; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool UsingTCPFastOpen() const OVERRIDE; 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool WasNpnNegotiated() const OVERRIDE; 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual NextProto GetNegotiatedProtocol() const OVERRIDE; 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE; 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Socket implementation. 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int Read(IOBuffer* buf, int buf_len, 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int Write(IOBuffer* buf, int buf_len, 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int SetReceiveBufferSize(int32 size) OVERRIDE; 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual int SetSendBufferSize(int32 size) OVERRIDE; 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Releases ownership of underlying SocketDescriptor to caller. 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Internal state is reset so that this object can be used again. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Socket must be connected in order to release it. 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SocketDescriptor ReleaseConnectedSocket(); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string socket_path_; 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const bool use_abstract_namespace_; 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<SocketLibevent> socket_; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This net log is just to comply StreamSocket::NetLog(). It throws away 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // everything. 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BoundNetLog net_log_; 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UnixDomainClientSocket); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace net 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif // NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_ 86