]> granicus.if.org Git - vim/commitdiff
updated for version 7.1-017 v7.1.017
authorBram Moolenaar <Bram@vim.org>
Thu, 28 Jun 2007 20:02:32 +0000 (20:02 +0000)
committerBram Moolenaar <Bram@vim.org>
Thu, 28 Jun 2007 20:02:32 +0000 (20:02 +0000)
src/ex_cmds.c
src/fileio.c
src/proto/fileio.pro
src/version.c

index 9c9f856507faeb86cc9c8ae6d6e3faf30202a502..5ca3dfd07de7788d470b7b0806aa634ee7c8773c 100644 (file)
@@ -2912,22 +2912,35 @@ not_writing()
 }
 
 /*
- * Check if a buffer is read-only.  Ask for overruling in a dialog.
- * Return TRUE and give an error message when the buffer is readonly.
+ * Check if a buffer is read-only (either 'readonly' option is set or file is
+ * read-only). Ask for overruling in a dialog. Return TRUE and give an error
+ * message when the buffer is readonly.
  */
     static int
 check_readonly(forceit, buf)
     int                *forceit;
     buf_T      *buf;
 {
-    if (!*forceit && buf->b_p_ro)
+    struct stat        st;
+
+    /* Handle a file being readonly when the 'readonly' option is set or when
+     * the file exists and permissions are read-only.
+     * We will send 0777 to check_file_readonly(), as the "perm" variable is
+     * important for device checks but not here. */
+    if (!*forceit && (buf->b_p_ro
+               || (mch_stat((char *)buf->b_ffname, &st) >= 0
+                   && check_file_readonly(buf->b_ffname, 0777))))
     {
 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
        if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL)
        {
            char_u      buff[IOSIZE];
 
-           dialog_msg(buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"),
+           if (buf->b_p_ro)
+               dialog_msg(buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"),
+                   buf->b_fname);
+           else
+               dialog_msg(buff, _("File permissions of \"%s\" are read-only.\nIt may still be possible to write it.\nDo you wish to try?"),
                    buf->b_fname);
 
            if (vim_dialog_yesno(VIM_QUESTION, NULL, buff, 2) == VIM_YES)
@@ -2941,9 +2954,14 @@ check_readonly(forceit, buf)
        }
        else
 #endif
+       if (buf->b_p_ro)
            EMSG(_(e_readonly));
+       else
+           EMSG2(_("E505: \"%s\" is read-only (add ! to override)"),
+                   buf->b_fname);
        return TRUE;
     }
+
     return FALSE;
 }
 
index c44a08d378704cfc735787d5d9936f3f09a93f61..6fd2799c8c5c874f1eb360b806e90f8f31be76ef 100644 (file)
@@ -424,7 +424,7 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
         */
        if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE)
        {
-           filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option"), 0);
+           filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option)"), 0);
            msg_end();
            msg_scroll = msg_save;
            return FAIL;
@@ -2733,6 +2733,32 @@ set_file_time(fname, atime, mtime)
 # define MIN(a, b) ((a) < (b) ? (a) : (b))
 #endif
 
+/*
+ * Return TRUE if a file appears to be read-only from the file permissions.
+ */
+    int
+check_file_readonly(fname, perm)
+    char_u     *fname;         /* full path to file */
+    int                perm;           /* known permissions on file */
+{
+#ifndef USE_MCH_ACCESS
+    int            fd = 0;
+#endif
+
+    return (
+#ifdef USE_MCH_ACCESS
+# ifdef UNIX
+       (perm & 0222) == 0 ||
+# endif
+       mch_access((char *)fname, W_OK)
+#else
+       (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
+                                       ? TRUE : (close(fd), FALSE)
+#endif
+       );
+}
+
+
 /*
  * buf_write() - write to file "fname" lines "start" through "end"
  *
@@ -3219,17 +3245,8 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
         * Check if the file is really writable (when renaming the file to
         * make a backup we won't discover it later).
         */
-       file_readonly = (
-# ifdef USE_MCH_ACCESS
-#  ifdef UNIX
-                   (perm & 0222) == 0 ||
-#  endif
-                   mch_access((char *)fname, W_OK)
-# else
-                   (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
-                                                  ? TRUE : (close(fd), FALSE)
-# endif
-                   );
+       file_readonly = check_file_readonly(fname, (int)perm);
+
        if (!forceit && file_readonly)
        {
            if (vim_strchr(p_cpo, CPO_FWRITE) != NULL)
index a8c4142ef27863374496830f853b5b483b615ffa..068117ad6e6ae08c85190e4b56101e9d880db13c 100644 (file)
@@ -2,6 +2,7 @@
 void filemess __ARGS((buf_T *buf, char_u *name, char_u *s, int attr));
 int readfile __ARGS((char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_skip, linenr_T lines_to_read, exarg_T *eap, int flags));
 int prep_exarg __ARGS((exarg_T *eap, buf_T *buf));
+int check_file_readonly __ARGS((char_u *fname, int perm));
 int buf_write __ARGS((buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering));
 void msg_add_fname __ARGS((buf_T *buf, char_u *fname));
 void msg_add_lines __ARGS((int insert_space, long lnum, long nchars));
index a69bbd2ffdd428ef5f184ac26248b579c96cf187..1bfc824468119a2aa624c7d9f49ad6266cb0a515 100644 (file)
@@ -666,6 +666,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    17,
 /**/
     16,
 /**/