OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/posix/unix_domain_socket.h" | 5 #include "base/posix/unix_domain_socket.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <unistd.h> | 8 #include <unistd.h> |
9 #include <sys/uio.h> | 9 #include <sys/uio.h> |
10 #include <sys/socket.h> | 10 #include <sys/socket.h> |
11 | 11 |
12 #include "base/eintr_wrapper.h" | 12 #include "base/eintr_wrapper.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/pickle.h" | 14 #include "base/pickle.h" |
15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
16 | 16 |
| 17 const size_t UnixDomainSocket::kMaxFileDescriptors = 16; |
| 18 |
17 // static | 19 // static |
18 bool UnixDomainSocket::SendMsg(int fd, | 20 bool UnixDomainSocket::SendMsg(int fd, |
19 const void* buf, | 21 const void* buf, |
20 size_t length, | 22 size_t length, |
21 const std::vector<int>& fds) { | 23 const std::vector<int>& fds) { |
22 struct msghdr msg; | 24 struct msghdr msg; |
23 memset(&msg, 0, sizeof(msg)); | 25 memset(&msg, 0, sizeof(msg)); |
24 struct iovec iov = {const_cast<void*>(buf), length}; | 26 struct iovec iov = {const_cast<void*>(buf), length}; |
25 msg.msg_iov = &iov; | 27 msg.msg_iov = &iov; |
26 msg.msg_iovlen = 1; | 28 msg.msg_iovlen = 1; |
(...skipping 18 matching lines...) Expand all Loading... |
45 const bool ret = static_cast<ssize_t>(length) == r; | 47 const bool ret = static_cast<ssize_t>(length) == r; |
46 delete[] control_buffer; | 48 delete[] control_buffer; |
47 return ret; | 49 return ret; |
48 } | 50 } |
49 | 51 |
50 // static | 52 // static |
51 ssize_t UnixDomainSocket::RecvMsg(int fd, | 53 ssize_t UnixDomainSocket::RecvMsg(int fd, |
52 void* buf, | 54 void* buf, |
53 size_t length, | 55 size_t length, |
54 std::vector<int>* fds) { | 56 std::vector<int>* fds) { |
55 static const unsigned kMaxDescriptors = 16; | |
56 | |
57 fds->clear(); | 57 fds->clear(); |
58 | 58 |
59 struct msghdr msg; | 59 struct msghdr msg; |
60 memset(&msg, 0, sizeof(msg)); | 60 memset(&msg, 0, sizeof(msg)); |
61 struct iovec iov = {buf, length}; | 61 struct iovec iov = {buf, length}; |
62 msg.msg_iov = &iov; | 62 msg.msg_iov = &iov; |
63 msg.msg_iovlen = 1; | 63 msg.msg_iovlen = 1; |
64 | 64 |
65 char control_buffer[CMSG_SPACE(sizeof(int) * kMaxDescriptors)]; | 65 char control_buffer[CMSG_SPACE(sizeof(int) * kMaxFileDescriptors)]; |
66 msg.msg_control = control_buffer; | 66 msg.msg_control = control_buffer; |
67 msg.msg_controllen = sizeof(control_buffer); | 67 msg.msg_controllen = sizeof(control_buffer); |
68 | 68 |
69 const ssize_t r = HANDLE_EINTR(recvmsg(fd, &msg, 0)); | 69 const ssize_t r = HANDLE_EINTR(recvmsg(fd, &msg, 0)); |
70 if (r == -1) | 70 if (r == -1) |
71 return -1; | 71 return -1; |
72 | 72 |
73 int* wire_fds = NULL; | 73 int* wire_fds = NULL; |
74 unsigned wire_fds_len = 0; | 74 unsigned wire_fds_len = 0; |
75 | 75 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 NOTREACHED(); | 137 NOTREACHED(); |
138 | 138 |
139 return -1; | 139 return -1; |
140 } | 140 } |
141 | 141 |
142 if (result_fd) | 142 if (result_fd) |
143 *result_fd = fd_vector.empty() ? -1 : fd_vector[0]; | 143 *result_fd = fd_vector.empty() ? -1 : fd_vector[0]; |
144 | 144 |
145 return reply_len; | 145 return reply_len; |
146 } | 146 } |
OLD | NEW |