Index: libbsd.py
===================================================================
--- libbsd.py	(revision c2ec5f188b415ced3047e2969d6678a030396913)
+++ libbsd.py	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -108,4 +108,6 @@
             'rtems/syslog.c',
             'ftpd/ftpd.c',
+            'ftpd/ftpd-init.c',
+            'ftpd/ftpd-service.c',
             'ftpfs/ftpfs.c',
             'mdns/mdns.c',
Index: libbsd_waf.py
===================================================================
--- libbsd_waf.py	(revision c2ec5f188b415ced3047e2969d6678a030396913)
+++ libbsd_waf.py	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -1014,4 +1014,6 @@
               'mDNSResponder/mDNSShared/dnssd_clientshim.c',
               'mDNSResponder/mDNSShared/mDNSDebug.c',
+              'rtemsbsd/ftpd/ftpd-init.c',
+              'rtemsbsd/ftpd/ftpd-service.c',
               'rtemsbsd/ftpd/ftpd.c',
               'rtemsbsd/ftpfs/ftpfs.c',
Index: rtemsbsd/ftpd/ftpd-init.c
===================================================================
--- rtemsbsd/ftpd/ftpd-init.c	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
+++ rtemsbsd/ftpd/ftpd-init.c	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -0,0 +1,39 @@
+/*
+ *  FTP Server Daemon
+ *
+ *  Submitted by: Jake Janovetz <janovetz@tempest.ece.uiuc.edu>
+ *
+ *  Changed by:   Sergei Organov <osv@javad.ru> (OSV)
+ *                Arnout Vandecappelle <arnout@mind.be> (AV)
+ *                Sebastien Bourdeauducq <sebastien@milkymist.org> (MM)
+ */
+
+/*************************************************************************
+ *                                 ftpd-init.c
+ *************************************************************************
+ * Description:
+ *
+ *    This file contains the legacy daemon initialisation.
+ *
+ *************************************************************************/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/ftpd.h>
+
+/* Configuration table */
+extern struct rtems_ftpd_configuration rtems_ftpd_configuration;
+
+/*
+ * rtems_initialize_ftpd
+ *
+ * Call the FTPD start function.
+ */
+int
+rtems_initialize_ftpd(void)
+{
+  rtems_ftpd_configuration.verbose = true;
+  return rtems_ftpd_start(&rtems_ftpd_configuration);
+}
Index: rtemsbsd/ftpd/ftpd-service.c
===================================================================
--- rtemsbsd/ftpd/ftpd-service.c	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
+++ rtemsbsd/ftpd/ftpd-service.c	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2016 Chris Johns <chrisj@rtems.org>.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * FTPD service. To use add to rc.conf:
+ *
+ * ftpd_enable="YES"
+ * ftp_options="-p 21 -C 4 -P 100 -I 300 -R / -L -A rw"
+ *
+ * The options defaults are show. The options are:
+ *
+ *  -p port       : Port.
+ *  -C conns      : Maximum connections.
+ *  -P priority   : FTP thread priority (RTEMS Classis API).
+ *  -I secs       : Idle timeout in seconds.
+ *  -R path       : Root path.
+ *  -L            : Logins using /etc/passwd
+ *  -A <rw/rd/wr> : Access, rw=read/write, rd=read, wr=write.
+ */
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define __need_getopt_newlib
+#include <getopt.h>
+
+#include <rtems/ftpd.h>
+#include <machine/rtems-bsd-rc-conf-services.h>
+
+static int
+ftpd_service(rtems_bsd_rc_conf* rc_conf)
+{
+  struct rtems_ftpd_configuration config = {
+    .priority = 100,        /* FTPD task priority */
+    .max_hook_filesize = 0, /* Maximum buffersize for hooks */
+    .port = 21,             /* Well-known port */
+    .hooks = NULL,          /* List of hooks */
+    .root = NULL,           /* Root for FTPD or NULL for "/" */
+    .tasks_count = 4,       /* Max. connections */
+    .idle = 5 * 60,         /* Idle timeout in seconds  or 0 for no (infinite) timeout */
+    .access = 0,            /* Access: 0 - r/w, 1 - read-only, 2 - write-only,
+                             * 3 - browse-only */
+    .login = NULL           /* Login */
+  };
+  rtems_bsd_rc_conf_argc_argv* aa;
+  int                          r;
+
+  aa = rtems_bsd_rc_conf_argc_argv_create();
+  if (aa == NULL)
+    return -1;
+
+  r = rtems_bsd_rc_conf_find(rc_conf, "ftpd_enable", aa);
+  if (r == 0) {
+    rtems_status_code sc;
+    bool              verbose = false;
+    if (aa->argc == 2 && strcasecmp("YES", aa->argv[1]) == 0) {
+      r = rtems_bsd_rc_conf_find(rc_conf, "ftpd_options", aa);
+      if (r == 0) {
+        struct getopt_data data;
+        char*              end;
+
+        memset(&data, 0, sizeof(data));
+
+        while (true) {
+          int c;
+
+          c = getopt_r(aa->argc, aa->argv, "p:C:P:I:R:LA:v", &data);
+          if (c == -1)
+            break;
+
+          switch (c) {
+          case 'p':
+            config.port = strtoul(data.optarg, &end, 10);
+            if (config.port == 0 || *end != '\0') {
+              fprintf(stderr, "error: ftpd: invalid port\n");
+              config.port = 21;
+            }
+            break;
+          case 'C':
+            config.tasks_count = strtoul(data.optarg, &end, 10);
+            if (config.tasks_count == 0 || *end != '\0') {
+              fprintf(stderr, "error: ftpd: invalid port\n");
+              config.tasks_count = 4;
+            }
+            break;
+          case 'P':
+            config.priority = strtoul(data.optarg, &end, 10);
+            if (config.priority == 0 || *end != '\0') {
+              fprintf(stderr, "error: ftpd: invalid priority\n");
+              config.priority = 100;
+            }
+            break;
+          case 'I':
+            config.idle = strtoul(data.optarg, &end, 10);
+            if (config.tasks_count == 0 || *end != '\0') {
+              fprintf(stderr, "error: ftpd: invalid idle seconds\n");
+              config.idle = 5 * 60;
+            }
+            break;
+          case 'R':
+            config.root = strdup(data.optarg);
+            if (config.root == NULL) {
+              fprintf(stderr, "error: ftpd: no memory for root path\n");
+            }
+            break;
+          case 'L':
+            config.login = rtems_shell_login_check;
+            break;
+          case 'A':
+            if (strcasecmp("rw", data.optarg) == 0)
+              config.access = 0;
+            else if (strcasecmp("rd", data.optarg) == 0)
+              config.access = 1;
+            else if (strcasecmp("wr", data.optarg) == 0)
+              config.access = 2;
+            else
+              fprintf(stderr, "error: ftp: invalid access option\n");
+            break;
+          case 'v':
+            verbose = true;
+            break;
+          case '?':
+          default:
+            fprintf(stderr, "error: ftp: unknown option: %s\n", data.optarg);
+            break;
+          }
+        }
+      }
+      if (verbose) {
+        printf("ftpd: port:%lu conns:%lu pri:%lu idle:%lu root:%s login:%s access:%s\n",
+               config.port, config.tasks_count, config.priority, config.idle,
+               config.root == NULL ? "/" : config.root,
+               config.login == NULL ? "no" : "yes",
+               config.access == 0 ? "read/write" : config.access == 1 ? "read" : "write");
+      }
+      sc = rtems_ftpd_start(&config);
+      if (sc != RTEMS_SUCCESSFUL)
+        fprintf(stderr, "error: ftpd: %s\n", rtems_status_text(sc));
+    }
+  }
+
+  return 0;
+}
+
+void
+rc_conf_ftpd_init(void* arg)
+{
+  int r;
+  r = rtems_bsd_rc_conf_service_add("ftpd",
+                                    "after:network;",
+                                    ftpd_service);
+  if (r < 0)
+    fprintf(stderr, "error: ftpd service add failed: %s\n", strerror(errno));
+}
Index: rtemsbsd/ftpd/ftpd.c
===================================================================
--- rtemsbsd/ftpd/ftpd.c	(revision c2ec5f188b415ced3047e2969d6678a030396913)
+++ rtemsbsd/ftpd/ftpd.c	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -14,5 +14,5 @@
  *                Arnout Vandecappelle <arnout@mind.be> (AV)
  *                Sebastien Bourdeauducq <sebastien@milkymist.org> (MM)
