Index: native_client_sdk/src/libraries/nacl_io/kernel_handle.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc b/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc |
index cdc85351ce52801e965a297043a83b68bec5cb85..eab3ce81dca0db9b3458b7ba2d4fbdc3b3216924 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc |
@@ -9,6 +9,7 @@ |
#include "nacl_io/mount.h" |
#include "nacl_io/mount_node.h" |
+#include "nacl_io/mount_node_socket.h" |
#include "nacl_io/osunistd.h" |
#include "sdk_util/auto_lock.h" |
@@ -36,10 +37,10 @@ MountNodeSocket* KernelHandle::socket_node() { |
} |
Error KernelHandle::Init(int open_flags) { |
- handle_data_.flags = open_flags; |
+ handle_attr_.flags = open_flags; |
if (open_flags & O_APPEND) { |
- Error error = node_->GetSize(&handle_data_.offs); |
+ Error error = node_->GetSize(&handle_attr_.offs); |
if (error) |
return error; |
} |
@@ -65,7 +66,7 @@ Error KernelHandle::Seek(off_t offset, int whence, off_t* out_offset) { |
base = 0; |
break; |
case SEEK_CUR: |
- base = handle_data_.offs; |
+ base = handle_attr_.offs; |
break; |
case SEEK_END: |
base = node_size; |
@@ -85,31 +86,31 @@ Error KernelHandle::Seek(off_t offset, int whence, off_t* out_offset) { |
return EINVAL; |
} |
- *out_offset = handle_data_.offs = new_offset; |
+ *out_offset = handle_attr_.offs = new_offset; |
return 0; |
} |
Error KernelHandle::Read(void* buf, size_t nbytes, int* cnt) { |
AUTO_LOCK(handle_lock_); |
- Error error = node_->Read(handle_data_, buf, nbytes, cnt); |
+ Error error = node_->Read(handle_attr_, buf, nbytes, cnt); |
if (0 == error) |
- handle_data_.offs += *cnt; |
+ handle_attr_.offs += *cnt; |
return error; |
} |
Error KernelHandle::Write(const void* buf, size_t nbytes, int* cnt) { |
AUTO_LOCK(handle_lock_); |
- Error error = node_->Write(handle_data_, buf, nbytes, cnt); |
+ Error error = node_->Write(handle_attr_, buf, nbytes, cnt); |
if (0 == error) |
- handle_data_.offs += *cnt; |
+ handle_attr_.offs += *cnt; |
return error; |
} |
Error KernelHandle::GetDents(struct dirent* pdir, size_t nbytes, int* cnt) { |
AUTO_LOCK(handle_lock_); |
- Error error = node_->GetDents(handle_data_.offs, pdir, nbytes, cnt); |
+ Error error = node_->GetDents(handle_attr_.offs, pdir, nbytes, cnt); |
if (0 == error) |
- handle_data_.offs += *cnt; |
+ handle_attr_.offs += *cnt; |
return error; |
} |
@@ -124,25 +125,95 @@ Error KernelHandle::Fcntl(int request, int* result, ...) { |
Error KernelHandle::VFcntl(int request, int* result, va_list args) { |
switch (request) { |
case F_GETFL: { |
- *result = handle_data_.flags; |
+ *result = handle_attr_.flags; |
return 0; |
} |
case F_SETFL: { |
AUTO_LOCK(handle_lock_); |
int flags = va_arg(args, int); |
- if (!(flags & O_APPEND) && (handle_data_.flags & O_APPEND)) { |
+ if (!(flags & O_APPEND) && (handle_attr_.flags & O_APPEND)) { |
// Attempt to clear O_APPEND. |
return EPERM; |
} |
// Only certain flags are mutable |
const int mutable_flags = O_ASYNC | O_NONBLOCK; |
flags &= mutable_flags; |
- handle_data_.flags &= ~mutable_flags; |
- handle_data_.flags |= flags; |
+ handle_attr_.flags &= ~mutable_flags; |
+ handle_attr_.flags |= flags; |
return 0; |
} |
} |
return ENOSYS; |
} |
+Error KernelHandle::Accept(PP_Resource* new_sock, struct sockaddr* addr, |
+ socklen_t* len) { |
+ MountNodeSocket* sock = socket_node(); |
+ if (!sock) |
+ return ENOTSOCK; |
+ |
+ AUTO_LOCK(handle_lock_); |
+ return sock->Accept(handle_attr_, new_sock, addr, len); |
+} |
+ |
+Error KernelHandle::Connect(const struct sockaddr* addr, socklen_t len) { |
+ MountNodeSocket* sock = socket_node(); |
+ if (!sock) |
+ return ENOTSOCK; |
+ |
+ AUTO_LOCK(handle_lock_); |
+ return sock->Connect(handle_attr_, addr, len); |
+} |
+ |
+Error KernelHandle::Recv(void* buf, size_t len, int flags, int* out_len) { |
+ MountNodeSocket* sock = socket_node(); |
+ if (!sock) |
+ return ENOTSOCK; |
+ |
+ AUTO_LOCK(handle_lock_); |
+ return sock->Recv(handle_attr_, buf, len, flags, out_len); |
+} |
+ |
+Error KernelHandle::RecvFrom(void* buf, |
+ size_t len, |
+ int flags, |
+ struct sockaddr* src_addr, |
+ socklen_t* addrlen, |
+ int* out_len) { |
+ MountNodeSocket* sock = socket_node(); |
+ if (!sock) |
+ return ENOTSOCK; |
+ |
+ AUTO_LOCK(handle_lock_); |
+ return sock->RecvFrom(handle_attr_, buf, len, flags, src_addr, addrlen, |
+ out_len); |
+} |
+ |
+Error KernelHandle::Send(const void* buf, |
+ size_t len, |
+ int flags, |
+ int* out_len) { |
+ MountNodeSocket* sock = socket_node(); |
+ if (!sock) |
+ return ENOTSOCK; |
+ |
+ AUTO_LOCK(handle_lock_); |
+ return sock->Send(handle_attr_, buf, len, flags, out_len); |
+} |
+ |
+Error KernelHandle::SendTo(const void* buf, |
+ size_t len, |
+ int flags, |
+ const struct sockaddr* dest_addr, |
+ socklen_t addrlen, |
+ int* out_len) { |
+ MountNodeSocket* sock = socket_node(); |
+ if (!sock) |
+ return ENOTSOCK; |
+ |
+ AUTO_LOCK(handle_lock_); |
+ return sock->SendTo(handle_attr_, buf, len, flags, dest_addr, addrlen, |
+ out_len); |
+} |
+ |
} // namespace nacl_io |