From 04e356b002bec740b3f4799606c5c581a1013b06 Mon Sep 17 00:00:00 2001 From: yugui Date: Wed, 22 Oct 2014 00:32:03 +0000 Subject: * nacl/pepper_main.c (Instance_DidCreate): mount devfs and rebind fd 0 .. 2 so that stderr goes to the console of the browser. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48083 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- nacl/pepper_main.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'nacl/pepper_main.c') diff --git a/nacl/pepper_main.c b/nacl/pepper_main.c index bcb128ded1..168e8f9fd4 100644 --- a/nacl/pepper_main.c +++ b/nacl/pepper_main.c @@ -404,6 +404,24 @@ init_libraries_if_necessary(void) return 0; } +static int +reopen_fd(int fd, const char* path, int flags) { + int fd2 = open(path, flags); + if (fd2 < 0) { + perror("open fd"); + return -1; + } + if (dup2(fd2, fd) < 0) { + perror("dup2 fd"); + return -1; + } + if (close(fd2)) { + perror("close old fd"); + return -1; + } + return fd; +} + static int pruby_init(void) { @@ -490,13 +508,29 @@ static PP_Bool Instance_DidCreate(PP_Instance instance, uint32_t argc, const char* argn[], const char* argv[]) { - int ret; struct PepperInstance* data = pruby_register_instance(instance); current_instance = instance; nacl_io_init_ppapi(instance, get_browser_interface); - // TODO(yugui) Mount devfs + if (mount("", "/dev2", "dev", 0, "")) { + perror("mount dev"); + return PP_FALSE; + } + if (reopen_fd(0, "/dev2/stdin", O_RDONLY) < 0) { + perror("reopen stdin"); + return PP_FALSE; + } + if (reopen_fd(1, "/dev2/stdout", O_WRONLY) < 0) { + perror("reopen stdout"); + return PP_FALSE; + } + if (reopen_fd(2, "/dev2/console1", O_WRONLY) < 0) { + perror("reopen stderr"); + return PP_FALSE; + } + + /* TODO(yugui) Unmount original /dev */ if (mount("/lib", "/lib", "httpfs", 0, "allow_cross_origin_requests=false")) { -- cgit v1.2.3