forked from aniani/vim
patch 8.1.0915: fsync() may not work properly on Mac
Problem: fsync() may not work properly on Mac. Solution: Use fcntl() with F_FULLFSYNC. (suggested by Justin M. Keyes)
This commit is contained in:
21
src/fileio.c
21
src/fileio.c
@@ -4661,7 +4661,7 @@ restore_backup:
|
||||
* work (could be a pipe).
|
||||
* If the 'fsync' option is FALSE, don't fsync(). Useful for laptops.
|
||||
*/
|
||||
if (p_fs && fsync(fd) != 0 && !device)
|
||||
if (p_fs && vim_fsync(fd) != 0 && !device)
|
||||
{
|
||||
errmsg = (char_u *)_(e_fsync);
|
||||
end = 0;
|
||||
@@ -5123,6 +5123,25 @@ nofail:
|
||||
return retval;
|
||||
}
|
||||
|
||||
#if defined(HAVE_FSYNC) || defined(PROTO)
|
||||
/*
|
||||
* Call fsync() with Mac-specific exception.
|
||||
* Return fsync() result: zero for success.
|
||||
*/
|
||||
int
|
||||
vim_fsync(int fd)
|
||||
{
|
||||
int r;
|
||||
|
||||
# ifdef MACOS_X
|
||||
r = fcntl(fd, F_FULLFSYNC);
|
||||
if (r != 0 && errno == ENOTTY)
|
||||
# endif
|
||||
r = fsync(fd);
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Set the name of the current buffer. Use when the buffer doesn't have a
|
||||
* name and a ":r" or ":w" command with a file name is used.
|
||||
|
||||
Reference in New Issue
Block a user