Patch 7.2.294
Problem:    When using TEMPDIRS dir name could get too long.
Solution:   Overwrite tail instead of appending each time.  Use mkdtemp() when
            available. (James Vega)
Files:      src/auto/configure, src/config.h.in, src/configure.in, src/fileio.c


*** ../vim-7.2.293/src/auto/configure   2009-09-11 13:44:33.000000000 +0200
--- src/auto/configure  2009-11-17 12:03:15.000000000 +0100
***************
*** 14019,14027 ****
  
  
  
  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 \
        setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
        sigvec strcasecmp strerror strftime stricmp strncasecmp \
        strnicmp strpbrk strtol tgetent towlower towupper iswupper \
--- 14019,14028 ----
  
  
  
+ 
  for ac_func in bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \
        getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \
!       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 \
*** ../vim-7.2.293/src/config.h.in      2009-05-21 23:25:38.000000000 +0200
--- src/config.h.in     2009-11-11 17:40:21.000000000 +0100
***************
*** 157,162 ****
--- 157,163 ----
  #undef HAVE_LSTAT
  #undef HAVE_MEMCMP
  #undef HAVE_MEMSET
+ #undef HAVE_MKDTEMP
  #undef HAVE_NANOSLEEP
  #undef HAVE_OPENDIR
  #undef HAVE_FLOAT_FUNCS
*** ../vim-7.2.293/src/configure.in     2009-09-11 13:44:33.000000000 +0200
--- src/configure.in    2009-11-11 17:40:21.000000000 +0100
***************
*** 2635,2641 ****
  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 \
        setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
        sigvec strcasecmp strerror strftime stricmp strncasecmp \
        strnicmp strpbrk strtol tgetent towlower towupper iswupper \
--- 2635,2641 ----
  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 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 \
*** ../vim-7.2.293/src/fileio.c 2009-09-11 17:24:01.000000000 +0200
--- src/fileio.c        2009-11-11 18:01:22.000000000 +0100
***************
*** 146,151 ****
--- 146,152 ----
  # 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,6992 ****
--- 6988,7020 ----
  #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,7014 ****
  #ifdef TEMPDIRNAMES
      static char       *(tempdirs[]) = {TEMPDIRNAMES};
      int               i;
-     long      nr;
-     long      off;
  # ifndef EEXIST
      struct stat       st;
  # endif
--- 7035,7040 ----
***************
*** 7027,7032 ****
--- 7053,7064 ----
         */
        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,7046 ****
--- 7072,7085 ----
                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,7110 ****
                for (off = 0; off < 10000L; ++off)
                {
                    int         r;
! #if defined(UNIX) || defined(VMS)
                    mode_t      umask_save;
! #endif
  
!                   sprintf((char *)itmp + STRLEN(itmp), "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)
                    /* Make sure the umask doesn't remove the executable bit.
                     * "repl" has been reported to use "177". */
                    umask_save = umask(077);
! #endif
                    r = vim_mkdir(itmp, 0700);
! #if defined(UNIX) || defined(VMS)
                    (void)umask(umask_save);
! #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);
!                       }
                        break;
                    }
! # 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
                        break;
                }
                if (vim_tempdir != NULL)
                    break;
            }
--- 7091,7131 ----
                for (off = 0; off < 10000L; ++off)
                {
                    int         r;
! #  if defined(UNIX) || defined(VMS)
                    mode_t      umask_save;
! #  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)
                    /* Make sure the umask doesn't remove the executable bit.
                     * "repl" has been reported to use "177". */
                    umask_save = umask(077);
! #  endif
                    r = vim_mkdir(itmp, 0700);
! #  if defined(UNIX) || defined(VMS)
                    (void)umask(umask_save);
! #  endif
                    if (r == 0)
                    {
!                       vim_settempdir(itmp);
                        break;
                    }
! #  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
                        break;
                }
+ # endif /* HAVE_MKDTEMP */
                if (vim_tempdir != NULL)
                    break;
            }
*** ../vim-7.2.293/src/version.c        2009-11-11 17:30:05.000000000 +0100
--- src/version.c       2009-11-17 11:54:49.000000000 +0100
***************
*** 683,684 ****
--- 683,686 ----
  {   /* Add new patch number below this line */
+ /**/
+     294,
  /**/

-- 
ARTHUR:       Now stand aside worthy adversary.
BLACK KNIGHT: (Glancing at his shoulder) 'Tis but a scratch.
ARTHUR:       A scratch?  Your arm's off.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui