* 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:
Christopher Faylor 2000-03-26 01:54:22 +00:00
parent 4f7831c1f5
commit c114dfb0c0
5 changed files with 51 additions and 53 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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. */

View File

@ -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,

View File

@ -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);