Index: native_client_sdk/src/libraries/nacl_mounts/mount_dev.cc |
diff --git a/native_client_sdk/src/libraries/nacl_mounts/mount_dev.cc b/native_client_sdk/src/libraries/nacl_mounts/mount_dev.cc |
index 5d439893f7eac504d9a454deda95f1bb83b940de..83925da6e76262fd17d12ae2262359fda4abe6a7 100644 |
--- a/native_client_sdk/src/libraries/nacl_mounts/mount_dev.cc |
+++ b/native_client_sdk/src/libraries/nacl_mounts/mount_dev.cc |
@@ -6,12 +6,13 @@ |
#define _CRT_RAND_S |
#endif |
-#include "nacl_mounts/mount_dev.h" |
#include <errno.h> |
#include <fcntl.h> |
#include <string.h> |
+#include "nacl_mounts/mount_dev.h" |
#include "nacl_mounts/mount_node.h" |
#include "nacl_mounts/mount_node_dir.h" |
+#include "nacl_mounts/pepper_interface.h" |
#include "utils/auto_lock.h" |
#if defined(__native_client__) |
@@ -36,6 +37,25 @@ class NullNode : public MountNode { |
virtual int Write(size_t offs, const void* buf, size_t count); |
}; |
+class ConsoleNode : public NullNode { |
+ public: |
+ ConsoleNode(Mount* mount, int ino, int dev, PP_LogLevel level); |
+ |
+ virtual int Write(size_t offs, const void* buf, size_t count); |
+ |
+private: |
+ PP_LogLevel level_; |
+}; |
+ |
+ |
+class TtyNode : public NullNode { |
+ public: |
+ TtyNode(Mount* mount, int ino, int dev); |
+ |
+ virtual int Write(size_t offs, const void* buf, size_t count); |
+}; |
+ |
+ |
class ZeroNode : public MountNode { |
public: |
ZeroNode(Mount* mount, int ino, int dev); |
@@ -70,6 +90,45 @@ int NullNode::Write(size_t offs, const void* buf, size_t count) { |
return count; |
} |
+ConsoleNode::ConsoleNode(Mount* mount, int ino, int dev, PP_LogLevel level) |
+ : NullNode(mount, ino, dev), |
+ level_(level) { |
+} |
+ |
+int ConsoleNode::Write(size_t offs, const void* buf, size_t count) { |
+ ConsoleInterface* con_intr = mount_->ppapi()->GetConsoleInterface(); |
+ VarInterface* var_intr = mount_->ppapi()->GetVarInterface(); |
+ |
+ if (var_intr && con_intr) { |
+ const char* data = static_cast<const char *>(buf); |
+ uint32_t len = static_cast<uint32_t>(count); |
+ struct PP_Var val = var_intr->VarFromUtf8(data, len); |
+ con_intr->Log(mount_->ppapi()->GetInstance(), level_, val); |
+ return count; |
+ } |
+ return 0; |
+} |
+ |
+ |
+TtyNode::TtyNode(Mount* mount, int ino, int dev) |
+ : NullNode(mount, ino, dev) { |
+} |
+ |
+int TtyNode::Write(size_t offs, const void* buf, size_t count) { |
+ MessagingInterface* msg_intr = mount_->ppapi()->GetMessagingInterface(); |
+ VarInterface* var_intr = mount_->ppapi()->GetVarInterface(); |
+ |
+ if (var_intr && msg_intr) { |
+ const char* data = static_cast<const char *>(buf); |
+ uint32_t len = static_cast<uint32_t>(count); |
+ struct PP_Var val = var_intr->VarFromUtf8(data, len); |
+ msg_intr->PostMessage(mount_->ppapi()->GetInstance(), val); |
+ return count; |
+ } |
+ return 0; |
+} |
+ |
+ |
ZeroNode::ZeroNode(Mount* mount, int ino, int dev) |
: MountNode(mount, ino, dev) { |
} |
@@ -132,6 +191,8 @@ int UrandomNode::Write(size_t offs, const void* buf, size_t count) { |
return count; |
} |
+ |
+ |
} // namespace |
MountNode *MountDev::Open(const Path& path, int mode) { |
@@ -177,7 +238,12 @@ int MountDev::Remove(const Path& path) { |
MountDev::MountDev() |
: null_node_(NULL), |
zero_node_(NULL), |
- random_node_(NULL) { |
+ random_node_(NULL), |
+ console0_node_(NULL), |
+ console1_node_(NULL), |
+ console2_node_(NULL), |
+ console3_node_(NULL), |
+ tty_node_(NULL) { |
} |
bool MountDev::Init(int dev, StringMap_t& args, PepperInterface* ppapi) { |
@@ -191,10 +257,27 @@ bool MountDev::Init(int dev, StringMap_t& args, PepperInterface* ppapi) { |
root_->AddChild("/zero", zero_node_); |
random_node_ = new UrandomNode(this, 4, dev_); |
root_->AddChild("/urandom", random_node_); |
+ |
+ console0_node_ = new ConsoleNode(this, 5, dev_, PP_LOGLEVEL_TIP); |
+ root_->AddChild("/console0", console0_node_); |
+ console1_node_ = new ConsoleNode(this, 6, dev_, PP_LOGLEVEL_LOG); |
+ root_->AddChild("/console1", console1_node_); |
+ console2_node_ = new ConsoleNode(this, 7, dev_, PP_LOGLEVEL_WARNING); |
+ root_->AddChild("/console2", console2_node_); |
+ console3_node_ = new ConsoleNode(this, 8, dev_, PP_LOGLEVEL_ERROR); |
+ root_->AddChild("/console3", console3_node_); |
+ |
+ tty_node_ = new TtyNode(this, 9, dev_); |
+ root_->AddChild("/tty", tty_node_); |
return true; |
} |
void MountDev::Destroy() { |
+ ReleaseAndNullNode(&tty_node_); |
+ ReleaseAndNullNode(&console3_node_); |
+ ReleaseAndNullNode(&console2_node_); |
+ ReleaseAndNullNode(&console1_node_); |
+ ReleaseAndNullNode(&console0_node_); |
ReleaseAndNullNode(&random_node_); |
ReleaseAndNullNode(&zero_node_); |
ReleaseAndNullNode(&null_node_); |