diff options
Diffstat (limited to 'cpukit/libdl/rap-shell.c')
-rw-r--r-- | cpukit/libdl/rap-shell.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/cpukit/libdl/rap-shell.c b/cpukit/libdl/rap-shell.c new file mode 100644 index 0000000000..664f3a3055 --- /dev/null +++ b/cpukit/libdl/rap-shell.c @@ -0,0 +1,106 @@ +/* + * COPYRIGHT (c) 2013 Chris Johns <chrisj@rtems.org> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ +/** + * @file + * + * @ingroup rtems_rtld + * + * @brief RTEMS Application Loader. + * + * Shell command wrappers for the RTEMS Application loader. + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <rtems/rtl/rap.h> +#include <rtems/rtl/rap-shell.h> + +static void +shell_rap_command_help (void) +{ + printf ("usage: rap [cmd] [arg]\n" \ + "Commands and options:\n" \ + "ls: List the loaded applications (also list)\n" \ + "ld: Load an application (also load)\n" \ + "un: Unload an application (also unload)\n"); +} + +static void +shell_rap_get_error (const char* what) +{ + char message[64]; + int error; + error = rtems_rap_get_error (message, sizeof (message)); + printf ("error: %s: (%d) %s\n", what, error, message); +} + +static bool +shell_rap_list_handler (void* handle) +{ + printf (" %-10p %-10p %-s\n", + handle, rtems_rap_dl_handle (handle), rtems_rap_name (handle)); + return true; +} + +static int +shell_rap_list (int argc, char* argv[]) +{ + printf (" App DL Handle Name\n"); + return rtems_rap_iterate (shell_rap_list_handler) ? 0 : 1; +} + +static int +shell_rap_load (int argc, char* argv[]) +{ + int r = 0; + if (argc == 0) + { + printf ("error: no application name\n"); + return 0; + } + if (rtems_rap_load (argv[0], 0, argc - 1, (const char**) (argv + 1))) + printf ("%s loaded\n", argv[0]); + else + { + r = 1; + shell_rap_get_error ("loading"); + } + return r; +} + +int +shell_rap (int argc, char* argv[]) +{ + if (argc == 1) + { + shell_rap_command_help (); + return 0; + } + + if ((strcmp (argv[1], "ls") == 0) || + (strcmp (argv[1], "list") == 0)) + { + return shell_rap_list (argc - 2, argv + 2); + } + else if ((strcmp (argv[1], "ld") == 0) || + (strcmp (argv[1], "load") == 0)) + { + return shell_rap_load (argc - 2, argv + 2); + } + + printf ("error: invalid command: %s\n", argv[1]); + return 0; +} + |