mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 14:38:18 +00:00
Fix symlink handling of fs_listdir
On Windows, the check was incorrectly using logical or instead of bitwise or. Checking for the flag `FILE_ATTRIBUTE_REPARSE_POINT` is not necessary, as the `FILE_ATTRIBUTE_DIRECTORY` will correctly be set when the target of a symbolic link is a directory. This otherwise causes symbolic links to files to be incorrectly handled as directories. On Linux, the minor performance optimization of using `entry->d_type` is reverted and `fs_is_dir` is used instead. This internally uses `stat`, which correctly returns the attributes for the symbolic link targets.
This commit is contained in:
parent
6a5d99daf1
commit
ec55212c52
|
@ -2095,7 +2095,7 @@ void fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user)
|
||||||
{
|
{
|
||||||
WideCharToMultiByte(CP_UTF8, 0, finddata.cFileName, -1, buffer2, sizeof(buffer2), NULL, NULL);
|
WideCharToMultiByte(CP_UTF8, 0, finddata.cFileName, -1, buffer2, sizeof(buffer2), NULL, NULL);
|
||||||
str_copy(buffer + length, buffer2, (int)sizeof(buffer) - length);
|
str_copy(buffer + length, buffer2, (int)sizeof(buffer) - length);
|
||||||
if(cb(buffer2, (finddata.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY || FILE_ATTRIBUTE_REPARSE_POINT)) != 0, type, user))
|
if(cb(buffer2, (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0, type, user))
|
||||||
break;
|
break;
|
||||||
} while(FindNextFileW(handle, &finddata));
|
} while(FindNextFileW(handle, &finddata));
|
||||||
|
|
||||||
|
@ -2115,7 +2115,7 @@ void fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user)
|
||||||
while((entry = readdir(d)) != NULL)
|
while((entry = readdir(d)) != NULL)
|
||||||
{
|
{
|
||||||
str_copy(buffer + length, entry->d_name, (int)sizeof(buffer) - length);
|
str_copy(buffer + length, entry->d_name, (int)sizeof(buffer) - length);
|
||||||
if(cb(entry->d_name, entry->d_type == DT_UNKNOWN ? fs_is_dir(buffer) : entry->d_type == DT_DIR || entry->d_type == DT_LNK, type, user))
|
if(cb(entry->d_name, fs_is_dir(buffer), type, user))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2155,7 +2155,7 @@ void fs_listdir_fileinfo(const char *dir, FS_LISTDIR_CALLBACK_FILEINFO cb, int t
|
||||||
info.m_TimeCreated = filetime_to_unixtime(&finddata.ftCreationTime);
|
info.m_TimeCreated = filetime_to_unixtime(&finddata.ftCreationTime);
|
||||||
info.m_TimeModified = filetime_to_unixtime(&finddata.ftLastWriteTime);
|
info.m_TimeModified = filetime_to_unixtime(&finddata.ftLastWriteTime);
|
||||||
|
|
||||||
if(cb(&info, (finddata.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY || FILE_ATTRIBUTE_REPARSE_POINT)) != 0, type, user))
|
if(cb(&info, (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0, type, user))
|
||||||
break;
|
break;
|
||||||
} while(FindNextFileW(handle, &finddata));
|
} while(FindNextFileW(handle, &finddata));
|
||||||
|
|
||||||
|
@ -2184,7 +2184,7 @@ void fs_listdir_fileinfo(const char *dir, FS_LISTDIR_CALLBACK_FILEINFO cb, int t
|
||||||
info.m_TimeCreated = created;
|
info.m_TimeCreated = created;
|
||||||
info.m_TimeModified = modified;
|
info.m_TimeModified = modified;
|
||||||
|
|
||||||
if(cb(&info, entry->d_type == DT_UNKNOWN ? fs_is_dir(buffer) : entry->d_type == DT_DIR || entry->d_type == DT_LNK, type, user))
|
if(cb(&info, fs_is_dir(buffer), type, user))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue