ReactOS  0.4.14-dev-593-g1793dcc
ftp.c File Reference
#include "ws2tcpip.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "wininet.h"
#include "winnls.h"
#include "winerror.h"
#include "winreg.h"
#include "winternl.h"
#include "shlwapi.h"
#include "wine/debug.h"
#include "internet.h"
Include dependency graph for ftp.c:

Go to the source code of this file.

Classes

struct  ftp_file_t
 
struct  _ftp_session_t
 
struct  FILEPROPERTIESW
 
struct  WININETFTPFINDNEXTW
 
struct  put_file_task_t
 
struct  directory_task_t
 
struct  find_first_file_task_t
 
struct  get_current_dir_task_t
 
struct  open_file_task_t
 
struct  get_file_task_t
 
struct  delete_file_task_t
 
struct  rename_file_task_t
 
struct  find_next_task_t
 

Macros

#define RESPONSE_TIMEOUT   30
 
#define DATA_PACKET_SIZE   0x2000
 
#define szCRLF   "\r\n"
 
#define MAX_BACKLOG   5
 
#define FTP_CONDITION_MASK   0x0007
 

Typedefs

typedef struct _ftp_session_t ftp_session_t
 
typedef struct FILEPROPERTIESWLPFILEPROPERTIESW
 
typedef struct WININETFTPFINDNEXTWLPWININETFTPFINDNEXTW
 

Enumerations

enum  FTP_COMMAND {
  FTP_CMD_ACCT, FTP_CMD_CWD, FTP_CMD_DELE, FTP_CMD_MKD,
  FTP_CMD_PASS, FTP_CMD_PORT, FTP_CMD_RETR, FTP_CMD_RMD,
  FTP_CMD_RNFR, FTP_CMD_RNTO, FTP_CMD_STOR, FTP_CMD_TYPE,
  FTP_CMD_USER, FTP_CMD_SIZE, FTP_CMD_ABOR, FTP_CMD_LIST,
  FTP_CMD_NLST, FTP_CMD_PASV, FTP_CMD_PWD, FTP_CMD_QUIT
}
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (wininet)
 
