diff options
Diffstat (limited to 'addons/ftp')
| -rw-r--r-- | addons/ftp/nxd_ftp_server.c | 163 |
1 files changed, 92 insertions, 71 deletions
diff --git a/addons/ftp/nxd_ftp_server.c b/addons/ftp/nxd_ftp_server.c index 0075f1f6..a6d02d29 100644 --- a/addons/ftp/nxd_ftp_server.c +++ b/addons/ftp/nxd_ftp_server.c @@ -8,6 +8,7 @@ * * SPDX-License-Identifier: MIT **************************************************************************/ +// Some portions generated by Copilot (Sonnet 4.6). /**************************************************************************/ @@ -81,7 +82,8 @@ NX_CALLER_CHECKING_EXTERNS #define NX_FTP_CODE_BAD_NAME "553" /* Requested action not taken, File name not allowed. */ static VOID _nx_ftp_server_number_to_ascii(UCHAR *buffer_ptr, UINT buffer_size, UINT number, UCHAR pad); - +static VOID _nx_ftp_server_logout_client(NX_FTP_SERVER *ftp_server_ptr, NX_FTP_CLIENT_REQUEST *client_request_ptr); + /**************************************************************************/ /* */ /* FUNCTION RELEASE */ @@ -1445,6 +1447,7 @@ ULONG events; /* nx_tcp_socket_transmit_configure Configure data transer socket */ /* _nx_utility_uint_to_string Convert number to string */ /* _nx_ftp_server_data_socket_cleanup Clean up data socket */ +/* _nx_ftp_server_logout_client Logout the client */ /* */ /* CALLED BY */ /* */ @@ -1720,41 +1723,8 @@ ULONG block_size; /* Increment the number of disconnection requests. */ ftp_server_ptr -> nx_ftp_server_disconnection_requests++; - /* Check if this client login. */ - if (client_req_ptr -> nx_ftp_client_request_login) - { - - /* Call the logout function. */ - -#ifndef NX_DISABLE_IPV4 - /* Does this server have an IPv4 login function? */ - if (ftp_server_ptr -> nx_ftp_logout_ipv4) - { - - /* Call the logout which takes IPv4 address input. */ - (ftp_server_ptr -> nx_ftp_logout_ipv4)(ftp_server_ptr, - client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_ip.nxd_ip_address.v4, - client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_port, - client_req_ptr -> nx_ftp_client_request_username, - client_req_ptr -> nx_ftp_client_request_password, NX_NULL); - } -#endif /* NX_DISABLE_IPV4 */ - if (ftp_server_ptr -> nx_ftp_logout) - { - - /* Call the 'duo' logout function which takes IPv6 or IPv4 IP addresses. */ - (ftp_server_ptr -> nx_ftp_logout)(ftp_server_ptr, &(client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_ip), - client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_port, - client_req_ptr -> nx_ftp_client_request_username, - client_req_ptr -> nx_ftp_client_request_password, NX_NULL); - } - - /* Set the login as FALSE. */ - client_req_ptr -> nx_ftp_client_request_login = NX_FALSE; - } - - /* Clear authentication. */ - client_req_ptr -> nx_ftp_client_request_authenticated = NX_FALSE; + /* Logout the client. */ + _nx_ftp_server_logout_client(ftp_server_ptr, client_req_ptr); /* Now send a successful response to the client. */ _nx_ftp_server_response(&(client_req_ptr -> nx_ftp_client_request_control_socket), packet_ptr, @@ -4554,6 +4524,7 @@ NX_FTP_SERVER *server_ptr; /* fx_file_close Close file */ /* nx_ftp_packet_allocate Allocate a packet */ /* _nx_ftp_server_data_socket_cleanup Clean up data socket */ +/* _nx_ftp_server_logout_client Logout the client */ /* */ /* CALLED BY */ /* */ @@ -5133,6 +5104,7 @@ NX_FTP_SERVER *server_ptr; /* nx_tcp_server_socket_unaccept Unaccept server connection */ /* nx_tcp_socket_disconnect Disconnect socket */ /* _nx_ftp_server_data_socket_cleanup Clean up data socket */ +/* _nx_ftp_server_logout_client Logout the client */ /* */ /* CALLED BY */ /* */ @@ -5187,6 +5159,9 @@ NX_FTP_CLIENT_REQUEST *client_req_ptr; /* Reset the block bytes. */ client_req_ptr -> nx_ftp_client_request_block_bytes = 0; + /* Logout the client. */ + _nx_ftp_server_logout_client(ftp_server_ptr, client_req_ptr); + /* Now disconnect the command socket. */ nx_tcp_socket_disconnect(&(client_req_ptr -> nx_ftp_client_request_control_socket), NX_NO_WAIT); @@ -5324,9 +5299,6 @@ NX_FTP_CLIENT_REQUEST *client_req_ptr; /* Increment the number of disconnection requests. */ ftp_server_ptr -> nx_ftp_server_disconnection_requests++; - /* Clear authentication. */ - client_req_ptr -> nx_ftp_client_request_authenticated = NX_FALSE; - /* Disable the client request activity timeout. */ client_req_ptr -> nx_ftp_client_request_activity_timeout = 0; @@ -5344,38 +5316,8 @@ NX_FTP_CLIENT_REQUEST *client_req_ptr; /* Reset the block bytes. */ client_req_ptr -> nx_ftp_client_request_block_bytes = 0; - /* Check if this client login. */ - if (client_req_ptr -> nx_ftp_client_request_login) - { - - /* Call the logout function. */ - -#ifndef NX_DISABLE_IPV4 - /* Does this server have an IPv4 login function? */ - if (ftp_server_ptr -> nx_ftp_logout_ipv4) - { - - /* Call the logout which takes IPv4 address input. */ - (ftp_server_ptr -> nx_ftp_logout_ipv4)(ftp_server_ptr, - client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_ip.nxd_ip_address.v4, - client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_port, - client_req_ptr -> nx_ftp_client_request_username, - client_req_ptr -> nx_ftp_client_request_password, NX_NULL); - } -#endif /* NX_DISABLE_IPV4 */ - if (ftp_server_ptr -> nx_ftp_logout) - { - - /* Call the 'duo' logout function which takes IPv6 or IPv4 IP addresses. */ - (ftp_server_ptr -> nx_ftp_logout)(ftp_server_ptr, &(client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_ip), - client_req_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_port, - client_req_ptr -> nx_ftp_client_request_username, - client_req_ptr -> nx_ftp_client_request_password, NX_NULL); - } - - /* Set the login as FALSE. */ - client_req_ptr -> nx_ftp_client_request_login = NX_FALSE; - } + /* Logout the client. */ + _nx_ftp_server_logout_client(ftp_server_ptr, client_req_ptr); /* Now disconnect the command socket. */ nx_tcp_socket_disconnect(&(client_req_ptr -> nx_ftp_client_request_control_socket), NX_FTP_SERVER_TIMEOUT); @@ -6498,6 +6440,85 @@ UINT size; } } +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _nx_ftp_server_logout_client PORTABLE C */ +/* 6.4.3 */ +/* AUTHOR */ +/* */ +/* Yuxin Zhou */ +/* Valentin Batz */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function logs out the client if it was previously logged in */ +/* and resets the authenticated flag so the next connection on this */ +/* socket slot must perform a fresh login. */ +/* */ +/* INPUT */ +/* */ +/* ftp_server_ptr Pointer to FTP server */ +/* client_request_ptr Pointer to FTP client */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* _nx_ftp_server_control_disconnect_processing */ +/* Disconnect processing */ +/* _nx_ftp_server_command_process */ +/* QUIT command */ +/* _nx_ftp_server_timeout_processing */ +/* Timeout processing */ +/* */ +/**************************************************************************/ + +static VOID _nx_ftp_server_logout_client(NX_FTP_SERVER *ftp_server_ptr, NX_FTP_CLIENT_REQUEST *client_request_ptr) +{ + /* Check if this client login. */ + if (client_request_ptr -> nx_ftp_client_request_login) + { + + /* Call the logout function. */ + +#ifndef NX_DISABLE_IPV4 + /* Does this server have an IPv4 logout function? */ + if (ftp_server_ptr -> nx_ftp_logout_ipv4) + { + + /* Call the logout which takes IPv4 address input. */ + (ftp_server_ptr -> nx_ftp_logout_ipv4)(ftp_server_ptr, + client_request_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_ip.nxd_ip_address.v4, + client_request_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_port, + client_request_ptr -> nx_ftp_client_request_username, + client_request_ptr -> nx_ftp_client_request_password, NX_NULL); + } +#endif /* NX_DISABLE_IPV4 */ + if (ftp_server_ptr -> nx_ftp_logout) + { + + /* Call the 'duo' logout function which takes IPv6 or IPv4 IP addresses. */ + (ftp_server_ptr -> nx_ftp_logout)(ftp_server_ptr, &(client_request_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_ip), + client_request_ptr -> nx_ftp_client_request_control_socket.nx_tcp_socket_connect_port, + client_request_ptr -> nx_ftp_client_request_username, + client_request_ptr -> nx_ftp_client_request_password, NX_NULL); + } + + /* Clear the login flag. */ + client_request_ptr -> nx_ftp_client_request_login = NX_FALSE; + } + + /* Always clear authenticated so the next connection on this socket slot + must perform a fresh USER/PASS exchange. */ + client_request_ptr -> nx_ftp_client_request_authenticated = NX_FALSE; +} /**************************************************************************/ /* */ |
