diff options
author | vimboss <devnull@localhost> | 2006-02-28 23:52:23 +0000 |
---|---|---|
committer | vimboss <devnull@localhost> | 2006-02-28 23:52:23 +0000 |
commit | 5491b9ea0f60f8e1ba46b02291911e6d3b2ca6c6 (patch) | |
tree | c012f29a3c1c0f89b959e1a73105eda82afc4060 | |
parent | 974b44294ae1956d64a406d64952d7fe1b9fca58 (diff) | |
download | vim-5491b9ea0f60f8e1ba46b02291911e6d3b2ca6c6.tar.gz |
updated for version 7.0210
-rw-r--r-- | src/fileio.c | 23 | ||||
-rw-r--r-- | src/os_win32.c | 55 | ||||
-rw-r--r-- | src/proto/undo.pro | 1 |
3 files changed, 79 insertions, 0 deletions
diff --git a/src/fileio.c b/src/fileio.c index c3ff07c4..508de0bc 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -2357,6 +2357,22 @@ failed: curbuf->b_op_start.col = 0; curbuf->b_op_end.lnum = from + linecnt; curbuf->b_op_end.col = 0; + +#ifdef WIN32 + /* + * Work around a weird problem: When a file has two links (only + * possible on NTFS) and we write through one link, then stat() it + * throught the other link, the timestamp information may be wrong. + * It's correct again after reading the file, thus reset the timestamp + * here. + */ + if (newfile && !read_stdin && !read_buffer + && mch_stat((char *)fname, &st) >= 0) + { + buf_store_time(curbuf, &st, fname); + curbuf->b_mtime_read = curbuf->b_mtime; + } +#endif } msg_scroll = msg_save; @@ -3263,6 +3279,13 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit, ) backup_copy = TRUE; else +# else +# ifdef WIN32 + /* On NTFS file systems hard links are possible. */ + if (mch_is_linked(fname)) + backup_copy = TRUE; + else +# endif # endif { /* diff --git a/src/os_win32.c b/src/os_win32.c index 08df912c..3aec6ac6 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -2548,6 +2548,61 @@ mch_isdir(char_u *name) } /* + * Return TRUE if file "fname" has more than one link. + */ + int +mch_is_linked(char_u *fname) +{ + HANDLE hFile; + int res = 0; + BY_HANDLE_FILE_INFORMATION inf; +#ifdef FEAT_MBYTE + WCHAR *wn = NULL; + + if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + wn = enc_to_ucs2(fname, NULL); + if (wn != NULL) + { + hFile = CreateFileW(wn, /* file name */ + GENERIC_READ, /* access mode */ + 0, /* share mode */ + NULL, /* security descriptor */ + OPEN_EXISTING, /* creation disposition */ + 0, /* file attributes */ + NULL); /* handle to template file */ + if (hFile == INVALID_HANDLE_VALUE + && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + /* Retry with non-wide function (for Windows 98). */ + vim_free(wn); + wn = NULL; + } + } + if (wn == NULL) +#endif + hFile = CreateFile(fname, /* file name */ + GENERIC_READ, /* access mode */ + 0, /* share mode */ + NULL, /* security descriptor */ + OPEN_EXISTING, /* creation disposition */ + 0, /* file attributes */ + NULL); /* handle to template file */ + + if (hFile != INVALID_HANDLE_VALUE) + { + if (GetFileInformationByHandle(hFile, &inf) != 0 + && inf.nNumberOfLinks > 1) + res = 1; + CloseHandle(hFile); + } + +#ifdef FEAT_MBYTE + vim_free(wn); +#endif + return res; +} + +/* * Return TRUE if file or directory "name" is writable (not readonly). * Strange semantics of Win32: a readonly directory is writable, but you can't * delete a file. Let's say this means it is writable. diff --git a/src/proto/undo.pro b/src/proto/undo.pro index 8ac23239..5114ed07 100644 --- a/src/proto/undo.pro +++ b/src/proto/undo.pro @@ -7,6 +7,7 @@ int u_savedel __ARGS((linenr_T lnum, long nlines)); void u_undo __ARGS((int count)); void u_redo __ARGS((int count)); void u_sync __ARGS((void)); +void ex_undojoin __ARGS((exarg_T *eap)); void u_unchanged __ARGS((buf_T *buf)); void u_clearall __ARGS((buf_T *buf)); void u_saveline __ARGS((linenr_T lnum)); |