Make core.sharedRepository work under cygwin 1.7
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 <tboegi@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
			
			
				maint
			
			
		
							parent
							
								
									7b592fadf1
								
							
						
					
					
						commit
						0117c2f043
					
				|  | @ -1,3 +1,4 @@ | |||
| #define CYGWIN_C | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #ifdef CYGWIN_V15_WIN32API | ||||
| #include "../git-compat-util.h" | ||||
|  | @ -10,6 +11,18 @@ | |||
| #endif | ||||
| #include "../cache.h" /* to read configuration */ | ||||
|  | ||||
| /* | ||||
|  * Return POSIX permission bits, regardless of core.ignorecygwinfstricks | ||||
|  */ | ||||
| int cygwin_get_st_mode_bits(const char *path, int *mode) | ||||
| { | ||||
| 	struct stat st; | ||||
| 	if (lstat(path, &st) < 0) | ||||
| 		return -1; | ||||
| 	*mode = st.st_mode; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static inline void filetime_to_timespec(const FILETIME *ft, struct timespec *ts) | ||||
| { | ||||
| 	long long winTime = ((long long)ft->dwHighDateTime << 32) + | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -163,6 +163,7 @@ | |||
| typedef long intptr_t; | ||||
| typedef unsigned long uintptr_t; | ||||
| #endif | ||||
| int get_st_mode_bits(const char *path, int *mode); | ||||
| #if defined(__CYGWIN__) | ||||
| #undef _XOPEN_SOURCE | ||||
| #include <grp.h> | ||||
|  |  | |||
							
								
								
									
										20
									
								
								path.c
								
								
								
								
							
							
						
						
									
										20
									
								
								path.c
								
								
								
								
							|  | @ -14,6 +14,22 @@ | |||
| #include "strbuf.h" | ||||
| #include "string-list.h" | ||||
|  | ||||
| #ifndef get_st_mode_bits | ||||
| /* | ||||
|  * The replacement lstat(2) we use on Cygwin is incomplete and | ||||
|  * may return wrong permission bits. Most of the time we do not care, | ||||
|  * but the callsites of this wrapper do care. | ||||
|  */ | ||||
| int get_st_mode_bits(const char *path, int *mode) | ||||
| { | ||||
| 	struct stat st; | ||||
| 	if (lstat(path, &st) < 0) | ||||
| 		return -1; | ||||
| 	*mode = st.st_mode; | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static char bad_path[] = "/bad-path/"; | ||||
|  | ||||
| static char *get_pathname(void) | ||||
|  | @ -391,7 +407,6 @@ const char *enter_repo(const char *path, int strict) | |||
|  | ||||
| int set_shared_perm(const char *path, int mode) | ||||
| { | ||||
| 	struct stat st; | ||||
| 	int tweak, shared, orig_mode; | ||||
|  | ||||
| 	if (!shared_repository) { | ||||
|  | @ -400,9 +415,8 @@ int set_shared_perm(const char *path, int mode) | |||
| 		return 0; | ||||
| 	} | ||||
| 	if (!mode) { | ||||
| 		if (lstat(path, &st) < 0) | ||||
| 		if (get_st_mode_bits(path, &mode) < 0) | ||||
| 			return -1; | ||||
| 		mode = st.st_mode; | ||||
| 		orig_mode = mode; | ||||
| 	} else | ||||
| 		orig_mode = 0; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Torsten Bögershausen
						Torsten Bögershausen