- *                
+ *
  *
  *  Changes:
@@ -21,9 +21,9 @@
  *
  *      * Support spaces in filenames
- * 
+ *
  *    2010-04-29        Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
- * 
+ *
  *      * Added USER/PASS authentication.
- * 
+ *
  *    2001-01-31        Sergei Organov <osv@javad.ru>
  *
@@ -245,5 +245,5 @@
 
 /* Configuration table */
-extern struct rtems_ftpd_configuration rtems_ftpd_configuration;
+static struct rtems_ftpd_configuration* ftpd_config;
 
 /* this is not prototyped in strict ansi mode */
@@ -954,5 +954,5 @@
   }
 
-  if (!null && rtems_ftpd_configuration.hooks != NULL)
+  if (!null && ftpd_config->hooks != NULL)
   {
 
@@ -962,5 +962,5 @@
 
     i = 0;
-    hook = &rtems_ftpd_configuration.hooks[i++];
+    hook = &ftpd_config->hooks[i++];
     while (hook->filename != NULL)
     {
@@ -970,5 +970,5 @@
         break;
       }
-      hook = &rtems_ftpd_configuration.hooks[i++];
+      hook = &ftpd_config->hooks[i++];
     }
   }
@@ -983,6 +983,6 @@
      */
 
-    char                *bigBufr;
-    size_t filesize = rtems_ftpd_configuration.max_hook_filesize + 1;
+    char   *bigBufr;
+    size_t  filesize = ftpd_config->max_hook_filesize + 1;
 
     /*
@@ -1767,6 +1767,6 @@
     info->pass = NULL;
     info->user = strdup(fname);
-    if (rtems_ftpd_configuration.login &&
-      !rtems_ftpd_configuration.login(info->user, NULL)) {
+    if (ftpd_config->login &&
+      !ftpd_config->login(info->user, NULL)) {
       info->auth = false;
       send_reply(info, 331, "User name okay, need password.");
@@ -1785,6 +1785,6 @@
       send_reply(info, 332, "Need account to log in");
     } else {
-      if (rtems_ftpd_configuration.login &&
-        !rtems_ftpd_configuration.login(info->user, info->pass)) {
+      if (ftpd_config->login &&
+        !ftpd_config->login(info->user, info->pass)) {
         info->auth = false;
         send_reply(info, 530, "Not logged in.");
@@ -1827,5 +1827,5 @@
         char *c;
         c = strchr(args, ' ');
-        if((c != NULL) && (sscanf(args, "%o", &mask) == 1) && strncpy(fname, c+1, 254) 
+        if((c != NULL) && (sscanf(args, "%o", &mask) == 1) && strncpy(fname, c+1, 254)
           && (chmod(fname, (mode_t)mask) == 0))
           send_reply(info, 257, "CHMOD successful.");
@@ -2010,5 +2010,5 @@
 
   addr.sin_family      = AF_INET;
-  addr.sin_port        = htons(rtems_ftpd_configuration.port);
+  addr.sin_port        = htons(ftpd_config->port);
   addr.sin_addr.s_addr = htonl(INADDR_ANY);
   memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
@@ -2065,5 +2065,5 @@
             info->user = NULL;
             info->pass = NULL;
-            if (rtems_ftpd_configuration.login)
+            if (ftpd_config->login)
               info->auth = false;
             else
@@ -2089,10 +2089,10 @@
  *
  * Input parameters:
- *
+ *    config: constant initial setup.
  * Output parameters:
  *    returns RTEMS_SUCCESSFUL on successful start of the daemon.
  */
 int
