changeset 6721:7347229a646a v7.4.684

updated for version 7.4.684 Problem: When starting several Vim instances in diff mode, the temp files used may not be unique. (Issue 353) Solution: Add an argument to vim_tempname() to keep the file.
author Bram Moolenaar <bram@vim.org>
date Tue, 31 Mar 2015 13:33:08 +0200
parents 1f42458bf2e7
children 81f0b85eb236
files src/diff.c src/eval.c src/ex_cmds.c src/fileio.c src/hardcopy.c src/if_cscope.c src/memline.c src/misc1.c src/os_unix.c src/proto/fileio.pro src/quickfix.c src/spell.c src/version.c
diffstat 13 files changed, 29 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/diff.c
+++ b/src/diff.c
@@ -688,9 +688,9 @@ ex_diffupdate(eap)
 	return;
 
     /* We need three temp file names. */
-    tmp_orig = vim_tempname('o');
-    tmp_new = vim_tempname('n');
-    tmp_diff = vim_tempname('d');
+    tmp_orig = vim_tempname('o', TRUE);
+    tmp_new = vim_tempname('n', TRUE);
+    tmp_diff = vim_tempname('d', TRUE);
     if (tmp_orig == NULL || tmp_new == NULL || tmp_diff == NULL)
 	goto theend;
 
@@ -920,8 +920,8 @@ ex_diffpatch(eap)
 #endif
 
     /* We need two temp file names. */
-    tmp_orig = vim_tempname('o');
-    tmp_new = vim_tempname('n');
+    tmp_orig = vim_tempname('o', FALSE);
+    tmp_new = vim_tempname('n', FALSE);
     if (tmp_orig == NULL || tmp_new == NULL)
 	goto theend;
 