static BOOL FTP_SendCommand (INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
 
static BOOL FTP_SendStore (ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
 
static BOOL FTP_GetDataSocket (ftp_session_t *, LPINT nDataSocket)
 
static BOOL FTP_SendData (ftp_session_t *, INT nDataSocket, HANDLE hFile)
 
static INT FTP_ReceiveResponse (ftp_session_t *, DWORD_PTR dwContext)
 
static BOOL FTP_SendRetrieve (ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
 
static BOOL FTP_RetrieveFileData (ftp_session_t *, INT nDataSocket, HANDLE hFile)
 
static BOOL FTP_InitListenSocket (ftp_session_t *)
 
static BOOL FTP_ConnectToHost (ftp_session_t *)
 
static BOOL FTP_SendPassword (ftp_session_t *)
 
static BOOL FTP_SendAccount (ftp_session_t *)
 
static BOOL FTP_SendType (ftp_session_t *, DWORD dwType)
 
static BOOL FTP_SendPort (ftp_session_t *)
 
static BOOL FTP_DoPassive (ftp_session_t *)
 
static BOOL FTP_SendPortOrPasv (ftp_session_t *)
 
static BOOL FTP_ParsePermission (LPCSTR lpszPermission, LPFILEPROPERTIESW lpfp)
 
static BOOL FTP_ParseNextFile (INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERTIESW fileprop)
 
static BOOL FTP_ParseDirectory (ftp_session_t *, INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERTIESW *lpafp, LPDWORD dwfp)
 
static HINTERNET FTP_ReceiveFileList (ftp_session_t *, INT nSocket, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD_PTR dwContext)
 
static DWORD FTP_SetResponseError (DWORD dwResponse)
 
static BOOL FTP_ConvertFileProp (LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData)
 
static BOOL FTP_FtpPutFileW (ftp_session_t *, LPCWSTR lpszLocalFile, LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
 
static BOOL FTP_FtpSetCurrentDirectoryW (ftp_session_t *, LPCWSTR lpszDirectory)
 
static BOOL FTP_FtpCreateDirectoryW (ftp_session_t *, LPCWSTR lpszDirectory)
 
static HINTERNET FTP_FtpFindFirstFileW (ftp_session_t *, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext)
 
static BOOL FTP_FtpGetCurrentDirectoryW (ftp_session_t *, LPWSTR lpszCurrentDirectory, LPDWORD lpdwCurrentDirectory)
 
static BOOL FTP_FtpRenameFileW (ftp_session_t *, LPCWSTR lpszSrc, LPCWSTR lpszDest)
 
static BOOL FTP_FtpRemoveDirectoryW (ftp_session_t *, LPCWSTR lpszDirectory)
 
static BOOL FTP_FtpDeleteFileW (ftp_session_t *, LPCWSTR lpszFileName)
 
static BOOL FTP_FtpGetFileW (ftp_session_t *, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext)
 
static BOOL res_to_le (DWORD res)
 
BOOL WINAPI FtpPutFileA (HINTERNET hConnect, LPCSTR lpszLocalFile, LPCSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
 
static void AsyncFtpPutFileProc (task_header_t *hdr)
 
BOOL WINAPI FtpPutFileW (HINTERNET hConnect, LPCWSTR lpszLocalFile, LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
 
BOOL WINAPI FtpSetCurrentDirectoryA (HINTERNET hConnect, LPCSTR lpszDirectory)
 
static void AsyncFtpSetCurrentDirectoryProc (task_header_t *hdr)
 
BOOL WINAPI FtpSetCurrentDirectoryW (HINTERNET hConnect, LPCWSTR lpszDirectory)
 
BOOL WINAPI FtpCreateDirectoryA (HINTERNET hConnect, LPCSTR lpszDirectory)
 
static void AsyncFtpCreateDirectoryProc (task_header_t *hdr)
 
BOOL WINAPI FtpCreateDirectoryW (HINTERNET hConnect, LPCWSTR lpszDirectory)
 
HINTERNET WINAPI FtpFindFirstFileA (HINTERNET hConnect, LPCSTR lpszSearchFile, LPWIN32_FIND_DATAA lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext)
 
static void AsyncFtpFindFirstFileProc (task_header_t *hdr)
 
HINTERNET WINAPI FtpFindFirstFileW (HINTERNET hConnect, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext)
 
BOOL WINAPI FtpGetCurrentDirectoryA (HINTERNET hFtpSession, LPSTR lpszCurrentDirectory, LPDWORD lpdwCurrentDirectory)
 
static void AsyncFtpGetCurrentDirectoryProc (task_header_t *hdr)
 
BOOL WINAPI FtpGetCurrentDirectoryW (HINTERNET hFtpSession, LPWSTR lpszCurrentDirectory, LPDWORD lpdwCurrentDirectory)
 
static void FTPFILE_Destroy (object_header_t *hdr)
 
static DWORD FTPFILE_QueryOption (object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
 
static DWORD FTPFILE_ReadFile (object_header_t *hdr, void *buffer, DWORD size, DWORD *read, DWORD flags, DWORD_PTR context)
 
static DWORD FTPFILE_WriteFile (object_header_t *hdr, const void *buffer, DWORD size, DWORD *written)
 
static void FTP_ReceiveRequestData (ftp_file_t *file, BOOL first_notif)
 
static void FTPFILE_AsyncQueryDataAvailableProc (task_header_t *task)
 
static DWORD FTPFILE_QueryDataAvailable (object_header_t *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx)
 
static DWORD FTPFILE_LockRequestFile (object_header_t *hdr, req_file_t **ret)
 
static HINTERNET FTP_FtpOpenFileW (ftp_session_t *lpwfs, LPCWSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext)
 
HINTERNET WINAPI FtpOpenFileA (HINTERNET hFtpSession, LPCSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext)
 
static void AsyncFtpOpenFileProc (task_header_t *hdr)
 
HINTERNET WINAPI FtpOpenFileW (HINTERNET hFtpSession, LPCWSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext)
 
BOOL WINAPI FtpGetFileA (HINTERNET hInternet, LPCSTR lpszRemoteFile, LPCSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext)
 
static void AsyncFtpGetFileProc (task_header_t *hdr)
 
BOOL WINAPI FtpGetFileW (HINTERNET hInternet, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext)
 
DWORD WINAPI FtpGetFileSize (HINTERNET hFile, LPDWORD lpdwFileSizeHigh)
 
BOOL WINAPI FtpDeleteFileA (HINTERNET hFtpSession, LPCSTR lpszFileName)
 
static void AsyncFtpDeleteFileProc (task_header_t *hdr)
 
BOOL WINAPI FtpDeleteFileW (HINTERNET hFtpSession, LPCWSTR lpszFileName)
 
BOOL WINAPI FtpRemoveDirectoryA (HINTERNET hFtpSession, LPCSTR lpszDirectory)
 
static void AsyncFtpRemoveDirectoryProc (task_header_t *hdr)
 
BOOL WINAPI FtpRemoveDirectoryW (HINTERNET hFtpSession, LPCWSTR lpszDirectory)
 
BOOL WINAPI FtpRenameFileA (HINTERNET hFtpSession, LPCSTR lpszSrc, LPCSTR lpszDest)
 
static void AsyncFtpRenameFileProc (task_header_t *hdr)
 
BOOL WINAPI FtpRenameFileW (HINTERNET hFtpSession, LPCWSTR lpszSrc, LPCWSTR lpszDest)
 
BOOL WINAPI FtpCommandA (HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags, LPCSTR lpszCommand, DWORD_PTR dwContext, HINTERNET *phFtpCommand)
 
BOOL WINAPI FtpCommandW (HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags, LPCWSTR lpszCommand, DWORD_PTR dwContext, HINTERNET *phFtpCommand)
 
static void FTPSESSION_Destroy (object_header_t *hdr)
 
static void FTPSESSION_CloseConnection (object_header_t *hdr)
 
static DWORD FTPSESSION_QueryOption (object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
 
HINTERNET FTP_Connect (appinfo_t *hIC, LPCWSTR lpszServerName, INTERNET_PORT nServerPort, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwFlags, DWORD_PTR dwContext, DWORD dwInternalFlags)
 
static LPSTR FTP_GetNextLine (INT nSocket, LPDWORD dwLen)
 
static BOOL FTP_SendCommandA (INT nSocket, FTP_COMMAND ftpCmd, LPCSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
 
static void FTPFINDNEXT_Destroy (object_header_t *hdr)
 
static DWORD FTPFINDNEXT_FindNextFileProc (WININETFTPFINDNEXTW *find, LPVOID data)
 
static void FTPFINDNEXT_AsyncFindNextFileProc (task_header_t *hdr)
 
static DWORD FTPFINDNEXT_QueryOption (object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
 
static DWORD FTPFINDNEXT_FindNextFileW (object_header_t *hdr, void *data)
 

Variables

static const CHAR *const szFtpCommands []
 
static const CHAR szMonths [] = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
 
static const WCHAR szNoAccount [] = {'n','o','a','c','c','o','u','n','t','\0'}
 
static const object_vtbl_t FTPFILEVtbl
 
static const object_vtbl_t FTPSESSIONVtbl
 
static const object_vtbl_t FTPFINDNEXTVtbl
 

Macro Definition Documentation

◆ DATA_PACKET_SIZE

#define DATA_PACKET_SIZE   0x2000

Definition at line 103 of file ftp.c.

◆ FTP_CONDITION_MASK

#define FTP_CONDITION_MASK   0x0007

Definition at line 110 of file ftp.c.

◆ MAX_BACKLOG

#define MAX_BACKLOG   5

Definition at line 105 of file ftp.c.

◆ RESPONSE_TIMEOUT

#define RESPONSE_TIMEOUT   30

Definition at line 55 of file ftp.c.

◆ szCRLF

#define szCRLF   "\r\n"

Definition at line 104 of file ftp.c.

Typedef Documentation

◆ ftp_session_t

Definition at line 57 of file ftp.c.

◆ LPFILEPROPERTIESW

◆ LPWININETFTPFINDNEXTW

Enumeration Type Documentation

◆ FTP_COMMAND

Enumerator
FTP_CMD_ACCT 
FTP_CMD_CWD 
FTP_CMD_DELE 
FTP_CMD_MKD 
FTP_CMD_PASS 
FTP_CMD_PORT 
FTP_CMD_RETR 
FTP_CMD_RMD 
FTP_CMD_RNFR 
FTP_CMD_RNTO 
FTP_CMD_STOR 
FTP_CMD_TYPE 
FTP_CMD_USER 
FTP_CMD_SIZE 
FTP_CMD_ABOR 
FTP_CMD_LIST 
FTP_CMD_NLST 
FTP_CMD_PASV 
FTP_CMD_PWD 
FTP_CMD_QUIT 

Definition at line 112 of file ftp.c.

112  {
113  /* FTP commands with arguments. */
114  FTP_CMD_ACCT,
115  FTP_CMD_CWD,
116  FTP_CMD_DELE,
117  FTP_CMD_MKD,
118  FTP_CMD_PASS,
119  FTP_CMD_PORT,
120  FTP_CMD_RETR,
121  FTP_CMD_RMD,
122  FTP_CMD_RNFR,
123  FTP_CMD_RNTO,
124  FTP_CMD_STOR,
125  FTP_CMD_TYPE,
126  FTP_CMD_USER,
127  FTP_CMD_SIZE,
128 
129  /* FTP commands without arguments. */
130  FTP_CMD_ABOR,
131  FTP_CMD_LIST,
132  FTP_CMD_NLST,
133  FTP_CMD_PASV,
134  FTP_CMD_PWD,
135  FTP_CMD_QUIT,
136 } FTP_COMMAND;
FTP_COMMAND
Definition: ftp.c:112

Function Documentation

◆ AsyncFtpCreateDirectoryProc()

static void AsyncFtpCreateDirectoryProc ( task_header_t hdr)
static

Definition at line 575 of file ftp.c.

576 {
579 
580  TRACE(" %p\n", session);
581 
583  heap_free(task->directory);
584 }
char hdr[14]
Definition: iptest.cpp:33
static BOOL FTP_FtpCreateDirectoryW(ftp_session_t *, LPCWSTR lpszDirectory)
Definition: ftp.c:658
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
WCHAR * directory
Definition: ftp.c:429
task_header_t hdr
Definition: ftp.c:428
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpCreateDirectoryW().

◆ AsyncFtpDeleteFileProc()

static void AsyncFtpDeleteFileProc ( task_header_t hdr)
static

Definition at line 1790 of file ftp.c.

1791 {
1794 
1795  TRACE("%p\n", session);
1796 
1798  heap_free(task->file_name);
1799 }
char hdr[14]
Definition: iptest.cpp:33
WCHAR * file_name
Definition: ftp.c:1787
#define TRACE(s)
Definition: solgame.cpp:4
task_header_t hdr
Definition: ftp.c:1786
object_header_t * hdr
Definition: internet.h:391
static BOOL FTP_FtpDeleteFileW(ftp_session_t *, LPCWSTR lpszFileName)
Definition: ftp.c:1873
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpDeleteFileW().

◆ AsyncFtpFindFirstFileProc()

static void AsyncFtpFindFirstFileProc ( task_header_t hdr)
static

Definition at line 733 of file ftp.c.

734 {
737 
738  TRACE("%p\n", session);
739 
741  heap_free(task->search_file);
742 }
char hdr[14]
Definition: iptest.cpp:33
DWORD_PTR context
Definition: ftp.c:730
WIN32_FIND_DATAW * find_file_data
Definition: ftp.c:728
task_header_t hdr
Definition: ftp.c:726
WCHAR * search_file
Definition: ftp.c:727
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext)
Definition: ftp.c:811
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpFindFirstFileW().

◆ AsyncFtpGetCurrentDirectoryProc()

static void AsyncFtpGetCurrentDirectoryProc ( task_header_t hdr)
static

Definition at line 948 of file ftp.c.

949 {
952 
953  TRACE("%p\n", session);
954 
956 }
char hdr[14]
Definition: iptest.cpp:33
DWORD * directory_len
Definition: ftp.c:945
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
task_header_t hdr
Definition: ftp.c:943
WCHAR * directory
Definition: ftp.c:944
static BOOL FTP_FtpGetCurrentDirectoryW(ftp_session_t *, LPWSTR lpszCurrentDirectory, LPDWORD lpdwCurrentDirectory)
Definition: ftp.c:1043

Referenced by FtpGetCurrentDirectoryW().

◆ AsyncFtpGetFileProc()

static void AsyncFtpGetFileProc ( task_header_t hdr)
static

Definition at line 1583 of file ftp.c.

1584 {
1587 
1588  TRACE("%p\n", session);
1589 
1591  task->local_attr, task->flags, task->context);
1592  heap_free(task->remote_file);
1593  heap_free(task->new_file);
1594 }
char hdr[14]
Definition: iptest.cpp:33
WCHAR * remote_file
Definition: ftp.c:1575
DWORD_PTR context
Definition: ftp.c:1580
WCHAR * new_file
Definition: ftp.c:1576
task_header_t hdr
Definition: ftp.c:1574
#define TRACE(s)
Definition: solgame.cpp:4
static BOOL FTP_FtpGetFileW(ftp_session_t *, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext)
Definition: ftp.c:1684
object_header_t * hdr
Definition: internet.h:391
DWORD local_attr
Definition: ftp.c:1578
DWORD flags
Definition: ftp.c:1579
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
BOOL fail_if_exists
Definition: ftp.c:1577

Referenced by FtpGetFileW().

◆ AsyncFtpOpenFileProc()

static void AsyncFtpOpenFileProc ( task_header_t hdr)
static

Definition at line 1461 of file ftp.c.

1462 {
1465 
1466  TRACE("%p\n", session);
1467 
1468  FTP_FtpOpenFileW(session, task->file_name, task->access, task->flags, task->context);
1469  heap_free(task->file_name);
1470 }
DWORD flags
Definition: ftp.c:1457
char hdr[14]
Definition: iptest.cpp:33
WCHAR * file_name
Definition: ftp.c:1455
DWORD_PTR context
Definition: ftp.c:1458
static HINTERNET FTP_FtpOpenFileW(ftp_session_t *lpwfs, LPCWSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext)
Definition: ftp.c:1314
task_header_t hdr
Definition: ftp.c:1454
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
DWORD access
Definition: ftp.c:1456
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpOpenFileW().

◆ AsyncFtpPutFileProc()

static void AsyncFtpPutFileProc ( task_header_t hdr)
static

Definition at line 245 of file ftp.c.

246 {
249 
250  TRACE("%p\n", session);
251 
253  task->flags, task->context);
254 
255  heap_free(task->local_file);
256  heap_free(task->remote_file);
257 }
char hdr[14]
Definition: iptest.cpp:33
WCHAR * remote_file
Definition: ftp.c:240
static BOOL FTP_FtpPutFileW(ftp_session_t *, LPCWSTR lpszLocalFile, LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
Definition: ftp.c:341
task_header_t hdr
Definition: ftp.c:238
DWORD_PTR context
Definition: ftp.c:242
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
DWORD flags
Definition: ftp.c:241
WCHAR * local_file
Definition: ftp.c:239
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpPutFileW().

◆ AsyncFtpRemoveDirectoryProc()

static void AsyncFtpRemoveDirectoryProc ( task_header_t hdr)
static

Definition at line 1932 of file ftp.c.

1933 {
1936 
1937  TRACE("%p\n", session);
1938 
1940  heap_free(task->directory);
1941 }
char hdr[14]
Definition: iptest.cpp:33
static BOOL FTP_FtpRemoveDirectoryW(ftp_session_t *, LPCWSTR lpszDirectory)
Definition: ftp.c:2015
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
WCHAR * directory
Definition: ftp.c:429
task_header_t hdr
Definition: ftp.c:428
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpRemoveDirectoryW().

◆ AsyncFtpRenameFileProc()

static void AsyncFtpRenameFileProc ( task_header_t hdr)
static

Definition at line 2084 of file ftp.c.

2085 {
2088 
2089  TRACE("%p\n", session);
2090 
2092  heap_free(task->src_file);
2093  heap_free(task->dst_file);
2094 }
char hdr[14]
Definition: iptest.cpp:33
WCHAR * dst_file
Definition: ftp.c:2081
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
WCHAR * src_file
Definition: ftp.c:2080
task_header_t hdr
Definition: ftp.c:2079
static BOOL FTP_FtpRenameFileW(ftp_session_t *, LPCWSTR lpszSrc, LPCWSTR lpszDest)
Definition: ftp.c:2169
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpRenameFileW().

◆ AsyncFtpSetCurrentDirectoryProc()

static void AsyncFtpSetCurrentDirectoryProc ( task_header_t hdr)
static

Definition at line 432 of file ftp.c.

433 {
436 
437  TRACE("%p\n", session);
438 
440  heap_free(task->directory);
441 }
char hdr[14]
Definition: iptest.cpp:33
static BOOL FTP_FtpSetCurrentDirectoryW(ftp_session_t *, LPCWSTR lpszDirectory)
Definition: ftp.c:513
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t * hdr
Definition: internet.h:391
WCHAR * directory
Definition: ftp.c:429
task_header_t hdr
Definition: ftp.c:428
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpSetCurrentDirectoryW().

◆ FTP_Connect()

HINTERNET FTP_Connect ( appinfo_t hIC,
LPCWSTR  lpszServerName,
INTERNET_PORT  nServerPort,
LPCWSTR  lpszUserName,
LPCWSTR  lpszPassword,
DWORD  dwFlags,
DWORD_PTR  dwContext,
DWORD  dwInternalFlags 
)

Definition at line 2425 of file ftp.c.

2429 {
2430  static const WCHAR szKey[] = {'S','o','f','t','w','a','r','e','\\',
2431  'M','i','c','r','o','s','o','f','t','\\',
2432  'W','i','n','d','o','w','s','\\',
2433  'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
2434  'I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s',0};
2435  static const WCHAR szValue[] = {'E','m','a','i','l','N','a','m','e',0};
2436  static const WCHAR szDefaultUsername[] = {'a','n','o','n','y','m','o','u','s','\0'};
2437  static const WCHAR szEmpty[] = {'\0'};
2438  struct sockaddr_in socketAddr;
2439  INT nsocket = -1;
2440  socklen_t sock_namelen;
2441  BOOL bSuccess = FALSE;
2442  ftp_session_t *lpwfs = NULL;
2443  char szaddr[INET6_ADDRSTRLEN];
2444 
2445  TRACE("%p Server(%s) Port(%d) User(%s) Paswd(%s)\n",
2446  hIC, debugstr_w(lpszServerName),
2447  nServerPort, debugstr_w(lpszUserName), debugstr_w(lpszPassword));
2448 
2449  assert( hIC->hdr.htype == WH_HINIT );
2450 
2451  if ((!lpszUserName || !*lpszUserName) && lpszPassword && *lpszPassword)
2452  {
2454  return NULL;
2455  }
2456 
2457  lpwfs = alloc_object(&hIC->hdr, &FTPSESSIONVtbl, sizeof(ftp_session_t));
2458  if (NULL == lpwfs)
2459  {
2461  return NULL;
2462  }
2463 
2464  if (nServerPort == INTERNET_INVALID_PORT_NUMBER)
2466  else
2467  lpwfs->serverport = nServerPort;
2468 
2469  lpwfs->hdr.htype = WH_HFTPSESSION;
2470  lpwfs->hdr.dwFlags = dwFlags;
2471  lpwfs->hdr.dwContext = dwContext;
2472  lpwfs->hdr.dwInternalFlags |= dwInternalFlags;
2473  lpwfs->download_in_progress = NULL;
2474  lpwfs->sndSocket = -1;
2475  lpwfs->lstnSocket = -1;
2476  lpwfs->pasvSocket = -1;
2477 
2478  WININET_AddRef( &hIC->hdr );
2479  lpwfs->lpAppInfo = hIC;
2480  list_add_head( &hIC->hdr.children, &lpwfs->hdr.entry );
2481 
2482  if(hIC->proxy && hIC->accessType == INTERNET_OPEN_TYPE_PROXY) {
2483  if(strchrW(hIC->proxy, ' '))
2484  FIXME("Several proxies not implemented.\n");
2485  if(hIC->proxyBypass)
2486  FIXME("Proxy bypass is ignored.\n");
2487  }
2488  if (!lpszUserName || !lpszUserName[0]) {
2489  HKEY key;
2490  WCHAR szPassword[MAX_PATH];
2491  DWORD len = sizeof(szPassword);
2492 
2493  lpwfs->lpszUserName = heap_strdupW(szDefaultUsername);
2494 
2495  RegOpenKeyW(HKEY_CURRENT_USER, szKey, &key);
2496  if (RegQueryValueExW(key, szValue, NULL, NULL, (LPBYTE)szPassword, &len)) {
2497  /* Nothing in the registry, get the username and use that as the password */
2498  if (!GetUserNameW(szPassword, &len)) {
2499  /* Should never get here, but use an empty password as failsafe */
2500  strcpyW(szPassword, szEmpty);
2501  }
2502  }
2503  RegCloseKey(key);
2504 
2505  TRACE("Password used for anonymous ftp : (%s)\n", debugstr_w(szPassword));
2506  lpwfs->lpszPassword = heap_strdupW(szPassword);
2507  }
2508  else {
2509  lpwfs->lpszUserName = heap_strdupW(lpszUserName);
2511  }
2512  lpwfs->servername = heap_strdupW(lpszServerName);
2513 
2514  /* Don't send a handle created callback if this handle was created with InternetOpenUrl */
2515  if (!(lpwfs->hdr.dwInternalFlags & INET_OPENURL))
2516  {
2518 
2519  iar.dwResult = (DWORD_PTR)lpwfs->hdr.hInternet;
2520  iar.dwError = ERROR_SUCCESS;
2521 
2522  INTERNET_SendCallback(&hIC->hdr, dwContext,
2524  sizeof(INTERNET_ASYNC_RESULT));
2525  }
2526 
2528  (LPWSTR) lpszServerName, (strlenW(lpszServerName)+1) * sizeof(WCHAR));
2529 
2530  sock_namelen = sizeof(socketAddr);
2531  if (!GetAddress(lpszServerName, lpwfs->serverport, (struct sockaddr *)&socketAddr, &sock_namelen, szaddr))
2532  {
2534  goto lerror;
2535  }
2536 
2537  if (socketAddr.sin_family != AF_INET)
2538  {
2539  WARN("unsupported address family %d\n", socketAddr.sin_family);
2541  goto lerror;
2542  }
2543 
2545  szaddr, strlen(szaddr)+1);
2546 
2547  init_winsock();
2548  nsocket = socket(AF_INET,SOCK_STREAM,0);
2549  if (nsocket == -1)
2550  {
2552  goto lerror;
2553  }
2554 
2556  szaddr, strlen(szaddr)+1);
2557 
2558  if (connect(nsocket, (struct sockaddr *)&socketAddr, sock_namelen) < 0)
2559  {
2560  ERR("Unable to connect (%d)\n", WSAGetLastError());
2562  closesocket(nsocket);
2563  }
2564  else
2565  {
2566  TRACE("Connected to server\n");
2567  lpwfs->sndSocket = nsocket;
2569  szaddr, strlen(szaddr)+1);
2570 
2571  sock_namelen = sizeof(lpwfs->socketAddress);
2572  getsockname(nsocket, (struct sockaddr *) &lpwfs->socketAddress, &sock_namelen);
2573 
2574  if (FTP_ConnectToHost(lpwfs))
2575  {
2576  TRACE("Successfully logged into server\n");
2577  bSuccess = TRUE;
2578  }
2579  }
2580 
2581 lerror:
2582  if (!bSuccess)
2583  {
2584  WININET_Release(&lpwfs->hdr);
2585  return NULL;
2586  }
2587 
2588  return lpwfs->hdr.hInternet;
2589 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
#define TRUE
Definition: types.h:120
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
static BOOL FTP_ConnectToHost(ftp_session_t *)
Definition: ftp.c:2602
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
WINE_UNICODE_INLINE WCHAR * strchrW(const WCHAR *str, WCHAR ch)
Definition: unicode.h:248
#define HKEY_CURRENT_USER
Definition: winreg.h:11
struct sockaddr_in socketAddress
Definition: ftp.c:77
LPWSTR lpszUserName
Definition: ftp.c:82
LPWSTR servername
Definition: ftp.c:79
#define WARN(fmt,...)
Definition: debug.h:111
#define INTERNET_STATUS_CONNECTING_TO_SERVER
Definition: wininet.h:885
#define closesocket
Definition: precomp.h:57
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
struct list children
Definition: internet.h:287
#define INTERNET_OPEN_TYPE_PROXY
Definition: wininet.h:523
#define assert(x)
Definition: debug.h:53
ftp_file_t * download_in_progress
Definition: ftp.c:76
_In_opt_ LPSTR _In_opt_ LPSTR lpszPassword
Definition: winbase.h:2668
INT WSAAPI connect(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: sockctrl.c:23
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
#define INTERNET_INVALID_PORT_NUMBER
Definition: wininet.h:36
DWORD_PTR dwContext
Definition: internet.h:279
#define ERROR_INTERNET_CANNOT_CONNECT
Definition: wininet.h:2018
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
unsigned char * LPBYTE
Definition: typedefs.h:52
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL GetAddress(const WCHAR *, INTERNET_PORT, SOCKADDR *, int *, char *) DECLSPEC_HIDDEN
Definition: utility.c:133
static WCHAR * heap_strdupW(const WCHAR *str)
Definition: propsheet.c:178
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3296
#define debugstr_w
Definition: kernel32.h:32
DWORD accessType
Definition: internet.h:298
#define FIXME(fmt,...)
Definition: debug.h:110
static DWORD_PTR
Definition: ftp.c:44
smooth NULL
Definition: ftsmooth.c:416
object_header_t * WININET_AddRef(object_header_t *info)
Definition: internet.c:177
int pasvSocket
Definition: ftp.c:75
#define INTERNET_STATUS_NAME_RESOLVED
Definition: wininet.h:884
static const WCHAR szEmpty[]
Definition: provider.c:50
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
Definition: misc.c:291
#define TRACE(s)
Definition: solgame.cpp:4
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
object_header_t hdr
Definition: ftp.c:71
INTERNET_PORT serverport
Definition: ftp.c:80
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
__wchar_t WCHAR
Definition: xmlstorage.h:180
LPWSTR lpszPassword
Definition: ftp.c:81
struct list entry
Definition: internet.h:286
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
int socklen_t
Definition: tcp.c:35
#define ERROR_INTERNET_NAME_NOT_RESOLVED
Definition: wininet.h:1996
#define INTERNET_DEFAULT_FTP_PORT
Definition: wininet.h:38
DWORD_PTR dwResult
Definition: wininet.h:155
LPWSTR proxy
Definition: internet.h:294
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
HKEY key
Definition: reg.c:42
void * alloc_object(object_header_t *parent, const object_vtbl_t *vtbl, size_t size)
Definition: internet.c:111
GLenum GLsizei len
Definition: glext.h:6722
#define INTERNET_STATUS_RESOLVING_NAME
Definition: wininet.h:883
HINTERNET hInternet
Definition: internet.h:276
int sndSocket
Definition: ftp.c:73
BOOL WININET_Release(object_header_t *info)
Definition: internet.c:219
#define ERR(fmt,...)
Definition: debug.h:109
object_header_t hdr
Definition: internet.h:292
DWORD dwInternalFlags
Definition: internet.h:282
WINE_UNICODE_INLINE WCHAR * strcpyW(WCHAR *dst, const WCHAR *src)
Definition: unicode.h:219
int lstnSocket
Definition: ftp.c:74
#define INET_OPENURL
Definition: internet.h:244
static const object_vtbl_t FTPSESSIONVtbl
Definition: ftp.c:2393
#define INTERNET_STATUS_CONNECTED_TO_SERVER
Definition: wininet.h:886
#define INET6_ADDRSTRLEN
Definition: ws2ipdef.h:132
#define AF_INET
Definition: tcpip.h:117
#define INTERNET_STATUS_HANDLE_CREATED
Definition: wininet.h:895
#define SOCK_STREAM
Definition: tcpip.h:118
WCHAR * LPWSTR
Definition: xmlstorage.h:184
appinfo_t * lpAppInfo
Definition: ftp.c:72
LPWSTR proxyBypass
Definition: internet.h:295
WH_TYPE htype
Definition: internet.h:274
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213
void init_winsock(void) DECLSPEC_HIDDEN
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
Definition: path.c:41

Referenced by INTERNET_InternetOpenUrlW(), and InternetConnectW().

◆ FTP_ConnectToHost()

static BOOL FTP_ConnectToHost ( ftp_session_t lpwfs)
static

Definition at line 2602 of file ftp.c.

2603 {
2604  INT nResCode;
2605  BOOL bSuccess = FALSE;
2606 
2607  TRACE("\n");
2608  FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2609 
2610  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_USER, lpwfs->lpszUserName, 0, 0, 0))
2611  goto lend;
2612 
2613  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2614  if (nResCode)
2615  {
2616  /* Login successful... */
2617  if (nResCode == 230)
2618  bSuccess = TRUE;
2619  /* User name okay, need password... */
2620  else if (nResCode == 331)
2621  bSuccess = FTP_SendPassword(lpwfs);
2622  /* Need account for login... */
2623  else if (nResCode == 332)
2624  bSuccess = FTP_SendAccount(lpwfs);
2625  else
2626  FTP_SetResponseError(nResCode);
2627  }
2628 
2629  TRACE("Returning %d\n", bSuccess);
2630 lend:
2631  return bSuccess;
2632 }
#define TRUE
Definition: types.h:120
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
LPWSTR lpszUserName
Definition: ftp.c:82
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
static BOOL FTP_SendPassword(ftp_session_t *)
Definition: ftp.c:2834
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
static BOOL FTP_SendAccount(ftp_session_t *)
Definition: ftp.c:2874
int sndSocket
Definition: ftp.c:73
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751

Referenced by FTP_Connect().

◆ FTP_ConvertFileProp()

static BOOL FTP_ConvertFileProp ( LPFILEPROPERTIESW  lpafp,
LPWIN32_FIND_DATAW  lpFindFileData 
)
static

Definition at line 3595 of file ftp.c.

3596 {
3597  BOOL bSuccess = FALSE;
3598 
3599  ZeroMemory(lpFindFileData, sizeof(WIN32_FIND_DATAW));
3600 
3601  if (lpafp)
3602  {
3603  SystemTimeToFileTime( &lpafp->tmLastModified, &lpFindFileData->ftLastAccessTime );
3604  lpFindFileData->ftLastWriteTime = lpFindFileData->ftLastAccessTime;
3605  lpFindFileData->ftCreationTime = lpFindFileData->ftLastAccessTime;
3606 
3607  /* Not all fields are filled in */
3608  lpFindFileData->nFileSizeHigh = 0; /* We do not handle files bigger than 0xFFFFFFFF bytes yet :-) */
3609  lpFindFileData->nFileSizeLow = lpafp->nSize;
3610 
3611  if (lpafp->bIsDirectory)
3612  lpFindFileData->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
3613 
3614  if (lpafp->lpszName)
3615  lstrcpynW(lpFindFileData->cFileName, lpafp->lpszName, MAX_PATH);
3616 
3617  bSuccess = TRUE;
3618  }
3619 
3620  return bSuccess;
3621 }
DWORD nFileSizeHigh
Definition: winbase.h:915
#define TRUE
Definition: types.h:120
#define ZeroMemory
Definition: winbase.h:1642
static BOOLEAN bSuccess
Definition: drive.cpp:419
#define lstrcpynW
Definition: compat.h:405
DWORD nFileSizeLow
Definition: winbase.h:916
unsigned int BOOL
Definition: ntddk_ex.h:94
SYSTEMTIME tmLastModified
Definition: ftp.c:90
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
LPWSTR lpszName
Definition: ftp.c:88
#define MAX_PATH
Definition: compat.h:26
WCHAR cFileName[MAX_PATH]
Definition: winbase.h:919
FILETIME ftLastWriteTime
Definition: winbase.h:914
DWORD nSize
Definition: ftp.c:89
FILETIME ftLastAccessTime
Definition: winbase.h:913
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
Definition: time.c:158
DWORD dwFileAttributes
Definition: winbase.h:911
BOOL bIsDirectory
Definition: ftp.c:87
FILETIME ftCreationTime
Definition: winbase.h:912

Referenced by FTP_ReceiveFileList(), and FTPFINDNEXT_FindNextFileProc().

◆ FTP_DoPassive()

static BOOL FTP_DoPassive ( ftp_session_t lpwfs)
static

Definition at line 3137 of file ftp.c.

3138 {
3139  INT nResCode;
3140  BOOL bSuccess = FALSE;
3141 
3142  TRACE("\n");
3143  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_PASV, NULL, 0, 0, 0))
3144  goto lend;
3145 
3146  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
3147  if (nResCode)
3148  {
3149  if (nResCode == 227)
3150  {
3151  LPSTR lpszResponseBuffer = INTERNET_GetResponseBuffer();
3152  LPSTR p;
3153  int f[6];
3154  int i;
3155  char *pAddr, *pPort;
3156  INT nsocket = -1;
3157  struct sockaddr_in dataSocketAddress;
3158 
3159  p = lpszResponseBuffer+4; /* skip status code */
3160  while (*p != '\0' && (*p < '0' || *p > '9')) p++;
3161 
3162  if (*p == '\0')
3163  {
3164  ERR("no address found in response, aborting\n");
3165  goto lend;
3166  }
3167 
3168  if (sscanf(p, "%d,%d,%d,%d,%d,%d", &f[0], &f[1], &f[2], &f[3],
3169  &f[4], &f[5]) != 6)
3170  {
3171  ERR("unknown response address format '%s', aborting\n", p);
3172  goto lend;
3173  }
3174  for (i=0; i < 6; i++)
3175  f[i] = f[i] & 0xff;
3176 
3177  dataSocketAddress = lpwfs->socketAddress;
3178  pAddr = (char *)&(dataSocketAddress.sin_addr.S_un.S_addr);
3179  pPort = (char *)&(dataSocketAddress.sin_port);
3180  pAddr[0] = f[0];
3181  pAddr[1] = f[1];
3182  pAddr[2] = f[2];
3183  pAddr[3] = f[3];
3184  pPort[0] = f[4];
3185  pPort[1] = f[5];
3186 
3187  nsocket = socket(AF_INET,SOCK_STREAM,0);
3188  if (nsocket == -1)
3189  goto lend;
3190 
3191  if (connect(nsocket, (struct sockaddr *)&dataSocketAddress, sizeof(dataSocketAddress)))
3192  {
3193  ERR("can't connect passive FTP data port.\n");
3194  closesocket(nsocket);
3195  goto lend;
3196  }
3197  lpwfs->pasvSocket = nsocket;
3198  bSuccess = TRUE;
3199  }
3200  else
3201  FTP_SetResponseError(nResCode);
3202  }
3203 
3204 lend:
3205  return bSuccess;
3206 }
#define TRUE
Definition: types.h:120
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
LPSTR INTERNET_GetResponseBuffer(void)
Definition: internet.c:3820
struct sockaddr_in socketAddress
Definition: ftp.c:77
#define closesocket
Definition: precomp.h:57
char * LPSTR
Definition: xmlstorage.h:182
INT WSAAPI connect(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: sockctrl.c:23
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
_Check_return_ _CRTIMP int __cdecl sscanf(_In_z_ const char *_Src, _In_z_ _Scanf_format_string_ const char *_Format,...)
int pasvSocket
Definition: ftp.c:75
GLfloat f
Definition: glext.h:7540
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
int sndSocket
Definition: ftp.c:73
#define ERR(fmt,...)
Definition: debug.h:109
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
#define AF_INET
Definition: tcpip.h:117
#define SOCK_STREAM
Definition: tcpip.h:118
GLfloat GLfloat p
Definition: glext.h:8902

Referenced by FTP_SendPortOrPasv().

◆ FTP_FtpCreateDirectoryW()

static BOOL FTP_FtpCreateDirectoryW ( ftp_session_t lpwfs,
LPCWSTR  lpszDirectory 
)
static

Definition at line 658 of file ftp.c.

659 {
660  INT nResCode;
661  BOOL bSuccess = FALSE;
662  appinfo_t *hIC = NULL;
663 
664  TRACE("lpszDirectory(%s)\n", debugstr_w(lpszDirectory));
665 
666  /* Clear any error information */
668 
669  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_MKD, lpszDirectory, 0, 0, 0))
670  goto lend;
671 
672  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
673  if (nResCode)
674  {
675  if (nResCode == 257)
676  bSuccess = TRUE;
677  else
678  FTP_SetResponseError(nResCode);
679  }
680 
681 lend:
682  hIC = lpwfs->lpAppInfo;
683  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
684  {
686 
687  iar.dwResult = (DWORD)bSuccess;
690  &iar, sizeof(INTERNET_ASYNC_RESULT));
691  }
692 
693  return bSuccess;
694 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
int sndSocket
Definition: ftp.c:73
object_header_t hdr
Definition: internet.h:292
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
appinfo_t * lpAppInfo
Definition: ftp.c:72
static DWORD
Definition: ftp.c:44

Referenced by AsyncFtpCreateDirectoryProc(), and FtpCreateDirectoryW().

◆ FTP_FtpDeleteFileW()

BOOL FTP_FtpDeleteFileW ( ftp_session_t lpwfs,
LPCWSTR  lpszFileName 
)
static

Definition at line 1873 of file ftp.c.

1874 {
1875  INT nResCode;
1876  BOOL bSuccess = FALSE;
1877  appinfo_t *hIC = NULL;
1878 
1879  TRACE("%p\n", lpwfs);
1880 
1881  /* Clear any error information */
1883 
1884  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_DELE, lpszFileName, 0, 0, 0))
1885  goto lend;
1886 
1887  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
1888  if (nResCode)
1889  {
1890  if (nResCode == 250)
1891  bSuccess = TRUE;
1892  else
1893  FTP_SetResponseError(nResCode);
1894  }
1895 lend:
1896  hIC = lpwfs->lpAppInfo;
1897  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
1898  {
1900 
1901  iar.dwResult = (DWORD)bSuccess;
1904  &iar, sizeof(INTERNET_ASYNC_RESULT));
1905  }
1906 
1907  return bSuccess;
1908 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
int sndSocket
Definition: ftp.c:73
object_header_t hdr
Definition: internet.h:292
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
appinfo_t * lpAppInfo
Definition: ftp.c:72
static DWORD
Definition: ftp.c:44

