summaryrefslogtreecommitdiffstats
path: root/native_client_sdk
diff options
context:
space:
mode:
authorsbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-24 22:40:36 +0000
committersbc@chromium.org <sbc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-24 22:40:36 +0000
commit6d70f5269b0e7aeae3d83c0d2ac7fb1f320e2a15 (patch)
treebcdb83408b02dc83c886ad7e8897cce595a2ce76 /native_client_sdk
parent8608e138796081bfd56e7cd6e79771b0b6f98b31 (diff)
downloadchromium_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')
-rw-r--r--native_client_sdk/src/libraries/nacl_io/devfs/tty_node.h2
-rw-r--r--native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc8
-rw-r--r--native_client_sdk/src/libraries/nacl_io/kernel_wrap_newlib.cc13
-rw-r--r--native_client_sdk/src/libraries/nacl_io/kernel_wrap_real.h1
-rw-r--r--native_client_sdk/src/libraries/nacl_io/node.cc4
-rw-r--r--native_client_sdk/src/libraries/nacl_io/node.h4
-rw-r--r--native_client_sdk/src/libraries/nacl_io/passthroughfs/passthrough_fs.cc13
-rw-r--r--native_client_sdk/src/libraries/nacl_io/syscalls/isatty.c5
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/html5_fs_test.cc4
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/main.cc1
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/mem_fs_node_test.cc4
-rw-r--r--native_client_sdk/src/tests/nacl_io_test/mock_node.h2
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&));