move check_file_readonly() into /src/os/fs.c and rename it

This commit is contained in:
Stefan Hoffmann
2014-03-16 15:01:22 +01:00
committed by Thiago de Arruda
parent 4a138137f7
commit 071d28076f
5 changed files with 33 additions and 39 deletions

View File

@@ -2496,15 +2496,11 @@ int not_writing(void)
*/ */
static int check_readonly(int *forceit, buf_T *buf) static int check_readonly(int *forceit, buf_T *buf)
{ {
struct stat st;
/* Handle a file being readonly when the 'readonly' option is set or when /* Handle a file being readonly when the 'readonly' option is set or when
* the file exists and permissions are read-only. * the file exists and permissions are read-only. */
* We will send 0777 to check_file_readonly(), as the "perm" variable is
* important for device checks but not here. */
if (!*forceit && (buf->b_p_ro if (!*forceit && (buf->b_p_ro
|| (mch_stat((char *)buf->b_ffname, &st) >= 0 || (os_file_exists(buf->b_ffname)
&& check_file_readonly(buf->b_ffname, 0777)))) { && os_file_is_readonly((char *)buf->b_ffname)))) {
if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL) { if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL) {
char_u buff[DIALOG_MSG_SIZE]; char_u buff[DIALOG_MSG_SIZE];

View File

@@ -71,9 +71,6 @@ static int crypt_seed_len[] = {0, 8};
#define CRYPT_SALT_LEN_MAX 8 #define CRYPT_SALT_LEN_MAX 8
#define CRYPT_SEED_LEN_MAX 8 #define CRYPT_SEED_LEN_MAX 8
/* Is there any system that doesn't have access()? */
#define USE_MCH_ACCESS
static char_u *next_fenc(char_u **pp); static char_u *next_fenc(char_u **pp);
static char_u *readfile_charconvert(char_u *fname, char_u *fenc, static char_u *readfile_charconvert(char_u *fname, char_u *fenc,
int *fdp); int *fdp);
@@ -2443,34 +2440,6 @@ set_file_time (
} }
#endif /* UNIX */ #endif /* UNIX */
/*
* Return TRUE if a file appears to be read-only from the file permissions.
*/
int
check_file_readonly (
char_u *fname, /* full path to file */
int perm /* known permissions on file */
)
{
#ifndef USE_MCH_ACCESS
int fd = 0;
#endif
return
#ifdef USE_MCH_ACCESS
# ifdef UNIX
(perm & 0222) == 0 ||
# endif
mch_access((char *)fname, W_OK)
#else
(fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
? TRUE : (close(fd), FALSE)
#endif
;
}
/* /*
* buf_write() - write to file "fname" lines "start" through "end" * buf_write() - write to file "fname" lines "start" through "end"
* *
@@ -2887,7 +2856,7 @@ buf_write (
* Check if the file is really writable (when renaming the file to * Check if the file is really writable (when renaming the file to
* make a backup we won't discover it later). * make a backup we won't discover it later).
*/ */
file_readonly = check_file_readonly(fname, (int)perm); file_readonly = os_file_is_readonly((char *)fname);
if (!forceit && file_readonly) { if (!forceit && file_readonly) {
if (vim_strchr(p_cpo, CPO_FWRITE) != NULL) { if (vim_strchr(p_cpo, CPO_FWRITE) != NULL) {

View File

@@ -278,3 +278,13 @@ int os_file_exists(const char_u *name)
} }
} }
// return TRUE if a file appears to be read-only from the file permissions.
int os_file_is_readonly(const char *name)
{
if (mch_access(name, W_OK) == 0) {
return FALSE;
} else {
return TRUE;
}
}

View File

@@ -68,5 +68,6 @@ int os_get_usernames(garray_T *usernames);
int os_get_user_name(char *s, size_t len); int os_get_user_name(char *s, size_t len);
int os_get_uname(uid_t uid, char *s, size_t len); int os_get_uname(uid_t uid, char *s, size_t len);
char *os_get_user_directory(const char *name); char *os_get_user_directory(const char *name);
int os_file_is_readonly(const char *name);
#endif // NEOVIM_OS_OS_H #endif // NEOVIM_OS_OS_H

View File

@@ -19,6 +19,7 @@ int os_can_exe(char_u *name);
int32_t os_getperm(char_u *name); int32_t os_getperm(char_u *name);
int os_setperm(char_u *name, long perm); int os_setperm(char_u *name, long perm);
int os_file_exists(const char_u *name); int os_file_exists(const char_u *name);
int os_file_is_readonly(char *fname);
]] ]]
-- import constants parsed by ffi -- import constants parsed by ffi
@@ -282,6 +283,9 @@ describe 'fs function', ->
os_setperm = (filename, perm) -> os_setperm = (filename, perm) ->
fs.os_setperm (to_cstr filename), perm fs.os_setperm (to_cstr filename), perm
os_file_is_readonly = (filename) ->
fs.os_file_is_readonly (to_cstr filename)
bit_set = (number, check_bit) -> bit_set = (number, check_bit) ->
if 0 == (bit.band number, check_bit) then false else true if 0 == (bit.band number, check_bit) then false else true
@@ -322,6 +326,20 @@ describe 'fs function', ->
perm = ffi.C.kS_IXUSR perm = ffi.C.kS_IXUSR
eq FAIL, (os_setperm 'non-existing-file', perm) eq FAIL, (os_setperm 'non-existing-file', perm)
describe 'os_file_is_readonly', ->
it 'returns TRUE if the file is readonly', ->
perm = os_getperm 'unit-test-directory/test.file'
perm_orig = perm
perm = unset_bit perm, ffi.C.kS_IWUSR
perm = unset_bit perm, ffi.C.kS_IWGRP
perm = unset_bit perm, ffi.C.kS_IWOTH
eq OK, (os_setperm 'unit-test-directory/test.file', perm)
eq TRUE, os_file_is_readonly 'unit-test-directory/test.file'
eq OK, (os_setperm 'unit-test-directory/test.file', perm_orig)
it 'returns FALSE if the file is writable', ->
eq FALSE, os_file_is_readonly 'unit-test-directory/test.file'
describe 'os_file_exists', -> describe 'os_file_exists', ->
os_file_exists = (filename) -> os_file_exists = (filename) ->
fs.os_file_exists (to_cstr filename) fs.os_file_exists (to_cstr filename)