diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c index f45e495b305..64c06c3868d 100644 --- a/dlls/wininet/ftp.c +++ b/dlls/wininet/ftp.c @@ -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); diff --git a/dlls/wininet/tests/ftp.c b/dlls/wininet/tests/ftp.c index b88b13685fb..567545d2b9f 100644 --- a/dlls/wininet/tests/ftp.c +++ b/dlls/wininet/tests/ftp.c @@ -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);