• 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_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