Referenced by AsyncFtpDeleteFileProc(), and FtpDeleteFileW().

◆ FTP_FtpFindFirstFileW()

static HINTERNET FTP_FtpFindFirstFileW ( ftp_session_t lpwfs,
LPCWSTR  lpszSearchFile,
LPWIN32_FIND_DATAW  lpFindFileData,
DWORD  dwFlags,
DWORD_PTR  dwContext 
)
static

Definition at line 811 of file ftp.c.

813 {
814  INT nResCode;
815  appinfo_t *hIC = NULL;
816  HINTERNET hFindNext = NULL;
817  LPWSTR lpszSearchPath = NULL;
818 
819  TRACE("\n");
820 
821  /* Clear any error information */
823 
824  if (!FTP_InitListenSocket(lpwfs))
825  goto lend;
826 
828  goto lend;
829 
830  if (!FTP_SendPortOrPasv(lpwfs))
831  goto lend;
832 
833  /* split search path into file and path */
834  if (lpszSearchFile)
835  {
836  LPCWSTR name = lpszSearchFile, p;
837  if ((p = strrchrW( name, '\\' ))) name = p + 1;
838  if ((p = strrchrW( name, '/' ))) name = p + 1;
839  if (name != lpszSearchFile)
840  {
841  lpszSearchPath = heap_strndupW(lpszSearchFile, name - lpszSearchFile);
842  lpszSearchFile = name;
843  }
844  }
845 
846  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_LIST, lpszSearchPath,
847  lpwfs->hdr.lpfnStatusCB, &lpwfs->hdr, lpwfs->hdr.dwContext))
848  goto lend;
849 
850  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
851  if (nResCode)
852  {
853  if (nResCode == 125 || nResCode == 150)
854  {
855  INT nDataSocket;
856 
857  /* Get data socket to server */
858  if (FTP_GetDataSocket(lpwfs, &nDataSocket))
859  {
860  hFindNext = FTP_ReceiveFileList(lpwfs, nDataSocket, lpszSearchFile, lpFindFileData, dwContext);
861  closesocket(nDataSocket);
862  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
863  if (nResCode != 226 && nResCode != 250)
865  }
866  }
867  else
868  FTP_SetResponseError(nResCode);
869  }
870 
871 lend:
872  heap_free(lpszSearchPath);
873 
874  if (lpwfs->lstnSocket != -1)
875  {
876  closesocket(lpwfs->lstnSocket);
877  lpwfs->lstnSocket = -1;
878  }
879 
880  hIC = lpwfs->lpAppInfo;
881  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
882  {
884 
885  if (hFindNext)
886  {
887  iar.dwResult = (DWORD_PTR)hFindNext;
888  iar.dwError = ERROR_SUCCESS;
890  &iar, sizeof(INTERNET_ASYNC_RESULT));
891  }
892 
893  iar.dwResult = (DWORD_PTR)hFindNext;
894  iar.dwError = hFindNext ? ERROR_SUCCESS : INTERNET_GetLastError();
896  &iar, sizeof(INTERNET_ASYNC_RESULT));
897  }
898 
899  return hFindNext;
900 }
static BOOL FTP_SendType(ftp_session_t *, DWORD dwType)
Definition: ftp.c:3011
static LPWSTR heap_strndupW(LPCWSTR str, unsigned len)
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
static BOOL FTP_InitListenSocket(ftp_session_t *)
Definition: ftp.c:2951
#define closesocket
Definition: precomp.h:57
int32_t INT
Definition: typedefs.h:56
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
static DWORD_PTR
Definition: ftp.c:44
smooth NULL
Definition: ftsmooth.c:416
static BOOL FTP_SendPortOrPasv(ftp_session_t *)
Definition: ftp.c:3209
#define ERROR_NO_MORE_FILES
Definition: winerror.h:121
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
#define INTERNET_FLAG_TRANSFER_ASCII
Definition: wininet.h:90
static BOOL FTP_GetDataSocket(ftp_session_t *, LPINT nDataSocket)
Definition: ftp.c:3238
int sndSocket
Definition: ftp.c:73
WINE_UNICODE_INLINE WCHAR * strrchrW(const WCHAR *str, WCHAR ch)
Definition: unicode.h:254
object_header_t hdr
Definition: internet.h:292
int lstnSocket
Definition: ftp.c:74
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
Definition: name.c:38
INTERNET_STATUS_CALLBACK lpfnStatusCB
Definition: internet.h:285
#define INTERNET_STATUS_HANDLE_CREATED
Definition: wininet.h:895
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184
static HINTERNET FTP_ReceiveFileList(ftp_session_t *, INT nSocket, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD_PTR dwContext)
Definition: ftp.c:3551
appinfo_t * lpAppInfo
Definition: ftp.c:72
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
GLuint const GLchar * name
Definition: glext.h:6031

Referenced by AsyncFtpFindFirstFileProc(), and FtpFindFirstFileW().

◆ FTP_FtpGetCurrentDirectoryW()

static BOOL FTP_FtpGetCurrentDirectoryW ( ftp_session_t lpwfs,
LPWSTR  lpszCurrentDirectory,
LPDWORD  lpdwCurrentDirectory 
)
static

Definition at line 1043 of file ftp.c.

1045 {
1046  INT nResCode;
1047  appinfo_t *hIC = NULL;
1048  BOOL bSuccess = FALSE;
1049 
1050  /* Clear any error information */
1052 
1053  hIC = lpwfs->lpAppInfo;
1054  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_PWD, NULL,
1055  lpwfs->hdr.lpfnStatusCB, &lpwfs->hdr, lpwfs->hdr.dwContext))
1056  goto lend;
1057 
1058  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
1059  if (nResCode)
1060  {
1061  if (nResCode == 257) /* Extract directory name */
1062  {
1063  DWORD firstpos, lastpos, len;
1064  LPWSTR lpszResponseBuffer = heap_strdupAtoW(INTERNET_GetResponseBuffer());
1065 
1066  for (firstpos = 0, lastpos = 0; lpszResponseBuffer[lastpos]; lastpos++)
1067  {
1068  if ('"' == lpszResponseBuffer[lastpos])
1069  {
1070  if (!firstpos)
1071  firstpos = lastpos;
1072  else
1073  break;
1074  }
1075  }
1076  len = lastpos - firstpos;
1077  if (*lpdwCurrentDirectory >= len)
1078  {
1079  memcpy(lpszCurrentDirectory, &lpszResponseBuffer[firstpos + 1], len * sizeof(WCHAR));
1080  lpszCurrentDirectory[len - 1] = 0;
1081  *lpdwCurrentDirectory = len;
1082  bSuccess = TRUE;
1083  }
1085 
1086  heap_free(lpszResponseBuffer);
1087  }
1088  else
1089  FTP_SetResponseError(nResCode);
1090  }
1091 
1092 lend:
1093  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
1094  {
1096 
1097  iar.dwResult = bSuccess;
1100  &iar, sizeof(INTERNET_ASYNC_RESULT));
1101  }
1102 
1103  return bSuccess;
1104 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
#define ERROR_INTERNET_EXTENDED_ERROR
Definition: wininet.h:1992
LPSTR INTERNET_GetResponseBuffer(void)
Definition: internet.c:3820
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
static WCHAR * heap_strdupAtoW(const char *str)
Definition: appwiz.h:80
object_header_t hdr
Definition: ftp.c:71
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
int sndSocket
Definition: ftp.c:73
object_header_t hdr
Definition: internet.h:292
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
INTERNET_STATUS_CALLBACK lpfnStatusCB
Definition: internet.h:285
WCHAR * LPWSTR
Definition: xmlstorage.h:184
appinfo_t * lpAppInfo
Definition: ftp.c:72
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10

Referenced by AsyncFtpGetCurrentDirectoryProc(), and FtpGetCurrentDirectoryW().

◆ FTP_FtpGetFileW()

static BOOL FTP_FtpGetFileW ( ftp_session_t lpwfs,
LPCWSTR  lpszRemoteFile,
LPCWSTR  lpszNewFile,
BOOL  fFailIfExists,
DWORD  dwLocalFlagsAttribute,
DWORD  dwInternetFlags,
DWORD_PTR  dwContext 
)
static

Definition at line 1684 of file ftp.c.

1687 {
1688  BOOL bSuccess = FALSE;
1689  HANDLE hFile;
1690  appinfo_t *hIC = NULL;
1691 
1692  TRACE("lpszRemoteFile(%s) lpszNewFile(%s)\n", debugstr_w(lpszRemoteFile), debugstr_w(lpszNewFile));
1693 
1694  /* Clear any error information */
1696 
1697  /* Ensure we can write to lpszNewfile by opening it */
1698  hFile = CreateFileW(lpszNewFile, GENERIC_WRITE, 0, 0, fFailIfExists ?
1699  CREATE_NEW : CREATE_ALWAYS, dwLocalFlagsAttribute, 0);
1700  if (INVALID_HANDLE_VALUE == hFile)
1701  return FALSE;
1702 
1703  /* Set up socket to retrieve data */
1704  if (FTP_SendRetrieve(lpwfs, lpszRemoteFile, dwInternetFlags))
1705  {
1706  INT nDataSocket;
1707 
1708  /* Get data socket to server */
1709  if (FTP_GetDataSocket(lpwfs, &nDataSocket))
1710  {
1711  INT nResCode;
1712 
1713  /* Receive data */
1714  FTP_RetrieveFileData(lpwfs, nDataSocket, hFile);
1715  closesocket(nDataSocket);
1716 
1717  nResCode = FTP_ReceiveResponse(lpwfs, dwContext);
1718  if (nResCode)
1719  {
1720  if (nResCode == 226)
1721  bSuccess = TRUE;
1722  else
1723  FTP_SetResponseError(nResCode);
1724  }
1725  }
1726  }
1727 
1728  if (lpwfs->lstnSocket != -1)
1729  {
1730  closesocket(lpwfs->lstnSocket);
1731  lpwfs->lstnSocket = -1;
1732  }
1733 
1734  CloseHandle(hFile);
1735 
1736  hIC = lpwfs->lpAppInfo;
1737  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
1738  {
1740 
1741  iar.dwResult = (DWORD)bSuccess;
1744  &iar, sizeof(INTERNET_ASYNC_RESULT));
1745  }
1746 
1747  if (!bSuccess) DeleteFileW(lpszNewFile);
1748  return bSuccess;
1749 }
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:406
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
#define closesocket
Definition: precomp.h:57
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
#define debugstr_w
Definition: kernel32.h:32
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
smooth NULL
Definition: ftsmooth.c:416
static BOOL FTP_RetrieveFileData(ftp_session_t *, INT nDataSocket, HANDLE hFile)
Definition: ftp.c:3395
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
static BOOL FTP_GetDataSocket(ftp_session_t *, LPINT nDataSocket)
Definition: ftp.c:3238
_In_ HANDLE hFile
Definition: mswsock.h:90
object_header_t hdr
Definition: internet.h:292
#define CREATE_ALWAYS
Definition: disk.h:72
int lstnSocket
Definition: ftp.c:74
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
#define CreateFileW
Definition: compat.h:408
#define CREATE_NEW
Definition: disk.h:69
static BOOL FTP_SendRetrieve(ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
Definition: ftp.c:3349
appinfo_t * lpAppInfo
Definition: ftp.c:72
static DWORD
Definition: ftp.c:44

Referenced by AsyncFtpGetFileProc(), and FtpGetFileW().

◆ FTP_FtpOpenFileW()

static HINTERNET FTP_FtpOpenFileW ( ftp_session_t lpwfs,
LPCWSTR  lpszFileName,
DWORD  fdwAccess,
DWORD  dwFlags,
DWORD_PTR  dwContext 
)
static

Definition at line 1314 of file ftp.c.

1317 {
1318  INT nDataSocket;
1319  BOOL bSuccess = FALSE;
1320  ftp_file_t *lpwh = NULL;
1321  appinfo_t *hIC = NULL;
1322 
1323  TRACE("\n");
1324 
1325  /* Clear any error information */
1327 
1328  if (GENERIC_READ == fdwAccess)
1329  {
1330  /* Set up socket to retrieve data */
1331  bSuccess = FTP_SendRetrieve(lpwfs, lpszFileName, dwFlags);
1332  }
1333  else if (GENERIC_WRITE == fdwAccess)
1334  {
1335  /* Set up socket to send data */
1336  bSuccess = FTP_SendStore(lpwfs, lpszFileName, dwFlags);
1337  }
1338 
1339  /* Get data socket to server */
1340  if (bSuccess && FTP_GetDataSocket(lpwfs, &nDataSocket))
1341  {
1342  lpwh = alloc_object(&lpwfs->hdr, &FTPFILEVtbl, sizeof(ftp_file_t));
1343  lpwh->hdr.htype = WH_HFILE;
1344  lpwh->hdr.dwFlags = dwFlags;
1345  lpwh->hdr.dwContext = dwContext;
1346  lpwh->nDataSocket = nDataSocket;
1347  lpwh->cache_file = NULL;
1349  lpwh->session_deleted = FALSE;
1350 
1351  WININET_AddRef( &lpwfs->hdr );
1352  lpwh->lpFtpSession = lpwfs;
1353  list_add_head( &lpwfs->hdr.children, &lpwh->hdr.entry );
1354 
1355  /* Indicate that a download is currently in progress */
1356  lpwfs->download_in_progress = lpwh;
1357  }
1358 
1359  if (lpwfs->lstnSocket != -1)
1360  {
1361  closesocket(lpwfs->lstnSocket);
1362  lpwfs->lstnSocket = -1;
1363  }
1364 
1365  if (bSuccess && fdwAccess == GENERIC_READ)
1366  {
1367  WCHAR filename[MAX_PATH + 1];
1368  URL_COMPONENTSW uc;
1369  DWORD len;
1370 
1371  memset(&uc, 0, sizeof(uc));
1372  uc.dwStructSize = sizeof(uc);
1374  uc.lpszHostName = lpwfs->servername;
1375  uc.nPort = lpwfs->serverport;
1376  uc.lpszUserName = lpwfs->lpszUserName;
1377  uc.lpszUrlPath = heap_strdupW(lpszFileName);
1378 
1380  {
1381  WCHAR *url = heap_alloc(len * sizeof(WCHAR));
1382 
1383  if (url && InternetCreateUrlW(&uc, 0, url, &len) && CreateUrlCacheEntryW(url, 0, NULL, filename, 0))
1384  {
1385  lpwh->cache_file = heap_strdupW(filename);
1389  {
1390  WARN("Could not create cache file: %u\n", GetLastError());
1391  heap_free(lpwh->cache_file);
1392  lpwh->cache_file = NULL;
1393  }
1394  }
1395  heap_free(url);
1396  }
1397  heap_free(uc.lpszUrlPath);
1398  }
1399 
1400  hIC = lpwfs->lpAppInfo;
1401  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
1402  {
1404 
1405  if (lpwh)
1406  {
1407  iar.dwResult = (DWORD_PTR)lpwh->hdr.hInternet;
1408  iar.dwError = ERROR_SUCCESS;
1410  &iar, sizeof(INTERNET_ASYNC_RESULT));
1411  }
1412 
1413  if(bSuccess) {
1415  }else {
1416  iar.dwResult = 0;
1419  &iar, sizeof(INTERNET_ASYNC_RESULT));
1420  }
1421  }
1422 
1423  if(!bSuccess)
1424  return FALSE;
1425 
1426  return lpwh->hdr.hInternet;
1427 }
BOOL WINAPI CreateUrlCacheEntryW(LPCWSTR lpszUrlName, DWORD dwExpectedFileSize, LPCWSTR lpszFileExtension, LPWSTR lpszFileName, DWORD dwReserved)
Definition: urlcache.c:2827
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
DWORD dwStructSize
Definition: wininet.h:211
static const object_vtbl_t FTPFILEVtbl
Definition: ftp.c:1292
LPWSTR lpszUserName
Definition: ftp.c:82
LPWSTR servername
Definition: ftp.c:79
#define WARN(fmt,...)
Definition: debug.h:111
#define closesocket
Definition: precomp.h:57
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
struct list children
Definition: internet.h:287
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
ftp_file_t * download_in_progress
Definition: ftp.c:76
const char * filename
Definition: ioapi.h:135
LPWSTR lpszHostName
Definition: wininet.h:215
static void FTP_ReceiveRequestData(ftp_file_t *file, BOOL first_notif)
Definition: ftp.c:1223
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
#define FILE_SHARE_READ
Definition: compat.h:125
DWORD_PTR dwContext
Definition: internet.h:279
HANDLE cache_file_handle
Definition: ftp.c:66
Definition: ftp.c:59
static BOOL FTP_SendStore(ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
Definition: ftp.c:2904
INTERNET_PORT nPort
Definition: wininet.h:217
unsigned int BOOL
Definition: ntddk_ex.h:94
static WCHAR * heap_strdupW(const WCHAR *str)
Definition: propsheet.c:178
#define GENERIC_WRITE
Definition: nt_native.h:90
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
static DWORD_PTR
Definition: ftp.c:44
smooth NULL
Definition: ftsmooth.c:416
object_header_t * WININET_AddRef(object_header_t *info)
Definition: internet.c:177
ftp_session_t * lpFtpSession
Definition: ftp.c:62
#define OPEN_EXISTING
Definition: compat.h:434
object_header_t hdr
Definition: ftp.c:61
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
INTERNET_PORT serverport
Definition: ftp.c:80
int nDataSocket
Definition: ftp.c:64
__wchar_t WCHAR
Definition: xmlstorage.h:180
static const WCHAR url[]
Definition: encode.c:1432
struct list entry
Definition: internet.h:286
INTERNET_SCHEME nScheme
Definition: wininet.h:214
#define MAX_PATH
Definition: compat.h:26
BOOL session_deleted
Definition: ftp.c:63
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
LPWSTR lpszUserName
Definition: wininet.h:218
static BOOL FTP_GetDataSocket(ftp_session_t *, LPINT nDataSocket)
Definition: ftp.c:3238
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
LPWSTR lpszUrlPath
Definition: wininet.h:222
void * alloc_object(object_header_t *parent, const object_vtbl_t *vtbl, size_t size)
Definition: internet.c:111
GLenum GLsizei len
Definition: glext.h:6722
#define GENERIC_READ
Definition: compat.h:124
HINTERNET hInternet
Definition: internet.h:276
WCHAR * cache_file
Definition: ftp.c:65
object_header_t hdr
Definition: internet.h:292
BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW lpUrlComponents, DWORD dwFlags, LPWSTR lpszUrl, LPDWORD lpdwUrlLength)
Definition: internet.c:4307
int lstnSocket
Definition: ftp.c:74
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
#define CreateFileW
Definition: compat.h:408
#define INTERNET_STATUS_HANDLE_CREATED
Definition: wininet.h:895
static BOOL FTP_SendRetrieve(ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
Definition: ftp.c:3349
appinfo_t * lpAppInfo
Definition: ftp.c:72
#define memset(x, y, z)
Definition: compat.h:39
WH_TYPE htype
Definition: internet.h:274
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10

Referenced by AsyncFtpOpenFileProc(), and FtpOpenFileW().

◆ FTP_FtpPutFileW()

static BOOL FTP_FtpPutFileW ( ftp_session_t lpwfs,
LPCWSTR  lpszLocalFile,
LPCWSTR  lpszNewRemoteFile,
DWORD  dwFlags,
DWORD_PTR  dwContext 
)
static

Definition at line 341 of file ftp.c.

343 {
344  HANDLE hFile;
345  BOOL bSuccess = FALSE;
346  appinfo_t *hIC = NULL;
347  INT nResCode;
348 
349  TRACE(" lpszLocalFile(%s) lpszNewRemoteFile(%s)\n", debugstr_w(lpszLocalFile), debugstr_w(lpszNewRemoteFile));
350 
351  /* Clear any error information */
353 
354  /* Open file to be uploaded */
355  if (INVALID_HANDLE_VALUE ==
356  (hFile = CreateFileW(lpszLocalFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0)))
357  /* Let CreateFile set the appropriate error */
358  return FALSE;
359 
360  hIC = lpwfs->lpAppInfo;
361 
363 
364  if (FTP_SendStore(lpwfs, lpszNewRemoteFile, dwFlags))
365  {
366  INT nDataSocket;
367 
368  /* Get data socket to server */
369  if (FTP_GetDataSocket(lpwfs, &nDataSocket))
370  {
371  FTP_SendData(lpwfs, nDataSocket, hFile);
372  closesocket(nDataSocket);
373  nResCode = FTP_ReceiveResponse(lpwfs, dwContext);
374  if (nResCode)
375  {
376  if (nResCode == 226)
377  bSuccess = TRUE;
378  else
379  FTP_SetResponseError(nResCode);
380  }
381  }
382  }
383 
384  if (lpwfs->lstnSocket != -1)
385  {
386  closesocket(lpwfs->lstnSocket);
387  lpwfs->lstnSocket = -1;
388  }
389 
390  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
391  {
393 
394  iar.dwResult = (DWORD)bSuccess;
397  &iar, sizeof(INTERNET_ASYNC_RESULT));
398  }
399 
401 
402  return bSuccess;
403 }
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:406
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
#define closesocket
Definition: precomp.h:57
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static BOOL FTP_SendData(ftp_session_t *, INT nDataSocket, HANDLE hFile)
Definition: ftp.c:3269
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
static BOOL FTP_SendStore(ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
Definition: ftp.c:2904
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
smooth NULL
Definition: ftsmooth.c:416
#define OPEN_EXISTING
Definition: compat.h:434
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
static BOOL FTP_GetDataSocket(ftp_session_t *, LPINT nDataSocket)
Definition: ftp.c:3238
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
#define INTERNET_STATUS_SENDING_REQUEST
Definition: wininet.h:887
#define GENERIC_READ
Definition: compat.h:124
_In_ HANDLE hFile
Definition: mswsock.h:90
object_header_t hdr
Definition: internet.h:292
int lstnSocket
Definition: ftp.c:74
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
#define CreateFileW
Definition: compat.h:408
appinfo_t * lpAppInfo
Definition: ftp.c:72
static DWORD
Definition: ftp.c:44

Referenced by AsyncFtpPutFileProc(), and FtpPutFileW().

◆ FTP_FtpRemoveDirectoryW()

BOOL FTP_FtpRemoveDirectoryW ( ftp_session_t lpwfs,
LPCWSTR  lpszDirectory 
)
static

Definition at line 2015 of file ftp.c.

2016 {
2017  INT nResCode;
2018  BOOL bSuccess = FALSE;
2019  appinfo_t *hIC = NULL;
2020 
2021  TRACE("\n");
2022 
2023  /* Clear any error information */
2025 
2026  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_RMD, lpszDirectory, 0, 0, 0))
2027  goto lend;
2028 
2029  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2030  if (nResCode)
2031  {
2032  if (nResCode == 250)
2033  bSuccess = TRUE;
2034  else
2035  FTP_SetResponseError(nResCode);
2036  }
2037 
2038 lend:
2039  hIC = lpwfs->lpAppInfo;
2040  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
2041  {
2043 
2044  iar.dwResult = (DWORD)bSuccess;
2047  &iar, sizeof(INTERNET_ASYNC_RESULT));
2048  }
2049 
2050  return bSuccess;
2051 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
int sndSocket
Definition: ftp.c:73
object_header_t hdr
Definition: internet.h:292
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
appinfo_t * lpAppInfo
Definition: ftp.c:72
static DWORD
Definition: ftp.c:44

Referenced by AsyncFtpRemoveDirectoryProc(), and FtpRemoveDirectoryW().

◆ FTP_FtpRenameFileW()

BOOL FTP_FtpRenameFileW ( ftp_session_t lpwfs,
LPCWSTR  lpszSrc,
LPCWSTR  lpszDest 
)
static

Definition at line 2169 of file ftp.c.

2170 {
2171  INT nResCode;
2172  BOOL bSuccess = FALSE;
2173  appinfo_t *hIC = NULL;
2174 
2175  TRACE("\n");
2176 
2177  /* Clear any error information */
2179 
2180  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_RNFR, lpszSrc, 0, 0, 0))
2181  goto lend;
2182 
2183  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2184  if (nResCode == 350)
2185  {
2186  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_RNTO, lpszDest, 0, 0, 0))
2187  goto lend;
2188 
2189  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2190  }
2191 
2192  if (nResCode == 250)
2193  bSuccess = TRUE;
2194  else
2195  FTP_SetResponseError(nResCode);
2196 
2197 lend:
2198  hIC = lpwfs->lpAppInfo;
2199  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
2200  {
2202 
2203  iar.dwResult = (DWORD)bSuccess;
2206  &iar, sizeof(INTERNET_ASYNC_RESULT));
2207  }
2208 
2209  return bSuccess;
2210 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
smooth NULL
Definition: ftsmooth.c:416
WCHAR lpszDest[260]
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
int sndSocket
Definition: ftp.c:73
object_header_t hdr
Definition: internet.h:292
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
appinfo_t * lpAppInfo
Definition: ftp.c:72
static DWORD
Definition: ftp.c:44

Referenced by AsyncFtpRenameFileProc(), and FtpRenameFileW().

◆ FTP_FtpSetCurrentDirectoryW()

static BOOL FTP_FtpSetCurrentDirectoryW ( ftp_session_t lpwfs,
LPCWSTR  lpszDirectory 
)
static

Definition at line 513 of file ftp.c.

514 {
515  INT nResCode;
516  appinfo_t *hIC = NULL;
517  BOOL bSuccess = FALSE;
518 
519  TRACE("lpszDirectory(%s)\n", debugstr_w(lpszDirectory));
520 
521  /* Clear any error information */
523 
524  hIC = lpwfs->lpAppInfo;
525  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_CWD, lpszDirectory,
526  lpwfs->hdr.lpfnStatusCB, &lpwfs->hdr, lpwfs->hdr.dwContext))
527  goto lend;
528 
529  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
530 
531  if (nResCode)
532  {
533  if (nResCode == 250)
534  bSuccess = TRUE;
535  else
536  FTP_SetResponseError(nResCode);
537  }
538 
539 lend:
540  if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
541  {
543 
544  iar.dwResult = bSuccess;
547  &iar, sizeof(INTERNET_ASYNC_RESULT));
548  }
549  return bSuccess;
550 }
#define TRUE
Definition: types.h:120
#define ERROR_SUCCESS
Definition: deptool.c:10
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
#define ERROR_INTERNET_EXTENDED_ERROR
Definition: wininet.h:1992
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
DWORD_PTR dwResult
Definition: wininet.h:155
#define INTERNET_FLAG_ASYNC
Definition: wininet.h:64
int sndSocket
Definition: ftp.c:73
object_header_t hdr
Definition: internet.h:292
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
INTERNET_STATUS_CALLBACK lpfnStatusCB
Definition: internet.h:285
appinfo_t * lpAppInfo
Definition: ftp.c:72

Referenced by AsyncFtpSetCurrentDirectoryProc(), and FtpSetCurrentDirectoryW().

◆ FTP_GetDataSocket()

static BOOL FTP_GetDataSocket ( ftp_session_t lpwfs,
LPINT  nDataSocket 
)
static

Definition at line 3238 of file ftp.c.

3239 {
3240  struct sockaddr_in saddr;
3241  socklen_t addrlen = sizeof(saddr);
3242 
3243  TRACE("\n");
3244  if (lpwfs->hdr.dwFlags & INTERNET_FLAG_PASSIVE)
3245  {
3246  *nDataSocket = lpwfs->pasvSocket;
3247  lpwfs->pasvSocket = -1;
3248  }
3249  else
3250  {
3251  *nDataSocket = accept(lpwfs->lstnSocket, (struct sockaddr *) &saddr, &addrlen);
3252  closesocket(lpwfs->lstnSocket);
3253  lpwfs->lstnSocket = -1;
3254  }
3255  return *nDataSocket != -1;
3256 }
#define closesocket
Definition: precomp.h:57
int pasvSocket
Definition: ftp.c:75
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
int socklen_t
Definition: tcp.c:35
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
Definition: socklife.c:23
#define INTERNET_FLAG_PASSIVE
Definition: wininet.h:65
int lstnSocket
Definition: ftp.c:74

Referenced by FTP_FtpFindFirstFileW(), FTP_FtpGetFileW(), FTP_FtpOpenFileW(), and FTP_FtpPutFileW().

◆ FTP_GetNextLine()

static LPSTR FTP_GetNextLine ( INT  nSocket,
LPDWORD  dwLen 
)
static

Definition at line 2645 of file ftp.c.

2646 {
2647  struct timeval tv = {RESPONSE_TIMEOUT,0};
2648  FD_SET set;
2649  INT nRecv = 0;
2650  LPSTR lpszBuffer = INTERNET_GetResponseBuffer();
2651 
2652  TRACE("\n");
2653 
2654  FD_ZERO(&set);
2655  FD_SET(nSocket, &set);
2656 
2657  while (nRecv < MAX_REPLY_LEN)
2658  {
2659  if (select(nSocket+1, &set, NULL, NULL, &tv) > 0)
2660  {
2661  if (sock_recv(nSocket, &lpszBuffer[nRecv], 1, 0) <= 0)
2662  {
2664  return NULL;
2665  }
2666 
2667  if (lpszBuffer[nRecv] == '\n')
2668  {
2669  lpszBuffer[nRecv] = '\0';
2670  *dwLen = nRecv - 1;
2671  TRACE(":%d %s\n", nRecv, lpszBuffer);
2672  return lpszBuffer;
2673  }
2674  if (lpszBuffer[nRecv] != '\r')
2675  nRecv++;
2676  }
2677  else
2678  {
2680  return NULL;
2681  }
2682  }
2683 
2684  return NULL;
2685 }
Definition: winsock.h:66
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
LPSTR INTERNET_GetResponseBuffer(void)
Definition: internet.c:3820
#define FD_ZERO(set)
Definition: winsock.h:96
char * LPSTR
Definition: xmlstorage.h:182
#define FD_SET(fd, set)
Definition: winsock.h:89
int32_t INT
Definition: typedefs.h:56
#define MAX_REPLY_LEN
Definition: request.c:2568
INT WSAAPI select(IN INT s, IN OUT LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST struct timeval *timeout)
Definition: select.c:41
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
static UINT set(struct ID3DXConstantTableImpl *table, IDirect3DDevice9 *device, struct ctab_constant *constant, const void **indata, D3DXPARAMETER_TYPE intype, UINT *size, UINT incol, D3DXPARAMETER_CLASS inclass, UINT index, BOOL is_pointer)
Definition: shader.c:1095
#define ERROR_FTP_TRANSFER_IN_PROGRESS
Definition: wininet.h:2046
#define ERROR_INTERNET_TIMEOUT
Definition: wininet.h:1991
#define RESPONSE_TIMEOUT
Definition: ftp.c:55
static int sock_recv(int fd, void *msg, size_t len, int flags)
Definition: net.c:49
Definition: _set.h:46

Referenced by FTP_ParseNextFile(), and FTP_ReceiveResponse().

◆ FTP_InitListenSocket()

static BOOL FTP_InitListenSocket ( ftp_session_t lpwfs)
static

Definition at line 2951 of file ftp.c.

2952 {
2953  BOOL bSuccess = FALSE;
2954  socklen_t namelen = sizeof(lpwfs->lstnSocketAddress);
2955 
2956  TRACE("\n");
2957 
2958  init_winsock();
2959  lpwfs->lstnSocket = socket(AF_INET, SOCK_STREAM, 0);
2960  if (lpwfs->lstnSocket == -1)
2961  {
2962  TRACE("Unable to create listening socket\n");
2963  goto lend;
2964  }
2965 
2966  /* We obtain our ip addr from the name of the command channel socket */
2967  lpwfs->lstnSocketAddress = lpwfs->socketAddress;
2968 
2969  /* and get the system to assign us a port */
2970  lpwfs->lstnSocketAddress.sin_port = htons(0);
2971 
2972  if (bind(lpwfs->lstnSocket,(struct sockaddr *) &lpwfs->lstnSocketAddress, sizeof(lpwfs->lstnSocketAddress)) == -1)
2973  {
2974  TRACE("Unable to bind socket\n");
2975  goto lend;
2976  }
2977 
2978  if (listen(lpwfs->lstnSocket, MAX_BACKLOG) == -1)
2979  {
2980  TRACE("listen failed\n");
2981  goto lend;
2982  }
2983 
2984  if (getsockname(lpwfs->lstnSocket, (struct sockaddr *) &lpwfs->lstnSocketAddress, &namelen) != -1)
2985  bSuccess = TRUE;
2986 
2987 lend:
2988  if (!bSuccess && lpwfs->lstnSocket != -1)
2989  {
2990  closesocket(lpwfs->lstnSocket);
2991  lpwfs->lstnSocket = -1;
2992  }
2993 
2994  return bSuccess;
2995 }
#define TRUE
Definition: types.h:120
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
struct sockaddr_in socketAddress
Definition: ftp.c:77
#define closesocket
Definition: precomp.h:57
GLint namelen
Definition: glext.h:7232
static BOOLEAN bSuccess
Definition: drive.cpp:419
struct sockaddr_in lstnSocketAddress
Definition: ftp.c:78
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TRACE(s)
Definition: solgame.cpp:4
int socklen_t
Definition: tcp.c:35
int lstnSocket
Definition: ftp.c:74
INT WSAAPI listen(IN SOCKET s, IN INT backlog)
Definition: sockctrl.c:123
#define MAX_BACKLOG
Definition: ftp.c:105
#define AF_INET
Definition: tcpip.h:117
#define SOCK_STREAM
Definition: tcpip.h:118
#define htons(x)
Definition: module.h:213
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213
void init_winsock(void) DECLSPEC_HIDDEN

Referenced by FTP_FtpFindFirstFileW(), FTP_SendRetrieve(), and FTP_SendStore().

◆ FTP_ParseDirectory()

static BOOL FTP_ParseDirectory ( ftp_session_t lpwfs,
INT  nSocket,
LPCWSTR  lpszSearchFile,
LPFILEPROPERTIESW lpafp,
LPDWORD  dwfp 
)
static

Definition at line 3793 of file ftp.c.

3795 {
3796  BOOL bSuccess = TRUE;
3797  INT sizeFilePropArray = 500;/*20; */
3798  INT indexFilePropArray = -1;
3799 
3800  TRACE("\n");
3801 
3802  /* Allocate initial file properties array */
3803  *lpafp = heap_alloc_zero(sizeof(FILEPROPERTIESW)*(sizeFilePropArray));
3804  if (!*lpafp)
3805  return FALSE;
3806 
3807  do {
3808  if (indexFilePropArray+1 >= sizeFilePropArray)
3809  {
3810  LPFILEPROPERTIESW tmpafp;
3811 
3812  sizeFilePropArray *= 2;
3813  tmpafp = heap_realloc_zero(*lpafp, sizeof(FILEPROPERTIESW)*sizeFilePropArray);
3814  if (NULL == tmpafp)
3815  {
3816  bSuccess = FALSE;
3817  break;
3818  }
3819 
3820  *lpafp = tmpafp;
3821  }
3822  indexFilePropArray++;
3823  } while (FTP_ParseNextFile(nSocket, lpszSearchFile, &(*lpafp)[indexFilePropArray]));
3824 
3825  if (bSuccess && indexFilePropArray)
3826  {
3827  if (indexFilePropArray < sizeFilePropArray - 1)
3828  {
3829  LPFILEPROPERTIESW tmpafp;
3830 
3831  tmpafp = heap_realloc(*lpafp, sizeof(FILEPROPERTIESW)*indexFilePropArray);
3832  if (NULL != tmpafp)
3833  *lpafp = tmpafp;
3834  }
3835  *dwfp = indexFilePropArray;
3836  }
3837  else
3838  {
3839  heap_free(*lpafp);
3841  bSuccess = FALSE;
3842  }
3843 
3844  return bSuccess;
3845 }
#define TRUE
Definition: types.h:120
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
static void * heap_realloc(void *mem, size_t len)
Definition: appwiz.h:70
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
#define ERROR_NO_MORE_FILES
Definition: winerror.h:121
#define TRACE(s)
Definition: solgame.cpp:4
static BOOL FTP_ParseNextFile(INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERTIESW fileprop)
Definition: ftp.c:3632
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FTP_ReceiveFileList().

◆ FTP_ParseNextFile()

static BOOL FTP_ParseNextFile ( INT  nSocket,
LPCWSTR  lpszSearchFile,
LPFILEPROPERTIESW  fileprop 
)
static