--- a/src/eval.c
+++ b/src/eval.c
@@ -18775,7 +18775,7 @@ get_cmd_output_as_rettv(argvars, rettv, 
 	 * Write the string to a temp file, to be used for input of the shell
 	 * command.
 	 */
-	if ((infile = vim_tempname('i')) == NULL)
+	if ((infile = vim_tempname('i', TRUE)) == NULL)
 	{
 	    EMSG(_(e_notmp));
 	    goto errret;
@@ -19134,7 +19134,7 @@ f_tempname(argvars, rettv)
     static int	x = 'A';
 
     rettv->v_type = VAR_STRING;
-    rettv->vval.v_string = vim_tempname(x);
+    rettv->vval.v_string = vim_tempname(x, FALSE);
 
     /* Advance 'x' to use A-Z and 0-9, so that there are at least 34 different
      * names.  Skip 'I' and 'O', they are used for shell redirection. */
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1158,8 +1158,8 @@ do_filter(line1, line2, eap, cmd, do_in,
     }
     else
 #endif
-	if ((do_in && (itmp = vim_tempname('i')) == NULL)
-		|| (do_out && (otmp = vim_tempname('o')) == NULL))
+	if ((do_in && (itmp = vim_tempname('i', FALSE)) == NULL)
+		|| (do_out && (otmp = vim_tempname('o', FALSE)) == NULL))
 	{
 	    EMSG(_(e_notmp));
 	    goto filterend;
@@ -1963,7 +1963,7 @@ write_viminfo(file, forceit)
 	    if (fp_out == NULL)
 	    {
 		vim_free(tempname);
-		if ((tempname = vim_tempname('o')) != NULL)
+		if ((tempname = vim_tempname('o', TRUE)) != NULL)
 		    fp_out = mch_fopen((char *)tempname, WRITEBIN);
 	    }
 
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2872,7 +2872,7 @@ readfile_charconvert(fname, fenc, fdp)
     char_u	*tmpname;
     char_u	*errmsg = NULL;
 
-    tmpname = vim_tempname('r');
+    tmpname = vim_tempname('r', FALSE);
     if (tmpname == NULL)
 	errmsg = (char_u *)_("Can't find temp file for conversion");
     else
@@ -4288,7 +4288,7 @@ buf_write(buf, fname, sfname, start, end
 	     */
 	    if (*p_ccv != NUL)
 	    {
-		wfname = vim_tempname('w');
+		wfname = vim_tempname('w', FALSE);
 		if (wfname == NULL)	/* Can't write without a tempfile! */
 		{
 		    errmsg = (char_u *)_("E214: Can't find temp file for writing");
@@ -7344,14 +7344,16 @@ vim_settempdir(tempdir)
 /*
  * vim_tempname(): Return a unique name that can be used for a temp file.
  *
- * The temp file is NOT created.
+ * The temp file is NOT garanteed to be created.  If "keep" is FALSE it is
+ * garanteed to NOT be created.
  *
  * The returned pointer is to allocated memory.
  * The returned pointer is NULL if no valid name was found.
  */
     char_u  *
-vim_tempname(extra_char)
+vim_tempname(extra_char, keep)
     int	    extra_char UNUSED;  /* char to use in the name instead of '?' */
+    int	    keep UNUSED;
 {
 #ifdef USE_TMPNAM
     char_u	itmp[L_tmpnam];	/* use tmpnam() */
@@ -7487,8 +7489,9 @@ vim_tempname(extra_char)
     buf4[2] = extra_char;   /* make it "VIa", "VIb", etc. */
     if (GetTempFileName(szTempFile, buf4, 0, itmp) == 0)
 	return NULL;
-    /* GetTempFileName() will create the file, we don't want that */
-    (void)DeleteFile(itmp);
+    if (!keep)
+	/* GetTempFileName() will create the file, we don't want that */
+	(void)DeleteFile(itmp);
 
     /* Backslashes in a temp file name cause problems when filtering with
      * "sh".  NOTE: This also checks 'shellcmdflag' to help those people who
--- a/src/hardcopy.c
+++ b/src/hardcopy.c
@@ -2751,7 +2751,7 @@ mch_print_init(psettings, jobname, force
     /* If the user didn't specify a file name, use a temp file. */
     if (psettings->outfile == NULL)
     {
-	prt_ps_file_name = vim_tempname('p');
+	prt_ps_file_name = vim_tempname('p', TRUE);
 	if (prt_ps_file_name == NULL)
 	{
 	    EMSG(_(e_notmp));
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -1269,7 +1269,7 @@ cs_find_common(opt, pat, forceit, verbos
     {
 	/* fill error list */
 	FILE	    *f;
-	char_u	    *tmp = vim_tempname('c');
+	char_u	    *tmp = vim_tempname('c', TRUE);
 	qf_info_T   *qi = NULL;
 	win_T	    *wp = NULL;
 
--- a/src/memline.c
+++ b/src/memline.c
@@ -757,7 +757,7 @@ ml_open_file(buf)
     /* For a spell buffer use a temp file name. */
     if (buf->b_spell)
     {
-	fname = vim_tempname('s');
+	fname = vim_tempname('s', FALSE);
 	if (fname != NULL)
 	    (void)mf_open_file(mfp, fname);	/* consumes fname! */
 	buf->b_may_swap = FALSE;
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -11049,7 +11049,7 @@ get_cmd_output(cmd, infile, flags, ret_l
 	return NULL;
 
     /* get a name for the temp file */
-    if ((tempname = vim_tempname('o')) == NULL)
+    if ((tempname = vim_tempname('o', FALSE)) == NULL)
     {
 	EMSG(_(e_notmp));
 	return NULL;
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -5838,7 +5838,7 @@ mch_expand_wildcards(num_pat, pat, num_f
     /*
      * get a name for the temp file
      */
-    if ((tempname = vim_tempname('o')) == NULL)
+    if ((tempname = vim_tempname('o', FALSE)) == NULL)
     {
 	EMSG(_(e_notmp));
 	return FAIL;
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -23,7 +23,7 @@ void buf_reload __ARGS((buf_T *buf, int 
 void buf_store_time __ARGS((buf_T *buf, struct stat *st, char_u *fname));
 void write_lnum_adjust __ARGS((linenr_T offset));
 void vim_deltempdir __ARGS((void));
-char_u *vim_tempname __ARGS((int extra_char));
+char_u *vim_tempname __ARGS((int extra_char, int keep));
 void forward_slash __ARGS((char_u *fname));
 void aubuflocal_remove __ARGS((buf_T *buf));
 int au_has_group __ARGS((char_u *name));
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2945,7 +2945,7 @@ get_mef_name()
 
     if (*p_mef == NUL)
     {
-	name = vim_tempname('e');
+	name = vim_tempname('e', FALSE);
 	if (name == NULL)
 	    EMSG(_(e_notmp));
 	return name;
--- a/src/spell.c
+++ b/src/spell.c
@@ -9426,7 +9426,7 @@ spell_add_word(word, len, bad, idx, undo
     {
 	if (int_wordlist == NULL)
 	{
-	    int_wordlist = vim_tempname('s');
+	    int_wordlist = vim_tempname('s', FALSE);
 	    if (int_wordlist == NULL)
 		return;
 	}
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    684,
+/**/
     683,
 /**/
     682,