aboutsummaryrefslogtreecommitdiff
path: root/src/os
diff options
context:
space:
mode:
Diffstat (limited to 'src/os')
-rw-r--r--src/os/fs.c52
-rw-r--r--src/os/os.h2
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