-rtems_initialize_ftpd(void)
+rtems_ftpd_start(const struct rtems_ftpd_configuration* config)
 {
   rtems_status_code   sc;
@@ -2101,32 +2101,40 @@
   int count;
 
-  if (rtems_ftpd_configuration.port == 0)
-  {
-    rtems_ftpd_configuration.port = FTPD_CONTROL_PORT;
-  }
-
-  if (rtems_ftpd_configuration.priority == 0)
-  {
-    rtems_ftpd_configuration.priority = 40;
-  }
-  priority = rtems_ftpd_configuration.priority;
-
-  ftpd_timeout = rtems_ftpd_configuration.idle;
+  if (ftpd_config != NULL)
+    return RTEMS_RESOURCE_IN_USE;
+
+  ftpd_config = malloc(sizeof(*ftpd_config));
+  if (ftpd_config == NULL)
+    return RTEMS_NO_MEMORY;
+
+  *ftpd_config = *config;
+
+  if (ftpd_config->port == 0)
+  {
+    ftpd_config->port = FTPD_CONTROL_PORT;
+  }
+
+  if (ftpd_config->priority == 0)
+  {
+    ftpd_config->priority = 40;
+  }
+  priority = ftpd_config->priority;
+
+  ftpd_timeout = ftpd_config->idle;
   if (ftpd_timeout < 0)
     ftpd_timeout = 0;
-  rtems_ftpd_configuration.idle = ftpd_timeout;
-
-  ftpd_access = rtems_ftpd_configuration.access;
+  ftpd_config->idle = ftpd_timeout;
+
+  ftpd_access = ftpd_config->access;
 
   ftpd_root = "/";
-  if ( rtems_ftpd_configuration.root &&
-       rtems_ftpd_configuration.root[0] == '/' )
-    ftpd_root = rtems_ftpd_configuration.root;
-
-  rtems_ftpd_configuration.root = ftpd_root;
-
-  if (rtems_ftpd_configuration.tasks_count <= 0)
-    rtems_ftpd_configuration.tasks_count = 1;
-  count = rtems_ftpd_configuration.tasks_count;
+  if (ftpd_config->root && ftpd_config->root[0] == '/' )
+    ftpd_root = ftpd_config->root;
+
+  ftpd_config->root = ftpd_root;
+
+  if (ftpd_config->tasks_count <= 0)
+    ftpd_config->tasks_count = 1;
+  count = ftpd_config->tasks_count;
 
   if (!task_pool_init(count, priority))
@@ -2158,6 +2166,7 @@
   }
 
