Index: net/socket/unix_domain_server_socket_posix.cc |
diff --git a/net/socket/unix_domain_server_socket_posix.cc b/net/socket/unix_domain_server_socket_posix.cc |
index 4ab0b834e624e81c94da14cc9dae2048b2d49ed0..950ed883c5a8f745f3e2bbd00e32d1540d367be1 100644 |
--- a/net/socket/unix_domain_server_socket_posix.cc |
+++ b/net/socket/unix_domain_server_socket_posix.cc |
@@ -16,6 +16,19 @@ |
namespace net { |
+namespace { |
+// Intended for use as SetterCallbacks in Accept() helper methods. |
+void SetStreamSocket(scoped_ptr<StreamSocket>* socket, |
+ scoped_ptr<SocketLibevent> accepted_socket) { |
+ socket->reset(new UnixDomainClientSocket(accepted_socket.Pass())); |
+} |
+ |
+void SetSocketDescriptor(SocketDescriptor* socket, |
+ scoped_ptr<SocketLibevent> accepted_socket) { |
+ *socket = accepted_socket->ReleaseConnectedSocket(); |
+} |
+} // anonymous nanmespace |
mmenke
2014/09/03 14:56:46
nit: -anonymous, nanmespace -> namespace
mmenke
2014/09/03 14:56:46
nit: I believe blank lines before end and after s
Chris Masone
2014/09/03 15:57:12
Done.
Chris Masone
2014/09/03 15:57:12
Done.
|
+ |
UnixDomainServerSocket::UnixDomainServerSocket( |
const AuthCallback& auth_callback, |
bool use_abstract_namespace) |
@@ -95,6 +108,23 @@ int UnixDomainServerSocket::GetLocalAddress(IPEndPoint* address) const { |
int UnixDomainServerSocket::Accept(scoped_ptr<StreamSocket>* socket, |
const CompletionCallback& callback) { |
DCHECK(socket); |
+ |
+ SetterCallback setter_callback = base::Bind(&SetStreamSocket, socket); |
+ return DoAccept(setter_callback, callback); |
+} |
+ |
+int UnixDomainServerSocket::AcceptSocketDescriptor( |
+ SocketDescriptor* socket, |
+ const CompletionCallback& callback) { |
+ DCHECK(socket); |
+ |
+ SetterCallback setter_callback = base::Bind(&SetSocketDescriptor, socket); |
+ return DoAccept(setter_callback, callback); |
+} |
+ |
+int UnixDomainServerSocket::DoAccept(const SetterCallback& setter_callback, |
+ const CompletionCallback& callback) { |
+ DCHECK(!setter_callback.is_null()); |
DCHECK(!callback.is_null()); |
DCHECK(listen_socket_); |
DCHECK(!accept_socket_); |
@@ -103,38 +133,41 @@ int UnixDomainServerSocket::Accept(scoped_ptr<StreamSocket>* socket, |
int rv = listen_socket_->Accept( |
&accept_socket_, |
base::Bind(&UnixDomainServerSocket::AcceptCompleted, |
- base::Unretained(this), socket, callback)); |
+ base::Unretained(this), |
+ setter_callback, |
+ callback)); |
if (rv != OK) |
return rv; |
- if (AuthenticateAndGetStreamSocket(socket)) |
+ if (AuthenticateAndGetStreamSocket(setter_callback)) |
return OK; |
// Accept another socket because authentication error should be transparent |
// to the caller. |
} |
} |
-void UnixDomainServerSocket::AcceptCompleted(scoped_ptr<StreamSocket>* socket, |
- const CompletionCallback& callback, |
- int rv) { |
+void UnixDomainServerSocket::AcceptCompleted( |
+ const SetterCallback& setter_callback, |
+ const CompletionCallback& callback, |
+ int rv) { |
if (rv != OK) { |
callback.Run(rv); |
return; |
} |
- if (AuthenticateAndGetStreamSocket(socket)) { |
+ if (AuthenticateAndGetStreamSocket(setter_callback)) { |
callback.Run(OK); |
return; |
} |
// Accept another socket because authentication error should be transparent |
// to the caller. |
- rv = Accept(socket, callback); |
+ rv = DoAccept(setter_callback, callback); |
if (rv != ERR_IO_PENDING) |
callback.Run(rv); |
} |
bool UnixDomainServerSocket::AuthenticateAndGetStreamSocket( |
- scoped_ptr<StreamSocket>* socket) { |
+ const SetterCallback& setter_callback) { |
DCHECK(accept_socket_); |
Credentials credentials; |
@@ -144,7 +177,7 @@ bool UnixDomainServerSocket::AuthenticateAndGetStreamSocket( |
return false; |
} |
- socket->reset(new UnixDomainClientSocket(accept_socket_.Pass())); |
+ setter_callback.Run(accept_socket_.Pass()); |
return true; |
} |