Definition at line 3632 of file ftp.c.

3633 {
3634  static const char szSpace[] = " \t";
3635  DWORD nBufLen;
3636  char *pszLine;
3637  char *pszToken;
3638  char *pszTmp;
3639  BOOL found = FALSE;
3640  int i;
3641 
3642  lpfp->lpszName = NULL;
3643  do {
3644  if(!(pszLine = FTP_GetNextLine(nSocket, &nBufLen)))
3645  return FALSE;
3646 
3647  pszToken = strtok(pszLine, szSpace);
3648  /* ls format
3649  * <Permissions> <NoLinks> <owner> <group> <size> <date> <time or year> <filename>
3650  *
3651  * For instance:
3652  * drwx--s--- 2 pcarrier ens 512 Sep 28 1995 pcarrier
3653  */
3654  if(!isdigit(pszToken[0]) && 10 == strlen(pszToken)) {
3655  if(!FTP_ParsePermission(pszToken, lpfp))
3656  lpfp->bIsDirectory = FALSE;
3657  for(i=0; i<=3; i++) {
3658  if(!(pszToken = strtok(NULL, szSpace)))
3659  break;
3660  }
3661  if(!pszToken) continue;
3662  if(lpfp->bIsDirectory) {
3663  TRACE("Is directory\n");
3664  lpfp->nSize = 0;
3665  }
3666  else {
3667  TRACE("Size: %s\n", pszToken);
3668  lpfp->nSize = atol(pszToken);
3669  }
3670 
3671  lpfp->tmLastModified.wSecond = 0;
3672  lpfp->tmLastModified.wMinute = 0;
3673  lpfp->tmLastModified.wHour = 0;
3674  lpfp->tmLastModified.wDay = 0;
3675  lpfp->tmLastModified.wMonth = 0;
3676  lpfp->tmLastModified.wYear = 0;
3677 
3678  /* Determine month */
3679  pszToken = strtok(NULL, szSpace);
3680  if(!pszToken) continue;
3681  if(strlen(pszToken) >= 3) {
3682  pszToken[3] = 0;
3683  if((pszTmp = StrStrIA(szMonths, pszToken)))
3684  lpfp->tmLastModified.wMonth = ((pszTmp - szMonths) / 3)+1;
3685  }
3686  /* Determine day */
3687  pszToken = strtok(NULL, szSpace);
3688  if(!pszToken) continue;
3689  lpfp->tmLastModified.wDay = atoi(pszToken);
3690  /* Determine time or year */
3691  pszToken = strtok(NULL, szSpace);
3692  if(!pszToken) continue;
3693  if((pszTmp = strchr(pszToken, ':'))) {
3694  SYSTEMTIME curr_time;
3695  *pszTmp = 0;
3696  pszTmp++;
3697  lpfp->tmLastModified.wMinute = atoi(pszTmp);
3698  lpfp->tmLastModified.wHour = atoi(pszToken);
3699  GetLocalTime( &curr_time );
3700  lpfp->tmLastModified.wYear = curr_time.wYear;
3701  }
3702  else {
3703  lpfp->tmLastModified.wYear = atoi(pszToken);
3704  lpfp->tmLastModified.wHour = 12;
3705  }
3706  TRACE("Mod time: %02d:%02d:%02d %04d/%02d/%02d\n",
3707  lpfp->tmLastModified.wHour, lpfp->tmLastModified.wMinute, lpfp->tmLastModified.wSecond,
3708  lpfp->tmLastModified.wYear, lpfp->tmLastModified.wMonth, lpfp->tmLastModified.wDay);
3709 
3710  pszToken = strtok(NULL, szSpace);
3711  if(!pszToken) continue;
3712  lpfp->lpszName = heap_strdupAtoW(pszToken);
3713  TRACE("File: %s\n", debugstr_w(lpfp->lpszName));
3714  }
3715  /* NT way of parsing ... :
3716 
3717  07-13-03 08:55PM <DIR> sakpatch
3718  05-09-03 06:02PM 12656686 2003-04-21bgm_cmd_e.rgz
3719  */
3720  else if(isdigit(pszToken[0]) && 8 == strlen(pszToken)) {
3721  int mon, mday, year, hour, min;
3722  lpfp->permissions = 0xFFFF; /* No idea, put full permission :-) */
3723 
3724  sscanf(pszToken, "%d-%d-%d", &mon, &mday, &year);
3725  lpfp->tmLastModified.wDay = mday;
3726  lpfp->tmLastModified.wMonth = mon;
3727  lpfp->tmLastModified.wYear = year;
3728 
3729  /* Hacky and bad Y2K protection :-) */
3730  if (lpfp->tmLastModified.wYear < 70) lpfp->tmLastModified.wYear += 2000;
3731 
3732  pszToken = strtok(NULL, szSpace);
3733  if(!pszToken) continue;
3734  sscanf(pszToken, "%d:%d", &hour, &min);
3735  lpfp->tmLastModified.wHour = hour;
3736  lpfp->tmLastModified.wMinute = min;
3737  if((pszToken[5] == 'P') && (pszToken[6] == 'M')) {
3738  lpfp->tmLastModified.wHour += 12;
3739  }
3740  lpfp->tmLastModified.wSecond = 0;
3741 
3742  TRACE("Mod time: %02d:%02d:%02d %04d/%02d/%02d\n",
3743  lpfp->tmLastModified.wHour, lpfp->tmLastModified.wMinute, lpfp->tmLastModified.wSecond,
3744  lpfp->tmLastModified.wYear, lpfp->tmLastModified.wMonth, lpfp->tmLastModified.wDay);
3745 
3746  pszToken = strtok(NULL, szSpace);
3747  if(!pszToken) continue;
3748  if(!_strnicmp(pszToken, "<DIR>", -1)) {
3749  lpfp->bIsDirectory = TRUE;
3750  lpfp->nSize = 0;
3751  TRACE("Is directory\n");
3752  }
3753  else {
3754  lpfp->bIsDirectory = FALSE;
3755  lpfp->nSize = atol(pszToken);
3756  TRACE("Size: %d\n", lpfp->nSize);
3757  }
3758 
3759  pszToken = strtok(NULL, szSpace);
3760  if(!pszToken) continue;
3761  lpfp->lpszName = heap_strdupAtoW(pszToken);
3762  TRACE("Name: %s\n", debugstr_w(lpfp->lpszName));
3763  }
3764  /* EPLF format - http://cr.yp.to/ftp/list/eplf.html */
3765  else if(pszToken[0] == '+') {
3766  FIXME("EPLF Format not implemented\n");
3767  }
3768 
3769  if(lpfp->lpszName) {
3770  if((lpszSearchFile == NULL) ||
3771  (PathMatchSpecW(lpfp->lpszName, lpszSearchFile))) {
3772  found = TRUE;
3773  TRACE("Matched: %s\n", debugstr_w(lpfp->lpszName));
3774  }
3775  else {
3776  heap_free(lpfp->lpszName);
3777  lpfp->lpszName = NULL;
3778  }
3779  }
3780  } while(!found);
3781  return TRUE;
3782 }
static LPSTR FTP_GetNextLine(INT nSocket, LPDWORD dwLen)
Definition: ftp.c:2645
#define TRUE
Definition: types.h:120
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static const WCHAR szSpace[]
Definition: msipriv.h:1110
WORD wYear
Definition: winbase.h:877
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
_Check_return_ _CRTIMP int __cdecl _strnicmp(_In_reads_or_z_(_MaxCount) const char *_Str1, _In_reads_or_z_(_MaxCount) const char *_Str2, _In_ size_t _MaxCount)
#define FIXME(fmt,...)
Definition: debug.h:110
WORD wMinute
Definition: winbase.h:882
smooth NULL
Definition: ftsmooth.c:416
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:286
_Check_return_ _CRTIMP int __cdecl sscanf(_In_z_ const char *_Src, _In_z_ _Scanf_format_string_ const char *_Format,...)
#define isdigit(c)
Definition: acclib.h:68
static WCHAR * heap_strdupAtoW(const char *str)
Definition: appwiz.h:80
#define TRACE(s)
Definition: solgame.cpp:4
unsigned long DWORD
Definition: ntddk_ex.h:95
static const CHAR szMonths[]
Definition: ftp.c:161
_Check_return_ long __cdecl atol(_In_z_ const char *_Str)
LPSTR WINAPI StrStrIA(LPCSTR lpszStr, LPCSTR lpszSearch)
Definition: string.c:355
static BOOL FTP_ParsePermission(LPCSTR lpszPermission, LPFILEPROPERTIESW lpfp)
Definition: ftp.c:3858
#define min(a, b)
Definition: monoChain.cc:55
char * strtok(char *String, const char *Delimiters)
Definition: utclib.c:338
char * strchr(const char *String, int ch)
Definition: utclib.c:501
BOOL WINAPI PathMatchSpecW(LPCWSTR lpszPath, LPCWSTR lpszMask)
Definition: path.c:1943
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FTP_ParseDirectory().

◆ FTP_ParsePermission()

static BOOL FTP_ParsePermission ( LPCSTR  lpszPermission,
LPFILEPROPERTIESW  lpfp 
)
static

Definition at line 3858 of file ftp.c.

3859 {
3860  BOOL bSuccess = TRUE;
3861  unsigned short nPermission = 0;
3862  INT nPos = 1;
3863  INT nLast = 9;
3864 
3865  TRACE("\n");
3866  if ((*lpszPermission != 'd') && (*lpszPermission != '-') && (*lpszPermission != 'l'))
3867  {
3868  bSuccess = FALSE;
3869  return bSuccess;
3870  }
3871 
3872  lpfp->bIsDirectory = (*lpszPermission == 'd');
3873  do
3874  {
3875  switch (nPos)
3876  {
3877  case 1:
3878  nPermission |= (*(lpszPermission+1) == 'r' ? 1 : 0) << 8;
3879  break;
3880  case 2:
3881  nPermission |= (*(lpszPermission+2) == 'w' ? 1 : 0) << 7;
3882  break;
3883  case 3:
3884  nPermission |= (*(lpszPermission+3) == 'x' ? 1 : 0) << 6;
3885  break;
3886  case 4:
3887  nPermission |= (*(lpszPermission+4) == 'r' ? 1 : 0) << 5;
3888  break;
3889  case 5:
3890  nPermission |= (*(lpszPermission+5) == 'w' ? 1 : 0) << 4;
3891  break;
3892  case 6:
3893  nPermission |= (*(lpszPermission+6) == 'x' ? 1 : 0) << 3;
3894  break;
3895  case 7:
3896  nPermission |= (*(lpszPermission+7) == 'r' ? 1 : 0) << 2;
3897  break;
3898  case 8:
3899  nPermission |= (*(lpszPermission+8) == 'w' ? 1 : 0) << 1;
3900  break;
3901  case 9:
3902  nPermission |= (*(lpszPermission+9) == 'x' ? 1 : 0);
3903  break;
3904  }
3905  nPos++;
3906  }while (nPos <= nLast);
3907 
3908  lpfp->permissions = nPermission;
3909  return bSuccess;
3910 }
#define TRUE
Definition: types.h:120
unsigned short permissions
Definition: ftp.c:91
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TRACE(s)
Definition: solgame.cpp:4
BOOL bIsDirectory
Definition: ftp.c:87

Referenced by FTP_ParseNextFile().

◆ FTP_ReceiveFileList()

static HINTERNET FTP_ReceiveFileList ( ftp_session_t lpwfs,
INT  nSocket,
LPCWSTR  lpszSearchFile,
LPWIN32_FIND_DATAW  lpFindFileData,
DWORD_PTR  dwContext 
)
static

Definition at line 3551 of file ftp.c.

3553 {
3554  DWORD dwSize = 0;
3555  LPFILEPROPERTIESW lpafp = NULL;
3556  LPWININETFTPFINDNEXTW lpwfn = NULL;
3557 
3558  TRACE("(%p,%d,%s,%p,%08lx)\n", lpwfs, nSocket, debugstr_w(lpszSearchFile), lpFindFileData, dwContext);
3559 
3560  if (FTP_ParseDirectory(lpwfs, nSocket, lpszSearchFile, &lpafp, &dwSize))
3561  {
3562  if(lpFindFileData)
3563  FTP_ConvertFileProp(lpafp, lpFindFileData);
3564 
3565  lpwfn = alloc_object(&lpwfs->hdr, &FTPFINDNEXTVtbl, sizeof(WININETFTPFINDNEXTW));
3566  if (lpwfn)
3567  {
3568  lpwfn->hdr.htype = WH_HFTPFINDNEXT;
3569  lpwfn->hdr.dwContext = dwContext;
3570  lpwfn->index = 1; /* Next index is 1 since we return index 0 */
3571  lpwfn->size = dwSize;
3572  lpwfn->lpafp = lpafp;
3573 
3574  WININET_AddRef( &lpwfs->hdr );
3575  lpwfn->lpFtpSession = lpwfs;
3576  list_add_head( &lpwfs->hdr.children, &lpwfn->hdr.entry );
3577  }
3578  }
3579 
3580  TRACE("Matched %d files\n", dwSize);
3581  return lpwfn ? lpwfn->hdr.hInternet : NULL;
3582 }
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
struct list children
Definition: internet.h:287
LPFILEPROPERTIESW lpafp
Definition: ftp.c:100
DWORD_PTR dwContext
Definition: internet.h:279
static BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData)
Definition: ftp.c:3595
#define debugstr_w
Definition: kernel32.h:32
smooth NULL
Definition: ftsmooth.c:416
object_header_t * WININET_AddRef(object_header_t *info)
Definition: internet.c:177
DWORD index
Definition: ftp.c:98
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
struct list entry
Definition: internet.h:286
unsigned long DWORD
Definition: ntddk_ex.h:95
void * alloc_object(object_header_t *parent, const object_vtbl_t *vtbl, size_t size)
Definition: internet.c:111
static BOOL FTP_ParseDirectory(ftp_session_t *, INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERTIESW *lpafp, LPDWORD dwfp)
Definition: ftp.c:3793
HINTERNET hInternet
Definition: internet.h:276
static const object_vtbl_t FTPFINDNEXTVtbl
Definition: ftp.c:3530
object_header_t hdr
Definition: ftp.c:96
DWORD size
Definition: ftp.c:99
WH_TYPE htype
Definition: internet.h:274
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
ftp_session_t * lpFtpSession
Definition: ftp.c:97

Referenced by FTP_FtpFindFirstFileW().

◆ FTP_ReceiveRequestData()

static void FTP_ReceiveRequestData ( ftp_file_t file,
BOOL  first_notif 
)
static

Definition at line 1223 of file ftp.c.

1224 {
1226  BYTE buffer[4096];
1227  int available;
1228 
1229  TRACE("%p\n", file);
1230 
1231  available = sock_recv(file->nDataSocket, buffer, sizeof(buffer), MSG_PEEK);
1232 
1233  if(available != -1) {
1234  iar.dwResult = (DWORD_PTR)file->hdr.hInternet;
1235  iar.dwError = first_notif ? 0 : available;
1236  }else {
1237  iar.dwResult = 0;
1239  }
1240 
1241  INTERNET_SendCallback(&file->hdr, file->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar,
1242  sizeof(INTERNET_ASYNC_RESULT));
1243 }
GLuint buffer
Definition: glext.h:5915
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
DWORD INTERNET_GetLastError(void)
Definition: internet.c:3741
static DWORD_PTR
Definition: ftp.c:44
static WCHAR available[MAX_STRING_RESOURCE_LEN]
Definition: object.c:2336
#define TRACE(s)
Definition: solgame.cpp:4
DWORD_PTR dwResult
Definition: wininet.h:155
unsigned char BYTE
Definition: mem.h:68
#define INTERNET_STATUS_REQUEST_COMPLETE
Definition: wininet.h:898
static int sock_recv(int fd, void *msg, size_t len, int flags)
Definition: net.c:49
Definition: fci.c:126
#define MSG_PEEK
Definition: winsock.h:222