-  syslog(LOG_INFO, "ftpd: FTP daemon started (%d session%s max)",
-    count, ((count > 1) ? "s" : ""));
+  if (ftpd_config->verbose)
+    syslog(LOG_INFO, "ftpd: FTP daemon started (%d session%s max)",
+           count, ((count > 1) ? "s" : ""));
 
   return RTEMS_SUCCESSFUL;
Index: rtemsbsd/include/machine/rtems-bsd-config.h
===================================================================
--- rtemsbsd/include/machine/rtems-bsd-config.h	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
+++ rtemsbsd/include/machine/rtems-bsd-config.h	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2016 Chris Johns <chrisj@rtems.org>.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Configure the LibBSD software stack.
+ *
+ * Configuration defines:
+ *
+ *  RTEMS_BSD_CONFIG_NET_PF_UNIX     : Packet Filter.
+ *  RTEMS_BSD_CONFIG_NET_IF_LAGG     : Link Aggregetion and Failover.
+ *  RTEMS_BSD_CONFIG_NET_IF_VLAN     : Virtual LAN.
+ *  RTEMS_BSD_CONFIG_SERVICE_FTPD    : File Transfer Protocol (FTP).
+ *  RTEMS_BSD_CONFIG_BSP_CONFIG      : Configure default BSP devices.
+ *  RTEMS_BSD_CONFIG_INIT            : Configure the LibBSD support.
+ *
+ * Rules for adding to this file:
+ *  1. All user visible defines start with 'RTEMS_BSD_CONFIG_'.
+ *  2. Define an implementation define starting with 'RTEMS_BSD_CFGDECL_'.
+ *  3. Only declare anything in the 'RTEMS_BSD_CONFIG_INIT' section.
+ *  4. Do not use '#ifdef ..' or '#ifndef ..'.
+ *  5. All '#endif' statements need a comment showing the '#if ..' logic.
+ */
+
+#ifndef _RTEMS_BSD_CONFIG_h
+#define _RTEMS_BSD_CONFIG_h
+
+#include <stdbool.h>
+
+/*
+ * Include the Nexus bus.
+ */
+#include <machine/rtems-bsd-nexus-bus.h>
+
+/*
+ * Include the SYSINIT support.
+ */
+#include <machine/rtems-bsd-sysinit.h>
+
+/*
+ * Include the services.
+ */
+#include <machine/rtems-bsd-rc-conf-services.h>
+
+#ifdef __cplusplus
+//extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * BSD Kernel modules.
+ */
+
+/*
+ * Unix packet filter.
+ *  https://www.freebsd.org/doc/handbook/firewalls-pf.html
+ */
+#if defined(RTEMS_BSD_CONFIG_NET_PF_UNIX)
+ #define RTEMS_BSD_CFGDECL_NET_PF_UNIX SYSINIT_NEED_NET_PF_UNIX
+#endif /* RTEMS_BSD_CONFIG_NET_PF_UNIX */
+
+/*
+ * Link Aggregation and Failover.
+ *  https://www.freebsd.org/doc/handbook/network-aggregation.html
+ */
+#if defined(RTEMS_BSD_CONFIG_NET_IF_LAGG)
+ #define RTEMS_BSD_CFGDECL_IF_LAGG SYSINIT_NEED_NET_IF_LAGG
+#endif /* RTEMS_BSD_CONFIG_NET_IF_LAGG */
+
+/*
+ * Virtual LAN
+ *  https://www.freebsd.org/cgi/man.cgi?query=rc.conf then 'network_interfaces'.
+ */
+#if defined(RTEMS_BSD_CONFIG_NET_IF_VLAN)
+ #define RTEMS_BSD_CFGDECL_NET_IF_VLAN SYSINIT_NEED_NET_IF_VLAN
+#endif /* RTEMS_BSD_CONFIG_NET_IF_VLAN */
+
+/*
+ * FTPD
+ */
+#if defined(RTEMS_BSD_CONFIG_SERVICE_FTPD)
+ #define RTEMS_BSD_CFGDECL_FTPD RTEMS_BSD_RC_CONF_SYSINT(rc_conf_ftpd)
+#endif /* RTEMS_BSD_CONFIG_SERVICE_FTPD */
+
+/*
+ * Configure the system.
+ */
+#if defined(RTEMS_BSD_CONFIG_INIT)
+ /*
+  * If a BSP configuration is requested include the Nexus bus BSP configuration.
+  */
+ #if defined(RTEMS_BSD_CONFIG_BSP_CONFIG)
+  #include <bsp/nexus-devices.h>
+ #endif
+
+ /*
+  * Create the networking modules and interfaces.
+  */
+ RTEMS_BSD_CFGDECL_NET_PF_UNIX;
+ RTEMS_BSD_CFGDECL_IF_LAGG;
+ RTEMS_BSD_CFGDECL_NET_IF_VLAN;
+
+ /*
+  * Create the services.
+  */
+ RTEMS_BSD_CFGDECL_FTPD;
+#endif /* RTEMS_BSD_CONFIG_INIT */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_BSD_CONFIG_h */
Index: rtemsbsd/include/machine/rtems-bsd-rc-conf-services.h
===================================================================
--- rtemsbsd/include/machine/rtems-bsd-rc-conf-services.h	(revision c2ec5f188b415ced3047e2969d6678a030396913)
+++ rtemsbsd/include/machine/rtems-bsd-rc-conf-services.h	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -155,5 +155,6 @@
  * Decls for the handlers.
  */
