Index: native_client_sdk/src/libraries/nacl_io/passthroughfs/real_node.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/passthroughfs/real_node.cc b/native_client_sdk/src/libraries/nacl_io/passthroughfs/real_node.cc |
index 08a4e32ddc96af4c433751993c60590e552592fe..7f585f640c54b35c633801da9cbd46b08b436721 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/passthroughfs/real_node.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/passthroughfs/real_node.cc |
@@ -5,9 +5,11 @@ |
#include "nacl_io/passthroughfs/real_node.h" |
#include <errno.h> |
+#include <string.h> |
#include "nacl_io/kernel_handle.h" |
#include "nacl_io/kernel_wrap_real.h" |
+#include "nacl_io/log.h" |
namespace nacl_io { |
RealNode::RealNode(Filesystem* filesystem, int real_fd, bool close_on_destroy) |
@@ -28,17 +30,24 @@ Error RealNode::Read(const HandleAttr& attr, |
void* buf, |
size_t count, |
int* out_bytes) { |
+ int err; |
*out_bytes = 0; |
- int64_t new_offset; |
- int err = _real_lseek(real_fd_, attr.offs, 0, &new_offset); |
- if (err && err != ESPIPE) |
- return err; |
+ if (IsaFile()) { |
+ int64_t new_offset; |
+ err = _real_lseek(real_fd_, attr.offs, SEEK_SET, &new_offset); |
+ if (err) { |
+ LOG_WARN("_real_lseek failed: %s\n", strerror(err)); |
+ return err; |
+ } |
+ } |
size_t nread; |
err = _real_read(real_fd_, buf, count, &nread); |
- if (err) |
+ if (err) { |
+ LOG_WARN("_real_read failed: %s\n", strerror(err)); |
return err; |
+ } |
*out_bytes = static_cast<int>(nread); |
return 0; |
@@ -48,19 +57,24 @@ Error RealNode::Write(const HandleAttr& attr, |
const void* buf, |
size_t count, |
int* out_bytes) { |
- //nacl_io_log("Real::Write\n"); |
int err; |
*out_bytes = 0; |
- int64_t new_offset; |
- err = _real_lseek(real_fd_, attr.offs, 0, &new_offset); |
- if (err && err != ESPIPE) |
- return err; |
+ if (IsaFile()) { |
+ int64_t new_offset; |
+ err = _real_lseek(real_fd_, attr.offs, SEEK_SET, &new_offset); |
+ if (err) { |
+ LOG_WARN("_real_lseek failed: %s\n", strerror(err)); |
+ return err; |
+ } |
+ } |
size_t nwrote; |
err = _real_write(real_fd_, buf, count, &nwrote); |
- if (err) |
+ if (err) { |
+ LOG_WARN("_real_write failed: %s\n", strerror(err)); |
return err; |
+ } |
*out_bytes = static_cast<int>(nwrote); |
return 0; |
@@ -86,6 +100,12 @@ Error RealNode::GetStat(struct stat* stat) { |
int err = _real_fstat(real_fd_, stat); |
if (err) |
return err; |
+ // On windows, fstat() of stdin/stdout/stderr returns all zeros |
+ // for the permission bits. This can cause problems down the |
+ // line. For example, CanOpen() will fail. |
+ // TODO(sbc): Fix this within sel_ldr instead. |
+ if (S_ISCHR(stat->st_mode) && (stat->st_mode & S_IRWXU) == 0) |
+ stat->st_mode |= S_IRWXU; |
return 0; |
} |