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;
|
||||
appinfo_t *hIC = NULL;
|
||||
HINTERNET hFindNext = NULL;
|
||||
LPWSTR lpszSearchPath = NULL;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
|
@ -846,7 +847,20 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
|
|||
if (!FTP_SendPortOrPasv(lpwfs))
|
||||
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))
|
||||
goto lend;
|
||||
|
||||
|
@ -872,6 +886,8 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
|
|||
}
|
||||
|
||||
lend:
|
||||
heap_free(lpszSearchPath);
|
||||
|
||||
if (lpwfs->lstnSocket != -1)
|
||||
{
|
||||
closesocket(lpwfs->lstnSocket);
|
||||
|
|
|
@ -751,6 +751,7 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
|
|||
HINTERNET hSearch2;
|
||||
HINTERNET hOpenFile;
|
||||
DWORD error;
|
||||
BOOL success;
|
||||
|
||||
/* NULL as the search file ought to return the first file in the directory */
|
||||
SetLastError(0xdeadbeef);
|
||||
|
@ -770,13 +771,13 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
|
|||
/* Try a valid filename in a subdirectory search */
|
||||
SetLastError(0xdeadbeef);
|
||||
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);
|
||||
|
||||
/* Try a valid filename in a subdirectory wildcard search */
|
||||
SetLastError(0xdeadbeef);
|
||||
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);
|
||||
|
||||
/* 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" );
|
||||
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 */
|
||||
SetLastError(0xdeadbeef);
|
||||
hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);
|
||||
|
|
Loading…
Reference in New Issue