-void rc_conf_net_init(void* arg);   /* Installed by default. */
+void rc_conf_net_init(void* arg);    /* Installed by default. */
+void rc_conf_ftpd_init(void* arg);   /* ftpd_enabled="YES" */
 
 /*
Index: rtemsbsd/include/rtems/ftpd.h
===================================================================
--- rtemsbsd/include/rtems/ftpd.h	(revision c2ec5f188b415ced3047e2969d6678a030396913)
+++ rtemsbsd/include/rtems/ftpd.h	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -55,4 +55,5 @@
    rtems_shell_login_check_t login;            /* Login check or 0 to ignore
                                                   user/passwd. */
+   bool                      verbose;          /* Say hello! */
 };
 
Index: testsuite/include/rtems/bsd/test/default-init.h
===================================================================
--- testsuite/include/rtems/bsd/test/default-init.h	(revision c2ec5f188b415ced3047e2969d6678a030396913)
+++ testsuite/include/rtems/bsd/test/default-init.h	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -74,12 +74,17 @@
 }
 
-#include <machine/rtems-bsd-sysinit.h>
+/*
+ * Configure LibBSD.
+ */
+#define RTEMS_BSD_CONFIG_NET_PF_UNIX
+#define RTEMS_BSD_CONFIG_NET_IF_LAGG
+#define RTEMS_BSD_CONFIG_NET_IF_VLAN
+#define RTEMS_BSD_CONFIG_INIT
 
