netx/addons/ftp/nx_ftp_client.h
2021-10-13 06:48:36 +00:00

371 lines
22 KiB
C

/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** NetX Component */
/** */
/** File Transfer Protocol (FTP) */
/** */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/* */
/* APPLICATION INTERFACE DEFINITION RELEASE */
/* */
/* nx_ftp_client.h PORTABLE C */
/* 6.1.9 */
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This file defines the NetX File Transfer Protocol component, */
/* including all data types and external references. */
/* It is assumed that nx_api.h and nx_port.h have already been */
/* included, along with fx_api.h and fx_port.h. */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
/* resulting in version 6.1 */
/* 10-15-2021 Yuxin Zhou Modified comment(s), included */
/* necessary header file, */
/* resulting in version 6.1.9 */
/* */
/**************************************************************************/
#ifndef NX_FTP_CLIENT_H
#define NX_FTP_CLIENT_H
/* Determine if a C++ compiler is being used. If so, ensure that standard
C is used to process the API information. */
#ifdef __cplusplus
/* Yes, C++ compiler is present. Use standard C. */
extern "C" {
#endif
#include "nx_api.h"
/* Define the FTP Client ID. */
#define NX_FTP_CLIENT_ID 0x46545200UL
/* Define the maximum number of clients the FTP Server can accommodate. */
#ifndef NX_FTP_MAX_CLIENTS
#define NX_FTP_MAX_CLIENTS 4
#endif
/* Define FTP TCP socket create options. Normally any TCP port will do but this
gives the application a means to specify a source port. */
#ifndef NX_FTP_CLIENT_SOURCE_PORT
#define NX_FTP_CLIENT_SOURCE_PORT NX_ANY_PORT
#endif
#ifndef NX_FTP_CONTROL_TOS
#define NX_FTP_CONTROL_TOS NX_IP_NORMAL
#endif
#ifndef NX_FTP_DATA_TOS
#define NX_FTP_DATA_TOS NX_IP_NORMAL
#endif
#ifndef NX_FTP_FRAGMENT_OPTION
#define NX_FTP_FRAGMENT_OPTION NX_DONT_FRAGMENT
#endif
#ifndef NX_FTP_CONTROL_WINDOW_SIZE
#define NX_FTP_CONTROL_WINDOW_SIZE 400
#endif
#ifndef NX_FTP_DATA_WINDOW_SIZE
#define NX_FTP_DATA_WINDOW_SIZE 2048
#endif
#ifndef NX_FTP_TIME_TO_LIVE
#define NX_FTP_TIME_TO_LIVE 0x80
#endif
#ifndef NX_FTP_USERNAME_SIZE
#define NX_FTP_USERNAME_SIZE 20
#endif
#ifndef NX_FTP_PASSWORD_SIZE
#define NX_FTP_PASSWORD_SIZE 20
#endif
#ifndef NX_FTP_TIMEOUT_PERIOD
#define NX_FTP_TIMEOUT_PERIOD 60 /* Number of seconds to check */
#endif
/* Define open types. */
#define NX_FTP_OPEN_FOR_READ 0x01 /* FTP file open for reading */
#define NX_FTP_OPEN_FOR_WRITE 0x02 /* FTP file open for writing */
/* Define transfer modes. Note: just support stream mode and block mode yet. */
#define NX_FTP_TRANSFER_MODE_STREAM 0 /* FTP stream transmission mode */
#define NX_FTP_TRANSFER_MODE_BLOCK 1 /* FTP block transmission mode */
#define NX_FTP_TRANSFER_MODE_COMPRESSED 2 /* FTP compressed transmission mode */
/* Define return code constants. */
#define NX_FTP_ERROR 0xD0 /* Generic FTP internal error - deprecated */
#define NX_FTP_TIMEOUT 0xD1 /* FTP timeout occurred */
#define NX_FTP_FAILED 0xD2 /* FTP error */
#define NX_FTP_NOT_CONNECTED 0xD3 /* FTP not connected error */
#define NX_FTP_NOT_DISCONNECTED 0xD4 /* FTP not disconnected error */
#define NX_FTP_NOT_OPEN 0xD5 /* FTP not opened error */
#define NX_FTP_NOT_CLOSED 0xD6 /* FTP not closed error */
#define NX_FTP_END_OF_FILE 0xD7 /* FTP end of file status */
#define NX_FTP_END_OF_LISTING 0xD8 /* FTP end of directory listing status */
#define NX_FTP_EXPECTED_1XX_CODE 0xD9 /* Expected a 1xx response from server */
#define NX_FTP_EXPECTED_2XX_CODE 0xDA /* Expected a 2xx response from server */
#define NX_FTP_EXPECTED_22X_CODE 0xDB /* Expected a 22x response from server */
#define NX_FTP_EXPECTED_23X_CODE 0xDC /* Expected a 23x response from server */
#define NX_FTP_EXPECTED_3XX_CODE 0xDD /* Expected a 3xx response from server */
#define NX_FTP_EXPECTED_33X_CODE 0xDE /* Expected a 33x response from server */
#define NX_FTP_INVALID_NUMBER 0xDF /* Extraced an invalid number from server response */
#define NX_FTP_INVALID_ADDRESS 0x1D0 /* Invalid IP address parsed from FTP command */
#define NX_FTP_INVALID_COMMAND 0x1D1 /* Invalid FTP command (bad syntax, unknown command) */
#define NX_FTP_CLIENT_INVALID_SIZE 0x1D2 /* Invalid FTP file size */
#define NX_FTP_CLIENT_FILE_SIZE_ALREADY_SET 0x1D3 /* The file size is already set */
#define NX_FTP_CLIENT_NOT_BLOCK_MODE 0x1D4 /* Block mode is not enabled */
#define NX_FTP_CLIENT_END_OF_BLOCK 0x1D5 /* FTP end of block */
/* Define FTP connection states. */
#define NX_FTP_STATE_NOT_CONNECTED 1 /* FTP not connected */
#define NX_FTP_STATE_CONNECTED 2 /* FTP connected */
#define NX_FTP_STATE_OPEN 3 /* FTP file open for reading */
#define NX_FTP_STATE_WRITE_OPEN 4 /* FTP file open for writing */
/* Define the FTP Server TCP port numbers. */
#define NX_FTP_SERVER_CONTROL_PORT 21 /* Control Port for FTP server */
#define NX_FTP_SERVER_DATA_PORT 20 /* Data Port for FTP server in active transfer mode */
/* Define the FTP basic commands. The ASCII command will be parsed and converted to the numerical
representation shown below. */
#define NX_FTP_NOOP 0
#define NX_FTP_USER 1
#define NX_FTP_PASS 2
#define NX_FTP_QUIT 3
#define NX_FTP_RETR 4
#define NX_FTP_STOR 5
#define NX_FTP_RNFR 6
#define NX_FTP_RNTO 7
#define NX_FTP_DELE 8
#define NX_FTP_RMD 9
#define NX_FTP_MKD 10
#define NX_FTP_NLST 11
#define NX_FTP_PORT 12
#define NX_FTP_CWD 13
#define NX_FTP_PWD 14
#define NX_FTP_TYPE 15
#define NX_FTP_LIST 16
#define NX_FTP_CDUP 17
#define NX_FTP_INVALID 18
#define NX_FTP_EPRT 19
#define NX_FTP_PASV 20
#define NX_FTP_EPSV 21
#define NX_FTP_MODE 22
/* Define the basic FTP Client data structure. */
typedef struct NX_FTP_CLIENT_STRUCT
{
ULONG nx_ftp_client_id; /* FTP Client ID */
CHAR *nx_ftp_client_name; /* Name of this FTP client */
NX_IP *nx_ftp_client_ip_ptr; /* Pointer to associated IP structure */
NX_PACKET_POOL *nx_ftp_client_packet_pool_ptr; /* Pointer to FTP client packet pool */
ULONG nx_ftp_client_server_ip; /* Server's IP address */
UINT nx_ftp_client_state; /* State of FTP client */
NX_TCP_SOCKET nx_ftp_client_control_socket; /* Client FTP control socket */
NX_TCP_SOCKET nx_ftp_client_data_socket; /* Client FTP data transfer socket */
UINT nx_ftp_client_data_port; /* Port the Client data socket binds */
UINT nx_ftp_client_passive_transfer_enabled; /* Client enabled for passive transfer */
UINT nx_ftp_client_transfer_mode; /* Client transfer mode */
ULONG nx_ftp_client_block_total_size; /* Total size of data in block mode */
ULONG nx_ftp_client_block_remaining_size; /* Remaining size of data in block mode*/
} NX_FTP_CLIENT;
#ifndef NX_FTP_SOURCE_CODE
/* Application caller is present, perform API mapping. */
/* Determine if error checking is desired. If so, map API functions
to the appropriate error checking front-ends. Otherwise, map API
functions to the core functions that actually perform the work.
Note: error checking is enabled by default. */
#ifdef NX_DISABLE_ERROR_CHECKING
/* Services without error checking. */
#define nx_ftp_client_connect _nx_ftp_client_connect
#define nx_ftp_client_create _nx_ftp_client_create
#define nx_ftp_client_delete _nx_ftp_client_delete
#define nx_ftp_client_directory_create _nx_ftp_client_directory_create
#define nx_ftp_client_directory_default_set _nx_ftp_client_directory_default_set
#define nx_ftp_client_directory_delete _nx_ftp_client_directory_delete
#define nx_ftp_client_directory_listing_get _nx_ftp_client_directory_listing_get
#define nx_ftp_client_directory_listing_continue _nx_ftp_client_directory_listing_continue
#define nx_ftp_client_disconnect _nx_ftp_client_disconnect
#define nx_ftp_client_file_close _nx_ftp_client_file_close
#define nx_ftp_client_file_delete _nx_ftp_client_file_delete
#define nx_ftp_client_file_open _nx_ftp_client_file_open
#define nx_ftp_client_file_read _nx_ftp_client_file_read
#define nx_ftp_client_file_rename _nx_ftp_client_file_rename
#define nx_ftp_client_file_write _nx_ftp_client_file_write
#define nx_ftp_client_file_size_set _nx_ftp_client_file_size_set
#define nx_ftp_client_passive_mode_set _nx_ftp_client_passive_mode_set
#define nx_ftp_client_transfer_mode_set _nx_ftp_client_transfer_mode_set
#else
/* Services with error checking. */
#define nx_ftp_client_connect _nxe_ftp_client_connect
#define nx_ftp_client_create _nxe_ftp_client_create
#define nx_ftp_client_delete _nxe_ftp_client_delete
#define nx_ftp_client_directory_create _nxe_ftp_client_directory_create
#define nx_ftp_client_directory_default_set _nxe_ftp_client_directory_default_set
#define nx_ftp_client_directory_delete _nxe_ftp_client_directory_delete
#define nx_ftp_client_directory_listing_get _nxe_ftp_client_directory_listing_get
#define nx_ftp_client_directory_listing_continue _nxe_ftp_client_directory_listing_continue
#define nx_ftp_client_disconnect _nxe_ftp_client_disconnect
#define nx_ftp_client_file_close _nxe_ftp_client_file_close
#define nx_ftp_client_file_delete _nxe_ftp_client_file_delete
#define nx_ftp_client_file_open _nxe_ftp_client_file_open
#define nx_ftp_client_file_read _nxe_ftp_client_file_read
#define nx_ftp_client_file_rename _nxe_ftp_client_file_rename
#define nx_ftp_client_file_write _nxe_ftp_client_file_write
#define nx_ftp_client_file_size_set _nxe_ftp_client_file_size_set
#define nx_ftp_client_passive_mode_set _nxe_ftp_client_passive_mode_set
#define nx_ftp_client_transfer_mode_set _nxe_ftp_client_transfer_mode_set
#endif
/* Define the prototypes accessible to the application software. */
UINT nx_ftp_client_connect(NX_FTP_CLIENT *ftp_client_ptr, ULONG server_ip, CHAR *username, CHAR *password, ULONG wait_option);
UINT nx_ftp_client_create(NX_FTP_CLIENT *ftp_client_ptr, CHAR *ftp_client_name, NX_IP *ip_ptr, ULONG window_size, NX_PACKET_POOL *pool_ptr);
UINT nx_ftp_client_delete(NX_FTP_CLIENT *ftp_client_ptr);
UINT nx_ftp_client_directory_create(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_name, ULONG wait_option);
UINT nx_ftp_client_directory_default_set(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_path, ULONG wait_option);
UINT nx_ftp_client_directory_delete(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_name, ULONG wait_option);
UINT nx_ftp_client_directory_listing_get(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_path, NX_PACKET **packet_ptr, ULONG wait_option);
UINT nx_ftp_client_directory_listing_continue(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
UINT nx_ftp_client_disconnect(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT nx_ftp_client_file_close(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT nx_ftp_client_file_delete(NX_FTP_CLIENT *ftp_client_ptr, CHAR *file_name, ULONG wait_option);
UINT nx_ftp_client_file_open(NX_FTP_CLIENT *ftp_client_ptr, CHAR *file_name, UINT open_type, ULONG wait_option);
UINT nx_ftp_client_file_read(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
UINT nx_ftp_client_file_rename(NX_FTP_CLIENT *ftp_ptr, CHAR *filename, CHAR *new_filename, ULONG wait_option);
UINT nx_ftp_client_file_write(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET *packet_ptr, ULONG wait_option);
UINT nx_ftp_client_file_size_set(NX_FTP_CLIENT *ftp_client_ptr, ULONG file_size);
UINT nx_ftp_client_passive_mode_set(NX_FTP_CLIENT *ftp_client_ptr, UINT passive_mode_enabled);
UINT nx_ftp_client_transfer_mode_set(NX_FTP_CLIENT *ftp_client_ptr, UINT transfer_mode);
#else
/* FTP source code is being compiled, do not perform any API mapping. */
UINT _nxe_ftp_client_connect(NX_FTP_CLIENT *ftp_client_ptr, ULONG server_ip, CHAR *username, CHAR *password, ULONG wait_option);
UINT _nx_ftp_client_connect(NX_FTP_CLIENT *ftp_client_ptr, ULONG server_ip, CHAR *username, CHAR *password, ULONG wait_option);
UINT _nxe_ftp_client_create(NX_FTP_CLIENT *ftp_client_ptr, CHAR *ftp_client_name, NX_IP *ip_ptr, ULONG window_size, NX_PACKET_POOL *pool_ptr);
UINT _nx_ftp_client_create(NX_FTP_CLIENT *ftp_client_ptr, CHAR *ftp_client_name, NX_IP *ip_ptr, ULONG window_size, NX_PACKET_POOL *pool_ptr);
UINT _nxe_ftp_client_delete(NX_FTP_CLIENT *ftp_client_ptr);
UINT _nx_ftp_client_delete(NX_FTP_CLIENT *ftp_client_ptr);
UINT _nxe_ftp_client_directory_create(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_name, ULONG wait_option);
UINT _nx_ftp_client_directory_create(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_name, ULONG wait_option);
UINT _nxe_ftp_client_directory_default_set(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_path, ULONG wait_option);
UINT _nx_ftp_client_directory_default_set(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_path, ULONG wait_option);
UINT _nxe_ftp_client_directory_delete(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_name, ULONG wait_option);
UINT _nx_ftp_client_directory_delete(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_name, ULONG wait_option);
UINT _nxe_ftp_client_directory_listing_get(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_path, NX_PACKET **packet_ptr, ULONG wait_option);
UINT _nx_ftp_client_directory_listing_get(NX_FTP_CLIENT *ftp_client_ptr, CHAR *directory_path, NX_PACKET **packet_ptr, ULONG wait_option);
UINT _nxe_ftp_client_directory_listing_continue(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
UINT _nx_ftp_client_directory_listing_continue(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
UINT _nxe_ftp_client_disconnect(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT _nx_ftp_client_disconnect(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT _nxe_ftp_client_file_close(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT _nx_ftp_client_file_close(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT _nxe_ftp_client_file_delete(NX_FTP_CLIENT *ftp_client_ptr, CHAR *file_name, ULONG wait_option);
UINT _nx_ftp_client_file_delete(NX_FTP_CLIENT *ftp_client_ptr, CHAR *file_name, ULONG wait_option);
UINT _nxe_ftp_client_file_open(NX_FTP_CLIENT *ftp_client_ptr, CHAR *file_name, UINT open_type, ULONG wait_option);
UINT _nx_ftp_client_file_open(NX_FTP_CLIENT *ftp_client_ptr, CHAR *file_name, UINT open_type, ULONG wait_option);
UINT _nxe_ftp_client_file_read(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
UINT _nx_ftp_client_file_read(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
UINT _nxe_ftp_client_file_rename(NX_FTP_CLIENT *ftp_client_ptr, CHAR *filename, CHAR *new_filename, ULONG wait_option);
UINT _nx_ftp_client_file_rename(NX_FTP_CLIENT *ftp_ptr, CHAR *filename, CHAR *new_filename, ULONG wait_option);
UINT _nxe_ftp_client_file_write(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET *packet_ptr, ULONG wait_option);
UINT _nx_ftp_client_file_write(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET *packet_ptr, ULONG wait_option);
UINT _nxe_ftp_client_file_size_set(NX_FTP_CLIENT *ftp_client_ptr, ULONG file_size);
UINT _nx_ftp_client_file_size_set(NX_FTP_CLIENT *ftp_client_ptr, ULONG file_size);
UINT _nxe_ftp_client_passive_mode_set(NX_FTP_CLIENT *ftp_client_ptr, UINT passive_mode_enabled);
UINT _nx_ftp_client_passive_mode_set(NX_FTP_CLIENT *ftp_client_ptr, UINT passive_mode_enabled);
UINT _nxe_ftp_client_transfer_mode_set(NX_FTP_CLIENT *ftp_client_ptr, UINT transfer_mode);
UINT _nx_ftp_client_transfer_mode_set(NX_FTP_CLIENT *ftp_client_ptr, UINT transfer_mode);
#endif /* NX_FTP_SOURCE_CODE */
/* Internal functions. */
VOID _nx_ftp_client_data_disconnect(NX_TCP_SOCKET *data_socket_ptr);
UINT _nx_ftp_client_packet_allocate(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
UINT _nx_ftp_client_active_transfer_setup(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT _nx_ftp_client_passive_transfer_setup(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
VOID _nx_ftp_client_data_socket_cleanup(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT _nx_ftp_client_block_mode_send(NX_FTP_CLIENT *ftp_client_ptr, ULONG wait_option);
UINT _nx_ftp_client_block_header_send(NX_FTP_CLIENT *ftp_client_ptr, ULONG block_size);
UINT _nx_ftp_client_block_header_retrieve(NX_FTP_CLIENT *ftp_client_ptr, NX_PACKET *packet_ptr);
UINT _nx_ftp_client_connect_internal(NX_FTP_CLIENT *ftp_client_ptr, ULONG server_ip, CHAR *username, CHAR *password, ULONG wait_option);
/* Determine if a C++ compiler is being used. If so, complete the standard
C conditional started above. */
#ifdef __cplusplus
}
#endif
#endif /* NX_FTP_CLIENT_H */