OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "nacl_io/kernel_proxy.h" | 5 #include "nacl_io/kernel_proxy.h" |
6 | 6 |
7 #include <assert.h> | 7 #include <assert.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <fcntl.h> | 9 #include <fcntl.h> |
10 #include <limits.h> | 10 #include <limits.h> |
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1007 } | 1007 } |
1008 } | 1008 } |
1009 } | 1009 } |
1010 } | 1010 } |
1011 } | 1011 } |
1012 | 1012 |
1013 return event_cnt; | 1013 return event_cnt; |
1014 } | 1014 } |
1015 | 1015 |
1016 | 1016 |
1017 | |
1018 // Socket Functions | 1017 // Socket Functions |
1019 int KernelProxy::accept(int fd, struct sockaddr* addr, socklen_t* len) { | 1018 int KernelProxy::accept(int fd, struct sockaddr* addr, socklen_t* len) { |
1020 if (NULL == addr || NULL == len) { | 1019 if (NULL == addr || NULL == len) { |
1021 errno = EFAULT; | 1020 errno = EFAULT; |
1022 return -1; | 1021 return -1; |
1023 } | 1022 } |
1024 | 1023 |
1025 ScopedKernelHandle handle; | 1024 ScopedKernelHandle handle; |
1026 if (AcquireSocketHandle(fd, &handle) == -1) | 1025 if (AcquireSocketHandle(fd, &handle) == -1) |
1027 return -1; | 1026 return -1; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 Error err = handle->socket_node()->GetSockName(addr, len); | 1103 Error err = handle->socket_node()->GetSockName(addr, len); |
1105 if (err != 0) { | 1104 if (err != 0) { |
1106 errno = err; | 1105 errno = err; |
1107 return -1; | 1106 return -1; |
1108 } | 1107 } |
1109 | 1108 |
1110 return 0; | 1109 return 0; |
1111 } | 1110 } |
1112 | 1111 |
1113 int KernelProxy::getsockopt(int fd, | 1112 int KernelProxy::getsockopt(int fd, |
1114 int lvl, | 1113 int lvl, |
1115 int optname, | 1114 int optname, |
1116 void* optval, | 1115 void* optval, |
1117 socklen_t* len) { | 1116 socklen_t* len) { |
1118 if (NULL == optval || NULL == len) { | 1117 if (NULL == optval || NULL == len) { |
1119 errno = EFAULT; | 1118 errno = EFAULT; |
1120 return -1; | 1119 return -1; |
1121 } | 1120 } |
1122 | 1121 |
1123 ScopedKernelHandle handle; | 1122 ScopedKernelHandle handle; |
1124 if (AcquireSocketHandle(fd, &handle) == -1) | 1123 if (AcquireSocketHandle(fd, &handle) == -1) |
1125 return -1; | 1124 return -1; |
1126 | 1125 |
1127 errno = EINVAL; | 1126 Error err = handle->socket_node()->GetSockOpt(lvl, optname, optval, len); |
1128 return -1; | 1127 if (err != 0) { |
| 1128 errno = err; |
| 1129 return -1; |
| 1130 } |
| 1131 |
| 1132 return 0; |
1129 } | 1133 } |
1130 | 1134 |
1131 int KernelProxy::listen(int fd, int backlog) { | 1135 int KernelProxy::listen(int fd, int backlog) { |
1132 ScopedKernelHandle handle; | 1136 ScopedKernelHandle handle; |
1133 if (AcquireSocketHandle(fd, &handle) == -1) | 1137 if (AcquireSocketHandle(fd, &handle) == -1) |
1134 return -1; | 1138 return -1; |
1135 | 1139 |
1136 errno = EOPNOTSUPP; | 1140 errno = EOPNOTSUPP; |
1137 return -1; | 1141 return -1; |
1138 } | 1142 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1282 socklen_t len) { | 1286 socklen_t len) { |
1283 if (NULL == optval) { | 1287 if (NULL == optval) { |
1284 errno = EFAULT; | 1288 errno = EFAULT; |
1285 return -1; | 1289 return -1; |
1286 } | 1290 } |
1287 | 1291 |
1288 ScopedKernelHandle handle; | 1292 ScopedKernelHandle handle; |
1289 if (AcquireSocketHandle(fd, &handle) == -1) | 1293 if (AcquireSocketHandle(fd, &handle) == -1) |
1290 return -1; | 1294 return -1; |
1291 | 1295 |
1292 errno = EINVAL; | 1296 Error err = handle->socket_node()->SetSockOpt(lvl, optname, optval, len); |
1293 return -1; | 1297 if (err != 0) { |
| 1298 errno = err; |
| 1299 return -1; |
| 1300 } |
| 1301 |
| 1302 return 0; |
1294 } | 1303 } |
1295 | 1304 |
1296 int KernelProxy::shutdown(int fd, int how) { | 1305 int KernelProxy::shutdown(int fd, int how) { |
1297 ScopedKernelHandle handle; | 1306 ScopedKernelHandle handle; |
1298 if (AcquireSocketHandle(fd, &handle) == -1) | 1307 if (AcquireSocketHandle(fd, &handle) == -1) |
1299 return -1; | 1308 return -1; |
1300 | 1309 |
1301 Error err = handle->socket_node()->Shutdown(how); | 1310 Error err = handle->socket_node()->Shutdown(how); |
1302 if (err != 0) { | 1311 if (err != 0) { |
1303 errno = err; | 1312 errno = err; |
(...skipping 18 matching lines...) Expand all Loading... |
1322 case SOCK_STREAM: | 1331 case SOCK_STREAM: |
1323 sock = new MountNodeTCP(stream_mount_.get()); | 1332 sock = new MountNodeTCP(stream_mount_.get()); |
1324 break; | 1333 break; |
1325 | 1334 |
1326 default: | 1335 default: |
1327 errno = EPROTONOSUPPORT; | 1336 errno = EPROTONOSUPPORT; |
1328 return -1; | 1337 return -1; |
1329 } | 1338 } |
1330 | 1339 |
1331 ScopedMountNode node(sock); | 1340 ScopedMountNode node(sock); |
1332 if (sock->Init(S_IREAD | S_IWRITE) == 0) { | 1341 Error rtn = sock->Init(S_IREAD | S_IWRITE); |
1333 ScopedKernelHandle handle(new KernelHandle(stream_mount_, node)); | 1342 if (rtn != 0) { |
1334 return AllocateFD(handle); | 1343 errno = rtn; |
| 1344 return -1; |
1335 } | 1345 } |
1336 | 1346 |
1337 // If we failed to init, assume we don't have access. | 1347 ScopedKernelHandle handle(new KernelHandle(stream_mount_, node)); |
1338 return EACCES; | 1348 return AllocateFD(handle); |
1339 } | 1349 } |
1340 | 1350 |
1341 int KernelProxy::socketpair(int domain, int type, int protocol, int* sv) { | 1351 int KernelProxy::socketpair(int domain, int type, int protocol, int* sv) { |
1342 if (NULL == sv) { | 1352 if (NULL == sv) { |
1343 errno = EFAULT; | 1353 errno = EFAULT; |
1344 return -1; | 1354 return -1; |
1345 } | 1355 } |
1346 | 1356 |
1347 // Catch-22: We don't support AF_UNIX, but any other AF doesn't support | 1357 // Catch-22: We don't support AF_UNIX, but any other AF doesn't support |
1348 // socket pairs. Thus, this function always fails. | 1358 // socket pairs. Thus, this function always fails. |
(...skipping 24 matching lines...) Expand all Loading... |
1373 errno = ENOTSOCK; | 1383 errno = ENOTSOCK; |
1374 return -1; | 1384 return -1; |
1375 } | 1385 } |
1376 | 1386 |
1377 return 0; | 1387 return 0; |
1378 } | 1388 } |
1379 | 1389 |
1380 #endif // PROVIDES_SOCKET_API | 1390 #endif // PROVIDES_SOCKET_API |
1381 | 1391 |
1382 } // namespace_nacl_io | 1392 } // namespace_nacl_io |
OLD | NEW |