This is an automated email from the ASF dual-hosted git repository.

pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 93105568c examples/ftpd: Add support for choosing address family
93105568c is described below

commit 93105568c05768b0164e037bddced429aa0af4d3
Author: wangchen <[email protected]>
AuthorDate: Thu Mar 23 10:14:26 2023 +0800

    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 <[email protected]>
---
 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);

Reply via email to