Skip directory symlinks in DOSFS_FindNextEx.
diff --git a/files/dos_fs.c b/files/dos_fs.c index d4dd2c3..5c1da9a 100644 --- a/files/dos_fs.c +++ b/files/dos_fs.c
@@ -1362,7 +1362,7 @@ */ 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 @@ 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 */
diff --git a/files/file.c b/files/file.c index 15201c3..2f9bc30 100644 --- a/files/file.c +++ b/files/file.c
@@ -617,14 +617,24 @@ { 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; }
diff --git a/include/winnt.h b/include/winnt.h index 67b50d6..60afdc4 100644 --- a/include/winnt.h +++ b/include/winnt.h
@@ -2891,6 +2891,7 @@ #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