| To: vim-dev@vim.org |
| Subject: Patch 7.2.294 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| 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 |
| |
| |
| |
| |
| |
| *** 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 \ |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 \ |
| |
| |
| |
| *** 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; |
| } |
| |
| |
| |
| *** 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 -- Bram@Moolenaar.net -- 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 /// |