summaryrefslogtreecommitdiff
path: root/addons/ftp
diff options
context:
space:
mode:
Diffstat (limited to 'addons/ftp')
-rw-r--r--addons/ftp/nxd_ftp_server.c163
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;
+}
/**************************************************************************/
/* */