| Index: native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
|
| 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 672f51c30825aa1c9a8b4febf07f1047128e7b0c..8fe8f9aab879f0fb368eebbd65b722a4d8abf98c 100644
|
| --- a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
|
| +++ b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc
|
| @@ -172,7 +172,7 @@ int KernelProxy::open_resource(const char* path) {
|
| return -1;
|
| }
|
|
|
| - return AllocateFD(handle);
|
| + return AllocateFD(handle, path);
|
| }
|
|
|
| int KernelProxy::open(const char* path, int open_flags) {
|
| @@ -192,7 +192,7 @@ int KernelProxy::open(const char* path, int open_flags) {
|
| return -1;
|
| }
|
|
|
| - return AllocateFD(handle);
|
| + return AllocateFD(handle, path);
|
| }
|
|
|
| int KernelProxy::pipe(int pipefds[2]) {
|
| @@ -233,13 +233,13 @@ int KernelProxy::close(int fd) {
|
|
|
| int KernelProxy::dup(int oldfd) {
|
| ScopedKernelHandle handle;
|
| - Error error = AcquireHandle(oldfd, &handle);
|
| + std::string path;
|
| + Error error = AcquireHandleAndPath(oldfd, &handle, &path);
|
| if (error) {
|
| errno = error;
|
| return -1;
|
| }
|
| -
|
| - return AllocateFD(handle);
|
| + return AllocateFD(handle, path);
|
| }
|
|
|
| int KernelProxy::dup2(int oldfd, int newfd) {
|
| @@ -248,13 +248,14 @@ int KernelProxy::dup2(int oldfd, int newfd) {
|
| return newfd;
|
|
|
| ScopedKernelHandle old_handle;
|
| - Error error = AcquireHandle(oldfd, &old_handle);
|
| + std::string old_path;
|
| + Error error = AcquireHandleAndPath(oldfd, &old_handle, &old_path);
|
| if (error) {
|
| errno = error;
|
| return -1;
|
| }
|
|
|
| - FreeAndReassignFD(newfd, old_handle);
|
| + FreeAndReassignFD(newfd, old_handle, old_path);
|
| return newfd;
|
| }
|
|
|
| @@ -514,8 +515,31 @@ int KernelProxy::getdents(int fd, void* buf, unsigned int count) {
|
| }
|
|
|
| int KernelProxy::fchdir(int fd) {
|
| - errno = ENOSYS;
|
| - return -1;
|
| + ScopedKernelHandle handle;
|
| + std::string path;
|
| + Error error = AcquireHandleAndPath(fd, &handle, &path);
|
| + if (error) {
|
| + errno = error;
|
| + return -1;
|
| + }
|
| +
|
| + if (!handle->node()->IsaDir()) {
|
| + errno = ENOTDIR;
|
| + return -1;
|
| + }
|
| +
|
| + if (path.empty()) {
|
| + errno = EBADF;
|
| + return -1;
|
| + }
|
| +
|
| + error = SetCWD(path);
|
| + if (error) {
|
| + // errno is return value from SetCWD
|
| + errno = error;
|
| + return -1;
|
| + }
|
| + return 0;
|
| }
|
|
|
| int KernelProxy::ftruncate(int fd, off_t length) {
|
|
|