]> granicus.if.org Git - vim/commitdiff
patch 8.1.0915: fsync() may not work properly on Mac v8.1.0915
authorBram Moolenaar <Bram@vim.org>
Thu, 14 Feb 2019 11:56:36 +0000 (12:56 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 14 Feb 2019 11:56:36 +0000 (12:56 +0100)
Problem:    fsync() may not work properly on Mac.
Solution:   Use fcntl() with F_FULLFSYNC. (suggested by Justin M. Keyes)

src/evalfunc.c
src/fileio.c
src/memfile.c
src/proto/fileio.pro
src/version.c

index 6538b36d3c42151e0397cd08a6e4e0388b749e62..e693ef9137b9a8a6301454e06e7b82be95a48211 100644 (file)
@@ -14791,7 +14791,7 @@ f_writefile(typval_T *argvars, typval_T *rettv)
        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 @@ f_writefile(typval_T *argvars, typval_T *rettv)
        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);
     }
index c7f3ad1768dec1ba7fb33f884520cabe62420284..f9e18d413a38ef44cd083ffc270936fab6556e94 100644 (file)
@@ -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.
index f2e774a4eddb872672589d6832e88e6b708361bf..1a527340adb7c502b0f9b18a41851f7f6b307014 100644 (file)
@@ -600,7 +600,7 @@ mf_sync(memfile_T *mfp, int flags)
         */
        if (STRCMP(p_sws, "fsync") == 0)
        {
-           if (fsync(mfp->mf_fd))
+           if (vim_fsync(mfp->mf_fd))
                status = FAIL;
        }
        else
@@ -617,7 +617,7 @@ mf_sync(memfile_T *mfp, int flags)
 #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 @@ mf_sync(memfile_T *mfp, int flags)
 #endif
 #ifdef AMIGA
 # if defined(__AROS__) || defined(__amigaos4__)
-       if (fsync(mfp->mf_fd) != 0)
+       if (vim_fsync(mfp->mf_fd) != 0)
            status = FAIL;
 # else
        /*
index 21ac55c9d1454d9c2c6f8a9f20febed948daeb65..e99cbc8bfde09cac382645bc5da06911ea0061a9 100644 (file)
@@ -7,6 +7,7 @@ void set_file_options(int set_options, exarg_T *eap);
 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);
index ed224a454ce5723cf908c6a6892416992ad5088b..d0255a1b8eb19d5d27f5e946ea17a28817585a2a 100644 (file)
@@ -783,6 +783,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    915,
 /**/
     914,
 /**/