mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
updated for version 7.1-017
This commit is contained in:
@@ -2912,23 +2912,36 @@ not_writing()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if a buffer is read-only. Ask for overruling in a dialog.
|
* Check if a buffer is read-only (either 'readonly' option is set or file is
|
||||||
* Return TRUE and give an error message when the buffer is readonly.
|
* read-only). Ask for overruling in a dialog. Return TRUE and give an error
|
||||||
|
* message when the buffer is readonly.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
check_readonly(forceit, buf)
|
check_readonly(forceit, buf)
|
||||||
int *forceit;
|
int *forceit;
|
||||||
buf_T *buf;
|
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 defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
|
||||||
if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL)
|
if ((p_confirm || cmdmod.confirm) && buf->b_fname != NULL)
|
||||||
{
|
{
|
||||||
char_u buff[IOSIZE];
|
char_u buff[IOSIZE];
|
||||||
|
|
||||||
|
if (buf->b_p_ro)
|
||||||
dialog_msg(buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"),
|
dialog_msg(buff, _("'readonly' option is set for \"%s\".\nDo you wish to write anyway?"),
|
||||||
buf->b_fname);
|
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)
|
if (vim_dialog_yesno(VIM_QUESTION, NULL, buff, 2) == VIM_YES)
|
||||||
{
|
{
|
||||||
@@ -2941,9 +2954,14 @@ check_readonly(forceit, buf)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
if (buf->b_p_ro)
|
||||||
EMSG(_(e_readonly));
|
EMSG(_(e_readonly));
|
||||||
|
else
|
||||||
|
EMSG2(_("E505: \"%s\" is read-only (add ! to override)"),
|
||||||
|
buf->b_fname);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
41
src/fileio.c
41
src/fileio.c
@@ -424,7 +424,7 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
|
|||||||
*/
|
*/
|
||||||
if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE)
|
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_end();
|
||||||
msg_scroll = msg_save;
|
msg_scroll = msg_save;
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@@ -2733,6 +2733,32 @@ set_file_time(fname, atime, mtime)
|
|||||||
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
#endif
|
#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"
|
* 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
|
* Check if the file is really writable (when renaming the file to
|
||||||
* make a backup we won't discover it later).
|
* make a backup we won't discover it later).
|
||||||
*/
|
*/
|
||||||
file_readonly = (
|
file_readonly = check_file_readonly(fname, (int)perm);
|
||||||
# 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
|
|
||||||
);
|
|
||||||
if (!forceit && file_readonly)
|
if (!forceit && file_readonly)
|
||||||
{
|
{
|
||||||
if (vim_strchr(p_cpo, CPO_FWRITE) != NULL)
|
if (vim_strchr(p_cpo, CPO_FWRITE) != NULL)
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
void filemess __ARGS((buf_T *buf, char_u *name, char_u *s, int attr));
|
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 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 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));
|
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_fname __ARGS((buf_T *buf, char_u *fname));
|
||||||
void msg_add_lines __ARGS((int insert_space, long lnum, long nchars));
|
void msg_add_lines __ARGS((int insert_space, long lnum, long nchars));
|
||||||
|
@@ -666,6 +666,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
17,
|
||||||
/**/
|
/**/
|
||||||
16,
|
16,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user