os_fchown: impl and remove HAVE_FCHOWN

This commit is contained in:
Pavel Platto
2014-07-14 00:04:59 +03:00
parent 563f38c317
commit 94f3d30306
6 changed files with 22 additions and 26 deletions

View File

@@ -38,7 +38,6 @@ check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(utime.h HAVE_UTIME_H) check_include_files(utime.h HAVE_UTIME_H)
# Functions # Functions
check_function_exists(fchown HAVE_FCHOWN)
check_function_exists(fseeko HAVE_FSEEKO) check_function_exists(fseeko HAVE_FSEEKO)
check_function_exists(fsync HAVE_FSYNC) check_function_exists(fsync HAVE_FSYNC)
check_function_exists(getpwent HAVE_GETPWENT) check_function_exists(getpwent HAVE_GETPWENT)

View File

@@ -18,7 +18,6 @@
#cmakedefine HAVE__NSGETENVIRON #cmakedefine HAVE__NSGETENVIRON
#cmakedefine HAVE_CRT_EXTERNS_H #cmakedefine HAVE_CRT_EXTERNS_H
#cmakedefine HAVE_DIRENT_H #cmakedefine HAVE_DIRENT_H
#cmakedefine HAVE_FCHOWN
#cmakedefine HAVE_FCNTL_H #cmakedefine HAVE_FCNTL_H
#cmakedefine HAVE_FD_CLOEXEC #cmakedefine HAVE_FD_CLOEXEC
#cmakedefine HAVE_FSEEKO #cmakedefine HAVE_FSEEKO

View File

@@ -1606,13 +1606,13 @@ void write_viminfo(char_u *file, int forceit)
fp_out = mch_fopen((char *)tempname, WRITEBIN); fp_out = mch_fopen((char *)tempname, WRITEBIN);
} }
#if defined(UNIX) && defined(HAVE_FCHOWN) #ifdef UNIX
/* /*
* Make sure the owner can read/write it. This only works for * Make sure the owner can read/write it. This only works for
* root. * root.
*/ */
if (fp_out != NULL) { if (fp_out != NULL) {
fchown(fileno(fp_out), old_info.stat.st_uid, old_info.stat.st_gid); os_fchown(fileno(fp_out), old_info.stat.st_uid, old_info.stat.st_gid);
} }
#endif #endif
} }

View File

@@ -2711,16 +2711,10 @@ buf_write (
* - it's a hard link * - it's a hard link
* - it's a symbolic link * - it's a symbolic link
* - we don't have write permission in the directory * - we don't have write permission in the directory
* - we can't set the owner/group of the new file
*/ */
if (file_info_old.stat.st_nlink > 1 if (file_info_old.stat.st_nlink > 1
|| !os_get_file_info_link((char *)fname, &file_info) || !os_get_file_info_link((char *)fname, &file_info)
|| !os_file_info_id_equal(&file_info, &file_info_old) || !os_file_info_id_equal(&file_info, &file_info_old)) {
# ifndef HAVE_FCHOWN
|| file_info.stat.st_uid != file_info_old.stat.st_uid
|| file_info.stat.st_gid != file_info_old.stat.st_gid
# endif
) {
backup_copy = TRUE; backup_copy = TRUE;
} else } else
# endif # endif
@@ -2744,9 +2738,7 @@ buf_write (
backup_copy = TRUE; backup_copy = TRUE;
else { else {
# ifdef UNIX # ifdef UNIX
# ifdef HAVE_FCHOWN os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
# endif
if (!os_get_file_info((char *)IObuff, &file_info) if (!os_get_file_info((char *)IObuff, &file_info)
|| file_info.stat.st_uid != file_info_old.stat.st_uid || file_info.stat.st_uid != file_info_old.stat.st_uid
|| file_info.stat.st_gid != file_info_old.stat.st_gid || file_info.stat.st_gid != file_info_old.stat.st_gid
@@ -2909,10 +2901,7 @@ buf_write (
* others. * others.
*/ */
if (file_info_new.stat.st_gid != file_info_old.stat.st_gid if (file_info_new.stat.st_gid != file_info_old.stat.st_gid
# ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */ && os_fchown(bfd, (uid_t)-1, file_info_old.stat.st_gid) != 0) {
&& fchown(bfd, (uid_t)-1, file_info_old.stat.st_gid) != 0
# endif
) {
os_setperm(backup, (perm & 0707) | ((perm & 07) << 3)); os_setperm(backup, (perm & 0707) | ((perm & 07) << 3));
} }
# ifdef HAVE_SELINUX # ifdef HAVE_SELINUX
@@ -3424,19 +3413,16 @@ restore_backup:
/* When creating a new file, set its owner/group to that of the original /* When creating a new file, set its owner/group to that of the original
* file. Get the new device and inode number. */ * file. Get the new device and inode number. */
if (backup != NULL && !backup_copy) { if (backup != NULL && !backup_copy) {
# ifdef HAVE_FCHOWN
/* don't change the owner when it's already OK, some systems remove /* don't change the owner when it's already OK, some systems remove
* permission or ACL stuff */ * permission or ACL stuff */
FileInfo file_info; FileInfo file_info;
if (!os_get_file_info((char *)wfname, &file_info) if (!os_get_file_info((char *)wfname, &file_info)
|| file_info.stat.st_uid != file_info_old.stat.st_uid || file_info.stat.st_uid != file_info_old.stat.st_uid
|| file_info.stat.st_gid != file_info_old.stat.st_gid) { || file_info.stat.st_gid != file_info_old.stat.st_gid) {
fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid); os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
if (perm >= 0) /* set permission again, may have changed */ if (perm >= 0) /* set permission again, may have changed */
(void)os_setperm(wfname, perm); (void)os_setperm(wfname, perm);
} }
# endif
buf_set_file_id(buf); buf_set_file_id(buf);
} else if (!buf->file_id_valid) { } else if (!buf->file_id_valid) {
// Set the file_id when creating a new file. // Set the file_id when creating a new file.

View File

@@ -210,6 +210,21 @@ int os_setperm(const char_u *name, int perm)
return FAIL; return FAIL;
} }
/// Changes the ownership of the file referred to by the open file descriptor.
///
/// @return `0` on success, a libuv error code on failure.
///
/// @note If the `owner` or `group` is specified as `-1`, then that ID is not
/// changed.
int os_fchown(int file_descriptor, uv_uid_t owner, uv_gid_t group)
{
uv_fs_t request;
int result = uv_fs_fchown(uv_default_loop(), &request, file_descriptor,
owner, group, NULL);
uv_fs_req_cleanup(&request);
return result;
}
/// Check if a file exists. /// Check if a file exists.
/// ///
/// @return `true` if `name` exists. /// @return `true` if `name` exists.

View File

@@ -1119,10 +1119,7 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash)
if (os_get_file_info((char *)buf->b_ffname, &file_info_old) if (os_get_file_info((char *)buf->b_ffname, &file_info_old)
&& os_get_file_info((char *)file_name, &file_info_new) && os_get_file_info((char *)file_name, &file_info_new)
&& file_info_old.stat.st_gid != file_info_new.stat.st_gid && file_info_old.stat.st_gid != file_info_new.stat.st_gid
# ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */ && os_fchown(fd, (uid_t)-1, file_info_old.stat.st_gid) != 0) {
&& fchown(fd, (uid_t)-1, file_info_old.stat.st_gid) != 0
# endif
) {
os_setperm(file_name, (perm & 0707) | ((perm & 07) << 3)); os_setperm(file_name, (perm & 0707) | ((perm & 07) << 3));
} }
# ifdef HAVE_SELINUX # ifdef HAVE_SELINUX