-SYSINIT_NEED_NET_PF_UNIX;
-SYSINIT_NEED_NET_IF_LAGG;
-SYSINIT_NEED_NET_IF_VLAN;
+#include <machine/rtems-bsd-config.h>
 
-#include <bsp/nexus-devices.h>
-
+/*
+ * Configure RTEMS.
+ */
 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
 #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
Index: testsuite/rcconf02/test_main.c
===================================================================
--- testsuite/rcconf02/test_main.c	(revision c2ec5f188b415ced3047e2969d6678a030396913)
+++ testsuite/rcconf02/test_main.c	(revision 90873cc8025a28f19b0f1a427263ad9a4a14fb75)
@@ -45,4 +45,6 @@
 #include <rtems/shell.h>
 
+#define RCCONF02_HAS_SHELL
+
 #define TEST_NAME "LIBBSD RC.CONF 2"
 
@@ -71,18 +73,21 @@
   IFACE_VLAN(re0)
 
-static const char* rc_conf_text =              \
-  "#\n"                                        \
-  "# Tests rc.conf. Add every NIC\n"           \
-  "#\n"                                        \
-  "hostname=\"rctest\"\n"                      \
-  "\n"                                         \
-  "create_args_myvlan=\"vlan 102\"\n"          \
-  "create_args_yourvlan=\"vlan 202\"\n"        \
-  "\n"                                         \
-  RC_CONF_IFACES                               \
-  "\n"                                         \
-  RC_CONF_VLANS                                \
-  "\n"                                         \
-  "defaultrouter=\"" NET_CFG_GATEWAY_IP "\"\n" \
+static const char* rc_conf_text =                       \
+  "#\n"                                                 \
+  "# Tests rc.conf. Add every NIC\n"                    \
+  "#\n"                                                 \
+  "hostname=\"rctest\"\n"                               \
+  "\n"                                                  \
+  "create_args_myvlan=\"vlan 102\"\n"                   \
+  "create_args_yourvlan=\"vlan 202\"\n"                 \
+  "\n"                                                  \
+  RC_CONF_IFACES                                        \
+  "\n"                                                  \
+  RC_CONF_VLANS                                         \
+  "\n"                                                  \
+  "defaultrouter=\"" NET_CFG_GATEWAY_IP "\"\n"          \
+  "\n"                                                  \
+  "ftpd_enable=\"YES\"\n"                               \
+  "ftpd_options=\"-v -p 21 -C 10 -P 150 -L -I 10 -R /\"\n" \
   "n";
 
@@ -114,4 +119,6 @@
 {
   test_rc_conf_script();
+
+#if defined(RCCONF02_HAS_SHELL)
   rtems_shell_init(
     "SHLL",
@@ -123,6 +130,13 @@
     NULL
     );
+#endif /* RCCONF02_HAS_SHELL */
+
   exit(0);
 }
+
+/*
+ * Optional shell for testing this test.
+ */
+#if defined(RCCONF02_HAS_SHELL)
 
 #define CONFIGURE_SHELL_COMMANDS_INIT
@@ -164,4 +178,8 @@
 
 #include <rtems/shellconfig.h>
+#endif /* RCCONF02_HAS_SHELL */
+
+#define RTEMS_BSD_CONFIG_BSP_CONFIG
+#define RTEMS_BSD_CONFIG_SERVICE_FTPD
 
 #include <rtems/bsd/test/default-init.h>
