summaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authortfarina <tfarina@chromium.org>2016-02-21 11:52:40 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-21 19:53:35 +0000
commit8749855f3f416be125598dfd7be0ecf55ff217e6 (patch)
treef565bd2bd5bb55bb82019640e9927c4da8347199 /ipc
parentc8e386dede86c0b37db10e56fd53689ee80df0c0 (diff)
downloadchromium_src-8749855f3f416be125598dfd7be0ecf55ff217e6.zip
chromium_src-8749855f3f416be125598dfd7be0ecf55ff217e6.tar.gz
chromium_src-8749855f3f416be125598dfd7be0ecf55ff217e6.tar.bz2
ipc: split the process of creating unix domain socket into a separate function
For clarity this patch separates the process of filing sockaddr_un (doing it first and only) in MakeUnixAddrForPath() from the process of creating and making the unix domain socket non-blocking in another function (only after MakeUnixAddrForPath()), called CreateUnixDomainSocket(). Because it is really weird and confusing that MakeUnixAddrForPath() returns an non-scoped fd in case of success. BUG=None TEST=ipc_tests R=agl@chromium.org Review URL: https://codereview.chromium.org/1689363002 Cr-Commit-Position: refs/heads/master@{#376666}
Diffstat (limited to 'ipc')
-rw-r--r--ipc/unix_domain_socket_util.cc49
1 files changed, 28 insertions, 21 deletions
diff --git a/ipc/unix_domain_socket_util.cc b/ipc/unix_domain_socket_util.cc
index 86367998..6e06fe7 100644
--- a/ipc/unix_domain_socket_util.cc
+++ b/ipc/unix_domain_socket_util.cc
@@ -24,46 +24,51 @@ static_assert(sizeof(((sockaddr_un*)0)->sun_path) >= kMaxSocketNameLength,
namespace {
-// Returns fd (>= 0) on success, -1 on failure. If successful, fills in
+// Returns true on success, false otherwise. If successful, fills in
// |unix_addr| with the appropriate data for the socket, and sets
// |unix_addr_len| to the length of the data therein.
-int MakeUnixAddrForPath(const std::string& socket_name,
- struct sockaddr_un* unix_addr,
- size_t* unix_addr_len) {
+bool MakeUnixAddrForPath(const std::string& socket_name,
+ struct sockaddr_un* unix_addr,
+ size_t* unix_addr_len) {
DCHECK(unix_addr);
DCHECK(unix_addr_len);
if (socket_name.length() == 0) {
LOG(ERROR) << "Empty socket name provided for unix socket address.";
- return -1;
+ return false;
}
// We reject socket_name.length() == kMaxSocketNameLength to make room for
// the NUL terminator at the end of the string.
if (socket_name.length() >= kMaxSocketNameLength) {
LOG(ERROR) << "Socket name too long: " << socket_name;
- return -1;
+ return false;
}
+ // Create unix_addr structure.
+ memset(unix_addr, 0, sizeof(struct sockaddr_un));
+ unix_addr->sun_family = AF_UNIX;
+ strncpy(unix_addr->sun_path, socket_name.c_str(), kMaxSocketNameLength);
+ *unix_addr_len =
+ offsetof(struct sockaddr_un, sun_path) + socket_name.length();
+ return true;
+}
+
+// Returns a valid socket on success.
+base::ScopedFD CreateUnixDomainSocket() {
// Create socket.
base::ScopedFD fd(socket(AF_UNIX, SOCK_STREAM, 0));
if (!fd.is_valid()) {
- PLOG(ERROR) << "socket";
- return -1;
+ PLOG(ERROR) << "Failed to create AF_UNIX socket.";
+ return base::ScopedFD();
}
- // Make socket non-blocking
+ // Make socket non-blocking.
if (!base::SetNonBlocking(fd.get())) {
PLOG(ERROR) << "base::SetNonBlocking() failed " << fd.get();
- return -1;
+ return base::ScopedFD();
}
- // Create unix_addr structure.
- memset(unix_addr, 0, sizeof(struct sockaddr_un));
- unix_addr->sun_family = AF_UNIX;
- strncpy(unix_addr->sun_path, socket_name.c_str(), kMaxSocketNameLength);
- *unix_addr_len =
- offsetof(struct sockaddr_un, sun_path) + socket_name.length();
- return fd.release();
+ return fd;
}
bool IsRecoverableError() {
@@ -80,8 +85,9 @@ bool CreateServerUnixDomainSocket(const base::FilePath& socket_path,
const std::string socket_name = socket_path.value();
struct sockaddr_un unix_addr;
size_t unix_addr_len;
- base::ScopedFD fd(
- MakeUnixAddrForPath(socket_name, &unix_addr, &unix_addr_len));
+ if (!MakeUnixAddrForPath(socket_name, &unix_addr, &unix_addr_len))
+ return false;
+ base::ScopedFD fd(CreateUnixDomainSocket());
if (!fd.is_valid())
return false;
@@ -122,8 +128,9 @@ bool CreateClientUnixDomainSocket(const base::FilePath& socket_path,
struct sockaddr_un unix_addr;
size_t unix_addr_len;
- base::ScopedFD fd(
- MakeUnixAddrForPath(socket_path.value(), &unix_addr, &unix_addr_len));
+ if (!MakeUnixAddrForPath(socket_path.value(), &unix_addr, &unix_addr_len))
+ return false;
+ base::ScopedFD fd(CreateUnixDomainSocket());
if (!fd.is_valid())
return false;