Referenced by FTP_FtpOpenFileW(), and FTPFILE_AsyncQueryDataAvailableProc().

◆ FTP_ReceiveResponse()

INT FTP_ReceiveResponse ( ftp_session_t lpwfs,
DWORD_PTR  dwContext 
)
static

Definition at line 2771 of file ftp.c.

2772 {
2773  LPSTR lpszResponse = INTERNET_GetResponseBuffer();
2774  DWORD nRecv;
2775  INT rc = 0;
2776  char firstprefix[5];
2777  BOOL multiline = FALSE;
2778 
2779  TRACE("socket(%d)\n", lpwfs->sndSocket);
2780 
2782 
2783  while(1)
2784  {
2785  if (!FTP_GetNextLine(lpwfs->sndSocket, &nRecv))
2786  goto lerror;
2787 
2788  if (nRecv >= 3)
2789  {
2790  if(!multiline)
2791  {
2792  if(lpszResponse[3] != '-')
2793  break;
2794  else
2795  { /* Start of multiline response. Loop until we get "nnn " */
2796  multiline = TRUE;
2797  memcpy(firstprefix, lpszResponse, 3);
2798  firstprefix[3] = ' ';
2799  firstprefix[4] = '\0';
2800  }
2801  }
2802  else
2803  {
2804  if(!memcmp(firstprefix, lpszResponse, 4))
2805  break;
2806  }
2807  }
2808  }
2809 
2810  if (nRecv >= 3)
2811  {
2812  rc = atoi(lpszResponse);
2813 
2815  &nRecv, sizeof(DWORD));
2816  }
2817 
2818 lerror:
2819  TRACE("return %d\n", rc);
2820  return rc;
2821 }
static LPSTR FTP_GetNextLine(INT nSocket, LPDWORD dwLen)
Definition: ftp.c:2645
#define TRUE
Definition: types.h:120
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
LPSTR INTERNET_GetResponseBuffer(void)
Definition: internet.c:3820
char * LPSTR
Definition: xmlstorage.h:182
int32_t INT
Definition: typedefs.h:56
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength) DECLSPEC_HIDDEN
unsigned int BOOL
Definition: ntddk_ex.h:94
smooth NULL
Definition: ftsmooth.c:416
#define INTERNET_STATUS_RECEIVING_RESPONSE
Definition: wininet.h:889
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
unsigned long DWORD
Definition: ntddk_ex.h:95
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
int sndSocket
Definition: ftp.c:73
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define INTERNET_STATUS_RESPONSE_RECEIVED
Definition: wininet.h:890

Referenced by FTP_ConnectToHost(), FTP_DoPassive(), FTP_FtpCreateDirectoryW(), FTP_FtpDeleteFileW(), FTP_FtpFindFirstFileW(), FTP_FtpGetCurrentDirectoryW(), FTP_FtpGetFileW(), FTP_FtpPutFileW(), FTP_FtpRemoveDirectoryW(), FTP_FtpRenameFileW(), FTP_FtpSetCurrentDirectoryW(), FTP_SendAccount(), FTP_SendPassword(), FTP_SendPort(), FTP_SendRetrieve(), FTP_SendStore(), FTP_SendType(), FtpCommandW(), and FTPFILE_Destroy().

◆ FTP_RetrieveFileData()

static BOOL FTP_RetrieveFileData ( ftp_session_t lpwfs,
INT  nDataSocket,
HANDLE  hFile 
)
static

Definition at line 3395 of file ftp.c.

3396 {
3397  DWORD nBytesWritten;
3398  INT nRC = 0;
3399  CHAR *lpszBuffer;
3400 
3401  TRACE("\n");
3402 
3403  lpszBuffer = heap_alloc_zero(sizeof(CHAR)*DATA_PACKET_SIZE);
3404  if (NULL == lpszBuffer)
3405  {
3407  return FALSE;
3408  }
3409 
3410  while (nRC != -1)
3411  {
3412  nRC = sock_recv(nDataSocket, lpszBuffer, DATA_PACKET_SIZE, 0);
3413  if (nRC != -1)
3414  {
3415  /* other side closed socket. */
3416  if (nRC == 0)
3417  goto recv_end;
3418  WriteFile(hFile, lpszBuffer, nRC, &nBytesWritten, NULL);
3419  }
3420  }
3421 
3422  TRACE("Data transfer complete\n");
3423 
3424 recv_end:
3425  heap_free(lpszBuffer);
3426  return (nRC != -1);
3427 }
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
char CHAR
Definition: xmlstorage.h:175
int32_t INT
Definition: typedefs.h:56
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_ HANDLE hFile
Definition: mswsock.h:90
#define DATA_PACKET_SIZE
Definition: ftp.c:103
static int sock_recv(int fd, void *msg, size_t len, int flags)
Definition: net.c:49
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FTP_FtpGetFileW().

◆ FTP_SendAccount()

static BOOL FTP_SendAccount ( ftp_session_t lpwfs)
static

Definition at line 2874 of file ftp.c.

2875 {
2876  INT nResCode;
2877  BOOL bSuccess = FALSE;
2878 
2879  TRACE("\n");
2880  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_ACCT, szNoAccount, 0, 0, 0))
2881  goto lend;
2882 
2883  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2884  if (nResCode)
2885  bSuccess = TRUE;
2886  else
2887  FTP_SetResponseError(nResCode);
2888 
2889 lend:
2890  return bSuccess;
2891 }
#define TRUE
Definition: types.h:120
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
int sndSocket
Definition: ftp.c:73
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751
static const WCHAR szNoAccount[]
Definition: ftp.c:162

Referenced by FTP_ConnectToHost(), and FTP_SendPassword().

◆ FTP_SendCommand()

static BOOL FTP_SendCommand ( INT  nSocket,
FTP_COMMAND  ftpCmd,
LPCWSTR  lpszParam,
INTERNET_STATUS_CALLBACK  lpfnStatusCB,
object_header_t hdr,
DWORD_PTR  dwContext 
)
static

Definition at line 2751 of file ftp.c.

2753 {
2754  BOOL ret;
2755  LPSTR lpszParamA = heap_strdupWtoA(lpszParam);
2756  ret = FTP_SendCommandA(nSocket, ftpCmd, lpszParamA, lpfnStatusCB, hdr, dwContext);
2757  heap_free(lpszParamA);
2758  return ret;
2759 }
char hdr[14]
Definition: iptest.cpp:33
static BOOL FTP_SendCommandA(INT nSocket, FTP_COMMAND ftpCmd, LPCSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2697
char * LPSTR
Definition: xmlstorage.h:182
unsigned int BOOL
Definition: ntddk_ex.h:94
static char * heap_strdupWtoA(const WCHAR *str)
int ret
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FTP_ConnectToHost(), FTP_DoPassive(), FTP_FtpCreateDirectoryW(), FTP_FtpDeleteFileW(), FTP_FtpFindFirstFileW(), FTP_FtpGetCurrentDirectoryW(), FTP_FtpRemoveDirectoryW(), FTP_FtpRenameFileW(), FTP_FtpSetCurrentDirectoryW(), FTP_SendAccount(), FTP_SendPassword(), FTP_SendPort(), FTP_SendRetrieve(), FTP_SendStore(), and FTP_SendType().

◆ FTP_SendCommandA()

static BOOL FTP_SendCommandA ( INT  nSocket,
FTP_COMMAND  ftpCmd,
LPCSTR  lpszParam,
INTERNET_STATUS_CALLBACK  lpfnStatusCB,
object_header_t hdr,
DWORD_PTR  dwContext 
)
static

Definition at line 2697 of file ftp.c.

2699 {
2700  DWORD len;
2701  CHAR *buf;
2702  DWORD nBytesSent = 0;
2703  int nRC = 0;
2704  DWORD dwParamLen;
2705 
2706  TRACE("%d: (%s) %d\n", ftpCmd, debugstr_a(lpszParam), nSocket);
2707 
2708  if (lpfnStatusCB)
2709  {
2710  lpfnStatusCB(hdr->hInternet, dwContext, INTERNET_STATUS_SENDING_REQUEST, NULL, 0);
2711  }
2712 
2713  dwParamLen = lpszParam?strlen(lpszParam)+1:0;
2714  len = dwParamLen + strlen(szFtpCommands[ftpCmd]) + strlen(szCRLF);
2715  if (NULL == (buf = heap_alloc(len+1)))
2716  {
2718  return FALSE;
2719  }
2720  sprintf(buf, "%s%s%s%s", szFtpCommands[ftpCmd], dwParamLen ? " " : "",
2721  dwParamLen ? lpszParam : "", szCRLF);
2722 
2723  TRACE("Sending (%s) len(%d)\n", debugstr_a(buf), len);
2724  while((nBytesSent < len) && (nRC != -1))
2725  {
2726  nRC = sock_send(nSocket, buf+nBytesSent, len - nBytesSent, 0);
2727  nBytesSent += nRC;
2728  }
2729  heap_free(buf);
2730 
2731  if (lpfnStatusCB)
2732  {
2733  lpfnStatusCB(hdr->hInternet, dwContext, INTERNET_STATUS_REQUEST_SENT,
2734  &nBytesSent, sizeof(DWORD));
2735  }
2736 
2737  TRACE("Sent %d bytes\n", nBytesSent);
2738  return (nRC != -1);
2739 }
char hdr[14]
Definition: iptest.cpp:33
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define INTERNET_STATUS_REQUEST_SENT
Definition: wininet.h:888
char CHAR
Definition: xmlstorage.h:175
static const CHAR *const szFtpCommands[]
Definition: ftp.c:138
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
#define sprintf(buf, format,...)
Definition: sprintf.c:55
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
#define debugstr_a
Definition: kernel32.h:31
unsigned long DWORD
Definition: ntddk_ex.h:95
#define szCRLF
Definition: ftp.c:104
#define INTERNET_STATUS_SENDING_REQUEST
Definition: wininet.h:887
GLenum GLsizei len
Definition: glext.h:6722
static int sock_send(int fd, const void *msg, size_t len, int flags)
Definition: net.c:38
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FTP_SendCommand().

◆ FTP_SendData()

static BOOL FTP_SendData ( ftp_session_t lpwfs,
INT  nDataSocket,
HANDLE  hFile 
)
static

Definition at line 3269 of file ftp.c.

3270 {
3272  DWORD nBytesRead = 0;
3273  DWORD nBytesSent = 0;
3274  DWORD nTotalSent = 0;
3275  DWORD nBytesToSend, nLen;
3276  int nRC = 1;
3277  time_t s_long_time, e_long_time;
3278  LONG nSeconds;
3279  CHAR *lpszBuffer;
3280 
3281  TRACE("\n");
3282  lpszBuffer = heap_alloc_zero(sizeof(CHAR)*DATA_PACKET_SIZE);
3283 
3284  /* Get the size of the file. */
3286  time(&s_long_time);
3287 
3288  do
3289  {
3290  nBytesToSend = nBytesRead - nBytesSent;
3291 
3292  if (nBytesToSend <= 0)
3293  {
3294  /* Read data from file. */
3295  nBytesSent = 0;
3296  if (!ReadFile(hFile, lpszBuffer, DATA_PACKET_SIZE, &nBytesRead, 0))
3297  ERR("Failed reading from file\n");
3298 
3299  if (nBytesRead > 0)
3300  nBytesToSend = nBytesRead;
3301  else
3302  break;
3303  }
3304 
3305  nLen = DATA_PACKET_SIZE < nBytesToSend ?
3306  DATA_PACKET_SIZE : nBytesToSend;
3307  nRC = sock_send(nDataSocket, lpszBuffer, nLen, 0);
3308 
3309  if (nRC != -1)
3310  {
3311  nBytesSent += nRC;
3312  nTotalSent += nRC;
3313  }
3314 
3315  /* Do some computation to display the status. */
3316  time(&e_long_time);
3317  nSeconds = e_long_time - s_long_time;
3318  if( nSeconds / 60 > 0 )
3319  {
3320  TRACE( "%d bytes of %d bytes (%d%%) in %d min %d sec estimated remaining time %d sec\n",
3321  nTotalSent, fi.nFileSizeLow, nTotalSent*100/fi.nFileSizeLow, nSeconds / 60,
3322  nSeconds % 60, (fi.nFileSizeLow - nTotalSent) * nSeconds / nTotalSent );
3323  }
3324  else
3325  {
3326  TRACE( "%d bytes of %d bytes (%d%%) in %d sec estimated remaining time %d sec\n",
3327  nTotalSent, fi.nFileSizeLow, nTotalSent*100/fi.nFileSizeLow, nSeconds,
3328  (fi.nFileSizeLow - nTotalSent) * nSeconds / nTotalSent);
3329  }
3330  } while (nRC != -1);
3331 
3332  TRACE("file transfer complete!\n");
3333 
3334  heap_free(lpszBuffer);
3335  return nTotalSent;
3336 }
char CHAR
Definition: xmlstorage.h:175
__u16 time
Definition: mkdosfs.c:366
long LONG
Definition: pedump.c:60
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
Definition: fileinfo.c:608
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_ HANDLE hFile
Definition: mswsock.h:90
#define DATA_PACKET_SIZE
Definition: ftp.c:103
#define ERR(fmt,...)
Definition: debug.h:109
static int sock_send(int fd, const void *msg, size_t len, int flags)
Definition: net.c:38
__kernel_time_t time_t
Definition: linux.h:252
BOOL WINAPI ReadFile(IN HANDLE hFile, IN LPVOID lpBuffer, IN DWORD nNumberOfBytesToRead, OUT LPDWORD lpNumberOfBytesRead OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:123
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FTP_FtpPutFileW().

◆ FTP_SendPassword()

static BOOL FTP_SendPassword ( ftp_session_t lpwfs)
static

Definition at line 2834 of file ftp.c.

2835 {
2836  INT nResCode;
2837  BOOL bSuccess = FALSE;
2838 
2839  TRACE("\n");
2840  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_PASS, lpwfs->lpszPassword, 0, 0, 0))
2841  goto lend;
2842 
2843  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2844  if (nResCode)
2845  {
2846  TRACE("Received reply code %d\n", nResCode);
2847  /* Login successful... */
2848  if (nResCode == 230)
2849  bSuccess = TRUE;
2850  /* Command not implemented, superfluous at the server site... */
2851  /* Need account for login... */
2852  else if (nResCode == 332)
2853  bSuccess = FTP_SendAccount(lpwfs);
2854  else
2855  FTP_SetResponseError(nResCode);
2856  }
2857 
2858 lend:
2859  TRACE("Returning %d\n", bSuccess);
2860  return bSuccess;
2861 }
#define TRUE
Definition: types.h:120
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
LPWSTR lpszPassword
Definition: ftp.c:81
static BOOL FTP_SendAccount(ftp_session_t *)
Definition: ftp.c:2874
int sndSocket
Definition: ftp.c:73
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751

Referenced by FTP_ConnectToHost().

◆ FTP_SendPort()

static BOOL FTP_SendPort ( ftp_session_t lpwfs)
static

Definition at line 3093 of file ftp.c.

