]> granicus.if.org Git - vim/commitdiff
updated for version 7.1-027 v7.1.027
authorBram Moolenaar <Bram@vim.org>
Tue, 10 Jul 2007 15:10:54 +0000 (15:10 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 10 Jul 2007 15:10:54 +0000 (15:10 +0000)
src/fileio.c
src/os_unix.h
src/version.c

index 6fd2799c8c5c874f1eb360b806e90f8f31be76ef..3f094d4ef1ea022808aad340823c6b44b379bfe1 100644 (file)
 /* Is there any system that doesn't have access()? */
 #define USE_MCH_ACCESS
 
+#if defined(sun) && defined(S_ISCHR)
+# define OPEN_CHR_FILES
+static int is_dev_fd_file(char_u *fname);
+#endif
 #ifdef FEAT_MBYTE
 static char_u *next_fenc __ARGS((char_u **pp));
 # ifdef FEAT_EVAL
@@ -405,6 +409,10 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
 # endif
 # ifdef S_ISSOCK
                      && !S_ISSOCK(perm)            /* ... or socket */
+# endif
+# ifdef OPEN_CHR_FILES
+                     && !(S_ISCHR(perm) && is_dev_fd_file(fname))
+                       /* ... or a character special file named /dev/fd/<n> */
 # endif
                                                )
        {
@@ -2265,6 +2273,13 @@ failed:
            }
 #  endif
 # endif
+# ifdef OPEN_CHR_FILES
+           if (S_ISCHR(perm))                      /* or character special */
+           {
+               STRCAT(IObuff, _("[character special]"));
+               c = TRUE;
+           }
+# endif
 #endif
            if (curbuf->b_p_ro)
            {
@@ -2464,6 +2479,25 @@ failed:
     return OK;
 }
 
+#ifdef OPEN_CHR_FILES
+/*
+ * Returns TRUE if the file name argument is of the form "/dev/fd/\d\+",
+ * which is the name of files used for process substitution output by
+ * some shells on some operating systems, e.g., bash on SunOS.
+ * Do not accept "/dev/fd/[012]", opening these may hang Vim.
+ */
+    static int
+is_dev_fd_file(fname)
+    char_u     *fname;
+{
+    return (STRNCMP(fname, "/dev/fd/", 8) == 0
+           && VIM_ISDIGIT(fname[8])
+           && *skipdigits(fname + 9) == NUL
+           && (fname[9] != NUL
+               || (fname[8] != '0' && fname[8] != '1' && fname[8] != '2')));
+}
+#endif
+
 #ifdef FEAT_MBYTE
 
 /*
index d99d1c8d3b2b9c13c4ee6f12c6179e9bd67ba4cc..be6048fa5dc1e67c25d20c24cf98c4c582fd3b91 100644 (file)
@@ -508,6 +508,9 @@ int mch_rename __ARGS((const char *src, const char *dest));
 #if !defined(S_ISFIFO) && defined(S_IFIFO)
 # define       S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
 #endif
+#if !defined(S_ISCHR) && defined(S_IFCHR)
+# define       S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
+#endif
 
 /* Note: Some systems need both string.h and strings.h (Savage).  However,
  * some systems can't handle both, only use string.h in that case. */
index 6d9157295659ababd2dfe89b0957de8ce4f573c1..38095cbac285e2fbb15e85357e3e1eb56719a517 100644 (file)
@@ -666,6 +666,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    27,
 /**/
     26,
 /**/