diff options
Diffstat (limited to 'src/os')
| -rw-r--r-- | src/os/fs.c | 52 | ||||
| -rw-r--r-- | src/os/os.h | 2 |
2 files changed, 42 insertions, 12 deletions
diff --git a/src/os/fs.c b/src/os/fs.c index e8525cb279..4c1b05b678 100644 --- a/src/os/fs.c +++ b/src/os/fs.c @@ -177,13 +177,8 @@ int mch_is_absolute_path(const char_u *fname) */ int mch_isdir(const char_u *name) { - uv_fs_t request; - int result = uv_fs_stat(uv_default_loop(), &request, (const char*) name, NULL); - uint64_t mode = request.statbuf.st_mode; - - uv_fs_req_cleanup(&request); - - if (0 != result) { + long mode = mch_getperm(name); + if (mode < 0) { return FALSE; } @@ -219,12 +214,9 @@ int mch_can_exe(const char_u *name) */ static int is_executable(const char_u *name) { - uv_fs_t request; - int result = uv_fs_stat(uv_default_loop(), &request, (const char*) name, NULL); - uint64_t mode = request.statbuf.st_mode; - uv_fs_req_cleanup(&request); + long mode = mch_getperm(name); - if (result != 0) { + if (mode < 0) { return FALSE; } @@ -287,3 +279,39 @@ static int is_executable_in_path(const char_u *name) assert(false); return FALSE; } + +/* + * Get file permissions for 'name'. + * Returns -1 when it doesn't exist. + */ +long mch_getperm(const char_u *name) +{ + uv_fs_t request; + int result = uv_fs_stat(uv_default_loop(), &request, (const char*) name, NULL); + uint64_t mode = request.statbuf.st_mode; + uv_fs_req_cleanup(&request); + + if (result != 0) { + return -1; + } else { + return (long) mode; + } +} + +/* + * Set file permission for 'name' to 'perm'. + * Returns FAIL for failure, OK otherwise. + */ +int mch_setperm(const char_u *name, int perm) +{ + uv_fs_t request; + int result = uv_fs_chmod(uv_default_loop(), &request, + (const char*)name, perm, NULL); + uv_fs_req_cleanup(&request); + + if (result != 0) { + return FAIL; + } else { + return OK; + } +} diff --git a/src/os/os.h b/src/os/os.h index 0d64f489cd..5a8c8fc005 100644 --- a/src/os/os.h +++ b/src/os/os.h @@ -17,5 +17,7 @@ int mch_get_usernames(garray_T *usernames); int mch_get_user_name(char *s, size_t len); int mch_get_uname(uid_t uid, char *s, size_t len); char *mch_get_user_directory(const char *name); +long mch_getperm(const char_u *name); +int mch_setperm(const char_u *name, int perm); #endif |