3094 {
3095  static const WCHAR szIPFormat[] = {'%','d',',','%','d',',','%','d',',','%','d',',','%','d',',','%','d','\0'};
3096  INT nResCode;
3097  WCHAR szIPAddress[64];
3098  BOOL bSuccess = FALSE;
3099  TRACE("\n");
3100 
3101  sprintfW(szIPAddress, szIPFormat,
3102  lpwfs->lstnSocketAddress.sin_addr.S_un.S_addr&0x000000FF,
3103  (lpwfs->lstnSocketAddress.sin_addr.S_un.S_addr&0x0000FF00)>>8,
3104  (lpwfs->lstnSocketAddress.sin_addr.S_un.S_addr&0x00FF0000)>>16,
3105  (lpwfs->lstnSocketAddress.sin_addr.S_un.S_addr&0xFF000000)>>24,
3106  lpwfs->lstnSocketAddress.sin_port & 0xFF,
3107  (lpwfs->lstnSocketAddress.sin_port & 0xFF00)>>8);
3108 
3109  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_PORT, szIPAddress, 0, 0, 0))
3110  goto lend;
3111 
3112  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
3113  if (nResCode)
3114  {
3115  if (nResCode == 200)
3116  bSuccess = TRUE;
3117  else
3118  FTP_SetResponseError(nResCode);
3119  }
3120 
3121 lend:
3122  return bSuccess;
3123 }
#define TRUE
Definition: types.h:120
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
DWORD_PTR dwContext
Definition: internet.h:279
struct sockaddr_in lstnSocketAddress
Definition: ftp.c:78
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
__wchar_t WCHAR
Definition: xmlstorage.h:180
int sndSocket
Definition: ftp.c:73
#define sprintfW
Definition: unicode.h:58
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751

Referenced by FTP_SendPortOrPasv().

◆ FTP_SendPortOrPasv()

static BOOL FTP_SendPortOrPasv ( ftp_session_t lpwfs)
static

Definition at line 3209 of file ftp.c.

3210 {
3211  if (lpwfs->hdr.dwFlags & INTERNET_FLAG_PASSIVE)
3212  {
3213  if (!FTP_DoPassive(lpwfs))
3214  return FALSE;
3215  }
3216  else
3217  {
3218  if (!FTP_SendPort(lpwfs))
3219  return FALSE;
3220  }
3221  return TRUE;
3222 }
static BOOL FTP_SendPort(ftp_session_t *)
Definition: ftp.c:3093
static BOOL FTP_DoPassive(ftp_session_t *)
Definition: ftp.c:3137
#define TRUE
Definition: types.h:120
object_header_t hdr
Definition: ftp.c:71
#define INTERNET_FLAG_PASSIVE
Definition: wininet.h:65

Referenced by FTP_FtpFindFirstFileW(), FTP_SendRetrieve(), and FTP_SendStore().

◆ FTP_SendRetrieve()

static BOOL FTP_SendRetrieve ( ftp_session_t lpwfs,
LPCWSTR  lpszRemoteFile,
DWORD  dwType 
)
static

Definition at line 3349 of file ftp.c.

3350 {
3351  INT nResCode;
3352  BOOL ret;
3353 
3354  TRACE("\n");
3355  if (!(ret = FTP_InitListenSocket(lpwfs)))
3356  goto lend;
3357 
3358  if (!(ret = FTP_SendType(lpwfs, dwType)))
3359  goto lend;
3360 
3361  if (!(ret = FTP_SendPortOrPasv(lpwfs)))
3362  goto lend;
3363 
3364  if (!(ret = FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_RETR, lpszRemoteFile, 0, 0, 0)))
3365  goto lend;
3366 
3367  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
3368  if ((nResCode != 125) && (nResCode != 150)) {
3369  /* That means that we got an error getting the file. */
3370  FTP_SetResponseError(nResCode);
3371  ret = FALSE;
3372  }
3373 
3374 lend:
3375  if (!ret && lpwfs->lstnSocket != -1)
3376  {
3377  closesocket(lpwfs->lstnSocket);
3378  lpwfs->lstnSocket = -1;
3379  }
3380 
3381  return ret;
3382 }
static BOOL FTP_SendType(ftp_session_t *, DWORD dwType)
Definition: ftp.c:3011
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
static BOOL FTP_InitListenSocket(ftp_session_t *)
Definition: ftp.c:2951
#define closesocket
Definition: precomp.h:57
int32_t INT
Definition: typedefs.h:56
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
static BOOL FTP_SendPortOrPasv(ftp_session_t *)
Definition: ftp.c:3209
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
int ret
int sndSocket
Definition: ftp.c:73
int lstnSocket
Definition: ftp.c:74
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751

Referenced by FTP_FtpGetFileW(), and FTP_FtpOpenFileW().

◆ FTP_SendStore()

static BOOL FTP_SendStore ( ftp_session_t lpwfs,
LPCWSTR  lpszRemoteFile,
DWORD  dwType 
)
static

Definition at line 2904 of file ftp.c.

2905 {
2906  INT nResCode;
2907  BOOL bSuccess = FALSE;
2908 
2909  TRACE("\n");
2910  if (!FTP_InitListenSocket(lpwfs))
2911  goto lend;
2912 
2913  if (!FTP_SendType(lpwfs, dwType))
2914  goto lend;
2915 
2916  if (!FTP_SendPortOrPasv(lpwfs))
2917  goto lend;
2918 
2919  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_STOR, lpszRemoteFile, 0, 0, 0))
2920  goto lend;
2921  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2922  if (nResCode)
2923  {
2924  if (nResCode == 150 || nResCode == 125)
2925  bSuccess = TRUE;
2926  else
2927  FTP_SetResponseError(nResCode);
2928  }
2929 
2930 lend:
2931  if (!bSuccess && lpwfs->lstnSocket != -1)
2932  {
2933  closesocket(lpwfs->lstnSocket);
2934  lpwfs->lstnSocket = -1;
2935  }
2936 
2937  return bSuccess;
2938 }
#define TRUE
Definition: types.h:120
static BOOL FTP_SendType(ftp_session_t *, DWORD dwType)
Definition: ftp.c:3011
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
static BOOL FTP_InitListenSocket(ftp_session_t *)
Definition: ftp.c:2951
#define closesocket
Definition: precomp.h:57
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
static BOOL FTP_SendPortOrPasv(ftp_session_t *)
Definition: ftp.c:3209
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
int sndSocket
Definition: ftp.c:73
int lstnSocket
Definition: ftp.c:74
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751

Referenced by FTP_FtpOpenFileW(), and FTP_FtpPutFileW().

◆ FTP_SendType()

static BOOL FTP_SendType ( ftp_session_t lpwfs,
DWORD  dwType 
)
static

Definition at line 3011 of file ftp.c.

3012 {
3013  INT nResCode;
3014  WCHAR type[] = { 'I','\0' };
3015  BOOL bSuccess = FALSE;
3016 
3017  TRACE("\n");
3018  if (dwType & INTERNET_FLAG_TRANSFER_ASCII)
3019  type[0] = 'A';
3020 
3021  if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_TYPE, type, 0, 0, 0))
3022  goto lend;
3023 
3024  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext)/100;
3025  if (nResCode)
3026  {
3027  if (nResCode == 2)
3028  bSuccess = TRUE;
3029  else
3030  FTP_SetResponseError(nResCode);
3031  }
3032 
3033 lend:
3034  return bSuccess;
3035 }
#define TRUE
Definition: types.h:120
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
int32_t INT
Definition: typedefs.h:56
static BOOLEAN bSuccess
Definition: drive.cpp:419
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define INTERNET_FLAG_TRANSFER_ASCII
Definition: wininet.h:90
int sndSocket
Definition: ftp.c:73
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
Definition: ftp.c:2751

Referenced by FTP_FtpFindFirstFileW(), FTP_SendRetrieve(), and FTP_SendStore().

◆ FTP_SetResponseError()

static DWORD FTP_SetResponseError ( DWORD  dwResponse)
static

Definition at line 3921 of file ftp.c.

3922 {
3923  DWORD dwCode = 0;
3924 
3925  switch(dwResponse)
3926  {
3927  case 425: /* Cannot open data connection. */
3929  break;
3930 
3931  case 426: /* Connection closed, transer aborted. */
3933  break;
3934 
3935  case 530: /* Not logged in. Login incorrect. */
3937  break;
3938 
3939  case 421: /* Service not available - Server may be shutting down. */
3940  case 450: /* File action not taken. File may be busy. */
3941  case 451: /* Action aborted. Server error. */
3942  case 452: /* Action not taken. Insufficient storage space on server. */
3943  case 500: /* Syntax error. Command unrecognized. */
3944  case 501: /* Syntax error. Error in parameters or arguments. */
3945  case 502: /* Command not implemented. */
3946  case 503: /* Bad sequence of commands. */
3947  case 504: /* Command not implemented for that parameter. */
3948  case 532: /* Need account for storing files */
3949  case 550: /* File action not taken. File not found or no access. */
3950  case 551: /* Requested action aborted. Page type unknown */
3951  case 552: /* Action aborted. Exceeded storage allocation */
3952  case 553: /* Action not taken. File name not allowed. */
3953 
3954  default:
3956  break;
3957  }
3958 
3959  INTERNET_SetLastError(dwCode);
3960  return dwCode;
3961 }
#define ERROR_INTERNET_CONNECTION_ABORTED
Definition: wininet.h:2019
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
#define ERROR_INTERNET_EXTENDED_ERROR
Definition: wininet.h:1992
#define ERROR_INTERNET_CANNOT_CONNECT
Definition: wininet.h:2018
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ERROR_INTERNET_LOGIN_FAILURE
Definition: wininet.h:2004

Referenced by FTP_ConnectToHost(), FTP_DoPassive(), FTP_FtpCreateDirectoryW(), FTP_FtpDeleteFileW(), FTP_FtpFindFirstFileW(), FTP_FtpGetCurrentDirectoryW(), FTP_FtpGetFileW(), FTP_FtpPutFileW(), FTP_FtpRemoveDirectoryW(), FTP_FtpRenameFileW(), FTP_FtpSetCurrentDirectoryW(), FTP_SendAccount(), FTP_SendPassword(), FTP_SendPort(), FTP_SendRetrieve(), FTP_SendStore(), FTP_SendType(), and FtpCommandW().

◆ FtpCommandA()

BOOL WINAPI FtpCommandA ( HINTERNET  hConnect,
BOOL  fExpectResponse,
DWORD  dwFlags,
LPCSTR  lpszCommand,
DWORD_PTR  dwContext,
HINTERNET phFtpCommand 
)

Definition at line 2215 of file ftp.c.

2217 {
2218  BOOL r;
2219  WCHAR *cmdW;
2220 
2221  TRACE("%p %d 0x%08x %s 0x%08lx %p\n", hConnect, fExpectResponse, dwFlags,
2222  debugstr_a(lpszCommand), dwContext, phFtpCommand);
2223 
2224  if (fExpectResponse)
2225  {
2226  FIXME("data connection not supported\n");
2227  return FALSE;
2228  }
2229 
2230  if (!lpszCommand || !lpszCommand[0])
2231  {
2233  return FALSE;
2234  }
2235 
2236  if (!(cmdW = heap_strdupAtoW(lpszCommand)))
2237  {
2239  return FALSE;
2240  }
2241 
2242  r = FtpCommandW(hConnect, fExpectResponse, dwFlags, cmdW, dwContext, phFtpCommand);
2243 
2244  heap_free(cmdW);
2245  return r;
2246 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
unsigned int BOOL
Definition: ntddk_ex.h:94
#define FIXME(fmt,...)
Definition: debug.h:110
static WCHAR * heap_strdupAtoW(const char *str)
Definition: appwiz.h:80
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define debugstr_a
Definition: kernel32.h:31
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
BOOL WINAPI FtpCommandW(HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags, LPCWSTR lpszCommand, DWORD_PTR dwContext, HINTERNET *phFtpCommand)
Definition: ftp.c:2251
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

◆ FtpCommandW()

BOOL WINAPI FtpCommandW ( HINTERNET  hConnect,
BOOL  fExpectResponse,
DWORD  dwFlags,
LPCWSTR  lpszCommand,
DWORD_PTR  dwContext,
HINTERNET phFtpCommand 
)

Definition at line 2251 of file ftp.c.

2253 {
2254  BOOL r = FALSE;
2255  ftp_session_t *lpwfs;
2256  LPSTR cmd = NULL;
2257  DWORD len, nBytesSent= 0;
2258  INT nResCode, nRC = 0;
2259 
2260  TRACE("%p %d 0x%08x %s 0x%08lx %p\n", hConnect, fExpectResponse, dwFlags,
2261  debugstr_w(lpszCommand), dwContext, phFtpCommand);
2262 
2263  if (!lpszCommand || !lpszCommand[0])
2264  {
2266  return FALSE;
2267  }
2268 
2269  if (fExpectResponse)
2270  {
2271  FIXME("data connection not supported\n");
2272  return FALSE;
2273  }
2274 
2275  lpwfs = (ftp_session_t*) get_handle_object( hConnect );
2276  if (!lpwfs)
2277  {
2279  return FALSE;
2280  }
2281 
2282  if (WH_HFTPSESSION != lpwfs->hdr.htype)
2283  {
2285  goto lend;
2286  }
2287 
2288  if (lpwfs->download_in_progress != NULL)
2289  {
2291  goto lend;
2292  }
2293 
2294  len = WideCharToMultiByte(CP_ACP, 0, lpszCommand, -1, NULL, 0, NULL, NULL) + strlen(szCRLF);
2295  if ((cmd = heap_alloc(len)))
2296  WideCharToMultiByte(CP_ACP, 0, lpszCommand, -1, cmd, len, NULL, NULL);
2297  else
2298  {
2300  goto lend;
2301  }
2302 
2303  strcat(cmd, szCRLF);
2304  len--;
2305 
2306  TRACE("Sending (%s) len(%d)\n", debugstr_a(cmd), len);
2307  while ((nBytesSent < len) && (nRC != -1))
2308  {
2309  nRC = sock_send(lpwfs->sndSocket, cmd + nBytesSent, len - nBytesSent, 0);
2310  if (nRC != -1)
2311  {
2312  nBytesSent += nRC;
2313  TRACE("Sent %d bytes\n", nRC);
2314  }
2315  }
2316 
2317  if (nBytesSent)
2318  {
2319  nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
2320  if (nResCode > 0 && nResCode < 400)
2321  r = TRUE;
2322  else
2323  FTP_SetResponseError(nResCode);
2324  }
2325 
2326 lend:
2327  WININET_Release( &lpwfs->hdr );
2328  heap_free( cmd );
2329  return r;
2330 }
#define ERROR_INTERNET_INCORRECT_HANDLE_TYPE
Definition: wininet.h:2007
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
#define TRUE
Definition: types.h:120
void INTERNET_SetLastError(DWORD dwError)
Definition: internet.c:3720
#define WideCharToMultiByte
Definition: compat.h:101
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
static DWORD FTP_SetResponseError(DWORD dwResponse)
Definition: ftp.c:3921
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
Definition: ftp_var.h:139
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
#define CP_ACP
Definition: compat.h:99
#define ERROR_INVALID_HANDLE
Definition: compat.h:88
ftp_file_t * download_in_progress
Definition: ftp.c:76
char * LPSTR
Definition: xmlstorage.h:182
int32_t INT
Definition: typedefs.h:56
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
DWORD_PTR dwContext
Definition: internet.h:279
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
Definition: ftp.c:2771
unsigned int BOOL
Definition: ntddk_ex.h:94
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
object_header_t hdr
Definition: ftp.c:71
#define debugstr_a
Definition: kernel32.h:31
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ERROR_FTP_TRANSFER_IN_PROGRESS
Definition: wininet.h:2046
#define szCRLF
Definition: ftp.c:104
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
GLenum GLsizei len
Definition: glext.h:6722
int sndSocket
Definition: ftp.c:73
BOOL WININET_Release(object_header_t *info)
Definition: internet.c:219
static int sock_send(int fd, const void *msg, size_t len, int flags)
Definition: net.c:38
WH_TYPE htype
Definition: internet.h:274
object_header_t * get_handle_object(HINTERNET hinternet)
Definition: internet.c:184
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
static BOOL heap_free(void *mem)
Definition: appwiz.h:75

Referenced by FtpCommandA().

◆ FtpCreateDirectoryA()

BOOL WINAPI FtpCreateDirectoryA ( HINTERNET  hConnect,
LPCSTR  lpszDirectory 
)

Definition at line 563 of file ftp.c.

564 {
565  LPWSTR lpwzDirectory;
566  BOOL ret;
567 
568  lpwzDirectory = heap_strdupAtoW(lpszDirectory);
569