From 50157ef1c2e36d8696e79fd688bdd08312196bc6 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 15 May 2021 23:21:05 +0200 Subject: patch 8.2.2856: get readonly error for device that can't be written to 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 | 19 ++++++++++++++++++- src/testdir/test_writefile.vim | 2 +- src/version.c | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 06109d57f..e1497a5a4 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -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) diff --git a/src/testdir/test_writefile.vim b/src/testdir/test_writefile.vim index 8470d4e30..75dda81d6 100644 --- a/src/testdir/test_writefile.vim +++ b/src/testdir/test_writefile.vim @@ -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 diff --git a/src/version.c b/src/version.c index 1aef3c7d3..70e02ed8e 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2856, /**/ 2855, /**/ -- cgit v1.2.1