Index: mojo/shell/domain_socket/unix_domain_server_socket_posix.cc |
diff --git a/mojo/shell/domain_socket/unix_domain_server_socket_posix.cc b/mojo/shell/domain_socket/unix_domain_server_socket_posix.cc |
deleted file mode 100644 |
index 9f45070f331b11523109dcf137c93f8600b7eb48..0000000000000000000000000000000000000000 |
--- a/mojo/shell/domain_socket/unix_domain_server_socket_posix.cc |
+++ /dev/null |
@@ -1,158 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "mojo/shell/domain_socket/unix_domain_server_socket_posix.h" |
- |
-#include <errno.h> |
-#include <sys/socket.h> |
-#include <sys/un.h> |
-#include <unistd.h> |
- |
-#include "base/logging.h" |
-#include "mojo/shell/domain_socket/completion_callback.h" |
-#include "mojo/shell/domain_socket/net_errors.h" |
-#include "mojo/shell/domain_socket/socket_descriptor.h" |
-#include "mojo/shell/domain_socket/socket_libevent.h" |
-#include "mojo/shell/domain_socket/unix_domain_client_socket_posix.h" |
- |
-namespace mojo { |
-namespace shell { |
- |
-namespace { |
- |
-// Intended for use as SetterCallbacks in Accept() helper methods. |
-void SetSocketDescriptor(SocketDescriptor* socket, |
- scoped_ptr<SocketLibevent> accepted_socket) { |
- *socket = accepted_socket->ReleaseConnectedSocket(); |
-} |
- |
-} // anonymous namespace |
- |
-UnixDomainServerSocket::UnixDomainServerSocket( |
- const AuthCallback& auth_callback, |
- bool use_abstract_namespace) |
- : auth_callback_(auth_callback), |
- use_abstract_namespace_(use_abstract_namespace) { |
- DCHECK(!auth_callback_.is_null()); |
-} |
- |
-UnixDomainServerSocket::~UnixDomainServerSocket() { |
-} |
- |
-// static |
-bool UnixDomainServerSocket::GetPeerCredentials(SocketDescriptor socket, |
- Credentials* credentials) { |
- struct ucred user_cred; |
- socklen_t len = sizeof(user_cred); |
- if (getsockopt(socket, SOL_SOCKET, SO_PEERCRED, &user_cred, &len) < 0) |
- return false; |
- credentials->process_id = user_cred.pid; |
- credentials->user_id = user_cred.uid; |
- credentials->group_id = user_cred.gid; |
- return true; |
-} |
- |
-int UnixDomainServerSocket::ListenWithPath(const std::string& unix_domain_path, |
- int backlog) { |
- DCHECK(!listen_socket_); |
- |
- SockaddrStorage address; |
- if (!UnixDomainClientSocket::FillAddress( |
- unix_domain_path, use_abstract_namespace_, &address)) { |
- return net::ERR_ADDRESS_INVALID; |
- } |
- |
- scoped_ptr<SocketLibevent> socket(new SocketLibevent); |
- int rv = socket->Open(AF_UNIX); |
- DCHECK_NE(net::ERR_IO_PENDING, rv); |
- if (rv != net::OK) |
- return rv; |
- |
- rv = socket->Bind(address); |
- DCHECK_NE(net::ERR_IO_PENDING, rv); |
- if (rv != net::OK) { |
- PLOG(ERROR) << "Could not bind unix domain socket to " << unix_domain_path |
- << (use_abstract_namespace_ ? " (with abstract namespace)" |
- : ""); |
- return rv; |
- } |
- |
- rv = socket->Listen(backlog); |
- DCHECK_NE(net::ERR_IO_PENDING, rv); |
- if (rv != net::OK) |
- return rv; |
- |
- listen_socket_.swap(socket); |
- return rv; |
-} |
- |
-int UnixDomainServerSocket::Accept(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_); |
- |
- while (true) { |
- int rv = listen_socket_->Accept( |
- &accept_socket_, |
- base::Bind(&UnixDomainServerSocket::AcceptCompleted, |
- base::Unretained(this), |
- setter_callback, |
- callback)); |
- if (rv != net::OK) |
- return rv; |
- if (AuthenticateAndGetStreamSocket(setter_callback)) |
- return net::OK; |
- // Accept another socket because authentication error should be transparent |
- // to the caller. |
- } |
-} |
- |
-void UnixDomainServerSocket::AcceptCompleted( |
- const SetterCallback& setter_callback, |
- const CompletionCallback& callback, |
- int rv) { |
- if (rv != net::OK) { |
- callback.Run(rv); |
- return; |
- } |
- |
- if (AuthenticateAndGetStreamSocket(setter_callback)) { |
- callback.Run(net::OK); |
- return; |
- } |
- |
- // Accept another socket because authentication error should be transparent |
- // to the caller. |
- rv = DoAccept(setter_callback, callback); |
- if (rv != net::ERR_IO_PENDING) |
- callback.Run(rv); |
-} |
- |
-bool UnixDomainServerSocket::AuthenticateAndGetStreamSocket( |
- const SetterCallback& setter_callback) { |
- DCHECK(accept_socket_); |
- |
- Credentials credentials; |
- if (!GetPeerCredentials(accept_socket_->socket_fd(), &credentials) || |
- !auth_callback_.Run(credentials)) { |
- accept_socket_.reset(); |
- return false; |
- } |
- |
- setter_callback.Run(accept_socket_.Pass()); |
- return true; |
-} |
- |
-} // namespace shell |
-} // namespace mojo |