summaryrefslogtreecommitdiffstats
path: root/native_client_sdk
diff options
context:
space:
mode:
authornoelallen@google.com <noelallen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-16 22:17:49 +0000
committernoelallen@google.com <noelallen@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-16 22:17:49 +0000
commit393b16e198cd793386f05a880c241662273a02be (patch)
tree4b518a0a8a6205b6411ff37e86529fc035b9b1c7 /native_client_sdk
parent924e9f9e90b0102ed99059ed2d0a8b304eed3935 (diff)
downloadchromium_src-393b16e198cd793386f05a880c241662273a02be.zip
chromium_src-393b16e198cd793386f05a880c241662273a02be.tar.gz
chromium_src-393b16e198cd793386f05a880c241662273a02be.tar.bz2
Add support for simple run of "main"
Converts calls to PostMessage and LogMesssage to prints to stderr and stdout. TBR=binji@chromium.org BUG=165626 NOTRY=true Review URL: https://codereview.chromium.org/11592003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173399 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk')
-rw-r--r--native_client_sdk/src/examples/hello_world_stdio/Makefile2
-rw-r--r--native_client_sdk/src/examples/hello_world_stdio/hello_world.c72
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts/kernel_proxy.cc1
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts/mount_dev.cc87
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts/mount_dev.h5
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts/pepper_interface.h20
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.cc76
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.h9
-rw-r--r--native_client_sdk/src/libraries/nacl_mounts_test/pepper_interface_mock.h1
-rw-r--r--native_client_sdk/src/libraries/ppapi_main/ppapi_instance.cc41
-rw-r--r--native_client_sdk/src/libraries/ppapi_main/ppapi_main.h2
11 files changed, 251 insertions, 65 deletions
diff --git a/native_client_sdk/src/examples/hello_world_stdio/Makefile b/native_client_sdk/src/examples/hello_world_stdio/Makefile
index d3b34a6..1f644cd 100644
--- a/native_client_sdk/src/examples/hello_world_stdio/Makefile
+++ b/native_client_sdk/src/examples/hello_world_stdio/Makefile
@@ -42,7 +42,7 @@ SOURCES=hello_world.c
# Notice that pthread and libc are implied and come last through standard
# compiler/link switches, for example -pthread.
#
-LIBS=ppapi_main ppapi_cpp ppapi
+LIBS=ppapi_main nacl_mounts ppapi_cpp ppapi
#
diff --git a/native_client_sdk/src/examples/hello_world_stdio/hello_world.c b/native_client_sdk/src/examples/hello_world_stdio/hello_world.c
index 2771be0..0d2faf1 100644
--- a/native_client_sdk/src/examples/hello_world_stdio/hello_world.c
+++ b/native_client_sdk/src/examples/hello_world_stdio/hello_world.c
@@ -1,7 +1,11 @@
+/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
#include <stdio.h>
#include <string.h>
-
#include "ppapi/c/ppb_var.h"
#include "ppapi/c/ppb_messaging.h"
#include "ppapi/c/ppb_console.h"
@@ -10,49 +14,12 @@
// Have the Module object provided by ppapi_main create a basic
-// PPAPI instance with default arguments to setting up
-// stdio file handles, processing keyboard, etc...
-// PPAPI Instance with default arguments.
+// PPAPI instance with default arguments which mounts the dev
+// file system providing /dev/null, /dev/tty, and /devl/console3
+// for null STDIN, STDOUT directed to PostMessage and STDERR
+// directed to the JavaScript Console with LogLevel 'ERROR'
PPAPI_MAIN_WITH_DEFAULT_ARGS
-static PPB_Messaging* ppb_messaging_interface = NULL;
-static PPB_Var* ppb_var_interface = NULL;
-static PPB_Console* ppb_console_interface = NULL;
-
-
-/**
- * Creates new string PP_Var from C string. The resulting object will be a
- * refcounted string object. It will be AddRef()ed for the caller. When the
- * caller is done with it, it should be Release()d.
- * @param[in] str C string to be converted to PP_Var
- * @return PP_Var containing string.
- */
-static struct PP_Var CStrToVar(const char* str) {
- if (ppb_var_interface != NULL) {
- return ppb_var_interface->VarFromUtf8(str, strlen(str));
- }
- return PP_MakeUndefined();
-}
-
-//
-// Post a message back to JavaScript
-//
-static void SendMessage(const char *str) {
- PP_Instance instance = PPAPI_GetInstanceId();
- if (ppb_messaging_interface)
- ppb_messaging_interface->PostMessage(instance, CStrToVar(str));
-}
-
-//
-// Send a message to the JavaScript Console
-//
-static void LogMessage(const char *str) {
- PP_Instance instance = PPAPI_GetInstanceId();
- if (ppb_console_interface)
- ppb_console_interface->Log(instance, PP_LOGLEVEL_LOG,
- CStrToVar(str));
-}
-
//
// The "main" entry point called by PPAPIInstance once initialization
// takes place. This is called off the main thread, which is hidden
@@ -64,15 +31,20 @@ static void LogMessage(const char *str) {
// Where the embed tag for this module uses KEY=VALUE
//
int ppapi_main(int argc, const char *argv[]) {
- ppb_messaging_interface =
- (PPB_Messaging*) PPAPI_GetInterface(PPB_MESSAGING_INTERFACE);
- ppb_var_interface =
- (PPB_Var*) PPAPI_GetInterface(PPB_VAR_INTERFACE);
- ppb_console_interface =
- (PPB_Console*) PPAPI_GetInterface(PPB_CONSOLE_INTERFACE);
+ int index = 1;
- SendMessage("Hello World STDIO.\n");
- LogMessage("Hello World STDERR.\n");
+ // Use PostMessage to send "Hello World" to JavaScript.
+ printf("Hello World STDIO.\n");
+ // Use PPAPI Console interface to send "Hello World" to the
+ // JavaScript Console.
+ fprintf(stderr, "Hello World STDERR.\n");
+
+ // Print the arguments we received from the web page
+ printf("NAME: %s\n", argv[0]);
+ while (index + 2 < argc) {
+ printf(" ARGS: %s=%s\n", argv[index+0], argv[index+1]);
+ index += 2;
+ }
return 0;
}
diff --git a/native_client_sdk/src/libraries/nacl_mounts/kernel_proxy.cc b/native_client_sdk/src/libraries/nacl_mounts/kernel_proxy.cc
index e8e2440..8b74b35 100644
--- a/native_client_sdk/src/libraries/nacl_mounts/kernel_proxy.cc
+++ b/native_client_sdk/src/libraries/nacl_mounts/kernel_proxy.cc
@@ -50,6 +50,7 @@ void KernelProxy::Init(PepperInterface* ppapi) {
// Create memory mount at root
StringMap_t smap;
mounts_["/"] = MountMem::Create<MountMem>(dev_++, smap, ppapi_);
+ mounts_["/dev"] = MountDev::Create<MountDev>(dev_++, smap, ppapi_);
}
int KernelProxy::open(const char *path, int oflags) {
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 5d43989..83925da 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_);
diff --git a/native_client_sdk/src/libraries/nacl_mounts/mount_dev.h b/native_client_sdk/src/libraries/nacl_mounts/mount_dev.h
index 8cac9ef..3c8c45d 100644
--- a/native_client_sdk/src/libraries/nacl_mounts/mount_dev.h
+++ b/native_client_sdk/src/libraries/nacl_mounts/mount_dev.h
@@ -32,6 +32,11 @@ class MountDev : public Mount {
MountNode* null_node_;
MountNode* zero_node_;
MountNode* random_node_;
+ MountNode* console0_node_;
+ MountNode* console1_node_;
+ MountNode* console2_node_;
+ MountNode* console3_node_;
+ MountNode* tty_node_;
friend class Mount;
};
diff --git a/native_client_sdk/src/libraries/nacl_mounts/pepper_interface.h b/native_client_sdk/src/libraries/nacl_mounts/pepper_interface.h
index 484ff8d..6e5a685 100644
--- a/native_client_sdk/src/libraries/nacl_mounts/pepper_interface.h
+++ b/native_client_sdk/src/libraries/nacl_mounts/pepper_interface.h
@@ -10,12 +10,17 @@
#include <ppapi/c/pp_instance.h>
#include <ppapi/c/pp_resource.h>
#include <ppapi/c/pp_var.h>
+#include <ppapi/c/ppb_console.h>
+#include <ppapi/c/ppb_messaging.h>
+
#include <utils/macros.h>
+class ConsoleInterface;
class DirectoryReaderInterface;
class FileIoInterface;
class FileRefInterface;
class FileSystemInterface;
+class MessagingInterface;
class VarInterface;
class PepperInterface {
@@ -24,13 +29,21 @@ class PepperInterface {
virtual PP_Instance GetInstance() = 0;
virtual void AddRefResource(PP_Resource) = 0;
virtual void ReleaseResource(PP_Resource) = 0;
+ virtual ConsoleInterface* GetConsoleInterface() = 0;
virtual FileSystemInterface* GetFileSystemInterface() = 0;
virtual FileRefInterface* GetFileRefInterface() = 0;
virtual FileIoInterface* GetFileIoInterface() = 0;
virtual DirectoryReaderInterface* GetDirectoryReaderInterface() = 0;
+ virtual MessagingInterface* GetMessagingInterface() = 0;
virtual VarInterface* GetVarInterface() = 0;
};
+class ConsoleInterface {
+ public:
+ virtual ~ConsoleInterface() {}
+ virtual void Log(PP_Instance, PP_LogLevel, struct PP_Var) = 0;
+};
+
class FileSystemInterface {
public:
virtual ~FileSystemInterface() {}
@@ -74,9 +87,16 @@ class DirectoryReaderInterface {
PP_CompletionCallback) = 0;
};
+class MessagingInterface {
+ public:
+ virtual ~MessagingInterface() {}
+ virtual void PostMessage(PP_Instance, struct PP_Var ) = 0;
+};
+
class VarInterface {
public:
virtual ~VarInterface() {}
+ virtual struct PP_Var VarFromUtf8(const char*, uint32_t) = 0;
virtual const char* VarToUtf8(PP_Var, uint32_t*) = 0;
};
diff --git a/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.cc b/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.cc
index bffbb49..55e44b1 100644
--- a/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.cc
+++ b/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.cc
@@ -5,12 +5,15 @@
#include "nacl_mounts/real_pepper_interface.h"
#include <assert.h>
+#include <stdio.h>
+
#include <ppapi/c/pp_errors.h>
+#include <ppapi/c/ppb_console.h>
#include <ppapi/c/ppb_file_io.h>
#include <ppapi/c/ppb_file_ref.h>
#include <ppapi/c/ppb_file_system.h>
+#include <ppapi/c/ppb_messaging.h>
#include <ppapi/c/ppb_var.h>
-#include <stdio.h>
#define DEFINE_CONSTRUCTOR(Class, Interface) \
Class::Class(const Interface* interface) : interface_(interface) {}
@@ -45,6 +48,35 @@
}
+#define DEFINE_VMETHOD1(Class, MethodName, Type0) \
+ void Class::MethodName(Type0 arg0) { \
+ interface_->MethodName(arg0); \
+ }
+
+#define DEFINE_VMETHOD2(Class, MethodName, Type0, Type1) \
+ void Class::MethodName(Type0 arg0, Type1 arg1) { \
+ interface_->MethodName(arg0, arg1); \
+ }
+
+#define DEFINE_VMETHOD3(Class, MethodName, Type0, Type1, Type2) \
+ void Class::MethodName(Type0 arg0, Type1 arg1, Type2 arg2) { \
+ interface_->MethodName(arg0, arg1, arg2); \
+ }
+
+#define DEFINE_VMETHOD4(Class, MethodName, Type0, Type1, Type2, Type3) \
+ void Class::MethodName(Type0 arg0, Type1 arg1, Type2 arg2, \
+ Type3 arg3) { \
+ interface_->MethodName(arg0, arg1, arg2, arg3); \
+ }
+
+#define DEFINE_VMETHOD5(Class, MethodName, Type0, Type1, Type2, Type3, Type4) \
+ void Class::MethodName(Type0 arg0, Type1 arg1, Type2 arg2, \
+ Type3 arg3, Type4 arg4) { \
+ interface_->MethodName(arg0, arg1, arg2, arg3, arg4); \
+ }
+
+
+
class RealFileSystemInterface : public FileSystemInterface {
public:
explicit RealFileSystemInterface(const PPB_FileSystem* filesystem_interface);
@@ -61,6 +93,18 @@ DEFINE_METHOD3(RealFileSystemInterface, int32_t, Open, PP_Resource, int64_t,
PP_CompletionCallback)
+class RealConsoleInterface : public ConsoleInterface {
+ public:
+ explicit RealConsoleInterface(const PPB_Console* console_interface);
+ virtual void Log(PP_Instance, PP_LogLevel, struct PP_Var);
+ private:
+ const PPB_Console* interface_;
+};
+DEFINE_CONSTRUCTOR(RealConsoleInterface, PPB_Console)
+DEFINE_VMETHOD3(RealConsoleInterface, Log, PP_Instance, PP_LogLevel,
+ struct PP_Var);
+
+
class RealFileRefInterface : public FileRefInterface {
public:
explicit RealFileRefInterface(const PPB_FileRef* fileref_interface);
@@ -141,14 +185,30 @@ class RealVarInterface : public VarInterface {
public:
explicit RealVarInterface(const PPB_Var* var_interface);
+ virtual struct PP_Var VarFromUtf8(const char *, uint32_t);
virtual const char* VarToUtf8(PP_Var, uint32_t*);
private:
const PPB_Var* interface_;
};
DEFINE_CONSTRUCTOR(RealVarInterface, PPB_Var)
+DEFINE_METHOD2(RealVarInterface, struct PP_Var, VarFromUtf8, const char *,
+ uint32_t)
DEFINE_METHOD2(RealVarInterface, const char*, VarToUtf8, PP_Var, uint32_t*)
+class RealMessagingInterface : public MessagingInterface {
+ public:
+ explicit RealMessagingInterface(const PPB_Messaging* messaging_interface);
+
+ virtual void PostMessage(PP_Instance, struct PP_Var);
+
+private:
+ const PPB_Messaging* interface_;
+};
+DEFINE_CONSTRUCTOR(RealMessagingInterface, PPB_Messaging);
+DEFINE_VMETHOD2(RealMessagingInterface, PostMessage, PP_Instance, struct
+ PP_Var);
+
RealPepperInterface::RealPepperInterface(PP_Instance instance,
PPB_GetInterface get_browser_interface)
@@ -162,6 +222,9 @@ RealPepperInterface::RealPepperInterface(PP_Instance instance,
assert(core_interface_);
assert(message_loop_interface_);
+ console_interface_ = new RealConsoleInterface(
+ static_cast<const PPB_Console*>(get_browser_interface(
+ PPB_CONSOLE_INTERFACE)));
directory_reader_interface_ = new RealDirectoryReaderInterface(
static_cast<const PPB_DirectoryReader_Dev*>(get_browser_interface(
PPB_DIRECTORYREADER_DEV_INTERFACE)));
@@ -172,6 +235,9 @@ RealPepperInterface::RealPepperInterface(PP_Instance instance,
filesystem_interface_ = new RealFileSystemInterface(
static_cast<const PPB_FileSystem*>(get_browser_interface(
PPB_FILESYSTEM_INTERFACE)));
+ messaging_interface_ = new RealMessagingInterface(
+ static_cast<const PPB_Messaging*>(get_browser_interface(
+ PPB_MESSAGING_INTERFACE)));
var_interface_= new RealVarInterface(
static_cast<const PPB_Var*>(get_browser_interface(
PPB_VAR_INTERFACE)));
@@ -191,6 +257,10 @@ void RealPepperInterface::ReleaseResource(PP_Resource resource) {
core_interface_->ReleaseResource(resource);
}
+ConsoleInterface* RealPepperInterface::GetConsoleInterface() {
+ return console_interface_;
+}
+
FileSystemInterface* RealPepperInterface::GetFileSystemInterface() {
return filesystem_interface_;
}
@@ -207,6 +277,10 @@ DirectoryReaderInterface* RealPepperInterface::GetDirectoryReaderInterface() {
return directory_reader_interface_;
}
+MessagingInterface* RealPepperInterface::GetMessagingInterface() {
+ return messaging_interface_;
+}
+
VarInterface* RealPepperInterface::GetVarInterface() {
return var_interface_;
}
diff --git a/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.h b/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.h
index b0a4a52..8e6e8a1 100644
--- a/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.h
+++ b/native_client_sdk/src/libraries/nacl_mounts/real_pepper_interface.h
@@ -7,13 +7,18 @@
#include <ppapi/c/ppb.h>
#include <ppapi/c/ppb_core.h>
+#include <ppapi/c/ppb_console.h>
#include <ppapi/c/ppb_message_loop.h>
+#include <ppapi/c/ppb_messaging.h>
+#include <ppapi/c/ppb_var.h>
#include "pepper_interface.h"
+class RealConsoleInterface;
class RealDirectoryReaderInterface;
class RealFileIoInterface;
class RealFileRefInterface;
class RealFileSystemInterface;
+class RealMessagingInterface;
class RealVarInterface;
class RealPepperInterface : public PepperInterface {
@@ -24,10 +29,12 @@ class RealPepperInterface : public PepperInterface {
virtual PP_Instance GetInstance();
virtual void AddRefResource(PP_Resource);
virtual void ReleaseResource(PP_Resource);
+ virtual ConsoleInterface* GetConsoleInterface();
virtual FileSystemInterface* GetFileSystemInterface();
virtual FileRefInterface* GetFileRefInterface();
virtual FileIoInterface* GetFileIoInterface();
virtual DirectoryReaderInterface* GetDirectoryReaderInterface();
+ virtual MessagingInterface* GetMessagingInterface();
virtual VarInterface* GetVarInterface();
int32_t InitializeMessageLoop();
@@ -36,10 +43,12 @@ class RealPepperInterface : public PepperInterface {
PP_Instance instance_;
const PPB_Core* core_interface_;
const PPB_MessageLoop* message_loop_interface_;
+ RealConsoleInterface* console_interface_;
RealDirectoryReaderInterface* directory_reader_interface_;
RealFileIoInterface* fileio_interface_;
RealFileRefInterface* fileref_interface_;
RealFileSystemInterface* filesystem_interface_;
+ RealMessagingInterface* messaging_interface_;
RealVarInterface* var_interface_;
};
diff --git a/native_client_sdk/src/libraries/nacl_mounts_test/pepper_interface_mock.h b/native_client_sdk/src/libraries/nacl_mounts_test/pepper_interface_mock.h
index 2a8fe13..b30896d 100644
--- a/native_client_sdk/src/libraries/nacl_mounts_test/pepper_interface_mock.h
+++ b/native_client_sdk/src/libraries/nacl_mounts_test/pepper_interface_mock.h
@@ -76,6 +76,7 @@ class DirectoryReaderInterfaceMock : public DirectoryReaderInterface {
class VarInterfaceMock : public VarInterface {
public:
+ MOCK_METHOD2(VarFromUtf8, PP_Var(const char*, uint32_t));
MOCK_METHOD2(VarToUtf8, const char*(PP_Var, uint32_t*));
};
diff --git a/native_client_sdk/src/libraries/ppapi_main/ppapi_instance.cc b/native_client_sdk/src/libraries/ppapi_main/ppapi_instance.cc
index 8bc51dd..97759fa 100644
--- a/native_client_sdk/src/libraries/ppapi_main/ppapi_instance.cc
+++ b/native_client_sdk/src/libraries/ppapi_main/ppapi_instance.cc
@@ -2,8 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include <cstdlib>
#include <cstring>
@@ -11,6 +14,8 @@
#include <string>
#include <vector>
+#include "nacl_mounts/kernel_intercept.h"
+
#include "ppapi/cpp/input_event.h"
#include "ppapi/cpp/rect.h"
#include "ppapi/cpp/size.h"
@@ -19,6 +24,7 @@
#include "ppapi_main/ppapi_instance.h"
#include "ppapi_main/ppapi_main.h"
+
struct StartInfo {
uint32_t argc_;
const char** argv_;
@@ -67,10 +73,7 @@ bool PPAPIInstance::Init(uint32_t arg,
si->argc_ = 1;
si->argv_ = new const char *[arg*2+1];
-
- char *name = new char[5];
- strcpy(name, "NEXE");
- si->argv_[0] = name;
+ si->argv_[0] = NULL;
for (uint32_t i=0; i < arg; i++) {
// If we start with PM prefix set the instance argument map
@@ -78,9 +81,17 @@ bool PPAPIInstance::Init(uint32_t arg,
std::string key = argn[i];
std::string val = argv[i];
properties_[key] = val;
+ continue;
+ }
+
+ // If this is the 'src' tag, then get the NMF name.
+ if (!strcmp("src", argn[i])) {
+ char *name = new char[strlen(argv[i]) + 1];
+ strcpy(name, argv[i]);
+ si->argv_[0] = name;
}
- // Otherwise turn it into arguments
else {
+ // Otherwise turn it into arguments
char *key = new char[strlen(argn[i]) + 3];
key[0] = '-';
key[1] = '-';
@@ -95,7 +106,12 @@ bool PPAPIInstance::Init(uint32_t arg,
}
}
-// ki_init();
+ // If src was not found, set the first arg to something
+ if (NULL == si->argv_[0]) {
+ char *name = new char[5];
+ strcpy(name, "NMF?");
+ si->argv_[0] = name;
+ }
if (ProcessProperties()) {
pthread_t main_thread;
@@ -116,11 +132,16 @@ const char* PPAPIInstance::GetProperty(const char* key, const char* def) {
}
bool PPAPIInstance::ProcessProperties() {
-#if 0
- const char* stdin_path = GetProperty("PM_STDIO", "/dev/tty");
- const char* stdout_path = GetProperty("PM_STDOUT", "/dev/console0");
+ const char* stdin_path = GetProperty("PM_STDIO", "/dev/null");
+ const char* stdout_path = GetProperty("PM_STDOUT", "/dev/tty");
const char* stderr_path = GetProperty("PM_STDERR", "/dev/console3");
-#endif
+
+ ki_init_ppapi(NULL, PPAPI_GetInstanceId(), PPAPI_GetInterface);
+ int f1 = open(stdin_path, O_RDONLY);
+ int f2 = open(stdout_path, O_WRONLY);
+ int f3 = open(stderr_path, O_WRONLY);
+
+ return true;
}
void PPAPIInstance::HandleMessage(const pp::Var& message) {
diff --git a/native_client_sdk/src/libraries/ppapi_main/ppapi_main.h b/native_client_sdk/src/libraries/ppapi_main/ppapi_main.h
index 78be506..01958384 100644
--- a/native_client_sdk/src/libraries/ppapi_main/ppapi_main.h
+++ b/native_client_sdk/src/libraries/ppapi_main/ppapi_main.h
@@ -30,7 +30,7 @@ EXTERN_C_END
#define PPAPI_MAIN_DEFAULT_ARGS \
{ \
- "PM_STDIN", "/dev/tty", \
+ "PM_STDIN", "/dev/null", \
"PM_STDIO", "/dev/console0", \
"PM_STDERR", "/dev/console3", \
NULL, NULL \