diff options
author | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-24 22:40:36 +0000 |
---|---|---|
committer | sbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-24 22:40:36 +0000 |
commit | 6d70f5269b0e7aeae3d83c0d2ac7fb1f320e2a15 (patch) | |
tree | bcdb83408b02dc83c886ad7e8897cce595a2ce76 /native_client_sdk | |
parent | 8608e138796081bfd56e7cd6e79771b0b6f98b31 (diff) | |
download | chromium_src-6d70f5269b0e7aeae3d83c0d2ac7fb1f320e2a15.zip chromium_src-6d70f5269b0e7aeae3d83c0d2ac7fb1f320e2a15.tar.gz chromium_src-6d70f5269b0e7aeae3d83c0d2ac7fb1f320e2a15.tar.bz2 |
[NaCl SDK] nacl_io: Enable isatty running under sel_ldr.
This change enabled the sel_ldr's isatty() implementation
to be used, which enables color output for gtest and other
terminal-based applications.
Unfortunately this is newlib only right now.
R=binji@chromium.org
Review URL: https://codereview.chromium.org/59883020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@259043 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'native_client_sdk')
12 files changed, 50 insertions, 11 deletions
diff --git a/native_client_sdk/src/libraries/nacl_io/devfs/tty_node.h b/native_client_sdk/src/libraries/nacl_io/devfs/tty_node.h index bf8ab53..17038eb 100644 --- a/native_client_sdk/src/libraries/nacl_io/devfs/tty_node.h +++ b/native_client_sdk/src/libraries/nacl_io/devfs/tty_node.h @@ -38,6 +38,8 @@ class TtyNode : public CharNode { virtual Error Tcsetattr(int optional_actions, const struct termios* termios_p); + virtual Error Isatty() { return 0; } + private: ScopedEventEmitter emitter_; diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc index 6d750be..680eaac 100644 --- a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc +++ b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc @@ -591,16 +591,16 @@ int KernelProxy::isatty(int fd) { Error error = AcquireHandle(fd, &handle); if (error) { errno = error; - return -1; + return 0; } - error = handle->node()->IsaTTY(); + error = handle->node()->Isatty(); if (error) { errno = error; - return -1; + return 0; } - return 0; + return 1; } int KernelProxy::ioctl(int fd, int request, va_list args) { diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc index 6cf5184..8090123 100644 --- a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc +++ b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc @@ -69,6 +69,7 @@ extern struct nacl_irt_memory __libnacl_irt_memory; OP(dev_fdio, fsync); \ OP(dev_fdio, fdatasync); \ OP(dev_fdio, ftruncate); \ + OP(dev_fdio, isatty); \ OP(dev_filename, open); \ OP(dev_filename, stat); \ OP(dev_filename, mkdir); \ @@ -158,6 +159,13 @@ int WRAP(ftruncate)(int fd, off_t length) { return (ki_ftruncate(fd, length) < 0) ? errno : 0; } +int WRAP(isatty)(int fd, int* result) { + *result = ki_isatty(fd); + if (*result == 1) + return errno; + return 0; +} + int WRAP(mmap)(void** addr, size_t length, int prot, int flags, int fd, off_t offset) { if (flags & MAP_ANONYMOUS) @@ -277,6 +285,11 @@ int _real_fstat(int fd, struct stat* buf) { return REAL(fstat)(fd, buf); } +int _real_isatty(int fd, int* result) { + CHECK_REAL(isatty); + return REAL(isatty)(fd, result); +} + int _real_getdents(int fd, void* nacl_buf, size_t nacl_count, size_t* nread) { CHECK_REAL(getdents); return REAL(getdents)(fd, static_cast<dirent*>(nacl_buf), nacl_count, nread); diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_real.h b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_real.h index 68840ac..f46f6cc 100644 --- a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_real.h +++ b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_real.h @@ -15,6 +15,7 @@ int _real_close(int fd); void _real_exit(int status); int _real_fstat(int fd, struct stat *buf); int _real_getdents(int fd, void* nacl_buf, size_t nacl_count, size_t *nread); +int _real_isatty(int fd, int* result); int _real_lseek(int fd, off_t offset, int whence, off_t* new_offset); int _real_mkdir(const char* pathname, mode_t mode); int _real_mmap(void** addr, size_t length, int prot, int flags, int fd, diff --git a/native_client_sdk/src/libraries/nacl_io/node.cc b/native_client_sdk/src/libraries/nacl_io/node.cc index ceaad6c..b8876ed 100644 --- a/native_client_sdk/src/libraries/nacl_io/node.cc +++ b/native_client_sdk/src/libraries/nacl_io/node.cc @@ -184,7 +184,9 @@ bool Node::IsaFile() { return (stat_.st_mode & S_IFREG) != 0; } bool Node::IsaSock() { return (stat_.st_mode & S_IFSOCK) != 0; } -bool Node::IsaTTY() { return (stat_.st_mode & S_IFCHR) != 0; } +Error Node::Isatty() { + return ENOTTY; +} Error Node::AddChild(const std::string& name, const ScopedNode& node) { return ENOTDIR; diff --git a/native_client_sdk/src/libraries/nacl_io/node.h b/native_client_sdk/src/libraries/nacl_io/node.h index 54b513a..4e4420c 100644 --- a/native_client_sdk/src/libraries/nacl_io/node.h +++ b/native_client_sdk/src/libraries/nacl_io/node.h @@ -95,10 +95,12 @@ class Node : public sdk_util::RefObject { virtual void SetType(int type); // Assume that |out_size| is non-NULL. virtual Error GetSize(size_t* out_size); + // Returns 0 if node is a TTY + virtual Error Isatty(); + virtual bool IsaDir(); virtual bool IsaFile(); virtual bool IsaSock(); - virtual bool IsaTTY(); // Number of children for this node (directory) virtual int ChildCount(); diff --git a/native_client_sdk/src/libraries/nacl_io/passthroughfs/passthrough_fs.cc b/native_client_sdk/src/libraries/nacl_io/passthroughfs/passthrough_fs.cc index 4b654f1..ebbec7d 100644 --- a/native_client_sdk/src/libraries/nacl_io/passthroughfs/passthrough_fs.cc +++ b/native_client_sdk/src/libraries/nacl_io/passthroughfs/passthrough_fs.cc @@ -90,6 +90,19 @@ class PassthroughFsNode : public Node { return 0; } + virtual Error Isatty() { +#ifdef __GLIBC__ + // isatty is not yet hooked up to the IRT interface under glibc. + return ENOTTY; +#else + int result = 0; + int err = _real_isatty(real_fd_, &result); + if (err) + return err; + return 0; +#endif + } + Error MMap(void* addr, size_t length, int prot, diff --git a/native_client_sdk/src/libraries/nacl_io/syscalls/isatty.c b/native_client_sdk/src/libraries/nacl_io/syscalls/isatty.c index f305f3f..8a54873 100644 --- a/native_client_sdk/src/libraries/nacl_io/syscalls/isatty.c +++ b/native_client_sdk/src/libraries/nacl_io/syscalls/isatty.c @@ -5,6 +5,11 @@ #include "nacl_io/kernel_intercept.h" #include "nacl_io/kernel_wrap.h" +#if !defined(__native_client__) || defined(__GLIBC__) +// GLIBC-only entry point. +// TODO(sbc): remove once this bug gets fixed: +// https://code.google.com/p/nativeclient/issues/detail?id=3709 int isatty(int fd) { return ki_isatty(fd); } +#endif diff --git a/native_client_sdk/src/tests/nacl_io_test/html5_fs_test.cc b/native_client_sdk/src/tests/nacl_io_test/html5_fs_test.cc index 9a73b73..3acbaa8 100644 --- a/native_client_sdk/src/tests/nacl_io_test/html5_fs_test.cc +++ b/native_client_sdk/src/tests/nacl_io_test/html5_fs_test.cc @@ -364,7 +364,7 @@ TEST_F(Html5FsTest, GetStat) { EXPECT_EQ(strlen(contents), size); EXPECT_FALSE(node->IsaDir()); EXPECT_TRUE(node->IsaFile()); - EXPECT_FALSE(node->IsaTTY()); + EXPECT_EQ(ENOTTY, node->Isatty()); // GetStat on a directory... EXPECT_EQ(0, fs->Open(Path("/dir"), O_RDONLY, &node)); @@ -382,7 +382,7 @@ TEST_F(Html5FsTest, GetStat) { EXPECT_EQ(0, size); EXPECT_TRUE(node->IsaDir()); EXPECT_FALSE(node->IsaFile()); - EXPECT_FALSE(node->IsaTTY()); + EXPECT_EQ(ENOTTY, node->Isatty()); } TEST_F(Html5FsTest, FTruncate) { diff --git a/native_client_sdk/src/tests/nacl_io_test/main.cc b/native_client_sdk/src/tests/nacl_io_test/main.cc index ef7b094..326c18f 100644 --- a/native_client_sdk/src/tests/nacl_io_test/main.cc +++ b/native_client_sdk/src/tests/nacl_io_test/main.cc @@ -9,6 +9,7 @@ #if defined(SEL_LDR) int main(int argc, char* argv[]) { + setenv("TERM", "xterm-256color", 0); ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } diff --git a/native_client_sdk/src/tests/nacl_io_test/mem_fs_node_test.cc b/native_client_sdk/src/tests/nacl_io_test/mem_fs_node_test.cc index dec489b..d6d8c18 100644 --- a/native_client_sdk/src/tests/nacl_io_test/mem_fs_node_test.cc +++ b/native_client_sdk/src/tests/nacl_io_test/mem_fs_node_test.cc @@ -79,7 +79,7 @@ TEST(MemFsNodeTest, File) { EXPECT_EQ(S_IFREG, file.GetType()); EXPECT_FALSE(file.IsaDir()); EXPECT_TRUE(file.IsaFile()); - EXPECT_FALSE(file.IsaTTY()); + EXPECT_EQ(ENOTTY, file.Isatty()); EXPECT_EQ(0, file.RefCount()); // Test IO @@ -209,7 +209,7 @@ TEST(MemFsNodeTest, Directory) { EXPECT_EQ(S_IFDIR, root.GetType()); EXPECT_TRUE(root.IsaDir()); EXPECT_FALSE(root.IsaFile()); - EXPECT_FALSE(root.IsaTTY()); + EXPECT_EQ(ENOTTY, root.Isatty()); EXPECT_EQ(0, root.RefCount()); // IO operations should fail diff --git a/native_client_sdk/src/tests/nacl_io_test/mock_node.h b/native_client_sdk/src/tests/nacl_io_test/mock_node.h index 199f6b1..8286e3a 100644 --- a/native_client_sdk/src/tests/nacl_io_test/mock_node.h +++ b/native_client_sdk/src/tests/nacl_io_test/mock_node.h @@ -35,7 +35,7 @@ class MockNode : public nacl_io::Node { MOCK_METHOD1(GetSize, Error(size_t*)); MOCK_METHOD0(IsaDir, bool()); MOCK_METHOD0(IsaFile, bool()); - MOCK_METHOD0(IsaTTY, bool()); + MOCK_METHOD0(Isatty, Error()); MOCK_METHOD0(ChildCount, int()); MOCK_METHOD2(AddChild, Error(const std::string&, const ScopedNode&)); MOCK_METHOD1(RemoveChild, Error(const std::string&)); |