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 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1020 | 1020 |
1021 | 1021 |
1022 // Socket Functions | 1022 // Socket Functions |
1023 int KernelProxy::accept(int fd, struct sockaddr* addr, socklen_t* len) { | 1023 int KernelProxy::accept(int fd, struct sockaddr* addr, socklen_t* len) { |
1024 if (NULL == addr || NULL == len) { | 1024 if (NULL == addr || NULL == len) { |
1025 errno = EFAULT; | 1025 errno = EFAULT; |
1026 return -1; | 1026 return -1; |
1027 } | 1027 } |
1028 | 1028 |
1029 ScopedKernelHandle handle; | 1029 ScopedKernelHandle handle; |
1030 if (AcquireSocketHandle(fd, &handle) == -1) | 1030 Error error = AcquireHandle(fd, &handle); |
1031 return -1; | 1031 if (error) { |
1032 | 1032 errno = error; |
1033 PP_Resource new_sock = 0; | |
1034 Error err = handle->socket_node()->Accept(&new_sock, addr, len); | |
1035 if (err != 0) { | |
1036 errno = err; | |
1037 return -1; | 1033 return -1; |
1038 } | 1034 } |
1039 | 1035 |
| 1036 PP_Resource new_sock = 0; |
| 1037 error = handle->Accept(&new_sock, addr, len); |
| 1038 if (error != 0) { |
| 1039 errno = error; |
| 1040 return -1; |
| 1041 } |
| 1042 |
1040 MountNodeSocket* sock = new MountNodeTCP(stream_mount_.get(), new_sock); | 1043 MountNodeSocket* sock = new MountNodeTCP(stream_mount_.get(), new_sock); |
1041 | 1044 |
1042 // The MountNodeSocket now holds a reference to the new socket | 1045 // The MountNodeSocket now holds a reference to the new socket |
1043 // so we release ours. | 1046 // so we release ours. |
1044 ppapi_->ReleaseResource(new_sock); | 1047 ppapi_->ReleaseResource(new_sock); |
1045 err = sock->Init(S_IREAD | S_IWRITE); | 1048 error = sock->Init(S_IREAD | S_IWRITE); |
1046 if (err != 0) { | 1049 if (error != 0) { |
1047 errno = err; | 1050 errno = error; |
1048 return -1; | 1051 return -1; |
1049 } | 1052 } |
1050 | 1053 |
1051 ScopedMountNode node(sock); | 1054 ScopedMountNode node(sock); |
1052 ScopedKernelHandle new_handle(new KernelHandle(stream_mount_, node)); | 1055 ScopedKernelHandle new_handle(new KernelHandle(stream_mount_, node)); |
1053 return AllocateFD(new_handle); | 1056 return AllocateFD(new_handle); |
1054 } | 1057 } |
1055 | 1058 |
1056 int KernelProxy::bind(int fd, const struct sockaddr* addr, socklen_t len) { | 1059 int KernelProxy::bind(int fd, const struct sockaddr* addr, socklen_t len) { |
1057 if (NULL == addr) { | 1060 if (NULL == addr) { |
(...skipping 14 matching lines...) Expand all Loading... |
1072 return 0; | 1075 return 0; |
1073 } | 1076 } |
1074 | 1077 |
1075 int KernelProxy::connect(int fd, const struct sockaddr* addr, socklen_t len) { | 1078 int KernelProxy::connect(int fd, const struct sockaddr* addr, socklen_t len) { |
1076 if (NULL == addr) { | 1079 if (NULL == addr) { |
1077 errno = EFAULT; | 1080 errno = EFAULT; |
1078 return -1; | 1081 return -1; |
1079 } | 1082 } |
1080 | 1083 |
1081 ScopedKernelHandle handle; | 1084 ScopedKernelHandle handle; |
1082 if (AcquireSocketHandle(fd, &handle) == -1) | 1085 Error error = AcquireHandle(fd, &handle); |
1083 return -1; | 1086 if (error) { |
1084 | 1087 errno = error; |
1085 Error err = handle->socket_node()->Connect(addr, len); | |
1086 if (err != 0) { | |
1087 errno = err; | |
1088 return -1; | 1088 return -1; |
1089 } | 1089 } |
1090 | 1090 |
| 1091 error = handle->Connect(addr, len); |
| 1092 if (error != 0) { |
| 1093 errno = error; |
| 1094 return -1; |
| 1095 } |
| 1096 |
1091 return 0; | 1097 return 0; |
1092 } | 1098 } |
1093 | 1099 |
1094 struct hostent* KernelProxy::gethostbyname(const char* name) { | 1100 struct hostent* KernelProxy::gethostbyname(const char* name) { |
1095 return host_resolver_.gethostbyname(name); | 1101 return host_resolver_.gethostbyname(name); |
1096 } | 1102 } |
1097 | 1103 |
1098 int KernelProxy::getpeername(int fd, struct sockaddr* addr, socklen_t* len) { | 1104 int KernelProxy::getpeername(int fd, struct sockaddr* addr, socklen_t* len) { |
1099 if (NULL == addr || NULL == len) { | 1105 if (NULL == addr || NULL == len) { |
1100 errno = EFAULT; | 1106 errno = EFAULT; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1173 ssize_t KernelProxy::recv(int fd, | 1179 ssize_t KernelProxy::recv(int fd, |
1174 void* buf, | 1180 void* buf, |
1175 size_t len, | 1181 size_t len, |
1176 int flags) { | 1182 int flags) { |
1177 if (NULL == buf) { | 1183 if (NULL == buf) { |
1178 errno = EFAULT; | 1184 errno = EFAULT; |
1179 return -1; | 1185 return -1; |
1180 } | 1186 } |
1181 | 1187 |
1182 ScopedKernelHandle handle; | 1188 ScopedKernelHandle handle; |
1183 if (AcquireSocketHandle(fd, &handle) == -1) | 1189 Error error = AcquireHandle(fd, &handle); |
1184 return -1; | 1190 if (error) { |
1185 | 1191 errno = error; |
1186 int out_len = 0; | |
1187 Error err = handle->socket_node()->Recv(handle->Data(), buf, len, flags, | |
1188 &out_len); | |
1189 if (err != 0) { | |
1190 errno = err; | |
1191 return -1; | 1192 return -1; |
1192 } | 1193 } |
1193 | 1194 |
| 1195 int out_len = 0; |
| 1196 error = handle->Recv(buf, len, flags, &out_len); |
| 1197 if (error != 0) { |
| 1198 errno = error; |
| 1199 return -1; |
| 1200 } |
| 1201 |
1194 return static_cast<ssize_t>(out_len); | 1202 return static_cast<ssize_t>(out_len); |
1195 } | 1203 } |
1196 | 1204 |
1197 ssize_t KernelProxy::recvfrom(int fd, | 1205 ssize_t KernelProxy::recvfrom(int fd, |
1198 void* buf, | 1206 void* buf, |
1199 size_t len, | 1207 size_t len, |
1200 int flags, | 1208 int flags, |
1201 struct sockaddr* addr, | 1209 struct sockaddr* addr, |
1202 socklen_t* addrlen) { | 1210 socklen_t* addrlen) { |
1203 // According to the manpage, recvfrom with a null addr is identical to recv. | 1211 // According to the manpage, recvfrom with a null addr is identical to recv. |
1204 if (NULL == addr) { | 1212 if (NULL == addr) { |
1205 return recv(fd, buf, len, flags); | 1213 return recv(fd, buf, len, flags); |
1206 } | 1214 } |
1207 | 1215 |
1208 if (NULL == buf || NULL == addrlen) { | 1216 if (NULL == buf || NULL == addrlen) { |
1209 errno = EFAULT; | 1217 errno = EFAULT; |
1210 return -1; | 1218 return -1; |
1211 } | 1219 } |
1212 | 1220 |
1213 ScopedKernelHandle handle; | 1221 ScopedKernelHandle handle; |
1214 if (AcquireSocketHandle(fd, &handle) == -1) | 1222 Error error = AcquireHandle(fd, &handle); |
1215 return -1; | 1223 if (error) { |
1216 | 1224 errno = error; |
1217 int out_len = 0; | |
1218 Error err = handle->socket_node()->RecvFrom(handle->Data(), | |
1219 buf, | |
1220 len, | |
1221 flags, | |
1222 addr, | |
1223 addrlen, | |
1224 &out_len); | |
1225 if (err != 0) { | |
1226 errno = err; | |
1227 return -1; | 1225 return -1; |
1228 } | 1226 } |
1229 | 1227 |
| 1228 int out_len = 0; |
| 1229 error = handle->RecvFrom(buf, len, flags, addr, addrlen, &out_len); |
| 1230 if (error != 0) { |
| 1231 errno = error; |
| 1232 return -1; |
| 1233 } |
| 1234 |
1230 return static_cast<ssize_t>(out_len); | 1235 return static_cast<ssize_t>(out_len); |
1231 } | 1236 } |
1232 | 1237 |
1233 ssize_t KernelProxy::recvmsg(int fd, struct msghdr* msg, int flags) { | 1238 ssize_t KernelProxy::recvmsg(int fd, struct msghdr* msg, int flags) { |
1234 if (NULL == msg ) { | 1239 if (NULL == msg ) { |
1235 errno = EFAULT; | 1240 errno = EFAULT; |
1236 return -1; | 1241 return -1; |
1237 } | 1242 } |
1238 | 1243 |
1239 ScopedKernelHandle handle; | 1244 ScopedKernelHandle handle; |
1240 if (AcquireSocketHandle(fd, &handle) == -1) | 1245 if (AcquireSocketHandle(fd, &handle) == -1) |
1241 return -1; | 1246 return -1; |
1242 | 1247 |
1243 errno = EOPNOTSUPP; | 1248 errno = EOPNOTSUPP; |
1244 return -1; | 1249 return -1; |
1245 } | 1250 } |
1246 | 1251 |
1247 ssize_t KernelProxy::send(int fd, const void* buf, size_t len, int flags) { | 1252 ssize_t KernelProxy::send(int fd, const void* buf, size_t len, int flags) { |
1248 if (NULL == buf) { | 1253 if (NULL == buf) { |
1249 errno = EFAULT; | 1254 errno = EFAULT; |
1250 return -1; | 1255 return -1; |
1251 } | 1256 } |
1252 | 1257 |
1253 ScopedKernelHandle handle; | 1258 ScopedKernelHandle handle; |
1254 if (AcquireSocketHandle(fd, &handle) == -1) | 1259 Error error = AcquireHandle(fd, &handle); |
1255 return -1; | 1260 if (error) { |
1256 | 1261 errno = error; |
1257 int out_len = 0; | |
1258 Error err = handle->socket_node()->Send(handle->Data(), buf, len, flags, | |
1259 &out_len); | |
1260 if (err != 0) { | |
1261 errno = err; | |
1262 return -1; | 1262 return -1; |
1263 } | 1263 } |
1264 | 1264 |
| 1265 int out_len = 0; |
| 1266 error = handle->Send(buf, len, flags, &out_len); |
| 1267 if (error != 0) { |
| 1268 errno = error; |
| 1269 return -1; |
| 1270 } |
| 1271 |
1265 return static_cast<ssize_t>(out_len); | 1272 return static_cast<ssize_t>(out_len); |
1266 } | 1273 } |
1267 | 1274 |
1268 ssize_t KernelProxy::sendto(int fd, | 1275 ssize_t KernelProxy::sendto(int fd, |
1269 const void* buf, | 1276 const void* buf, |
1270 size_t len, | 1277 size_t len, |
1271 int flags, | 1278 int flags, |
1272 const struct sockaddr* addr, | 1279 const struct sockaddr* addr, |
1273 socklen_t addrlen) { | 1280 socklen_t addrlen) { |
1274 // According to the manpage, sendto with a null addr is identical to send. | 1281 // According to the manpage, sendto with a null addr is identical to send. |
1275 if (NULL == addr) { | 1282 if (NULL == addr) { |
1276 return send(fd, buf, len, flags); | 1283 return send(fd, buf, len, flags); |
1277 } | 1284 } |
1278 | 1285 |
1279 if (NULL == buf) { | 1286 if (NULL == buf) { |
1280 errno = EFAULT; | 1287 errno = EFAULT; |
1281 return -1; | 1288 return -1; |
1282 } | 1289 } |
1283 | 1290 |
1284 ScopedKernelHandle handle; | 1291 ScopedKernelHandle handle; |
1285 if (AcquireSocketHandle(fd, &handle) == -1) | 1292 Error error = AcquireHandle(fd, &handle); |
1286 return -1; | 1293 if (error) { |
1287 | 1294 errno = error; |
1288 int out_len = 0; | |
1289 Error err = handle->socket_node()->SendTo(handle->Data(), buf, len, flags, | |
1290 addr, addrlen, &out_len); | |
1291 | |
1292 if (err != 0) { | |
1293 errno = err; | |
1294 return -1; | 1295 return -1; |
1295 } | 1296 } |
1296 | 1297 |
| 1298 int out_len = 0; |
| 1299 error = handle->SendTo(buf, len, flags, addr, addrlen, &out_len); |
| 1300 if (error != 0) { |
| 1301 errno = error; |
| 1302 return -1; |
| 1303 } |
| 1304 |
1297 return static_cast<ssize_t>(out_len); | 1305 return static_cast<ssize_t>(out_len); |
1298 } | 1306 } |
1299 | 1307 |
1300 ssize_t KernelProxy::sendmsg(int fd, const struct msghdr* msg, int flags) { | 1308 ssize_t KernelProxy::sendmsg(int fd, const struct msghdr* msg, int flags) { |
1301 if (NULL == msg) { | 1309 if (NULL == msg) { |
1302 errno = EFAULT; | 1310 errno = EFAULT; |
1303 return -1; | 1311 return -1; |
1304 } | 1312 } |
1305 | 1313 |
1306 ScopedKernelHandle handle; | 1314 ScopedKernelHandle handle; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 errno = ENOTSOCK; | 1423 errno = ENOTSOCK; |
1416 return -1; | 1424 return -1; |
1417 } | 1425 } |
1418 | 1426 |
1419 return 0; | 1427 return 0; |
1420 } | 1428 } |
1421 | 1429 |
1422 #endif // PROVIDES_SOCKET_API | 1430 #endif // PROVIDES_SOCKET_API |
1423 | 1431 |
1424 } // namespace_nacl_io | 1432 } // namespace_nacl_io |
OLD | NEW |