Index: native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
index ed2ab0c404d9368089c6aa2afbca2f2edbeac3b1..0cc3e9045fddc6e1cc4a02b7bd3fec372c3d232c 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_wrap_glibc.cc |
@@ -159,6 +159,7 @@ EXTERN_C_BEGIN |
OP(socketpair); \ |
OP(shutdown); \ |
\ |
+ OP(chmod); \ |
OP(access); \ |
OP(unlink); \ |
OP(fchdir); \ |
@@ -166,6 +167,7 @@ EXTERN_C_BEGIN |
OP(fsync); \ |
OP(fdatasync); \ |
OP(lstat); \ |
+ OP(link); \ |
OP(readlink); \ |
OP(utimes); |
@@ -335,6 +337,10 @@ int WRAP(lstat)(const char* pathname, struct nacl_abi_stat* nacl_buf) { |
return 0; |
} |
+int WRAP(link)(const char* pathname, const char* newpath) { |
+ ERRNO_RTN(ki_link(pathname, newpath)); |
+} |
+ |
int WRAP(readlink)(const char* pathname, |
char* buf, |
size_t count, |
@@ -349,6 +355,10 @@ int WRAP(utimes)(const char *filename, const struct timeval *times) { |
ERRNO_RTN(ki_utimes(filename, times)); |
} |
+int WRAP(chmod)(const char* pathname, mode_t mode) { |
+ ERRNO_RTN(ki_chmod(pathname, mode)); |
+} |
+ |
int WRAP(access)(const char* pathname, int amode) { |
ERRNO_RTN(ki_access(pathname, amode)); |
} |
@@ -511,6 +521,11 @@ static void assign_real_pointers() { |
if (!REAL(func)) \ |
assign_real_pointers(); |
+#define CHECK_REAL_NOSYS(func) \ |
+ CHECK_REAL(func) \ |
+ if (!REAL(func)) \ |
+ return ENOSYS; |
+ |
// "real" functions, i.e. the unwrapped original functions. |
int _real_close(int fd) { |
@@ -616,6 +631,11 @@ int _real_write(int fd, const void* buf, size_t count, size_t* nwrote) { |
return REAL(write)(fd, buf, count, nwrote); |
} |
+int _real_getcwd(char* pathname, size_t len) { |
+ CHECK_REAL_NOSYS(getcwd); |
+ return REAL(getcwd)(pathname, len); |
+} |
+ |
static bool s_wrapped = false; |
void kernel_wrap_init() { |
if (!s_wrapped) { |