Mercurial > vim
diff src/fileio.c @ 15816:40336d427dd2 v8.1.0915
patch 8.1.0915: fsync() may not work properly on Mac
commit https://github.com/vim/vim/commit/a787019518a540a7b4d0070f15467931b870ac89
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Feb 14 12:56:36 2019 +0100
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 14 Feb 2019 13:00:22 +0100 |
parents | 0d8291665b59 |
children | 734b1928a5aa |
line wrap: on
line diff
--- a/src/fileio.c +++ b/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.