components/vim/vim72-patches/7.2.076
changeset 379 c6a17bba1da3
parent 378 f0b61ed1d10d
child 380 e92b3b4a1c66
equal deleted inserted replaced
378:f0b61ed1d10d 379:c6a17bba1da3
     1 To: [email protected]
       
     2 Subject: Patch 7.2.076
       
     3 Fcc: outbox
       
     4 From: Bram Moolenaar <[email protected]>
       
     5 Mime-Version: 1.0
       
     6 Content-Type: text/plain; charset=ISO-8859-1
       
     7 Content-Transfer-Encoding: 8bit
       
     8 ------------
       
     9 
       
    10 Patch 7.2.076
       
    11 Problem:    rename(from, to) deletes the file if "from" and "to" are not equal
       
    12 	    but still refer to the same file.  E.g., on a FAT32 filesystem
       
    13 	    under Unix.
       
    14 Solution:   Go through another file name.
       
    15 Files:	    src/fileio.c
       
    16 
       
    17 
       
    18 *** ../vim-7.2.075/src/fileio.c	Fri Nov 28 21:26:50 2008
       
    19 --- src/fileio.c	Tue Dec 30 16:04:44 2008
       
    20 ***************
       
    21 *** 6119,6124 ****
       
    22 --- 6119,6165 ----
       
    23       if (mch_stat((char *)from, &st) < 0)
       
    24   	return -1;
       
    25   
       
    26 + #ifdef UNIX
       
    27 +     {
       
    28 + 	struct stat	st_to;
       
    29 + 	char		tempname[MAXPATHL + 1];
       
    30 + 
       
    31 + 	/* It's possible for the source and destination to be the same file.
       
    32 + 	 * This happens when "from" and "to" differ in case and are on a FAT32
       
    33 + 	 * filesystem.  In that case go through a temp file name. */
       
    34 + 	if (mch_stat((char *)to, &st_to) >= 0
       
    35 + 		&& st.st_dev == st_to.st_dev
       
    36 + 		&& st.st_ino == st_to.st_ino)
       
    37 + 	{
       
    38 + 	    /* Find a name that doesn't exist and is in the same directory.
       
    39 + 	     * Move "from" to "tempname" and then to "to". */
       
    40 + 	    if (STRLEN(from) >= MAXPATHL - 5)
       
    41 + 		return -1;
       
    42 + 	    STRCPY(tempname, from);
       
    43 + 	    for (n = 123; n < 99999; ++n)
       
    44 + 	    {
       
    45 + 		sprintf(gettail(tempname), "%d", n);
       
    46 + 		if (mch_stat(tempname, &st_to) < 0)
       
    47 + 		{
       
    48 + 		    if (mch_rename((char *)from, tempname) == 0)
       
    49 + 		    {
       
    50 + 			if (mch_rename(tempname, (char *)to) == 0)
       
    51 + 			    return 0;
       
    52 + 			/* Strange, the second step failed.  Try moving the
       
    53 + 			 * file back and return failure. */
       
    54 + 			mch_rename(tempname, (char *)from);
       
    55 + 			return -1;
       
    56 + 		    }
       
    57 + 		    /* If it fails for one temp name it will most likely fail
       
    58 + 		     * for any temp name, give up. */
       
    59 + 		    return -1;
       
    60 + 		}
       
    61 + 	    }
       
    62 + 	    return -1;
       
    63 + 	}
       
    64 +     }
       
    65 + #endif
       
    66 + 
       
    67       /*
       
    68        * Delete the "to" file, this is required on some systems to make the
       
    69        * mch_rename() work, on other systems it makes sure that we don't have
       
    70 *** ../vim-7.2.075/src/version.c	Wed Dec 24 14:24:41 2008
       
    71 --- src/version.c	Tue Dec 30 16:09:51 2008
       
    72 ***************
       
    73 *** 678,679 ****
       
    74 --- 678,681 ----
       
    75   {   /* Add new patch number below this line */
       
    76 + /**/
       
    77 +     76,
       
    78   /**/
       
    79 
       
    80 -- 
       
    81 FATAL ERROR! SYSTEM HALTED! - Press any key to continue doing nothing.
       
    82 
       
    83  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
       
    84 ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
       
    85 \\\        download, build and distribute -- http://www.A-A-P.org        ///
       
    86  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///