# HG changeset patch # User vimboss # Date 1258456132 0 # Node ID 1f53050b38688e127c4ea67251ab2730002541bd # Parent 077c15286de8e37250ed1337a448c740c86ee740 updated for version 7.2-294 diff --git a/src/auto/configure b/src/auto/configure --- a/src/auto/configure +++ b/src/auto/configure @@ -14019,9 +14019,10 @@ fi + for ac_func in bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \ getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \ - memset nanosleep opendir putenv qsort readlink select setenv \ + memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \ setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \ sigvec strcasecmp strerror strftime stricmp strncasecmp \ strnicmp strpbrk strtol tgetent towlower towupper iswupper \ diff --git a/src/config.h.in b/src/config.h.in --- a/src/config.h.in +++ b/src/config.h.in @@ -157,6 +157,7 @@ #undef HAVE_LSTAT #undef HAVE_MEMCMP #undef HAVE_MEMSET +#undef HAVE_MKDTEMP #undef HAVE_NANOSLEEP #undef HAVE_OPENDIR #undef HAVE_FLOAT_FUNCS diff --git a/src/configure.in b/src/configure.in --- a/src/configure.in +++ b/src/configure.in @@ -2635,7 +2635,7 @@ fi dnl Check for functions in one big call, to reduce the size of configure AC_CHECK_FUNCS(bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \ getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \ - memset nanosleep opendir putenv qsort readlink select setenv \ + memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \ setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \ sigvec strcasecmp strerror strftime stricmp strncasecmp \ strnicmp strpbrk strtol tgetent towlower towupper iswupper \ diff --git a/src/fileio.c b/src/fileio.c --- a/src/fileio.c +++ b/src/fileio.c @@ -146,6 +146,7 @@ static int get_mac_fio_flags __ARGS((cha # endif #endif static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf)); +static void vim_settempdir __ARGS((char_u *tempdir)); #ifdef FEAT_AUTOCMD static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name"); #endif @@ -6987,6 +6988,33 @@ vim_deltempdir() #endif /* + * Directory "tempdir" was created. Expand this name to a full path and put + * it in "vim_tempdir". This avoids that using ":cd" would confuse us. + * "tempdir" must be no longer than MAXPATHL. + */ + static void +vim_settempdir(tempdir) + char_u *tempdir; +{ + char_u *buf; + + buf = alloc((unsigned)MAXPATHL + 2); + if (buf != NULL) + { + if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL) + STRCPY(buf, tempdir); +# ifdef __EMX__ + if (vim_strchr(buf, '/') != NULL) + STRCAT(buf, "/"); + else +# endif + add_pathsep(buf); + vim_tempdir = vim_strsave(buf); + vim_free(buf); + } +} + +/* * vim_tempname(): Return a unique name that can be used for a temp file. * * The temp file is NOT created. @@ -7007,8 +7035,6 @@ vim_tempname(extra_char) #ifdef TEMPDIRNAMES static char *(tempdirs[]) = {TEMPDIRNAMES}; int i; - long nr; - long off; # ifndef EEXIST struct stat st; # endif @@ -7027,6 +7053,12 @@ vim_tempname(extra_char) */ for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i) { + size_t itmplen; +# ifndef HAVE_MKDTEMP + long nr; + long off; +# endif + /* expand $TMP, leave room for "/v1100000/999999999" */ expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20); if (mch_isdir(itmp)) /* directory exists */ @@ -7040,7 +7072,14 @@ vim_tempname(extra_char) else # endif add_pathsep(itmp); - + itmplen = STRLEN(itmp); + +# ifdef HAVE_MKDTEMP + /* Leave room for filename */ + STRCAT(itmp, "vXXXXXX"); + if (mkdtemp((char *)itmp) != NULL) + vim_settempdir(itmp); +# else /* Get an arbitrary number of up to 6 digits. When it's * unlikely that it already exists it will be faster, * otherwise it doesn't matter. The use of mkdir() avoids any @@ -7052,59 +7091,41 @@ vim_tempname(extra_char) for (off = 0; off < 10000L; ++off) { int r; -#if defined(UNIX) || defined(VMS) +# if defined(UNIX) || defined(VMS) mode_t umask_save; -#endif - - sprintf((char *)itmp + STRLEN(itmp), "v%ld", nr + off); -# ifndef EEXIST +# endif + + sprintf((char *)itmp + itmplen, "v%ld", nr + off); +# ifndef EEXIST /* If mkdir() does not set errno to EEXIST, check for * existing file here. There is a race condition then, * although it's fail-safe. */ if (mch_stat((char *)itmp, &st) >= 0) continue; -# endif -#if defined(UNIX) || defined(VMS) +# endif +# if defined(UNIX) || defined(VMS) /* Make sure the umask doesn't remove the executable bit. * "repl" has been reported to use "177". */ umask_save = umask(077); -#endif +# endif r = vim_mkdir(itmp, 0700); -#if defined(UNIX) || defined(VMS) +# if defined(UNIX) || defined(VMS) (void)umask(umask_save); -#endif +# endif if (r == 0) { - char_u *buf; - - /* Directory was created, use this name. - * Expand to full path; When using the current - * directory a ":cd" would confuse us. */ - buf = alloc((unsigned)MAXPATHL + 1); - if (buf != NULL) - { - if (vim_FullName(itmp, buf, MAXPATHL, FALSE) - == FAIL) - STRCPY(buf, itmp); -# ifdef __EMX__ - if (vim_strchr(buf, '/') != NULL) - STRCAT(buf, "/"); - else -# endif - add_pathsep(buf); - vim_tempdir = vim_strsave(buf); - vim_free(buf); - } + vim_settempdir(itmp); break; } -# ifdef EEXIST +# ifdef EEXIST /* If the mkdir() didn't fail because the file/dir exists, * we probably can't create any dir here, try another * place. */ if (errno != EEXIST) -# endif +# endif break; } +# endif /* HAVE_MKDTEMP */ if (vim_tempdir != NULL) break; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -682,6 +682,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 294, +/**/ 293, /**/ 292,