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/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.