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

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

Issue 22587003: [NaCl SDK] Add UDP and TCP Sockets (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Running tests on package Created 7 years, 4 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
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5
6 #include "nacl_io/ossocket.h"
7 #ifdef PROVIDES_SOCKET_API
8
9 #include <errno.h>
10 #include <string.h>
11
12 #include "nacl_io/mount.h"
13 #include "nacl_io/mount_node_socket.h"
14 #include "nacl_io/mount_node_udp.h"
15 #include "nacl_io/pepper_interface.h"
16
17 namespace nacl_io {
18
19 MountNodeUDP::MountNodeUDP(Mount* mount) : MountNodeSocket(mount) {}
20
21
22 UDPSocketInterface* MountNodeUDP::UDPSocket() {
23 if (mount_->ppapi() == NULL)
24 return NULL;
25
26 return mount_->ppapi()->GetUDPSocketInterface();
27 }
28
29 Error MountNodeUDP::Init(int flags) {
30 if (UDPSocket() == NULL)
31 return EACCES;
32
33 socket_resource_ = UDPSocket()->Create(mount_->ppapi()->GetInstance());
34 if (0 == socket_resource_)
35 return EACCES;
36
37 return 0;
38 }
39
40 Error MountNodeUDP::Bind(const struct sockaddr* addr, socklen_t len) {
41 if (0 == socket_resource_)
42 return EBADF;
43
44 /* Only bind once. */
45 if (local_addr_ != 0)
46 return EINVAL;
47
48 PP_Resource out_addr = SockAddrToResource(addr, len);
49 if (0 == out_addr)
50 return EINVAL;
51
52 int err = UDPSocket()->Bind(socket_resource_,
53 out_addr,
54 PP_BlockUntilComplete());
55 return PPErrorToErrno(err);
56 }
57
58 Error MountNodeUDP::Connect(const struct sockaddr* addr, socklen_t len) {
59 if (0 == socket_resource_)
60 return EBADF;
61
62 /* Connect for UDP is the default dest, it's legal to change it. */
63 if (remote_addr_ != 0) {
64 mount_->ppapi()->ReleaseResource(remote_addr_);
65 remote_addr_ = 0;
66 }
67
68 remote_addr_ = SockAddrToResource(addr, len);
69 if (0 == remote_addr_)
70 return EINVAL;
71
72 return 0;
73 }
74
75 Error MountNodeUDP::RecvFromHelper(void* buf,
76 size_t len,
77 int flags,
78 PP_Resource* out_addr,
79 int* out_len) {
80 if (0 == socket_resource_)
81 return EBADF;
82
83 int err = UDPSocket()->RecvFrom(socket_resource_,
84 static_cast<char*>(buf),
85 len & 0xFFFF,
86 out_addr,
87 PP_BlockUntilComplete());
88 if (err < 0)
89 return PPErrorToErrno(err);
90
91 *out_len = err;
92 return 0;
93 }
94
95 Error MountNodeUDP::Recv(void* buf, size_t len, int flags, int* out_len) {
96 while (1) {
97 int out_len = 0;
binji 2013/08/09 19:28:06 this shadows out_len above
noelallen1 2013/08/09 22:53:22 Done.
98 PP_Resource addr = 0;
99
100 int err = RecvFromHelper(buf, len, flags, &addr, &out_len);
101 if (err < 0)
102 return PPErrorToErrno(err);
103
104 /* If "connected" then only receive packets from the given remote. */
105 if (remote_addr_ != 0 && !EquivalentAddress(addr, remote_addr_))
106 continue;
107
108 return 0;
109 }
110 }
111
112 Error MountNodeUDP::RecvFrom(void* buf,
113 size_t len,
114 int flags,
115 struct sockaddr* src_addr,
116 socklen_t* addrlen,
117 int* out_len) {
118 PP_Resource addr = 0;
119 int err = RecvFromHelper(buf, len, flags, &addr, out_len);
120 if (err < 0)
121 return PPErrorToErrno(err);
122
123 if (src_addr)
124 *addrlen = ResourceToSockAddr(addr, *addrlen, src_addr);
125
binji 2013/08/09 19:28:06 need to release resource?
noelallen1 2013/08/09 22:53:22 Done.
126 return 0;
127 }
128
129
130 Error MountNodeUDP::SendToHelper(const void* buf,
131 size_t len,
132 int flags,
133 PP_Resource addr,
134 int* out_len) {
135 if (0 == socket_resource_)
136 return EBADF;
137
138 if (0 == addr)
139 return ENOTCONN;
140
141 int err = mount_->ppapi()->GetUDPSocketInterface()->SendTo(
142 socket_resource_,
binji 2013/08/09 19:28:06 nit: weird indent
noelallen1 2013/08/09 22:53:22 Done.
143 static_cast<const char*>(buf),
144 len & 0xFFFF,
145 addr,
146 PP_BlockUntilComplete());
147 if (err >= 0) {
binji 2013/08/09 19:28:06 invert check to match Recv
noelallen1 2013/08/09 22:53:22 Done.
148 *out_len = err;
149 return 0;
150 }
151
152 return PPErrorToErrno(err);
153 }
154
155 Error MountNodeUDP::Send(const void* buf, size_t len, int flags, int* out_len) {
156 return SendToHelper(buf, len, flags, remote_addr_, out_len);
157 }
158
159 Error MountNodeUDP::SendTo(const void* buf,
160 size_t len,
161 int flags,
162 const struct sockaddr* dest_addr,
163 socklen_t addrlen,
164 int* out_len) {
165 PP_Resource out_addr = SockAddrToResource(dest_addr, addrlen);
binji 2013/08/09 19:28:06 nit: extra space after =
binji 2013/08/09 19:28:06 use ScopedResource instead?
noelallen1 2013/08/09 22:53:22 Done.
166 if (0 == out_addr)
167 return EINVAL;
168
169 Error err = SendToHelper(buf, len, flags, out_addr, out_len);
170 mount_->ppapi()->ReleaseResource(out_addr);
171 return err;
172 }
173
174 } // namespace nacl_io
175
176 #endif // PROVIDES_SOCKET_API
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698