From 93105568c05768b0164e037bddced429aa0af4d3 Mon Sep 17 00:00:00 2001 From: wangchen Date: Thu, 23 Mar 2023 10:14:26 +0800 Subject: [PATCH] examples/ftpd: Add support for choosing address family choose the network protocol (ipv4 or ipv6) to bind network in setting ftpd Signed-off-by: wangchen --- examples/ftpd/ftpd_main.c | 61 ++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/examples/ftpd/ftpd_main.c b/examples/ftpd/ftpd_main.c index 755b534a0..e0eda11b4 100644 --- a/examples/ftpd/ftpd_main.c +++ b/examples/ftpd/ftpd_main.c @@ -154,6 +154,15 @@ static void ftpd_accounts(FTPD_SESSION handle) } } +static void hint(void) +{ + fprintf(stderr, + "Usage: ftpd [-46] \n\ + \t-4 Use IPv4\n\ + \t-6 Use IPv6\n\ + "); +} + /**************************************************************************** * Name: ftpd_daemon ****************************************************************************/ @@ -161,28 +170,51 @@ static void ftpd_accounts(FTPD_SESSION handle) int ftpd_daemon(int s_argc, char **s_argv) { FTPD_SESSION handle; - int ret; + int ret = EXIT_FAILURE; + int option; + int family = AF_UNSPEC; /* The FTPD daemon has been started */ g_ftpdglob.running = true; printf("FTP daemon [%d] started\n", g_ftpdglob.pid); + while ((option = getopt(s_argc, &s_argv[1], "46")) != ERROR) + { + switch (option) + { + case '4': + family = AF_INET; + break; + case '6': + family = AF_INET6; + break; + default: + break; + } + } + + if (family == AF_UNSPEC) + { + hint(); + goto out; + } + + if ((optind + 1) < s_argc) + { + fprintf(stderr, "%s: Too many arguments\n", s_argv[1]); + hint(); + goto out; + } + /* Open FTPD */ -#if ADDR_FAMILY == AF_INET6 - handle = ftpd_open(CONFIG_EXAMPLES_FTPD_PORT, AF_INET6); -#else - handle = ftpd_open(CONFIG_EXAMPLES_FTPD_PORT, AF_INET); -#endif + handle = ftpd_open(CONFIG_EXAMPLES_FTPD_PORT, family); if (!handle) { printf("FTP daemon [%d] failed to open FTPD\n", g_ftpdglob.pid); - g_ftpdglob.running = false; - g_ftpdglob.stop = false; - g_ftpdglob.pid = -1; - return EXIT_FAILURE; + goto out; } /* Configure accounts */ @@ -213,12 +245,15 @@ int ftpd_daemon(int s_argc, char **s_argv) /* Close the FTPD server and exit. */ printf("FTP daemon [%d] stopping\n", g_ftpdglob.pid); + ftpd_close(handle); + ret = EXIT_SUCCESS; + +out: g_ftpdglob.running = false; g_ftpdglob.stop = false; g_ftpdglob.pid = -1; - ftpd_close(handle); - return EXIT_SUCCESS; + return ret; } /**************************************************************************** @@ -261,7 +296,7 @@ int main(int argc, FAR char *argv[]) printf("Starting the FTP daemon\n"); g_ftpdglob.pid = task_create("FTP daemon", CONFIG_EXAMPLES_FTPD_PRIO, CONFIG_EXAMPLES_FTPD_STACKSIZE, - ftpd_daemon, NULL); + ftpd_daemon, argv); if (g_ftpdglob.pid < 0) { printf("Failed to start the FTP daemon: %d\n", errno);