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