mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 22:48:18 +00:00
Merge #5991
5991: Handle all `MultiByteToWideChar` and `WideCharToMultiByte` return values r=def- a=Robyt3 Closes #5970. ## Checklist - [X] Tested the change ingame - [ ] Provided screenshots if it is a visual change - [ ] Tested in combination with possibly related configuration options - [ ] Written a unit test (especially base/) or added coverage to integration test - [X] Considered possible null pointers and out of bounds array indexing - [X] Changed no physics that affect existing maps - [ ] Tested the change with [ASan+UBSan or valgrind's memcheck](https://github.com/ddnet/ddnet/#using-addresssanitizer--undefinedbehavioursanitizer-or-valgrinds-memcheck) (optional) Co-authored-by: Robert Müller <robytemueller@gmail.com>
This commit is contained in:
commit
1fe482232b
|
@ -339,21 +339,9 @@ public:
|
||||||
void Log(const CLogMessage *pMessage) override
|
void Log(const CLogMessage *pMessage) override
|
||||||
{
|
{
|
||||||
int WLen = MultiByteToWideChar(CP_UTF8, 0, pMessage->m_aLine, pMessage->m_LineLength, NULL, 0);
|
int WLen = MultiByteToWideChar(CP_UTF8, 0, pMessage->m_aLine, pMessage->m_LineLength, NULL, 0);
|
||||||
if(!WLen)
|
dbg_assert(WLen > 0, "MultiByteToWideChar failure");
|
||||||
{
|
|
||||||
WCHAR aError[] = L"Failed to obtain length of log message\r\n";
|
|
||||||
WriteConsoleW(m_pConsole, aError, std::size(aError) - 1, NULL, NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
WCHAR *pWide = (WCHAR *)malloc((WLen + 2) * sizeof(*pWide));
|
WCHAR *pWide = (WCHAR *)malloc((WLen + 2) * sizeof(*pWide));
|
||||||
WLen = MultiByteToWideChar(CP_UTF8, 0, pMessage->m_aLine, pMessage->m_LineLength, pWide, WLen);
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, pMessage->m_aLine, pMessage->m_LineLength, pWide, WLen) == WLen, "MultiByteToWideChar failure");
|
||||||
if(!WLen)
|
|
||||||
{
|
|
||||||
WCHAR aError[] = L"Failed to convert log message encoding\r\n";
|
|
||||||
WriteConsoleW(m_pConsole, aError, std::size(aError) - 1, NULL, NULL);
|
|
||||||
free(pWide);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pWide[WLen++] = '\r';
|
pWide[WLen++] = '\r';
|
||||||
pWide[WLen++] = '\n';
|
pWide[WLen++] = '\n';
|
||||||
|
|
||||||
|
@ -435,9 +423,12 @@ class CLoggerWindowsDebugger : public ILogger
|
||||||
public:
|
public:
|
||||||
void Log(const CLogMessage *pMessage) override
|
void Log(const CLogMessage *pMessage) override
|
||||||
{
|
{
|
||||||
WCHAR aWBuffer[4096];
|
int WLen = MultiByteToWideChar(CP_UTF8, 0, pMessage->m_aLine, -1, NULL, 0);
|
||||||
MultiByteToWideChar(CP_UTF8, 0, pMessage->m_aLine, -1, aWBuffer, sizeof(aWBuffer) / sizeof(WCHAR));
|
dbg_assert(WLen > 0, "MultiByteToWideChar failure");
|
||||||
OutputDebugStringW(aWBuffer);
|
WCHAR *pWide = (WCHAR *)malloc(WLen * sizeof(*pWide));
|
||||||
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, pMessage->m_aLine, -1, pWide, WLen) == WLen, "MultiByteToWideChar failure");
|
||||||
|
OutputDebugStringW(pWide);
|
||||||
|
free(pWide);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
std::unique_ptr<ILogger> log_logger_windows_debugger()
|
std::unique_ptr<ILogger> log_logger_windows_debugger()
|
||||||
|
|
|
@ -95,12 +95,13 @@ IOHANDLE io_current_exe()
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
wchar_t wpath[IO_MAX_PATH_LENGTH];
|
wchar_t wpath[IO_MAX_PATH_LENGTH];
|
||||||
char path[IO_MAX_PATH_LENGTH];
|
char path[IO_MAX_PATH_LENGTH];
|
||||||
if(!GetModuleFileNameW(NULL, wpath, std::size(wpath)))
|
if(GetModuleFileNameW(NULL, wpath, std::size(wpath)) == 0 || GetLastError() != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(!WideCharToMultiByte(CP_UTF8, 0, wpath, -1, path, sizeof(path), NULL, NULL))
|
if(WideCharToMultiByte(CP_UTF8, 0, wpath, -1, path, sizeof(path), NULL, NULL) == 0)
|
||||||
{
|
{
|
||||||
|
dbg_assert(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "WideCharToMultiByte failure");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return io_open(path, IOFLAG_READ);
|
return io_open(path, IOFLAG_READ);
|
||||||
|
@ -222,7 +223,7 @@ IOHANDLE io_open_impl(const char *filename, int flags)
|
||||||
dbg_assert(flags == (IOFLAG_READ | IOFLAG_SKIP_BOM) || flags == IOFLAG_READ || flags == IOFLAG_WRITE || flags == IOFLAG_APPEND, "flags must be read, read+skipbom, write or append");
|
dbg_assert(flags == (IOFLAG_READ | IOFLAG_SKIP_BOM) || flags == IOFLAG_READ || flags == IOFLAG_WRITE || flags == IOFLAG_APPEND, "flags must be read, read+skipbom, write or append");
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, filename, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, filename, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
if((flags & IOFLAG_READ) != 0)
|
if((flags & IOFLAG_READ) != 0)
|
||||||
return (IOHANDLE)_wfsopen(wBuffer, L"rb", _SH_DENYNO);
|
return (IOHANDLE)_wfsopen(wBuffer, L"rb", _SH_DENYNO);
|
||||||
if(flags == IOFLAG_WRITE)
|
if(flags == IOFLAG_WRITE)
|
||||||
|
@ -1430,6 +1431,24 @@ static int priv_net_close_all_sockets(NETSOCKET sock)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
|
static char *windows_format_system_message(int error)
|
||||||
|
{
|
||||||
|
WCHAR *wide_message;
|
||||||
|
const DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_MAX_WIDTH_MASK;
|
||||||
|
if(FormatMessageW(flags, NULL, error, 0, (LPWSTR)&wide_message, 0, NULL) == 0)
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
int len = WideCharToMultiByte(CP_UTF8, 0, wide_message, -1, NULL, 0, NULL, NULL);
|
||||||
|
dbg_assert(len > 0, "WideCharToMultiByte failure");
|
||||||
|
char *message = (char *)malloc(len * sizeof(*message));
|
||||||
|
dbg_assert(WideCharToMultiByte(CP_UTF8, 0, wide_message, -1, message, len, NULL, NULL) == len, "WideCharToMultiByte failure");
|
||||||
|
LocalFree(wide_message);
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, int sockaddrlen)
|
static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, int sockaddrlen)
|
||||||
{
|
{
|
||||||
int sock, e;
|
int sock, e;
|
||||||
|
@ -1439,13 +1458,10 @@ static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, i
|
||||||
if(sock < 0)
|
if(sock < 0)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
char buf[128];
|
|
||||||
WCHAR wBuffer[128];
|
|
||||||
int error = WSAGetLastError();
|
int error = WSAGetLastError();
|
||||||
if(FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, wBuffer, std::size(wBuffer), 0) == 0)
|
char *message = windows_format_system_message(error);
|
||||||
wBuffer[0] = 0;
|
dbg_msg("net", "failed to create socket with domain %d and type %d (%d '%s')", domain, type, error, message == nullptr ? "unknown error" : message);
|
||||||
WideCharToMultiByte(CP_UTF8, 0, wBuffer, -1, buf, sizeof(buf), NULL, NULL);
|
free(message);
|
||||||
dbg_msg("net", "failed to create socket with domain %d and type %d (%d '%s')", domain, type, error, buf);
|
|
||||||
#else
|
#else
|
||||||
dbg_msg("net", "failed to create socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno));
|
dbg_msg("net", "failed to create socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
|
@ -1478,13 +1494,10 @@ static int priv_net_create_socket(int domain, int type, struct sockaddr *addr, i
|
||||||
if(e != 0)
|
if(e != 0)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
char buf[128];
|
|
||||||
WCHAR wBuffer[128];
|
|
||||||
int error = WSAGetLastError();
|
int error = WSAGetLastError();
|
||||||
if(FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, error, 0, wBuffer, std::size(wBuffer), 0) == 0)
|
char *message = windows_format_system_message(error);
|
||||||
wBuffer[0] = 0;
|
dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, error, message == nullptr ? "unknown error" : message);
|
||||||
WideCharToMultiByte(CP_UTF8, 0, wBuffer, -1, buf, sizeof(buf), NULL, NULL);
|
free(message);
|
||||||
dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, error, buf);
|
|
||||||
#else
|
#else
|
||||||
dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno));
|
dbg_msg("net", "failed to bind socket with domain %d and type %d (%d '%s')", domain, type, errno, strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
|
@ -2097,26 +2110,24 @@ void fs_listdir(const char *dir, FS_LISTDIR_CALLBACK cb, int type, void *user)
|
||||||
WIN32_FIND_DATAW finddata;
|
WIN32_FIND_DATAW finddata;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
char buffer[IO_MAX_PATH_LENGTH];
|
char buffer[IO_MAX_PATH_LENGTH];
|
||||||
char buffer2[IO_MAX_PATH_LENGTH];
|
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
int length;
|
|
||||||
|
|
||||||
str_format(buffer, sizeof(buffer), "%s/*", dir);
|
str_format(buffer, sizeof(buffer), "%s/*", dir);
|
||||||
MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
|
|
||||||
handle = FindFirstFileW(wBuffer, &finddata);
|
handle = FindFirstFileW(wBuffer, &finddata);
|
||||||
if(handle == INVALID_HANDLE_VALUE)
|
if(handle == INVALID_HANDLE_VALUE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
str_format(buffer, sizeof(buffer), "%s/", dir);
|
|
||||||
length = str_length(buffer);
|
|
||||||
|
|
||||||
/* add all the entries */
|
/* add all the entries */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
WideCharToMultiByte(CP_UTF8, 0, finddata.cFileName, -1, buffer2, sizeof(buffer2), NULL, NULL);
|
if(WideCharToMultiByte(CP_UTF8, 0, finddata.cFileName, -1, buffer, sizeof(buffer), NULL, NULL) == 0)
|
||||||
str_copy(buffer + length, buffer2, (int)sizeof(buffer) - length);
|
{
|
||||||
if(cb(buffer2, (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0, type, user))
|
dbg_assert(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "WideCharToMultiByte failure");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(cb(buffer, (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0, type, user))
|
||||||
break;
|
break;
|
||||||
} while(FindNextFileW(handle, &finddata));
|
} while(FindNextFileW(handle, &finddata));
|
||||||
|
|
||||||
|
@ -2151,28 +2162,26 @@ void fs_listdir_fileinfo(const char *dir, FS_LISTDIR_CALLBACK_FILEINFO cb, int t
|
||||||
WIN32_FIND_DATAW finddata;
|
WIN32_FIND_DATAW finddata;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
char buffer[IO_MAX_PATH_LENGTH];
|
char buffer[IO_MAX_PATH_LENGTH];
|
||||||
char buffer2[IO_MAX_PATH_LENGTH];
|
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
int length;
|
|
||||||
|
|
||||||
str_format(buffer, sizeof(buffer), "%s/*", dir);
|
str_format(buffer, sizeof(buffer), "%s/*", dir);
|
||||||
MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
|
|
||||||
handle = FindFirstFileW(wBuffer, &finddata);
|
handle = FindFirstFileW(wBuffer, &finddata);
|
||||||
if(handle == INVALID_HANDLE_VALUE)
|
if(handle == INVALID_HANDLE_VALUE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
str_format(buffer, sizeof(buffer), "%s/", dir);
|
|
||||||
length = str_length(buffer);
|
|
||||||
|
|
||||||
/* add all the entries */
|
/* add all the entries */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
WideCharToMultiByte(CP_UTF8, 0, finddata.cFileName, -1, buffer2, sizeof(buffer2), NULL, NULL);
|
if(WideCharToMultiByte(CP_UTF8, 0, finddata.cFileName, -1, buffer, sizeof(buffer), NULL, NULL) == 0)
|
||||||
str_copy(buffer + length, buffer2, (int)sizeof(buffer) - length);
|
{
|
||||||
|
dbg_assert(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "WideCharToMultiByte failure");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
CFsFileInfo info;
|
CFsFileInfo info;
|
||||||
info.m_pName = buffer2;
|
info.m_pName = buffer;
|
||||||
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);
|
||||||
|
|
||||||
|
@ -2221,7 +2230,11 @@ int fs_storage_path(const char *appname, char *path, int max)
|
||||||
if(!home)
|
if(!home)
|
||||||
return -1;
|
return -1;
|
||||||
char buffer[IO_MAX_PATH_LENGTH];
|
char buffer[IO_MAX_PATH_LENGTH];
|
||||||
WideCharToMultiByte(CP_UTF8, 0, home, -1, buffer, sizeof(buffer), NULL, NULL);
|
if(WideCharToMultiByte(CP_UTF8, 0, home, -1, buffer, sizeof(buffer), NULL, NULL) == 0)
|
||||||
|
{
|
||||||
|
dbg_assert(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "WideCharToMultiByte failure");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
str_format(path, max, "%s/%s", buffer, appname);
|
str_format(path, max, "%s/%s", buffer, appname);
|
||||||
return 0;
|
return 0;
|
||||||
#elif defined(CONF_PLATFORM_ANDROID)
|
#elif defined(CONF_PLATFORM_ANDROID)
|
||||||
|
@ -2280,7 +2293,7 @@ int fs_makedir(const char *path)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, path, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, path, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
if(CreateDirectoryW(wBuffer, NULL) != 0)
|
if(CreateDirectoryW(wBuffer, NULL) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
if(GetLastError() == ERROR_ALREADY_EXISTS)
|
if(GetLastError() == ERROR_ALREADY_EXISTS)
|
||||||
|
@ -2304,7 +2317,7 @@ int fs_removedir(const char *path)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wPath[IO_MAX_PATH_LENGTH];
|
WCHAR wPath[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, path, -1, wPath, std::size(wPath));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, path, -1, wPath, std::size(wPath)) > 0, "MultiByteToWideChar failure");
|
||||||
if(RemoveDirectoryW(wPath) != 0)
|
if(RemoveDirectoryW(wPath) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -2319,7 +2332,7 @@ int fs_is_dir(const char *path)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wPath[IO_MAX_PATH_LENGTH];
|
WCHAR wPath[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, path, -1, wPath, std::size(wPath));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, path, -1, wPath, std::size(wPath)) > 0, "MultiByteToWideChar failure");
|
||||||
DWORD attributes = GetFileAttributesW(wPath);
|
DWORD attributes = GetFileAttributesW(wPath);
|
||||||
return attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
|
return attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
|
||||||
#else
|
#else
|
||||||
|
@ -2334,7 +2347,7 @@ int fs_is_relative_path(const char *path)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wPath[IO_MAX_PATH_LENGTH];
|
WCHAR wPath[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, path, -1, wPath, std::size(wPath));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, path, -1, wPath, std::size(wPath)) > 0, "MultiByteToWideChar failure");
|
||||||
return PathIsRelativeW(wPath) ? 1 : 0;
|
return PathIsRelativeW(wPath) ? 1 : 0;
|
||||||
#else
|
#else
|
||||||
return path[0] == '/' ? 0 : 1; // yes, it's that simple
|
return path[0] == '/' ? 0 : 1; // yes, it's that simple
|
||||||
|
@ -2347,7 +2360,7 @@ int fs_chdir(const char *path)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, path, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, path, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
return SetCurrentDirectoryW(wBuffer) != 0 ? 0 : 1;
|
return SetCurrentDirectoryW(wBuffer) != 0 ? 0 : 1;
|
||||||
#else
|
#else
|
||||||
if(chdir(path))
|
if(chdir(path))
|
||||||
|
@ -2366,8 +2379,12 @@ char *fs_getcwd(char *buffer, int buffer_size)
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
DWORD result = GetCurrentDirectoryW(std::size(wBuffer), wBuffer);
|
DWORD result = GetCurrentDirectoryW(std::size(wBuffer), wBuffer);
|
||||||
if(result == 0 || result > std::size(wBuffer))
|
if(result == 0 || result > std::size(wBuffer))
|
||||||
return 0;
|
return nullptr;
|
||||||
WideCharToMultiByte(CP_UTF8, 0, wBuffer, -1, buffer, buffer_size, NULL, NULL);
|
if(WideCharToMultiByte(CP_UTF8, 0, wBuffer, -1, buffer, buffer_size, NULL, NULL) == 0)
|
||||||
|
{
|
||||||
|
dbg_assert(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "WideCharToMultiByte failure");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
return buffer;
|
return buffer;
|
||||||
#else
|
#else
|
||||||
return getcwd(buffer, buffer_size);
|
return getcwd(buffer, buffer_size);
|
||||||
|
@ -2395,7 +2412,7 @@ int fs_remove(const char *filename)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wFilename[IO_MAX_PATH_LENGTH];
|
WCHAR wFilename[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, filename, -1, wFilename, std::size(wFilename));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, filename, -1, wFilename, std::size(wFilename)) > 0, "MultiByteToWideChar failure");
|
||||||
return DeleteFileW(wFilename) == 0;
|
return DeleteFileW(wFilename) == 0;
|
||||||
#else
|
#else
|
||||||
return unlink(filename) != 0;
|
return unlink(filename) != 0;
|
||||||
|
@ -2407,8 +2424,8 @@ int fs_rename(const char *oldname, const char *newname)
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wOldname[IO_MAX_PATH_LENGTH];
|
WCHAR wOldname[IO_MAX_PATH_LENGTH];
|
||||||
WCHAR wNewname[IO_MAX_PATH_LENGTH];
|
WCHAR wNewname[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, oldname, -1, wOldname, std::size(wOldname));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, oldname, -1, wOldname, std::size(wOldname)) > 0, "MultiByteToWideChar failure");
|
||||||
MultiByteToWideChar(CP_UTF8, 0, newname, -1, wNewname, std::size(wNewname));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, newname, -1, wNewname, std::size(wNewname)) > 0, "MultiByteToWideChar failure");
|
||||||
if(MoveFileExW(wOldname, wNewname, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) == 0)
|
if(MoveFileExW(wOldname, wNewname, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
#else
|
#else
|
||||||
|
@ -2425,7 +2442,7 @@ int fs_file_time(const char *name, time_t *created, time_t *modified)
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
|
|
||||||
MultiByteToWideChar(CP_UTF8, 0, name, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, name, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
handle = FindFirstFileW(wBuffer, &finddata);
|
handle = FindFirstFileW(wBuffer, &finddata);
|
||||||
if(handle == INVALID_HANDLE_VALUE)
|
if(handle == INVALID_HANDLE_VALUE)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -3861,8 +3878,8 @@ void cmdline_free(int argc, const char **argv)
|
||||||
PROCESS shell_execute(const char *file)
|
PROCESS shell_execute(const char *file)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wBuffer[512];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, file, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, file, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
SHELLEXECUTEINFOW info;
|
SHELLEXECUTEINFOW info;
|
||||||
mem_zero(&info, sizeof(SHELLEXECUTEINFOW));
|
mem_zero(&info, sizeof(SHELLEXECUTEINFOW));
|
||||||
info.cbSize = sizeof(SHELLEXECUTEINFOW);
|
info.cbSize = sizeof(SHELLEXECUTEINFOW);
|
||||||
|
@ -3910,8 +3927,8 @@ int kill_process(PROCESS process)
|
||||||
int open_link(const char *link)
|
int open_link(const char *link)
|
||||||
{
|
{
|
||||||
#if defined(CONF_FAMILY_WINDOWS)
|
#if defined(CONF_FAMILY_WINDOWS)
|
||||||
WCHAR wBuffer[512];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, link, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, link, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
SHELLEXECUTEINFOW info;
|
SHELLEXECUTEINFOW info;
|
||||||
mem_zero(&info, sizeof(SHELLEXECUTEINFOW));
|
mem_zero(&info, sizeof(SHELLEXECUTEINFOW));
|
||||||
info.cbSize = sizeof(SHELLEXECUTEINFOW);
|
info.cbSize = sizeof(SHELLEXECUTEINFOW);
|
||||||
|
@ -3958,7 +3975,8 @@ int open_file(const char *path)
|
||||||
char workingDir[IO_MAX_PATH_LENGTH];
|
char workingDir[IO_MAX_PATH_LENGTH];
|
||||||
if(fs_is_relative_path(path))
|
if(fs_is_relative_path(path))
|
||||||
{
|
{
|
||||||
fs_getcwd(workingDir, sizeof(workingDir));
|
if(!fs_getcwd(workingDir, sizeof(workingDir)))
|
||||||
|
return 0;
|
||||||
str_append(workingDir, "/", sizeof(workingDir));
|
str_append(workingDir, "/", sizeof(workingDir));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4236,7 +4254,7 @@ void set_exception_handler_log_file(const char *log_file_path)
|
||||||
if(exception_handling_module != nullptr)
|
if(exception_handling_module != nullptr)
|
||||||
{
|
{
|
||||||
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
WCHAR wBuffer[IO_MAX_PATH_LENGTH];
|
||||||
MultiByteToWideChar(CP_UTF8, 0, log_file_path, -1, wBuffer, std::size(wBuffer));
|
dbg_assert(MultiByteToWideChar(CP_UTF8, 0, log_file_path, -1, wBuffer, std::size(wBuffer)) > 0, "MultiByteToWideChar failure");
|
||||||
// Intentional
|
// Intentional
|
||||||
#ifdef __MINGW32__
|
#ifdef __MINGW32__
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
|
|
Loading…
Reference in a new issue