diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-02-05 17:36:13 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-02-05 17:36:13 +0000 |
commit | d8a039ee18825d1f29e0c020ae6569453fb7bb4f (patch) | |
tree | f5b452486749985de7826e7deb82d4752deabe58 /apps/examples/ftpd | |
parent | efb4bf7dca5d637268c6d70eec2880352047e34c (diff) | |
download | nuttx-d8a039ee18825d1f29e0c020ae6569453fb7bb4f.tar.gz nuttx-d8a039ee18825d1f29e0c020ae6569453fb7bb4f.tar.bz2 nuttx-d8a039ee18825d1f29e0c020ae6569453fb7bb4f.zip |
FTPD daemon and example now build without errors
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4371 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/examples/ftpd')
-rw-r--r-- | apps/examples/ftpd/Makefile | 9 | ||||
-rw-r--r-- | apps/examples/ftpd/ftpd.h | 67 | ||||
-rwxr-xr-x | apps/examples/ftpd/ftpd_main.c | 151 |
3 files changed, 178 insertions, 49 deletions
diff --git a/apps/examples/ftpd/Makefile b/apps/examples/ftpd/Makefile index d3ccda7cc..4eb25c9e9 100644 --- a/apps/examples/ftpd/Makefile +++ b/apps/examples/ftpd/Makefile @@ -56,12 +56,6 @@ endif ROOTDEPPATH = --dep-path . -# Buttons built-in application info - -APPNAME = ftpd -PRIORITY = SCHED_PRIORITY_DEFAULT -STACKSIZE = 2048 - # Common build VPATH = @@ -84,7 +78,8 @@ $(COBJS): %$(OBJEXT): %.c .context: ifeq ($(CONFIG_NSH_BUILTIN_APPS),y) - $(call REGISTER,$(APPNAME),$(PRIORITY),$(STACKSIZE),$(APPNAME)_main) + $(call REGISTER,ftpd_start,SCHED_PRIORITY_DEFAULT,2048,ftpd_start) + $(call REGISTER,ftpd_stop,SCHED_PRIORITY_DEFAULT,2048,ftpd_stop) @touch $@ endif diff --git a/apps/examples/ftpd/ftpd.h b/apps/examples/ftpd/ftpd.h index 619a9fa51..98ee3b3b6 100644 --- a/apps/examples/ftpd/ftpd.h +++ b/apps/examples/ftpd/ftpd.h @@ -38,6 +38,16 @@ /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ + +#include <nuttx/config.h> + +#include <stdint.h> +#include <stdbool.h> +#include <stdlib.h> + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ /* Configuration ************************************************************/ /* CONFIG_EXAMPLES_FTPD_PRIO - Priority of the FTP daemon. * Default: SCHED_PRIORITY_DEFAULT @@ -48,7 +58,7 @@ * configuration if the network is configuration prior to running the * example. * - * If CONFIG_EXAMPELS_FTPD_NONETINIT is not defined, then the following may + * If CONFIG_EXAMPLES_FTPD_NONETINIT is not defined, then the following may * be specified to customized the network configuration: * * CONFIG_EXAMPLE_FTPD_NOMAC - If the hardware has no MAC address of its @@ -75,21 +85,33 @@ # define CONFIG_EXAMPLES_FTPD_CLIENTSTACKSIZE 2048 #endif -#ifndef CONFIG_EXAMPLE_FTPD_IPADDR -# define CONFIG_EXAMPLE_FTPD_IPADDR 0x0a000002 -#endif -#ifndef CONFIG_EXAMPLE_FTPD_DRIPADDR -# define CONFIG_EXAMPLE_FTPD_DRIPADDR 0x0a000002 +/* NSH always initializes the network */ + +#if defined(CONFIG_NSH_BUILTIN_APPS) && !defined(CONFIG_EXAMPLES_FTPD_NONETINIT) +# define CONFIG_EXAMPLES_FTPD_NONETINIT 1 #endif -#ifndef CONFIG_EXAMPLE_FTPD_NETMASK -# define CONFIG_EXAMPLE_FTPD_NETMASK 0xffffff00 + +#ifdef CONFIG_EXAMPLES_FTPD_NONETINIT +# undef CONFIG_EXAMPLE_FTPD_IPADDR +# undef CONFIG_EXAMPLE_FTPD_DRIPADDR +# undef CONFIG_EXAMPLE_FTPD_NETMASK +#else +# ifndef CONFIG_EXAMPLE_FTPD_IPADDR +# define CONFIG_EXAMPLE_FTPD_IPADDR 0x0a000002 +# endif +# ifndef CONFIG_EXAMPLE_FTPD_DRIPADDR +# define CONFIG_EXAMPLE_FTPD_DRIPADDR 0x0a000001 +# endif +# ifndef CONFIG_EXAMPLE_FTPD_NETMASK +# define CONFIG_EXAMPLE_FTPD_NETMASK 0xffffff00 +# endif #endif /* Is this being built as an NSH built-in application? */ #ifdef CONFIG_NSH_BUILTIN_APPS -# define MAIN_NAME ftpd_main -# define MAIN_STRING "ftpd_main: " +# define MAIN_NAME ftpd_start +# define MAIN_STRING "ftpd_start: " #else # define MAIN_NAME user_start # define MAIN_STRING "user_start: " @@ -99,6 +121,8 @@ * Public Types ****************************************************************************/ +/* This structure describes one entry in a table of accounts */ + struct fptd_account_s { uint8_t flags; @@ -107,17 +131,34 @@ struct fptd_account_s FAR const char *home; }; +/* To minimize the probability of name collisitions, all FTPD example + * global data is maintained in single structure. + */ + struct ftpd_globals_s { - bool initialized; - volatile bool stop; + bool initialized; /* True: Networking is initialized. The + * network must be initialized only once. + */ +#ifdef CONFIG_NSH_BUILTIN_APPS + volatile bool stop; /* True: Request daemon to exit */ + volatile bool running; /* True: The daemon is running */ +#endif + pid_t pid; /* Task ID of the FTPD daemon. The value + * -1 is a redundant indication that the + * daemon is not running. + */ }; /**************************************************************************** * Public Function Prototypes ****************************************************************************/ -extern struct ftpd_globls_s g_ftpdglobls; +/* To minimize the probability of name collisitions, all FTPD example + * global data is maintained in a single instance of a structure. + */ + +extern struct ftpd_globals_s g_ftpdglob; /**************************************************************************** * Public Function Prototypes diff --git a/apps/examples/ftpd/ftpd_main.c b/apps/examples/ftpd/ftpd_main.c index ee3481d80..1f43e317c 100755 --- a/apps/examples/ftpd/ftpd_main.c +++ b/apps/examples/ftpd/ftpd_main.c @@ -34,6 +34,20 @@ * Included Files ****************************************************************************/ +#include <sys/types.h> + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sched.h> +#include <errno.h> +#include <debug.h> + +#include <netinet/in.h> + +#include <apps/netutils/uiplib.h> +#include <apps/netutils/ftpd.h> + #include "ftpd.h" /**************************************************************************** @@ -49,13 +63,23 @@ static const struct fptd_account_s g_ftpdaccounts[] = #define NACCOUNTS (sizeof(g_ftpdaccounts) / sizeof(struct fptd_account_s)) /**************************************************************************** + * Public Data + ****************************************************************************/ + +/* To minimize the probability of name collisitions, all FTPD example + * global data is maintained in a single instance of a structure. + */ + +struct ftpd_globals_s g_ftpdglob; + +/**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** - * Name: shell_netinit + * Name: fptd_netinit ****************************************************************************/ -static void shell_netinit(void) +static void fptd_netinit(void) { #ifndef CONFIG_EXAMPLES_FTPD_NONETINIT struct in_addr addr; @@ -98,14 +122,22 @@ static void shell_netinit(void) static void ftpd_accounts(FTPD_SESSION handle) { - FAR onst struct fptd_account_s *account; + FAR const struct fptd_account_s *account; int i; + printf("Adding accounts:\n"); for (i = 0; i < NACCOUNTS; i++) { account = &g_ftpdaccounts[i]; - ftpd_add_user(handle, account->flags, account->user, - account->password, account->home); + + printf("%d. %s account: USER=%s PASSWORD=%s HOME=%s\n", + (account->flags & FTPD_ACCOUNTFLAG_SYSTEM) != 0 ? "Root" : "User", + (account->user) ? "(none)" : account->user, + (account->password) ? "(none)" : account->password, + (account->home) ? "(none)" : account->home); + + ftpd_adduser(handle, account->flags, account->user, + account->password, account->home); } } @@ -118,12 +150,24 @@ int ftpd_daemon(int s_argc, char **s_argv) FTPD_SESSION handle; int ret; + /* The FTPD daemon has been started */ + +#ifdef CONFIG_NSH_BUILTIN_APPS + g_ftpdglob.running = true; +#endif + printf("FTP daemon [%d] started\n", g_ftpdglob.pid); + /* Open FTPD */ handle = ftpd_open(); if (!handle) { - ndbg("Failed to open FTPD\n"); + printf("FTP daemon [%d] failed to open FTPD\n", g_ftpdglob.pid); +#ifdef CONFIG_NSH_BUILTIN_APPS + g_ftpdglob.running = false; + g_ftpdglob.stop = false; +#endif + g_ftpdglob.pid = -1; return EXIT_FAILURE; } @@ -131,16 +175,33 @@ int ftpd_daemon(int s_argc, char **s_argv) (void)ftpd_accounts(handle); - /* Then drive the FTPD server */ + /* Then drive the FTPD server. */ - while (g_ftpdglobls.stop == 0) +#ifdef CONFIG_NSH_BUILTIN_APPS + while (g_ftpdglob.stop == 0) +#else + for (;;) +#endif { - (void)ftpd_run(handle, 1000); + /* If ftpd_session returns success, it means that a new FTP session + * has been started. + */ + + ret = ftpd_session(handle, 1000); + printf("FTP daemon [%d] ftpd_session returned %d\n", g_ftpdglob.pid, ret); } - /* Close the FTPD server and exit */ + /* Close the FTPD server and exit (we can get here only if + * CONFIG_NSH_BUILTIN_APPS is defined). + */ +#ifdef CONFIG_NSH_BUILTIN_APPS + printf("FTP daemon [%d] stopping\n", g_ftpdglob.pid); + g_ftpdglob.running = false; + g_ftpdglob.stop = false; + g_ftpdglob.pid = -1; ftpd_close(handle); +#endif return EXIT_SUCCESS; } @@ -148,44 +209,76 @@ int ftpd_daemon(int s_argc, char **s_argv) * Public Functions ****************************************************************************/ /**************************************************************************** - * Name: user_start/ftpd_main + * Name: user_start/ftpd_start ****************************************************************************/ int MAIN_NAME(int s_argc, char **s_argv) { - FTPD_SESSION handle; - pid_t pid; - int ret; - /* Check if we have already initialized the network */ - if (!g_ftpdglobls.initialized) + if (!g_ftpdglob.initialized) { /* Bring up the network */ - ret = ftpd_netinit(); - if (ret < 0) + printf("Initializing the network\n"); + fptd_netinit(); + + /* Initialize daemon state */ + + g_ftpdglob.initialized = true; + g_ftpdglob.pid = -1; +#ifdef CONFIG_NSH_BUILTIN_APPS + g_ftpdglob.stop = false; + g_ftpdglob.running = false; +#endif + } + + /* Then start the new daemon (if it is not already running) */ + +#ifdef CONFIG_NSH_BUILTIN_APPS + if (g_ftpdglob.stop && g_ftpdglob.running) + { + printf("Waiting for FTP daemon [%d] to stop\n", g_ftpdglob.pid); + return EXIT_FAILURE; + } + else +#endif + if (!g_ftpdglob.running) + { + printf("Starting the FTP daemon\n"); + g_ftpdglob.pid = TASK_CREATE("FTP daemon", CONFIG_EXAMPLES_FTPD_PRIO, + CONFIG_EXAMPLES_FTPD_STACKSIZE, + ftpd_daemon, NULL); + if (g_ftpdglob.pid < 0) { - ndbg("Failed to initialize the network\n"); + printf("Failed to start the FTP daemon: %d\n", errno); return EXIT_FAILURE; } - - g_ftpdglobls.initialized = true; - g_ftpdglobls.stop = false; } + else + { + printf("FTP daemon [%d] is running\n", g_ftpdglob.pid); + } + + return EXIT_SUCCESS; +} - /* Then start the new daemon */ +/**************************************************************************** + * Name: ftpd_stop + ****************************************************************************/ - g_telnetdcommon.daemon = daemon; - pid = TASK_CREATE("Telnet daemon", CONFIG_EXAMPLES_FTPD_PRIO, - CONFIG_EXAMPLES_FTPD_STACKSIZE, ftpd_daemon, NULL); - if (pid < 0) +#ifdef CONFIG_NSH_BUILTIN_APPS +int ftpd_stop(int s_argc, char **s_argv) +{ + if (!g_ftpdglob.initialized || g_ftpdglob.running) { - ndbg("Failed to start the telnet daemon: %d\n", errno); + printf("The FTP daemon not running\n"); return EXIT_FAILURE; } - printf("The FTP daemon is running, pid=%d\n", pid); + printf("Stopping the FTP daemon, pid=%d\n", g_ftpdglob.pid); + g_ftpdglob.stop = true; return EXIT_SUCCESS; } +#endif |