wininet: Fix handling of subdirectory in FtpFindFirstFile.
Based on a patch by Mike Ruprecht.
This commit is contained in:
parent
ea3ba29332
commit
2ce1650968
|
@ -831,6 +831,7 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
|
||||||
INT nResCode;
|
INT nResCode;
|
||||||
appinfo_t *hIC = NULL;
|
appinfo_t *hIC = NULL;
|
||||||
HINTERNET hFindNext = NULL;
|
HINTERNET hFindNext = NULL;
|
||||||
|
LPWSTR lpszSearchPath = NULL;
|
||||||
|
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
|
|
||||||
|
@ -846,7 +847,20 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
|
||||||
if (!FTP_SendPortOrPasv(lpwfs))
|
if (!FTP_SendPortOrPasv(lpwfs))
|
||||||
goto lend;
|
goto lend;
|
||||||
|
|
||||||
if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_LIST, NULL,
|
/* split search path into file and path */
|
||||||
|
if (lpszSearchFile)
|
||||||
|
{
|
||||||
|
LPCWSTR name = lpszSearchFile, p;
|
||||||
|
if ((p = strrchrW( name, '\\' ))) name = p + 1;
|
||||||
|
if ((p = strrchrW( name, '/' ))) name = p + 1;
|
||||||
|
if (name != lpszSearchFile)
|
||||||
|
{
|
||||||
|
lpszSearchPath = heap_strndupW(lpszSearchFile, name - lpszSearchFile);
|
||||||
|
lpszSearchFile = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_LIST, lpszSearchPath,
|
||||||
lpwfs->hdr.lpfnStatusCB, &lpwfs->hdr, lpwfs->hdr.dwContext))
|
lpwfs->hdr.lpfnStatusCB, &lpwfs->hdr, lpwfs->hdr.dwContext))
|
||||||
goto lend;
|
goto lend;
|
||||||
|
|
||||||
|
@ -872,6 +886,8 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
|
||||||
}
|
}
|
||||||
|
|
||||||
lend:
|
lend:
|
||||||
|
heap_free(lpszSearchPath);
|
||||||
|
|
||||||
if (lpwfs->lstnSocket != -1)
|
if (lpwfs->lstnSocket != -1)
|
||||||
{
|
{
|
||||||
closesocket(lpwfs->lstnSocket);
|
closesocket(lpwfs->lstnSocket);
|
||||||
|
|
|
@ -751,6 +751,7 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
|
||||||
HINTERNET hSearch2;
|
HINTERNET hSearch2;
|
||||||
HINTERNET hOpenFile;
|
HINTERNET hOpenFile;
|
||||||
DWORD error;
|
DWORD error;
|
||||||
|
BOOL success;
|
||||||
|
|
||||||
/* NULL as the search file ought to return the first file in the directory */
|
/* NULL as the search file ought to return the first file in the directory */
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
|
@ -770,13 +771,13 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
|
||||||
/* Try a valid filename in a subdirectory search */
|
/* Try a valid filename in a subdirectory search */
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
hSearch = FtpFindFirstFileA(hFtp, "pub/wine", &findData, 0, 0);
|
hSearch = FtpFindFirstFileA(hFtp, "pub/wine", &findData, 0, 0);
|
||||||
todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
|
ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
|
||||||
InternetCloseHandle(hSearch);
|
InternetCloseHandle(hSearch);
|
||||||
|
|
||||||
/* Try a valid filename in a subdirectory wildcard search */
|
/* Try a valid filename in a subdirectory wildcard search */
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
hSearch = FtpFindFirstFileA(hFtp, "pub/w*", &findData, 0, 0);
|
hSearch = FtpFindFirstFileA(hFtp, "pub/w*", &findData, 0, 0);
|
||||||
todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
|
ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
|
||||||
InternetCloseHandle(hSearch);
|
InternetCloseHandle(hSearch);
|
||||||
|
|
||||||
/* Try an invalid wildcard search */
|
/* Try an invalid wildcard search */
|
||||||
|
@ -785,6 +786,24 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
|
||||||
ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" );
|
ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" );
|
||||||
InternetCloseHandle(hSearch); /* Just in case */
|
InternetCloseHandle(hSearch); /* Just in case */
|
||||||
|
|
||||||
|
/* change current directory, and repeat those tests - this shows
|
||||||
|
* that the search string is interpreted as relative directory. */
|
||||||
|
success = FtpSetCurrentDirectoryA(hFtp, "pub");
|
||||||
|
ok( success, "Expected FtpSetCurrentDirectory to succeed\n" );
|
||||||
|
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
hSearch = FtpFindFirstFileA(hFtp, "wine", &findData, 0, 0);
|
||||||
|
ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
|
||||||
|
InternetCloseHandle(hSearch);
|
||||||
|
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
hSearch = FtpFindFirstFileA(hFtp, "w*", &findData, 0, 0);
|
||||||
|
ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
|
||||||
|
InternetCloseHandle(hSearch);
|
||||||
|
|
||||||
|
success = FtpSetCurrentDirectoryA(hFtp, "..");
|
||||||
|
ok( success, "Expected FtpSetCurrentDirectory to succeed\n" );
|
||||||
|
|
||||||
/* Try FindFirstFile between FtpOpenFile and InternetCloseHandle */
|
/* Try FindFirstFile between FtpOpenFile and InternetCloseHandle */
|
||||||
SetLastError(0xdeadbeef);
|
SetLastError(0xdeadbeef);
|
||||||
hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
|
hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
|
||||||
|
|
Loading…
Reference in New Issue