OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #if defined(WIN32) | 5 #if defined(WIN32) |
6 #define _CRT_RAND_S | 6 #define _CRT_RAND_S |
7 #endif | 7 #endif |
8 | 8 |
9 #include "nacl_io/devfs/dev_fs.h" | 9 #include "nacl_io/devfs/dev_fs.h" |
10 | 10 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 ConsoleNode::ConsoleNode(Filesystem* filesystem, PP_LogLevel level) | 182 ConsoleNode::ConsoleNode(Filesystem* filesystem, PP_LogLevel level) |
183 : CharNode(filesystem), level_(level) { | 183 : CharNode(filesystem), level_(level) { |
184 } | 184 } |
185 | 185 |
186 Error ConsoleNode::Write(const HandleAttr& attr, | 186 Error ConsoleNode::Write(const HandleAttr& attr, |
187 const void* buf, | 187 const void* buf, |
188 size_t count, | 188 size_t count, |
189 int* out_bytes) { | 189 int* out_bytes) { |
190 *out_bytes = 0; | 190 *out_bytes = 0; |
191 | 191 |
192 ConsoleInterface* con_intr = filesystem_->ppapi()->GetConsoleInterface(); | 192 ConsoleInterface* con_iface = filesystem_->ppapi()->GetConsoleInterface(); |
193 VarInterface* var_intr = filesystem_->ppapi()->GetVarInterface(); | 193 VarInterface* var_iface = filesystem_->ppapi()->GetVarInterface(); |
194 | 194 |
195 if (!(var_intr && con_intr)) | 195 if (!(var_iface && con_iface)) { |
| 196 LOG_ERROR("Got NULL interface(s): %s%s", |
| 197 con_iface ? "" : "Console ", |
| 198 var_iface ? "" : "Var"); |
196 return ENOSYS; | 199 return ENOSYS; |
| 200 } |
197 | 201 |
198 const char* var_data = static_cast<const char*>(buf); | 202 const char* var_data = static_cast<const char*>(buf); |
199 uint32_t len = static_cast<uint32_t>(count); | 203 uint32_t len = static_cast<uint32_t>(count); |
200 struct PP_Var val = var_intr->VarFromUtf8(var_data, len); | 204 struct PP_Var val = var_iface->VarFromUtf8(var_data, len); |
201 con_intr->Log(filesystem_->ppapi()->GetInstance(), level_, val); | 205 con_iface->Log(filesystem_->ppapi()->GetInstance(), level_, val); |
| 206 var_iface->Release(val); |
202 | 207 |
203 *out_bytes = count; | 208 *out_bytes = count; |
204 return 0; | 209 return 0; |
205 } | 210 } |
206 | 211 |
207 ZeroNode::ZeroNode(Filesystem* filesystem) : Node(filesystem) { | 212 ZeroNode::ZeroNode(Filesystem* filesystem) : Node(filesystem) { |
208 SetType(S_IFCHR); | 213 SetType(S_IFCHR); |
209 } | 214 } |
210 | 215 |
211 Error ZeroNode::Read(const HandleAttr& attr, | 216 Error ZeroNode::Read(const HandleAttr& attr, |
(...skipping 22 matching lines...) Expand all Loading... |
234 #endif | 239 #endif |
235 } | 240 } |
236 | 241 |
237 Error UrandomNode::Read(const HandleAttr& attr, | 242 Error UrandomNode::Read(const HandleAttr& attr, |
238 void* buf, | 243 void* buf, |
239 size_t count, | 244 size_t count, |
240 int* out_bytes) { | 245 int* out_bytes) { |
241 *out_bytes = 0; | 246 *out_bytes = 0; |
242 | 247 |
243 #if defined(__native_client__) | 248 #if defined(__native_client__) |
244 if (!interface_ok_) | 249 if (!interface_ok_) { |
| 250 LOG_ERROR("NACL_IRT_RANDOM_v0_1 interface not avaiable."); |
245 return EBADF; | 251 return EBADF; |
| 252 } |
246 | 253 |
247 size_t nread; | 254 size_t nread; |
248 int error = (*random_interface_.get_random_bytes)(buf, count, &nread); | 255 int error = (*random_interface_.get_random_bytes)(buf, count, &nread); |
249 if (error) | 256 if (error) |
250 return error; | 257 return error; |
251 #elif defined(WIN32) | 258 #elif defined(WIN32) |
252 char* out = static_cast<char*>(buf); | 259 char* out = static_cast<char*>(buf); |
253 size_t bytes_left = count; | 260 size_t bytes_left = count; |
254 while (bytes_left) { | 261 while (bytes_left) { |
255 unsigned int random_int; | 262 unsigned int random_int; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 | 295 |
289 } // namespace | 296 } // namespace |
290 | 297 |
291 Error DevFs::Access(const Path& path, int a_mode) { | 298 Error DevFs::Access(const Path& path, int a_mode) { |
292 ScopedNode node; | 299 ScopedNode node; |
293 int error = root_->FindChild(path.Join(), &node); | 300 int error = root_->FindChild(path.Join(), &node); |
294 if (error) | 301 if (error) |
295 return error; | 302 return error; |
296 | 303 |
297 // Don't allow execute access. | 304 // Don't allow execute access. |
298 if (a_mode & X_OK) | 305 if (a_mode & X_OK) { |
| 306 LOG_TRACE("Executing devfs nodes is not allowed."); |
299 return EACCES; | 307 return EACCES; |
| 308 } |
300 | 309 |
301 return 0; | 310 return 0; |
302 } | 311 } |
303 | 312 |
304 Error DevFs::Open(const Path& path, int open_flags, ScopedNode* out_node) { | 313 Error DevFs::Open(const Path& path, int open_flags, ScopedNode* out_node) { |
305 out_node->reset(NULL); | 314 out_node->reset(NULL); |
306 int error; | 315 int error; |
307 if (path.Part(1) == "fs") { | 316 if (path.Part(1) == "fs") { |
308 if (path.Size() == 3) | 317 if (path.Size() == 3) { |
309 error = fs_dir_->FindChild(path.Part(2), out_node); | 318 error = fs_dir_->FindChild(path.Part(2), out_node); |
310 else | 319 } else { |
| 320 LOG_TRACE("Bad devfs path: %s", path.Join().c_str()); |
311 error = ENOENT; | 321 error = ENOENT; |
| 322 } |
312 } else { | 323 } else { |
313 error = root_->FindChild(path.Join(), out_node); | 324 error = root_->FindChild(path.Join(), out_node); |
314 } | 325 } |
315 | 326 |
316 // Only return EACCES when trying to create a node that does not exist. | 327 // Only return EACCES when trying to create a node that does not exist. |
317 if ((error == ENOENT) && (open_flags & O_CREAT)) | 328 if ((error == ENOENT) && (open_flags & O_CREAT)) { |
| 329 LOG_TRACE("Cannot create devfs node: %s", path.Join().c_str()); |
318 return EACCES; | 330 return EACCES; |
| 331 } |
319 | 332 |
320 return error; | 333 return error; |
321 } | 334 } |
322 | 335 |
323 Error DevFs::Unlink(const Path& path) { | 336 Error DevFs::Unlink(const Path& path) { |
| 337 LOG_ERROR("unlink not supported."); |
324 return EPERM; | 338 return EPERM; |
325 } | 339 } |
326 | 340 |
327 Error DevFs::Mkdir(const Path& path, int permissions) { | 341 Error DevFs::Mkdir(const Path& path, int permissions) { |
| 342 LOG_ERROR("mkdir not supported."); |
328 return EPERM; | 343 return EPERM; |
329 } | 344 } |
330 | 345 |
331 Error DevFs::Rmdir(const Path& path) { | 346 Error DevFs::Rmdir(const Path& path) { |
| 347 LOG_ERROR("rmdir not supported."); |
332 return EPERM; | 348 return EPERM; |
333 } | 349 } |
334 | 350 |
335 Error DevFs::Remove(const Path& path) { | 351 Error DevFs::Remove(const Path& path) { |
| 352 LOG_ERROR("remove not supported."); |
336 return EPERM; | 353 return EPERM; |
337 } | 354 } |
338 | 355 |
339 Error DevFs::Rename(const Path& path, const Path& newpath) { | 356 Error DevFs::Rename(const Path& path, const Path& newpath) { |
| 357 LOG_ERROR("rename not supported."); |
340 return EPERM; | 358 return EPERM; |
341 } | 359 } |
342 | 360 |
343 Error DevFs::CreateFsNode(Filesystem* other_fs) { | 361 Error DevFs::CreateFsNode(Filesystem* other_fs) { |
344 int dev = other_fs->dev(); | 362 int dev = other_fs->dev(); |
345 char path[32]; | 363 char path[32]; |
346 snprintf(path, 32, "%d", dev); | 364 snprintf(path, 32, "%d", dev); |
347 ScopedNode new_node(new FsNode(this, other_fs)); | 365 ScopedNode new_node(new FsNode(this, other_fs)); |
348 return fs_dir_->AddChild(path, new_node); | 366 return fs_dir_->AddChild(path, new_node); |
349 } | 367 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 // Add a directory for "fs" nodes; they represent all currently-mounted | 417 // Add a directory for "fs" nodes; they represent all currently-mounted |
400 // filesystems. We can ioctl these nodes to make changes or provide input to | 418 // filesystems. We can ioctl these nodes to make changes or provide input to |
401 // a mounted filesystem. | 419 // a mounted filesystem. |
402 INITIALIZE_DEV_NODE("/fs", DirNode); | 420 INITIALIZE_DEV_NODE("/fs", DirNode); |
403 fs_dir_ = new_node; | 421 fs_dir_ = new_node; |
404 | 422 |
405 return 0; | 423 return 0; |
406 } | 424 } |
407 | 425 |
408 } // namespace nacl_io | 426 } // namespace nacl_io |
OLD | NEW |