Home | History | Annotate | Download | only in socket
      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_SERVER_SOCKET_POSIX_H_
      6 #define NET_SOCKET_UNIX_DOMAIN_SERVER_SOCKET_POSIX_H_
      7 
      8 #include <sys/types.h>
      9 
     10 #include <string>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/callback.h"
     14 #include "base/macros.h"
     15 #include "base/memory/scoped_ptr.h"
     16 #include "net/base/net_export.h"
     17 #include "net/socket/server_socket.h"
     18 #include "net/socket/socket_descriptor.h"
     19 
     20 namespace net {
     21 
     22 class SocketLibevent;
     23 
     24 // Unix Domain Server Socket Implementation. Supports abstract namespaces on
     25 // Linux and Android.
     26 class NET_EXPORT UnixDomainServerSocket : public ServerSocket {
     27  public:
     28   // Credentials of a peer process connected to the socket.
     29   struct NET_EXPORT Credentials {
     30 #if defined(OS_LINUX) || defined(OS_ANDROID)
     31     // Linux/Android API provides more information about the connected peer
     32     // than Windows/OS X. It's useful for permission-based authorization on
     33     // Android.
     34     pid_t process_id;
     35 #endif
     36     uid_t user_id;
     37     gid_t group_id;
     38   };
     39 
     40   // Callback that returns whether the already connected client, identified by
     41   // its credentials, is allowed to keep the connection open. Note that
     42   // the socket is closed immediately in case the callback returns false.
     43   typedef base::Callback<bool (const Credentials&)> AuthCallback;
     44 
     45   UnixDomainServerSocket(const AuthCallback& auth_callack,
     46                          bool use_abstract_namespace);
     47   virtual ~UnixDomainServerSocket();
     48 
     49   // Gets credentials of peer to check permissions.
     50   static bool GetPeerCredentials(SocketDescriptor socket_fd,
     51                                  Credentials* credentials);
     52 
     53   // ServerSocket implementation.
     54   virtual int Listen(const IPEndPoint& address, int backlog) OVERRIDE;
     55   virtual int ListenWithAddressAndPort(const std::string& unix_domain_path,
     56                                        int port_unused,
     57                                        int backlog) OVERRIDE;
     58   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE;
     59   virtual int Accept(scoped_ptr<StreamSocket>* socket,
     60                      const CompletionCallback& callback) OVERRIDE;
     61 
     62   // Accepts an incoming connection on |listen_socket_|, but passes back
     63   // a raw SocketDescriptor instead of a StreamSocket.
     64   int AcceptSocketDescriptor(SocketDescriptor* socket_descriptor,
     65                              const CompletionCallback& callback);
     66 
     67  private:
     68   // A callback to wrap the setting of the out-parameter to Accept().
     69   // This allows the internal machinery of that call to be implemented in
     70   // a manner that's agnostic to the caller's desired output.
     71   typedef base::Callback<void(scoped_ptr<SocketLibevent>)> SetterCallback;
     72 
     73   int DoAccept(const SetterCallback& setter_callback,
     74                const CompletionCallback& callback);
     75   void AcceptCompleted(const SetterCallback& setter_callback,
     76                        const CompletionCallback& callback,
     77                        int rv);
     78   bool AuthenticateAndGetStreamSocket(const SetterCallback& setter_callback);
     79 
     80   scoped_ptr<SocketLibevent> listen_socket_;
     81   const AuthCallback auth_callback_;
     82   const bool use_abstract_namespace_;
     83 
     84   scoped_ptr<SocketLibevent> accept_socket_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(UnixDomainServerSocket);
     87 };
     88 
     89 }  // namespace net
     90 
     91 #endif  // NET_SOCKET_UNIX_DOMAIN_SOCKET_POSIX_H_
     92