Skip directory symlinks in DOSFS_FindNextEx.

This commit is contained in:
Andreas Mohr 2000-10-19 20:38:38 +00:00 committed by Alexandre Julliard
parent 044f028f0e
commit 220312e993
3 changed files with 25 additions and 5 deletions

View File

@ -1362,7 +1362,7 @@ DWORD WINAPI GetFullPathNameW( LPCWSTR name, DWORD len, LPWSTR buffer,
*/
static int DOSFS_FindNextEx( FIND_FIRST_INFO *info, WIN32_FIND_DATAA *entry )
{
BYTE attr = info->attr | FA_UNUSED | FA_ARCHIVE | FA_RDONLY;
DWORD attr = info->attr | FA_UNUSED | FA_ARCHIVE | FA_RDONLY | FILE_ATTRIBUTE_SYMLINK;
UINT flags = DRIVE_GetFlags( info->drive );
char *p, buffer[MAX_PATHNAME_LEN];
const char *drive_path;
@ -1436,6 +1436,15 @@ static int DOSFS_FindNextEx( FIND_FIRST_INFO *info, WIN32_FIND_DATAA *entry )
WARN("can't stat %s\n", buffer);
continue;
}
if ((fileinfo.dwFileAttributes & FILE_ATTRIBUTE_SYMLINK) &&
(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
static int show_dir_symlinks = -1;
if (show_dir_symlinks == -1)
show_dir_symlinks = PROFILE_GetWineIniBool("wine", "ShowDirSymlinks", 0);
if (!show_dir_symlinks) continue;
}
if (fileinfo.dwFileAttributes & ~attr) continue;
/* We now have a matching entry; fill the result and return */

View File

@ -617,14 +617,24 @@ BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info )
{
struct stat st;
if (!unixName || !info) return FALSE;
if (stat( unixName, &st ) == -1)
if (lstat( unixName, &st ) == -1)
{
FILE_SetDosError();
return FALSE;
}
FILE_FillInfo( &st, info );
if (!S_ISLNK(st.st_mode)) FILE_FillInfo( &st, info );
else
{
/* do a "real" stat to find out
about the type of the symlink destination */
if (stat( unixName, &st ) == -1)
{
FILE_SetDosError();
return FALSE;
}
FILE_FillInfo( &st, info );
info->dwFileAttributes |= FILE_ATTRIBUTE_SYMLINK;
}
return TRUE;
}

View File

@ -2891,6 +2891,7 @@ typedef enum tagSID_NAME_USE {
#define FILE_ATTRIBUTE_XACTION_WRITE 0x00000400L
#define FILE_ATTRIBUTE_COMPRESSED 0x00000800L
#define FILE_ATTRIBUTE_OFFLINE 0x00001000L
#define FILE_ATTRIBUTE_SYMLINK 0x80000000L /* Not in Windows API */
/* File notification flags */
#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001