]> granicus.if.org Git - vim/commitdiff
patch 8.2.2856: get readonly error for device that can't be written to v8.2.2856
authorBram Moolenaar <Bram@vim.org>
Sat, 15 May 2021 21:21:05 +0000 (23:21 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 15 May 2021 21:21:05 +0000 (23:21 +0200)
Problem:    Get readonly error for device that can't be written to.
Solution:   Check for being able to write first. (closes #8205)

src/ex_cmds.c
src/testdir/test_writefile.vim
src/version.c

index 06109d57fb9e28b807031caba7d1e1a62885984b..e1497a5a4a1859e2caee31a237cbf23b00d796cf 100644 (file)
@@ -1856,6 +1856,19 @@ ex_write(exarg_T *eap)
        (void)do_write(eap);
 }
 
+#ifdef UNIX
+    static int
+check_writable(char_u *fname)
+{
+    if (mch_nodetype(fname) == NODE_OTHER)
+    {
+       semsg(_("E503: \"%s\" is not a file or writable device"), fname);
+       return FAIL;
+    }
+    return OK;
+}
+#endif
+
 /*
  * write current buffer to file 'eap->arg'
  * if 'eap->append' is TRUE, append to the file
@@ -1942,7 +1955,11 @@ do_write(exarg_T *eap)
 #ifdef FEAT_QUICKFIX
                bt_dontwrite_msg(curbuf) ||
 #endif
-               check_fname() == FAIL || check_readonly(&eap->forceit, curbuf)))
+               check_fname() == FAIL
+#ifdef UNIX
+               || check_writable(curbuf->b_ffname) == FAIL
+#endif
+               || check_readonly(&eap->forceit, curbuf)))
        goto theend;
 
     if (!other)
index 8470d4e30211eeec922381d207d0ba1fcb7956dc..75dda81d6d3125de66f9bd1a7f02ab2f8e5f988d 100644 (file)
@@ -285,7 +285,7 @@ func Test_write_errors()
         \ && getftype('/dev/loop0') == 'bdev' && !IsRoot()
     new
     edit /dev/loop0
-    call assert_fails('write', 'E505: ')
+    call assert_fails('write', 'E503: ')
     call assert_fails('write!', 'E503: ')
     close!
   endif
index 1aef3c7d3811d68b71fa803207edf60731ca8aa4..70e02ed8edf8c167374dde0b38d26d2949f60713 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2856,
 /**/
     2855,
 /**/