Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(355)

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc

Issue 26703008: [NaCl SDK] nacl_io: Add support for non-blocking connect/accept (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698