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)
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 6538b36..e693ef9 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -14791,7 +14791,7 @@
else if (do_fsync)
// Ignore the error, the user wouldn't know what to do about it.
// May happen for a device.
- vim_ignored = fsync(fileno(fd));
+ vim_ignored = vim_fsync(fileno(fd));
#endif
fclose(fd);
}
@@ -14803,7 +14803,7 @@
else if (do_fsync)
/* Ignore the error, the user wouldn't know what to do about it.
* May happen for a device. */
- vim_ignored = fsync(fileno(fd));
+ vim_ignored = vim_fsync(fileno(fd));
#endif
fclose(fd);
}
diff --git a/src/fileio.c b/src/fileio.c
index c7f3ad1..f9e18d4 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -4661,7 +4661,7 @@
* 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 @@
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.
diff --git a/src/memfile.c b/src/memfile.c
index f2e774a..1a52734 100644
--- a/src/memfile.c
+++ b/src/memfile.c
@@ -600,7 +600,7 @@
*/
if (STRCMP(p_sws, "fsync") == 0)
{
- if (fsync(mfp->mf_fd))
+ if (vim_fsync(mfp->mf_fd))
status = FAIL;
}
else
@@ -617,7 +617,7 @@
#ifdef VMS
if (STRCMP(p_sws, "fsync") == 0)
{
- if (fsync(mfp->mf_fd))
+ if (vim_fsync(mfp->mf_fd))
status = FAIL;
}
#endif
@@ -627,7 +627,7 @@
#endif
#ifdef AMIGA
# if defined(__AROS__) || defined(__amigaos4__)
- if (fsync(mfp->mf_fd) != 0)
+ if (vim_fsync(mfp->mf_fd) != 0)
status = FAIL;
# else
/*
diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro
index 21ac55c..e99cbc8 100644
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -7,6 +7,7 @@
void set_forced_fenc(exarg_T *eap);
int check_file_readonly(char_u *fname, int perm);
int buf_write(buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering);
+int vim_fsync(int fd);
void msg_add_fname(buf_T *buf, char_u *fname);
void msg_add_lines(int insert_space, long lnum, off_T nchars);
char_u *shorten_fname1(char_u *full_path);
diff --git a/src/version.c b/src/version.c
index ed224a4..d0255a1 100644
--- a/src/version.c
+++ b/src/version.c
@@ -784,6 +784,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 915,
+/**/
914,
/**/
913,