From 0117c2f043183fb99e9b046b0df7d64c1b296624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Sat, 23 Mar 2013 13:40:29 +0100 Subject: Make core.sharedRepository work under cygwin 1.7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When core.sharedRepository is used, set_shared_perm() in path.c needs lstat() to return the correct POSIX permissions. The default for cygwin is core.ignoreCygwinFSTricks = false, which means that the fast implementation in do_stat() is used instead of lstat(). lstat() under cygwin uses the Windows security model to implement POSIX-like permissions. The user, group or everyone bits can be set individually. do_stat() simplifes the file permission bits, and may return a wrong value. The read-only attribute of a file is used to calculate the permissions, resulting in either rw-r--r-- or r--r--r-- One effect of the simplified do_stat() is that t1301 fails. Add a function cygwin_get_st_mode_bits() which returns the POSIX permissions. When not compiling for cygwin, true_mode_bits() in path.c is used. Side note: t1301 passes under cygwin 1.5. The "user write" bit is synchronized with the "read only" attribute of a file: $ chmod 444 x $ attrib x A R C:\temp\pt\x cygwin 1.7 would show A C:\temp\pt\x Signed-off-by: Torsten Bögershausen Signed-off-by: Junio C Hamano --- compat/cygwin.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'compat/cygwin.h') diff --git a/compat/cygwin.h b/compat/cygwin.h index a3229f5b4f..c04965a2e0 100644 --- a/compat/cygwin.h +++ b/compat/cygwin.h @@ -4,6 +4,11 @@ typedef int (*stat_fn_t)(const char*, struct stat*); extern stat_fn_t cygwin_stat_fn; extern stat_fn_t cygwin_lstat_fn; +int cygwin_get_st_mode_bits(const char *path, int *mode); +#define get_st_mode_bits(p,m) cygwin_get_st_mode_bits((p),(m)) +#ifndef CYGWIN_C +/* cygwin.c needs the original lstat() */ #define stat(path, buf) (*cygwin_stat_fn)(path, buf) #define lstat(path, buf) (*cygwin_lstat_fn)(path, buf) +#endif -- cgit v1.2.1 From f66450ae94f28a565226c3e443df5433722c5672 Mon Sep 17 00:00:00 2001 From: Ramsay Jones Date: Sat, 22 Jun 2013 20:42:47 +0100 Subject: cygwin: Remove the Win32 l/stat() implementation Commit adbc0b6b ("cygwin: Use native Win32 API for stat", 30-09-2008) added a Win32 specific implementation of the stat functions. In order to handle absolute paths, cygwin mount points and symbolic links, this implementation may fall back on the standard cygwin l/stat() functions. Also, the choice of cygwin or Win32 functions is made lazily (by the first call(s) to l/stat) based on the state of some config variables. Unfortunately, this "schizophrenic stat" implementation has been the source of many problems ever since. For example, see commits 7faee6b8, 79748439, 452993c2, 085479e7, b8a97333, 924aaf3e, 05bab3ea and 0117c2f0. In order to avoid further problems, such as the issue raised by the new reference handling API, remove the Win32 l/stat() implementation. Signed-off-by: Ramsay Jones Signed-off-by: Junio C Hamano --- compat/cygwin.h | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 compat/cygwin.h (limited to 'compat/cygwin.h') diff --git a/compat/cygwin.h b/compat/cygwin.h deleted file mode 100644 index c04965a2e0..0000000000 --- a/compat/cygwin.h +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -typedef int (*stat_fn_t)(const char*, struct stat*); -extern stat_fn_t cygwin_stat_fn; -extern stat_fn_t cygwin_lstat_fn; -int cygwin_get_st_mode_bits(const char *path, int *mode); - -#define get_st_mode_bits(p,m) cygwin_get_st_mode_bits((p),(m)) -#ifndef CYGWIN_C -/* cygwin.c needs the original lstat() */ -#define stat(path, buf) (*cygwin_stat_fn)(path, buf) -#define lstat(path, buf) (*cygwin_lstat_fn)(path, buf) -#endif -- cgit v1.2.1