* path.cc (symlink_check_one): Recognize symlink settings from the mount table.
* path.h: Make PATH_SYMLINK an alias for MOUNT_SYMLINK. * syscalls.cc (stat_worker): Use extension search mechanism in path_conv to look for .exe rather than trying to special case it here. * mount.h: Make MOUNT_SYMLINK a real option.
This commit is contained in:
		| @@ -1,3 +1,12 @@ | |||||||
|  | Sat Mar 25 20:46:39 2000  Christopher Faylor <cgf@cygnus.com> | ||||||
|  |  | ||||||
|  | 	* path.cc (symlink_check_one): Recognize symlink settings from the | ||||||
|  | 	mount table. | ||||||
|  | 	* path.h: Make PATH_SYMLINK an alias for MOUNT_SYMLINK. | ||||||
|  | 	* syscalls.cc (stat_worker): Use extension search mechanism in | ||||||
|  | 	path_conv to look for .exe rather than trying to special case it here. | ||||||
|  | 	* mount.h: Make MOUNT_SYMLINK a real option. | ||||||
|  |  | ||||||
| Sat Mar 25 00:22:32 2000  Christopher Faylor <cgf@cygnus.com> | Sat Mar 25 00:22:32 2000  Christopher Faylor <cgf@cygnus.com> | ||||||
|  |  | ||||||
| 	* environ.cc: Add TMPDIR to the list of environment variables which are | 	* environ.cc: Add TMPDIR to the list of environment variables which are | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ extern "C" { | |||||||
|  |  | ||||||
| enum | enum | ||||||
|   { |   { | ||||||
|     /* MOUNT_SYMLINK = 1, place holder.  Do not use it. */ |     MOUNT_SYMLINK = 1,	/* "mount point" is a symlink */ | ||||||
|     MOUNT_BINARY =  2,	/* "binary" format read/writes */ |     MOUNT_BINARY =  2,	/* "binary" format read/writes */ | ||||||
|     MOUNT_SYSTEM =  8,	/* mount point came from system table */ |     MOUNT_SYSTEM =  8,	/* mount point came from system table */ | ||||||
|     MOUNT_EXEC   = 16,	/* Any file in the mounted directory gets 'x' bit */ |     MOUNT_EXEC   = 16,	/* Any file in the mounted directory gets 'x' bit */ | ||||||
|   | |||||||
| @@ -2156,7 +2156,7 @@ symlink_check_one (const char *in_path, char *buf, int buflen, DWORD& fileattr, | |||||||
|  |  | ||||||
|       /* A symlink will have the `system' file attribute. */ |       /* A symlink will have the `system' file attribute. */ | ||||||
|       /* Only files can be symlinks (which can be symlinks to directories). */ |       /* Only files can be symlinks (which can be symlinks to directories). */ | ||||||
|       if (!SYMLINKATTR (fileattr)) |       if (!(*pflags & PATH_SYMLINK) && !SYMLINKATTR (fileattr)) | ||||||
| 	goto file_not_symlink; | 	goto file_not_symlink; | ||||||
|  |  | ||||||
|       /* Check the file's extended attributes, if it has any.  */ |       /* Check the file's extended attributes, if it has any.  */ | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ enum symlink_follow | |||||||
| enum | enum | ||||||
| { | { | ||||||
|   PATH_NOTHING = 0, |   PATH_NOTHING = 0, | ||||||
|   PATH_SYMLINK = 1, |   PATH_SYMLINK = MOUNT_SYMLINK, | ||||||
|   PATH_BINARY = MOUNT_BINARY, |   PATH_BINARY = MOUNT_BINARY, | ||||||
|   PATH_EXEC = MOUNT_EXEC, |   PATH_EXEC = MOUNT_EXEC, | ||||||
|   PATH_SOCKET =  0x40000000, |   PATH_SOCKET =  0x40000000, | ||||||
|   | |||||||
| @@ -917,6 +917,12 @@ stat_dev (DWORD devn, int unit, unsigned long ino, struct stat *buf) | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static suffix_info stat_suffixes[] =  | ||||||
|  | { | ||||||
|  |   suffix_info ("", 1), | ||||||
|  |   suffix_info (".exe", 1) | ||||||
|  | }; | ||||||
|  |  | ||||||
| /* Cygwin internal */ | /* Cygwin internal */ | ||||||
| static int | static int | ||||||
| stat_worker (const char *caller, const char *name, struct stat *buf, | stat_worker (const char *caller, const char *name, struct stat *buf, | ||||||
| @@ -931,7 +937,9 @@ stat_worker (const char *caller, const char *name, struct stat *buf, | |||||||
|  |  | ||||||
|   debug_printf ("%s (%s, %p)", caller, name, buf); |   debug_printf ("%s (%s, %p)", caller, name, buf); | ||||||
|  |  | ||||||
|   path_conv real_path (name, nofollow ? SYMLINK_NOFOLLOW : SYMLINK_FOLLOW, 1); |   path_conv real_path (name, nofollow ? SYMLINK_NOFOLLOW : SYMLINK_FOLLOW, 1, | ||||||
|  | 		       stat_suffixes); | ||||||
|  |  | ||||||
|   if (real_path.error) |   if (real_path.error) | ||||||
|     { |     { | ||||||
|       set_errno (real_path.error); |       set_errno (real_path.error); | ||||||
| @@ -947,25 +955,6 @@ stat_worker (const char *caller, const char *name, struct stat *buf, | |||||||
|  |  | ||||||
|   atts = real_path.file_attributes (); |   atts = real_path.file_attributes (); | ||||||
|  |  | ||||||
| /* FIXME: this is of dubious merit and is fundamentally flawed. |  | ||||||
|    E.g., what if the .exe file is a symlink?  This is not accounted |  | ||||||
|    for here.  Also, what about all of the other special extensions? |  | ||||||
|  |  | ||||||
|    This could be "fixed" by passing the appropriate extension list |  | ||||||
|    to path_conv but I'm not sure that this is really justified.  */ |  | ||||||
|  |  | ||||||
|   /* If we can't find the name, try again with a .exe suffix |  | ||||||
|      [but only if not already present].  */ |  | ||||||
|   if (atts == -1 && GetLastError () == ERROR_FILE_NOT_FOUND && |  | ||||||
|       !(strrchr (win32_name, '.') > strrchr (win32_name, '\\'))) |  | ||||||
|     { |  | ||||||
|       debug_printf ("trying with .exe suffix"); |  | ||||||
|       strcat (win32_name, ".exe"); |  | ||||||
|       atts = (int) GetFileAttributesA (win32_name); |  | ||||||
|       if (atts == -1) |  | ||||||
| 	strchr (win32_name, '\0')[4] = '\0'; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|   debug_printf ("%d = GetFileAttributesA (%s)", atts, win32_name); |   debug_printf ("%d = GetFileAttributesA (%s)", atts, win32_name); | ||||||
|  |  | ||||||
|   strcpy (root, win32_name); |   strcpy (root, win32_name); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user