| OLD | NEW |
| 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 #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_mounts/mount_dev.h" | |
| 10 #include <errno.h> | 9 #include <errno.h> |
| 11 #include <fcntl.h> | 10 #include <fcntl.h> |
| 12 #include <string.h> | 11 #include <string.h> |
| 12 #include "nacl_mounts/mount_dev.h" |
| 13 #include "nacl_mounts/mount_node.h" | 13 #include "nacl_mounts/mount_node.h" |
| 14 #include "nacl_mounts/mount_node_dir.h" | 14 #include "nacl_mounts/mount_node_dir.h" |
| 15 #include "nacl_mounts/pepper_interface.h" |
| 15 #include "utils/auto_lock.h" | 16 #include "utils/auto_lock.h" |
| 16 | 17 |
| 17 #if defined(__native_client__) | 18 #if defined(__native_client__) |
| 18 # include <irt.h> | 19 # include <irt.h> |
| 19 #elif defined(WIN32) | 20 #elif defined(WIN32) |
| 20 # include <stdlib.h> | 21 # include <stdlib.h> |
| 21 #endif | 22 #endif |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| 24 | 25 |
| 25 void ReleaseAndNullNode(MountNode** node) { | 26 void ReleaseAndNullNode(MountNode** node) { |
| 26 if (*node) | 27 if (*node) |
| 27 (*node)->Release(); | 28 (*node)->Release(); |
| 28 *node = NULL; | 29 *node = NULL; |
| 29 } | 30 } |
| 30 | 31 |
| 31 class NullNode : public MountNode { | 32 class NullNode : public MountNode { |
| 32 public: | 33 public: |
| 33 NullNode(Mount* mount, int ino, int dev); | 34 NullNode(Mount* mount, int ino, int dev); |
| 34 | 35 |
| 35 virtual int Read(size_t offs, void* buf, size_t count); | 36 virtual int Read(size_t offs, void* buf, size_t count); |
| 36 virtual int Write(size_t offs, const void* buf, size_t count); | 37 virtual int Write(size_t offs, const void* buf, size_t count); |
| 37 }; | 38 }; |
| 38 | 39 |
| 40 class ConsoleNode : public NullNode { |
| 41 public: |
| 42 ConsoleNode(Mount* mount, int ino, int dev, PP_LogLevel level); |
| 43 |
| 44 virtual int Write(size_t offs, const void* buf, size_t count); |
| 45 |
| 46 private: |
| 47 PP_LogLevel level_; |
| 48 }; |
| 49 |
| 50 |
| 51 class TtyNode : public NullNode { |
| 52 public: |
| 53 TtyNode(Mount* mount, int ino, int dev); |
| 54 |
| 55 virtual int Write(size_t offs, const void* buf, size_t count); |
| 56 }; |
| 57 |
| 58 |
| 39 class ZeroNode : public MountNode { | 59 class ZeroNode : public MountNode { |
| 40 public: | 60 public: |
| 41 ZeroNode(Mount* mount, int ino, int dev); | 61 ZeroNode(Mount* mount, int ino, int dev); |
| 42 | 62 |
| 43 virtual int Read(size_t offs, void* buf, size_t count); | 63 virtual int Read(size_t offs, void* buf, size_t count); |
| 44 virtual int Write(size_t offs, const void* buf, size_t count); | 64 virtual int Write(size_t offs, const void* buf, size_t count); |
| 45 }; | 65 }; |
| 46 | 66 |
| 47 class UrandomNode : public MountNode { | 67 class UrandomNode : public MountNode { |
| 48 public: | 68 public: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 63 } | 83 } |
| 64 | 84 |
| 65 int NullNode::Read(size_t offs, void* buf, size_t count) { | 85 int NullNode::Read(size_t offs, void* buf, size_t count) { |
| 66 return 0; | 86 return 0; |
| 67 } | 87 } |
| 68 | 88 |
| 69 int NullNode::Write(size_t offs, const void* buf, size_t count) { | 89 int NullNode::Write(size_t offs, const void* buf, size_t count) { |
| 70 return count; | 90 return count; |
| 71 } | 91 } |
| 72 | 92 |
| 93 ConsoleNode::ConsoleNode(Mount* mount, int ino, int dev, PP_LogLevel level) |
| 94 : NullNode(mount, ino, dev), |
| 95 level_(level) { |
| 96 } |
| 97 |
| 98 int ConsoleNode::Write(size_t offs, const void* buf, size_t count) { |
| 99 ConsoleInterface* con_intr = mount_->ppapi()->GetConsoleInterface(); |
| 100 VarInterface* var_intr = mount_->ppapi()->GetVarInterface(); |
| 101 |
| 102 if (var_intr && con_intr) { |
| 103 const char* data = static_cast<const char *>(buf); |
| 104 uint32_t len = static_cast<uint32_t>(count); |
| 105 struct PP_Var val = var_intr->VarFromUtf8(data, len); |
| 106 con_intr->Log(mount_->ppapi()->GetInstance(), level_, val); |
| 107 return count; |
| 108 } |
| 109 return 0; |
| 110 } |
| 111 |
| 112 |
| 113 TtyNode::TtyNode(Mount* mount, int ino, int dev) |
| 114 : NullNode(mount, ino, dev) { |
| 115 } |
| 116 |
| 117 int TtyNode::Write(size_t offs, const void* buf, size_t count) { |
| 118 MessagingInterface* msg_intr = mount_->ppapi()->GetMessagingInterface(); |
| 119 VarInterface* var_intr = mount_->ppapi()->GetVarInterface(); |
| 120 |
| 121 if (var_intr && msg_intr) { |
| 122 const char* data = static_cast<const char *>(buf); |
| 123 uint32_t len = static_cast<uint32_t>(count); |
| 124 struct PP_Var val = var_intr->VarFromUtf8(data, len); |
| 125 msg_intr->PostMessage(mount_->ppapi()->GetInstance(), val); |
| 126 return count; |
| 127 } |
| 128 return 0; |
| 129 } |
| 130 |
| 131 |
| 73 ZeroNode::ZeroNode(Mount* mount, int ino, int dev) | 132 ZeroNode::ZeroNode(Mount* mount, int ino, int dev) |
| 74 : MountNode(mount, ino, dev) { | 133 : MountNode(mount, ino, dev) { |
| 75 } | 134 } |
| 76 | 135 |
| 77 int ZeroNode::Read(size_t offs, void* buf, size_t count) { | 136 int ZeroNode::Read(size_t offs, void* buf, size_t count) { |
| 78 memset(buf, 0, count); | 137 memset(buf, 0, count); |
| 79 return count; | 138 return count; |
| 80 } | 139 } |
| 81 | 140 |
| 82 int ZeroNode::Write(size_t offs, const void* buf, size_t count) { | 141 int ZeroNode::Write(size_t offs, const void* buf, size_t count) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 } | 184 } |
| 126 | 185 |
| 127 return count; | 186 return count; |
| 128 #endif | 187 #endif |
| 129 } | 188 } |
| 130 | 189 |
| 131 int UrandomNode::Write(size_t offs, const void* buf, size_t count) { | 190 int UrandomNode::Write(size_t offs, const void* buf, size_t count) { |
| 132 return count; | 191 return count; |
| 133 } | 192 } |
| 134 | 193 |
| 194 |
| 195 |
| 135 } // namespace | 196 } // namespace |
| 136 | 197 |
| 137 MountNode *MountDev::Open(const Path& path, int mode) { | 198 MountNode *MountDev::Open(const Path& path, int mode) { |
| 138 AutoLock lock(&lock_); | 199 AutoLock lock(&lock_); |
| 139 | 200 |
| 140 // Don't allow creating any files. | 201 // Don't allow creating any files. |
| 141 if (mode & O_CREAT) | 202 if (mode & O_CREAT) |
| 142 return NULL; | 203 return NULL; |
| 143 | 204 |
| 144 MountNode* node = root_->FindChild(path.Join()); | 205 MountNode* node = root_->FindChild(path.Join()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 170 } | 231 } |
| 171 | 232 |
| 172 int MountDev::Remove(const Path& path) { | 233 int MountDev::Remove(const Path& path) { |
| 173 errno = EINVAL; | 234 errno = EINVAL; |
| 174 return -1; | 235 return -1; |
| 175 } | 236 } |
| 176 | 237 |
| 177 MountDev::MountDev() | 238 MountDev::MountDev() |
| 178 : null_node_(NULL), | 239 : null_node_(NULL), |
| 179 zero_node_(NULL), | 240 zero_node_(NULL), |
| 180 random_node_(NULL) { | 241 random_node_(NULL), |
| 242 console0_node_(NULL), |
| 243 console1_node_(NULL), |
| 244 console2_node_(NULL), |
| 245 console3_node_(NULL), |
| 246 tty_node_(NULL) { |
| 181 } | 247 } |
| 182 | 248 |
| 183 bool MountDev::Init(int dev, StringMap_t& args, PepperInterface* ppapi) { | 249 bool MountDev::Init(int dev, StringMap_t& args, PepperInterface* ppapi) { |
| 184 if (!Mount::Init(dev, args, ppapi)) | 250 if (!Mount::Init(dev, args, ppapi)) |
| 185 return false; | 251 return false; |
| 186 | 252 |
| 187 root_ = new MountNodeDir(this, 1, dev_); | 253 root_ = new MountNodeDir(this, 1, dev_); |
| 188 null_node_ = new NullNode(this, 2, dev_); | 254 null_node_ = new NullNode(this, 2, dev_); |
| 189 root_->AddChild("/null", null_node_); | 255 root_->AddChild("/null", null_node_); |
| 190 zero_node_ = new ZeroNode(this, 3, dev_); | 256 zero_node_ = new ZeroNode(this, 3, dev_); |
| 191 root_->AddChild("/zero", zero_node_); | 257 root_->AddChild("/zero", zero_node_); |
| 192 random_node_ = new UrandomNode(this, 4, dev_); | 258 random_node_ = new UrandomNode(this, 4, dev_); |
| 193 root_->AddChild("/urandom", random_node_); | 259 root_->AddChild("/urandom", random_node_); |
| 260 |
| 261 console0_node_ = new ConsoleNode(this, 5, dev_, PP_LOGLEVEL_TIP); |
| 262 root_->AddChild("/console0", console0_node_); |
| 263 console1_node_ = new ConsoleNode(this, 6, dev_, PP_LOGLEVEL_LOG); |
| 264 root_->AddChild("/console1", console1_node_); |
| 265 console2_node_ = new ConsoleNode(this, 7, dev_, PP_LOGLEVEL_WARNING); |
| 266 root_->AddChild("/console2", console2_node_); |
| 267 console3_node_ = new ConsoleNode(this, 8, dev_, PP_LOGLEVEL_ERROR); |
| 268 root_->AddChild("/console3", console3_node_); |
| 269 |
| 270 tty_node_ = new TtyNode(this, 9, dev_); |
| 271 root_->AddChild("/tty", tty_node_); |
| 194 return true; | 272 return true; |
| 195 } | 273 } |
| 196 | 274 |
| 197 void MountDev::Destroy() { | 275 void MountDev::Destroy() { |
| 276 ReleaseAndNullNode(&tty_node_); |
| 277 ReleaseAndNullNode(&console3_node_); |
| 278 ReleaseAndNullNode(&console2_node_); |
| 279 ReleaseAndNullNode(&console1_node_); |
| 280 ReleaseAndNullNode(&console0_node_); |
| 198 ReleaseAndNullNode(&random_node_); | 281 ReleaseAndNullNode(&random_node_); |
| 199 ReleaseAndNullNode(&zero_node_); | 282 ReleaseAndNullNode(&zero_node_); |
| 200 ReleaseAndNullNode(&null_node_); | 283 ReleaseAndNullNode(&null_node_); |
| 201 ReleaseAndNullNode(&root_); | 284 ReleaseAndNullNode(&root_); |
| 202 } | 285 } |
| OLD | NEW |