diff options
Diffstat (limited to 'native_client_sdk')
6 files changed, 35 insertions, 11 deletions
diff --git a/native_client_sdk/src/libraries/nacl_io/socket/socket_node.cc b/native_client_sdk/src/libraries/nacl_io/socket/socket_node.cc index b3517de..0ec40cd 100644 --- a/native_client_sdk/src/libraries/nacl_io/socket/socket_node.cc +++ b/native_client_sdk/src/libraries/nacl_io/socket/socket_node.cc @@ -19,26 +19,28 @@ namespace nacl_io { -SocketNode::SocketNode(Filesystem* filesystem) +SocketNode::SocketNode(int type, Filesystem* filesystem) : StreamNode(filesystem), socket_resource_(0), local_addr_(0), remote_addr_(0), socket_flags_(0), last_errno_(0), - keep_alive_(false) { + keep_alive_(false), + so_type_(type) { memset(&linger_, 0, sizeof(linger_)); SetType(S_IFSOCK); } -SocketNode::SocketNode(Filesystem* filesystem, PP_Resource socket) +SocketNode::SocketNode(int type, Filesystem* filesystem, PP_Resource socket) : StreamNode(filesystem), socket_resource_(socket), local_addr_(0), remote_addr_(0), socket_flags_(0), last_errno_(0), - keep_alive_(false) { + keep_alive_(false), + so_type_(type) { memset(&linger_, 0, sizeof(linger_)); SetType(S_IFSOCK); filesystem_->ppapi()->AddRefResource(socket_resource_); @@ -248,6 +250,10 @@ Error SocketNode::GetSockOpt(int lvl, value_ptr = &value; value_len = sizeof(value); break; + case SO_TYPE: + value_ptr = &so_type_; + value_len = sizeof(so_type_); + break; case SO_LINGER: value_ptr = &linger_; value_len = sizeof(linger_); diff --git a/native_client_sdk/src/libraries/nacl_io/socket/socket_node.h b/native_client_sdk/src/libraries/nacl_io/socket/socket_node.h index f6f1541..9b3c35b 100644 --- a/native_client_sdk/src/libraries/nacl_io/socket/socket_node.h +++ b/native_client_sdk/src/libraries/nacl_io/socket/socket_node.h @@ -30,8 +30,8 @@ typedef sdk_util::ScopedRef<SocketNode> ScopedSocketNode; class SocketNode : public StreamNode { public: - explicit SocketNode(Filesystem* filesystem); - SocketNode(Filesystem* filesystem, PP_Resource socket); + SocketNode(int type, Filesystem* filesystem); + SocketNode(int type, Filesystem* filesystem, PP_Resource socket); protected: virtual void Destroy(); @@ -169,6 +169,7 @@ class SocketNode : public StreamNode { uint32_t socket_flags_; int last_errno_; bool keep_alive_; + int so_type_; struct linger linger_; friend class KernelProxy; diff --git a/native_client_sdk/src/libraries/nacl_io/socket/tcp_node.cc b/native_client_sdk/src/libraries/nacl_io/socket/tcp_node.cc index 5649566..a7bf74f 100644 --- a/native_client_sdk/src/libraries/nacl_io/socket/tcp_node.cc +++ b/native_client_sdk/src/libraries/nacl_io/socket/tcp_node.cc @@ -276,14 +276,14 @@ class TCPConnectWork : public StreamFs::Work { }; TcpNode::TcpNode(Filesystem* filesystem) - : SocketNode(filesystem), + : SocketNode(SOCK_STREAM, filesystem), emitter_(new TcpEventEmitter(kDefaultFifoSize, kDefaultFifoSize)), tcp_nodelay_(false) { emitter_->AttachStream(this); } TcpNode::TcpNode(Filesystem* filesystem, PP_Resource socket) - : SocketNode(filesystem, socket), + : SocketNode(SOCK_STREAM, filesystem, socket), emitter_(new TcpEventEmitter(kDefaultFifoSize, kDefaultFifoSize)), tcp_nodelay_(false) { emitter_->AttachStream(this); diff --git a/native_client_sdk/src/libraries/nacl_io/socket/udp_node.cc b/native_client_sdk/src/libraries/nacl_io/socket/udp_node.cc index 604c99f..f19baee 100644 --- a/native_client_sdk/src/libraries/nacl_io/socket/udp_node.cc +++ b/native_client_sdk/src/libraries/nacl_io/socket/udp_node.cc @@ -163,7 +163,7 @@ class UdpRecvWork : public UdpWork { }; UdpNode::UdpNode(Filesystem* filesystem) - : SocketNode(filesystem), + : SocketNode(SOCK_DGRAM, filesystem), emitter_(new UdpEventEmitter(kDefaultFifoSize, kDefaultFifoSize)) { emitter_->AttachStream(this); } diff --git a/native_client_sdk/src/libraries/nacl_io/socket/unix_node.cc b/native_client_sdk/src/libraries/nacl_io/socket/unix_node.cc index c5675a6..8fa44fd 100644 --- a/native_client_sdk/src/libraries/nacl_io/socket/unix_node.cc +++ b/native_client_sdk/src/libraries/nacl_io/socket/unix_node.cc @@ -15,13 +15,14 @@ namespace nacl_io { UnixNode::UnixNode(Filesystem* filesystem) - : SocketNode(filesystem), + : SocketNode(SOCK_STREAM, filesystem), emitter_(UnixEventEmitter::MakeUnixEventEmitter(65536)) { emitter_->AttachStream(this); } UnixNode::UnixNode(Filesystem* filesystem, const UnixNode& peer) - : SocketNode(filesystem), emitter_(peer.emitter_->GetPeerEmitter()) { + : SocketNode(SOCK_STREAM, filesystem), + emitter_(peer.emitter_->GetPeerEmitter()) { emitter_->AttachStream(this); } diff --git a/native_client_sdk/src/tests/nacl_io_socket_test/socket_test.cc b/native_client_sdk/src/tests/nacl_io_socket_test/socket_test.cc index 1c7edd4..839babe 100644 --- a/native_client_sdk/src/tests/nacl_io_socket_test/socket_test.cc +++ b/native_client_sdk/src/tests/nacl_io_socket_test/socket_test.cc @@ -405,6 +405,8 @@ TEST_F(SocketTestTCP, TCPConnectFails) { TEST_F(SocketTest, Getsockopt) { sock1_ = ki_socket(AF_INET, SOCK_STREAM, 0); EXPECT_GT(sock1_, -1); + sock2_ = ki_socket(AF_INET, SOCK_DGRAM, 0); + EXPECT_GT(sock1_, -1); int socket_error = 99; socklen_t len = sizeof(socket_error); @@ -415,6 +417,20 @@ TEST_F(SocketTest, Getsockopt) { ASSERT_EQ(0, socket_error); ASSERT_EQ(sizeof(socket_error), len); + // Check SO_TYPE for TCP sockets + int socket_type = 0; + len = sizeof(socket_type); + ASSERT_EQ(0, ki_getsockopt(sock1_, SOL_SOCKET, SO_TYPE, &socket_type, &len)); + ASSERT_EQ(SOCK_STREAM, socket_type); + ASSERT_EQ(sizeof(socket_type), len); + + // Check SO_TYPE for UDP sockets + socket_type = 0; + len = sizeof(socket_type); + ASSERT_EQ(0, ki_getsockopt(sock2_, SOL_SOCKET, SO_TYPE, &socket_type, &len)); + ASSERT_EQ(SOCK_DGRAM, socket_type); + ASSERT_EQ(sizeof(socket_type), len); + // Test for an invalid option (-1) ASSERT_EQ(-1, ki_getsockopt(sock1_, SOL_SOCKET, -1, &socket_error, &len)); ASSERT_EQ(ENOPROTOOPT, errno); |