diff src/ex_cmds.c @ 601:bc7ec0f1f7f3 v7.0170

updated for version 7.0170
author vimboss
date Wed, 14 Dec 2005 22:08:35 +0000
parents 3686831cf3da
children 9e359e5759f6
line wrap: on
line diff
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1656,6 +1656,9 @@ write_viminfo(file, forceit)
     int		shortname = FALSE;	/* use 8.3 file name */
     struct stat	st_old;		/* mch_stat() of existing viminfo file */
 #endif
+#ifdef WIN3264
+    long	perm = -1;
+#endif
 
     if (no_viminfo())
 	return;
@@ -1713,6 +1716,10 @@ write_viminfo(file, forceit)
 	    goto end;
 	}
 #endif
+#ifdef WIN3264
+	/* Get the file attributes of the existing viminfo file. */
+	perm = mch_getperm(fname);
+#endif
 
 	/*
 	 * Make tempname.
@@ -1803,15 +1810,16 @@ write_viminfo(file, forceit)
 	    int	fd;
 
 	    /* Use mch_open() to be able to use O_NOFOLLOW and set file
-	     * protection same as original file, but strip s-bit. */
+	     * protection:
+	     * Unix: same as original file, but strip s-bit.
+	     * Others: r&w for user only. */
 #ifdef UNIX
 	    fd = mch_open((char *)tempname,
 		    O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW,
 				       (int)((st_old.st_mode & 0777) | 0600));
 #else
 	    fd = mch_open((char *)tempname,
-		    O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW,
-				       0600);	/* r&w for user only */
+		    O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW, 0600);
 #endif
 	    if (fd < 0)
 		fp_out = NULL;
@@ -1866,12 +1874,21 @@ write_viminfo(file, forceit)
     if (fp_in != NULL)
     {
 	fclose(fp_in);
+
 	/*
-	 * In case of an error, don't overwrite the original viminfo file.
+	 * In case of an error keep the original viminfo file.
+	 * Otherwise rename the newly written file.
 	 */
 	if (viminfo_errcnt || vim_rename(tempname, fname) == -1)
 	    mch_remove(tempname);
-    }
+
+#ifdef WIN3264
+	/* If the viminfo file was hidden then also hide the new file. */
+	if (perm > 0 && (perm & FILE_ATTRIBUTE_HIDDEN))
+	    mch_hide(fname);
+#endif
+    }
+
 end:
     vim_free(fname);
     vim_free(tempname);