diff options
Diffstat (limited to 'cpukit/libmisc/shell')
56 files changed, 1590 insertions, 496 deletions
diff --git a/cpukit/libmisc/shell/cat_file.c b/cpukit/libmisc/shell/cat_file.c index f7a530c56c..50aaa8e3f4 100644 --- a/cpukit/libmisc/shell/cat_file.c +++ b/cpukit/libmisc/shell/cat_file.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CAT Command Implementation + */ + /* - * CAT Command Implementation - * - * Author: - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/cmds.c b/cpukit/libmisc/shell/cmds.c index dbc63639eb..608961de4c 100644 --- a/cpukit/libmisc/shell/cmds.c +++ b/cpukit/libmisc/shell/cmds.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief XXX -- Just monitor commands until those can be integrated better + */ + /* - * XXX -- Just monitor commands until those can be integrated better - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/fdisk.c b/cpukit/libmisc/shell/fdisk.c index c244922492..78b017c3c7 100644 --- a/cpukit/libmisc/shell/fdisk.c +++ b/cpukit/libmisc/shell/fdisk.c @@ -6,11 +6,6 @@ /* * Copyright (c) 2009, 2020 - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/hexdump-conv.c b/cpukit/libmisc/shell/hexdump-conv.c index aa16f9b169..24b28353f3 100644 --- a/cpukit/libmisc/shell/hexdump-conv.c +++ b/cpukit/libmisc/shell/hexdump-conv.c @@ -117,7 +117,11 @@ retry: if (clen == 0) clen = 1; else if (clen == (size_t)-1 || (clen == (size_t)-2 && +#ifndef __rtems__ buf == peekbuf)) { +#else /* __rtems__ */ + &buf[0] == &peekbuf[0])) { +#endif /* __rtems__ */ memset(&pr->mbstate, 0, sizeof(pr->mbstate)); wc = *p; clen = 1; diff --git a/cpukit/libmisc/shell/login_check.c b/cpukit/libmisc/shell/login_check.c index a1af07ce1d..d9bce28a7d 100644 --- a/cpukit/libmisc/shell/login_check.c +++ b/cpukit/libmisc/shell/login_check.c @@ -5,13 +5,7 @@ */ /* - * Copyright (c) 2009-2014 embedded brains GmbH and others. - * - * embedded brains GmbH - * Dornierstr. 4 - * D-82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (C) 2009, 2014 embedded brains GmbH & Co. KG * * Based on work from Chris Johns and Fernando Ruiz. * diff --git a/cpukit/libmisc/shell/login_prompt.c b/cpukit/libmisc/shell/login_prompt.c index 3533a65a87..149966be63 100644 --- a/cpukit/libmisc/shell/login_prompt.c +++ b/cpukit/libmisc/shell/login_prompt.c @@ -48,13 +48,7 @@ * * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03 * - * Copyright (c) 2009 embedded brains GmbH and others. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * D-82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2009 embedded brains GmbH & Co. KG * * Based on work from Chris Johns, Fernando Ruiz and Till Straumann. * diff --git a/cpukit/libmisc/shell/main_alias.c b/cpukit/libmisc/shell/main_alias.c index 63a808c066..163a8475aa 100644 --- a/cpukit/libmisc/shell/main_alias.c +++ b/cpukit/libmisc/shell/main_alias.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief ALIAS Shell Command Implmentation + */ + /* - * ALIAS Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_blkstats.c b/cpukit/libmisc/shell/main_blkstats.c index 7093d47f9b..3acc652d87 100644 --- a/cpukit/libmisc/shell/main_blkstats.c +++ b/cpukit/libmisc/shell/main_blkstats.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2012 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2012 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_blksync.c b/cpukit/libmisc/shell/main_blksync.c index 9b1cd24fbc..bc429e08f2 100644 --- a/cpukit/libmisc/shell/main_blksync.c +++ b/cpukit/libmisc/shell/main_blksync.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief RM Shell Command Implmentation + */ + /* - * RM Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cat.c b/cpukit/libmisc/shell/main_cat.c index 145db6b928..539f4493e6 100644 --- a/cpukit/libmisc/shell/main_cat.c +++ b/cpukit/libmisc/shell/main_cat.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CAT Shell Command Implmentation + */ + /* - * CAT Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cd.c b/cpukit/libmisc/shell/main_cd.c index 7b138742d3..dca1618d70 100644 --- a/cpukit/libmisc/shell/main_cd.c +++ b/cpukit/libmisc/shell/main_cd.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CD Shell Command Implmentation + */ + /* - * CD Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_chdir.c b/cpukit/libmisc/shell/main_chdir.c index 08d1c6e1ef..69f439d6f8 100644 --- a/cpukit/libmisc/shell/main_chdir.c +++ b/cpukit/libmisc/shell/main_chdir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CHDIR Shell Command Implmentation + */ + /* - * CHDIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_chmod.c b/cpukit/libmisc/shell/main_chmod.c index 8b932fac15..9a42cbd940 100644 --- a/cpukit/libmisc/shell/main_chmod.c +++ b/cpukit/libmisc/shell/main_chmod.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CHMOD Shell Command Implmentation + */ + /* - * CHMOD Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -54,7 +56,7 @@ static int rtems_shell_main_chmod( * Now change the files modes */ for (n=2 ; n < argc ; n++) { - sc = chmod(argv[n++], mode); + sc = chmod(argv[n], mode); _Assert_Unused_variable_unequal(sc, -1); } diff --git a/cpukit/libmisc/shell/main_chroot.c b/cpukit/libmisc/shell/main_chroot.c index 415a47c912..247cd2a22f 100644 --- a/cpukit/libmisc/shell/main_chroot.c +++ b/cpukit/libmisc/shell/main_chroot.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief CHROOT Shell Command Implmentation + */ + /* - * CHROOT Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cmdchmod.c b/cpukit/libmisc/shell/main_cmdchmod.c index 26772343e3..b6ec03bd5d 100644 --- a/cpukit/libmisc/shell/main_cmdchmod.c +++ b/cpukit/libmisc/shell/main_cmdchmod.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cmdchown.c b/cpukit/libmisc/shell/main_cmdchown.c index a5496eb38a..ba44d70ebb 100644 --- a/cpukit/libmisc/shell/main_cmdchown.c +++ b/cpukit/libmisc/shell/main_cmdchown.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cmdls.c b/cpukit/libmisc/shell/main_cmdls.c index 55f97a315c..529e070e8b 100644 --- a/cpukit/libmisc/shell/main_cmdls.c +++ b/cpukit/libmisc/shell/main_cmdls.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_cpuinfo.c b/cpukit/libmisc/shell/main_cpuinfo.c index 1a336fbb57..70179dcee8 100644 --- a/cpukit/libmisc/shell/main_cpuinfo.c +++ b/cpukit/libmisc/shell/main_cpuinfo.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2016 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2016 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_date.c b/cpukit/libmisc/shell/main_date.c index f93e5df016..5cae378b3c 100644 --- a/cpukit/libmisc/shell/main_date.c +++ b/cpukit/libmisc/shell/main_date.c @@ -1,11 +1,12 @@ +/** + * @file + * + * @brief DATE Shell Command Implmentation + */ + /* - * DATE Shell Command Implmentation - * - * OAuthor: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com - * - * Significantly rewritten by Joel Sherrill <joel.sherrill@oarcorp.com>. + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> + * Copyright (c) 2008 Joel Sherrill <joel.sherrill@oarcorp.com>. * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_dir.c b/cpukit/libmisc/shell/main_dir.c index 7d8e8bcb6b..6357a99243 100644 --- a/cpukit/libmisc/shell/main_dir.c +++ b/cpukit/libmisc/shell/main_dir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief DIR Shell Command Implmentation + */ + /* - * DIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_drvmgr.c b/cpukit/libmisc/shell/main_drvmgr.c index bdf8d1c9ae..6090dde6b1 100644 --- a/cpukit/libmisc/shell/main_drvmgr.c +++ b/cpukit/libmisc/shell/main_drvmgr.c @@ -1,12 +1,31 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* * DRVMGR Command Implementation * * COPYRIGHT (c) 2010. * Cobham Gaisler AB. * - * 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. + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_edit.c b/cpukit/libmisc/shell/main_edit.c index ed1371f7fa..8317452b7b 100644 --- a/cpukit/libmisc/shell/main_edit.c +++ b/cpukit/libmisc/shell/main_edit.c @@ -55,7 +55,9 @@ #if defined(__linux__) || defined(__rtems__) #include <sys/ioctl.h> #include <termios.h> +#ifndef O_BINARY #define O_BINARY 0 +#endif static int linux_console; #endif @@ -410,6 +412,9 @@ static void move_gap(struct editor *ed, int pos, int minsize) { if (gapsize + MINEXTEND > minsize) minsize = gapsize + MINEXTEND; newsize = (ed->end - ed->start) - gapsize + minsize; start = (unsigned char *) malloc(newsize); // TODO check for out of memory + if (start == NULL) { + return; + } gap = start + pos; rest = gap + minsize; end = start + newsize; @@ -753,8 +758,23 @@ static void get_console_size(struct env *env) { env->cols = ws.ws_col; env->lines = ws.ws_row - 1; #elif defined(__rtems__) - env->cols = 80; + char* e; env->lines = 25; + env->cols = 80; + e = getenv("LINES"); + if (e != NULL) { + int lines = strtol(e, 0, 10); + if (lines > 0) { + env->lines = lines - 1; + } + } + e = getenv("COLUMNS"); + if (e != NULL) { + int cols = strtol(e, 0, 10); + if (cols > 0) { + env->cols = cols; + } + } #else struct term *term = gettib()->proc->term; env->cols = term->cols; @@ -1693,7 +1713,6 @@ static void copy_selection(struct editor *ed) { ed->env->clipboard = (unsigned char *) realloc(ed->env->clipboard, ed->env->clipsize); if (!ed->env->clipboard) return; copy(ed, ed->env->clipboard, selstart, ed->env->clipsize); - select_toggle(ed); } static void cut_selection(struct editor *ed) { @@ -1792,14 +1811,14 @@ static void save_editor(struct editor *ed) { ed->refresh = 1; } -static void close_editor(struct editor *ed) { +static struct editor* close_editor(struct editor *ed) { struct env *env = ed->env; if (ed->dirty) { display_message(ed, "Close %s without saving changes (y/n)? ", ed->filename); if (!ask()) { ed->refresh = 1; - return; + return ed; } } @@ -1811,6 +1830,7 @@ static void close_editor(struct editor *ed) { new_file(ed, ""); } ed->refresh = 1; + return ed; } static void pipe_command(struct editor *ed) { @@ -2111,7 +2131,7 @@ static void edit(struct editor *ed) { case ctrl('e'): select_toggle(ed); break; case ctrl('a'): select_all(ed); break; - case ctrl('c'): copy_selection(ed); break; + case ctrl('c'): copy_selection(ed);select_toggle(ed); break; case ctrl('f'): find_text(ed, 0); break; case ctrl('l'): goto_line(ed); break; case ctrl('g'): find_text(ed, 1); break; @@ -2134,15 +2154,7 @@ static void edit(struct editor *ed) { case ctrl('s'): save_editor(ed); break; case ctrl('p'): pipe_command(ed); break; #endif -#if defined(__rtems__) - /* - * Coverity spotted this as using ed after free() so changing - * the order of the statements. - */ - case ctrl('w'): ed = ed->env->current; close_editor(ed); break; -#else - case ctrl('w'): close_editor(ed); ed = ed->env->current; break; -#endif + case ctrl('w'): ed = close_editor(ed); break; } } } diff --git a/cpukit/libmisc/shell/main_exit.c b/cpukit/libmisc/shell/main_exit.c index e44f853494..b1ad9579ba 100644 --- a/cpukit/libmisc/shell/main_exit.c +++ b/cpukit/libmisc/shell/main_exit.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief exit Shell Command Implmentation + */ + /* - * exit Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_flashdev.c b/cpukit/libmisc/shell/main_flashdev.c new file mode 100644 index 0000000000..ca2454b33c --- /dev/null +++ b/cpukit/libmisc/shell/main_flashdev.c @@ -0,0 +1,584 @@ +/* + * Copyright (C) 2023 Aaron Nyholm + * + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + */ + +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> + +#include <errno.h> +#include <rtems/shell.h> + +#include <dev/flash/flashdev.h> + +static int flashdev_shell_read(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_write(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_erase(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_type(char *dev_path); +static int flashdev_shell_jedecid(char *dev_path); +static int flashdev_shell_page_off(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_page_idx(char *dev_path, int argc, char *argv[]); +static int flashdev_shell_pg_count(char *dev_path); +static int flashdev_shell_wb_size(char *dev_path); + +static int flashdev_shell_ioctl_value( + char *dev_path, + int ioctl_call, + void *ret +); + +static int flashdev_shell_page( + char *dev_path, + int argc, + char *argv[], + int ioctl_call +); + +static const char rtems_flashdev_shell_usage [] = + "simple flash read / write / erase\n" + "\n" + "flashdev <FLASH_DEV_PATH> [OPTION]\n" + " -r <address> <bytes> Read at address for bytes\n" + " -w <address> <file> Write file to address\n" + " -e <address> <bytes> Erase at address for bytes\n" + " -t Print the flash type\n" + " -d Print the JEDEC ID of flash device\n" + " -o <address> Print the page information of page at address\n" + " -i <index> Print the page information of page at index\n" + " -p Print the number of pages\n" + " -b Print the write block size\n" + " -h Print this help\n"; + + +static int rtems_flashdev_shell_main( int argc, char *argv[] ) { + + char *dev_path = NULL; + int i; + + for (i = 1; i < argc; ++i) { + if (argv[i][0] == '-') { + /* + * Check that a path to flashdev has been provided before running + * command. + */ + if (dev_path == NULL) { + printf("Please input FLASH_DEV_PATH before instruction\n"); + return 1; + } + /* Run command */ + switch (argv[i][1]) { + case ('r'): + /* Read */ + return flashdev_shell_read(dev_path, argc, &argv[i]); + case ('w'): + /* Write */ + return flashdev_shell_write(dev_path, argc, &argv[i]); + case ('e'): + /* Erase */ + return flashdev_shell_erase(dev_path, argc, &argv[i]); + case ('t'): + /* Flash Type */ + return flashdev_shell_type(dev_path); + case ('d'): + /* JEDEC Id */ + return flashdev_shell_jedecid(dev_path); + case ('o'): + /* Page info by offset */ + return flashdev_shell_page_off(dev_path, argc, &argv[i]); + case ('i'): + /* Page info by index */ + return flashdev_shell_page_idx(dev_path, argc, &argv[i]); + case ('p'): + /* Page count */ + return flashdev_shell_pg_count(dev_path); + case ('b'): + /* Write block size */ + return flashdev_shell_wb_size(dev_path); + case ('h'): + default: + /* Help */ + printf(rtems_flashdev_shell_usage); + break; + } + } else if (dev_path == NULL) { + dev_path = argv[i]; + } else { + printf("Invalid argument: %s\n", argv[i]); + return 1; + } + } + + if (argc == 1) { + printf(rtems_flashdev_shell_usage); + } + + return 0; +} + +int flashdev_shell_read( + char *dev_path, + int argc, + char *argv[] +) +{ + uint32_t address; + uint32_t bytes; + int fd; + int status; + void *buffer; + + /* Check arguments */ + if (argc < 5) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + address = (uint32_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + errno = 0; + bytes = (uint32_t) strtoul(argv[2], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + + /* Open flash device */ + fd = open(dev_path, O_RDONLY); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + /* Move to address */ + status = lseek(fd, address, SEEK_SET); + if (status == -1) { + printf("Reading failed\n"); + close(fd); + return -1; + } + + /* Create a buffer to read into */ + buffer = calloc((bytes + bytes%4), 1); + if (buffer == NULL) { + printf("Failed to allocate read buffer\n"); + close(fd); + return -1; + } + + /* Read into buffer */ + status = read(fd, buffer, bytes); + if (status == -1) { + printf("Reading failed\n"); + free(buffer); + close(fd); + return -1; + } + + /* Print buffer out in 32bit blocks */ + printf("Reading %s at 0x%08x for %d bytes\n", dev_path, address, bytes); + for (int i = 0; i < (bytes/4); i++) { + printf("%08x ", ((uint32_t*)buffer)[i]); + if ((i+1)%4 == 0) { + printf("\n"); + } + } + printf("\n"); + + /* Clean up */ + free(buffer); + close(fd); + return 0; +} + +int flashdev_shell_write( + char *dev_path, + int argc, + char *argv[] +) +{ + uint32_t address; + int flash; + int file; + int status; + int read_len; + off_t length; + void *buffer; + uint32_t offset; + char *file_path; + + /* Check arguments */ + if (argc < 5) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + address = (uint32_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + errno = 0; + file_path = argv[2]; + + /* Open flash device and move to write offset */ + flash = open(dev_path, O_WRONLY); + if (flash == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + status = lseek(flash, address, SEEK_SET); + if (status == -1) { + printf("Reading failed\n"); + close(flash); + return -1; + } + + /* Open file and get file length */ + file = open(file_path, O_RDONLY); + if (file == -1) { + printf("Couldn't open %s\n", file_path); + close(flash); + return -1; + } + + length = lseek(file, 0, SEEK_END); + if (length == -1) { + close(flash); + close(file); + printf("Couldn't find length of file\n"); + return -1; + } + + if (lseek(file, 0, SEEK_SET) == -1) { + close(flash); + close(file); + printf("Couldn't find length of file\n"); + return -1; + } + + /* Create buffer */ + buffer = calloc(1, 0x1000); + + /* Write file to flash device in 0x1000 byte chunks */ + offset = 0; + while (offset != length) { + + read_len = length - offset; + if (read_len > 0x1000) { + read_len = 0x1000; + } + + status = read(file, buffer, read_len); + if (status == -1) { + free(buffer); + close(flash); + close(file); + printf("Can't read %s\n", file_path); + return -1; + } + + status = write(flash, buffer, read_len); + if (status == -1) { + free(buffer); + close(flash); + close(file); + printf("Can't write %s\n", dev_path); + return -1; + } + + offset = offset + read_len; + } + + /* Clean up */ + close(flash); + close(file); + free(buffer); + return 0; +} + +int flashdev_shell_erase( + char *dev_path, + int argc, + char *argv[] +) +{ + uint32_t address; + uint32_t bytes; + int fd; + int status; + rtems_flashdev_region args; + + /* Check arguments */ + if (argc < 5) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + address = (uint32_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + errno = 0; + bytes = (uint32_t) strtoul(argv[2], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + + /* Open flash device */ + fd = open(dev_path, O_RDWR); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + printf("Erasing at %08x for %x bytes\n", address, bytes); + + /* Erase flash */ + args.offset = address; + args.size = bytes; + + status = ioctl(fd, RTEMS_FLASHDEV_IOCTL_ERASE, &args); + if (status == -1) { + printf("Erase failed\n"); + close(fd); + return -1; + } + + /* Clean up */ + close(fd); + + return 0; +} + +int flashdev_shell_type( char *dev_path ) +{ + int type; + int status; + + /* Get type */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_TYPE, + &type + ); + + if (status) { + printf("Failed to get flash type\n"); + return status; + } + + /* Print type */ + switch(type) { + case RTEMS_FLASHDEV_NOR: + printf("NOR flash\n"); + break; + case RTEMS_FLASHDEV_NAND: + printf("NAND flash\n"); + break; + default: + printf("Unknown type\n"); + } + + return 0; +} + +int flashdev_shell_jedecid( char *dev_path ) { + uint32_t ret; + int status; + + /* Get JEDEC Id */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_JEDEC_ID, + &ret + ); + + /* Print JEDEC Id */ + if (status) { + printf("Failed to get JEDEC Id\n"); + return status; + } else { + printf("JEDEC Id: 0x%x\n", ret); + } + return 0; +} + +static int flashdev_shell_page_off( + char *dev_path, + int argc, + char *argv[] +) +{ + return flashdev_shell_page( + dev_path, + argc, + argv, + RTEMS_FLASHDEV_IOCTL_PAGEINFO_BY_OFFSET + ); +} + +static int flashdev_shell_page_idx( + char *dev_path, + int argc, + char *argv[] +) +{ + return flashdev_shell_page( + dev_path, + argc, + argv, + RTEMS_FLASHDEV_IOCTL_PAGEINFO_BY_INDEX + ); +} + +static int flashdev_shell_pg_count( char *dev_path ) +{ + uint32_t ret; + int status; + + /* Get Page Count */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_PAGE_COUNT, + &ret + ); + + /* Print Page Count */ + if (status) { + printf("Failed to get page count\n"); + return status; + } else { + printf("Page count: 0x%x\n", ret); + } + return 0; +} + +static int flashdev_shell_wb_size( char *dev_path ) +{ + size_t ret; + int status; + + /* Get Write Block Size */ + status = flashdev_shell_ioctl_value( + dev_path, + RTEMS_FLASHDEV_IOCTL_WRITE_BLOCK_SIZE, + &ret + ); + + /* Print Write Block Size */ + if (status) { + printf("Failed to get write block size\n"); + return status; + } else { + printf("Write block size: 0x%zx\n", ret); + } + return 0; +} + +static int flashdev_shell_ioctl_value( + char *dev_path, + int ioctl_call, + void *ret +) +{ + int fd; + int status; + + fd = open(dev_path, O_RDONLY); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + status = ioctl(fd, ioctl_call, ret); + if (status == -1) { + close(fd); + return -1; + } + + close(fd); + return 0; +} + +static int flashdev_shell_page( + char *dev_path, + int argc, + char *argv[], + int ioctl_call +) +{ + rtems_flashdev_ioctl_page_info pg_info; + int fd; + int status; + + /* Check arguments */ + if (argc < 4) { + printf("Missing argument\n"); + return -1; + } + + /* Get arguments */ + errno = 0; + pg_info.location = (off_t) strtoul(argv[1], NULL, 0); + if (errno != 0) { + printf("Could not read address\n"); + } + + /* Open flash device */ + fd = open(dev_path, O_RDWR); + if (fd == -1) { + printf("Couldn't open %s\n", dev_path); + return -1; + } + + status = ioctl(fd, ioctl_call, &pg_info); + if (status == -1) { + printf("Failed to get page info\n"); + close(fd); + return -1; + } + + printf( + "Page offset: 0x%jx\nPage length: 0x%zx\n", + pg_info.page_info.offset, + pg_info.page_info.size + ); + + /* Clean up */ + close(fd); + return 0; +} + +rtems_shell_cmd_t rtems_shell_FLASHDEV_Command = { + .name = "flashdev", + .usage = rtems_flashdev_shell_usage, + .topic = "misc", + .command = rtems_flashdev_shell_main, +}; diff --git a/cpukit/libmisc/shell/main_getenv.c b/cpukit/libmisc/shell/main_getenv.c index 034253fdc5..2e258e90b7 100644 --- a/cpukit/libmisc/shell/main_getenv.c +++ b/cpukit/libmisc/shell/main_getenv.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Get an environment variable + */ + /* - * Get an environment vairable. + * COPYRIGHT (C) 2009 Chris Johns <chrisj@rtems.org> + * + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_help.c b/cpukit/libmisc/shell/main_help.c index 564bc30a9c..e6d939d08f 100644 --- a/cpukit/libmisc/shell/main_help.c +++ b/cpukit/libmisc/shell/main_help.c @@ -22,23 +22,34 @@ #include "internal.h" #include <string.h> +static int rtems_shell_help_pause(int line, int lines) { + if (lines && line >= lines - 1) { + printf("\rPress any key to continue..."); + (void) getchar(); + printf("\r%*c\r", 29, ' '); + line = 0; + } + return line; +} + /* * show the help for one command. */ static int rtems_shell_help_cmd( - const rtems_shell_cmd_t *shell_cmd + const rtems_shell_cmd_t *shell_cmd, int indent, int line, + int cols, int lines ) { const char * pc; - int col,line; + int col; if (!rtems_shell_can_see_cmd(shell_cmd)) { return 0; } - printf("%-12.12s - ",shell_cmd->name); - col = 14; - line = 1; + printf("%-*s - ", indent, shell_cmd->name); + indent += 3; + col = indent; if (shell_cmd->alias) { printf("is an <alias> for command '%s'",shell_cmd->alias->name); } else if (shell_cmd->usage) { @@ -48,8 +59,10 @@ static int rtems_shell_help_cmd( case '\r': break; case '\n': - putchar('\n'); - col = 0; + if (*(pc + 1) != '\0') { + putchar('\n'); + col = 0; + } break; default: putchar(*pc); @@ -57,19 +70,21 @@ static int rtems_shell_help_cmd( break; } pc++; - if (col>78) { /* What daring... 78?*/ + if (col > (cols - 3)) { if (*pc) { putchar('\n'); col = 0; } } - if (!col && *pc) { - printf(" "); - col = 12;line++; + if (col == 0 && *pc) { + line = rtems_shell_help_pause(line + 1, lines); + printf("%*c", indent, ' '); + col = indent; } } } puts(""); + line = rtems_shell_help_pause(line + 1, lines); return line; } @@ -83,15 +98,27 @@ static int rtems_shell_help( char * argv[] ) { - int col,line,lines,arg; - char* lines_env; + int col,line,cols,lines,arg,indent; + char *lines_env, *cols_env; rtems_shell_topic_t *topic; + rtems_shell_cmd_t *shell_cmd; + lines = 16; + cols = 80; lines_env = getenv("SHELL_LINES"); - if (lines_env) + if (lines_env) { lines = strtol(lines_env, 0, 0); - else - lines = 16; + } else { + lines_env = getenv("LINES"); + if (lines_env) { + lines = strtol(lines_env, 0, 0); + } + } + + cols_env = getenv("COLUMNS"); + if (cols_env) { + cols = strtol(cols_env, 0, 0); + } if (argc<2) { printf("help: The topics are\n"); @@ -101,7 +128,7 @@ static int rtems_shell_help( if (!col){ col = printf(" %s",topic->topic); } else { - if ((col+strlen(topic->topic)+2)>78){ + if ((col+strlen(topic->topic)+2)>(cols - 2)){ printf("\n"); col = printf(" %s",topic->topic); } else { @@ -113,18 +140,19 @@ static int rtems_shell_help( printf("\n"); return 1; } + indent = 0; + shell_cmd = rtems_shell_first_cmd; + while (shell_cmd) { + size_t len = strlen(shell_cmd->name); + if (len > indent) { + indent = len; + } + shell_cmd = shell_cmd->next; + } line = 0; for (arg = 1;arg<argc;arg++) { const char *cur = argv[arg]; - rtems_shell_cmd_t *shell_cmd; - - if (lines && (line > lines)) { - printf("Press any key to continue..."); - (void) getchar(); /* we only want to know a character was pressed */ - printf("\n"); - line = 0; - } - topic = rtems_shell_lookup_topic(cur); + topic = rtems_shell_lookup_topic(cur); if (topic == NULL) { if ((shell_cmd = rtems_shell_lookup_cmd(cur)) == NULL) { if (strcmp(cur, "all") != 0) { @@ -132,11 +160,11 @@ static int rtems_shell_help( "help: topic or cmd '%s' not found. Try <help> alone for a list\n", cur ); - line++; + line = rtems_shell_help_pause(line + 1, lines); continue; } } else { - line+= rtems_shell_help_cmd(shell_cmd); + line = rtems_shell_help_cmd(shell_cmd, indent, line, cols, lines); continue; } } @@ -144,18 +172,12 @@ static int rtems_shell_help( line++; shell_cmd = rtems_shell_first_cmd; while (shell_cmd) { - if (topic == NULL || !strcmp(topic->topic,shell_cmd->topic)) - line+= rtems_shell_help_cmd(shell_cmd); - if (lines && (line > lines)) { - printf("Press any key to continue..."); - (void) getchar(); - printf("\n"); - line = 0; + if (topic == NULL || !strcmp(topic->topic,shell_cmd->topic)) { + line = rtems_shell_help_cmd(shell_cmd, indent, line, cols, lines); } shell_cmd = shell_cmd->next; } } - puts(""); return 0; } diff --git a/cpukit/libmisc/shell/main_i2cdetect.c b/cpukit/libmisc/shell/main_i2cdetect.c index e953b4eaef..1a863434b7 100644 --- a/cpukit/libmisc/shell/main_i2cdetect.c +++ b/cpukit/libmisc/shell/main_i2cdetect.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_i2cget.c b/cpukit/libmisc/shell/main_i2cget.c index ffa551308b..5726c6ea14 100644 --- a/cpukit/libmisc/shell/main_i2cget.c +++ b/cpukit/libmisc/shell/main_i2cget.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_i2cset.c b/cpukit/libmisc/shell/main_i2cset.c index d9025b3b28..cdc42a57f9 100644 --- a/cpukit/libmisc/shell/main_i2cset.c +++ b/cpukit/libmisc/shell/main_i2cset.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_id.c b/cpukit/libmisc/shell/main_id.c index 2d2b05fe11..bd1906cab1 100644 --- a/cpukit/libmisc/shell/main_id.c +++ b/cpukit/libmisc/shell/main_id.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief ID Command Implementation + */ + /* - * ID Command Implementation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_logoff.c b/cpukit/libmisc/shell/main_logoff.c index 67a2967228..99ed957161 100644 --- a/cpukit/libmisc/shell/main_logoff.c +++ b/cpukit/libmisc/shell/main_logoff.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief LOGOFF Shell Command Implmentation + */ + /* - * LOGOFF Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_lsof.c b/cpukit/libmisc/shell/main_lsof.c index 57e81c0295..2cc35f96fe 100644 --- a/cpukit/libmisc/shell/main_lsof.c +++ b/cpukit/libmisc/shell/main_lsof.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2012-2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (C) 2012, 2014 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mdump.c b/cpukit/libmisc/shell/main_mdump.c index 7f49480927..214b57c401 100644 --- a/cpukit/libmisc/shell/main_mdump.c +++ b/cpukit/libmisc/shell/main_mdump.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MDUMP Shell Command Implmentation + */ + /* - * MDUMP Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * Reworked by Ric Claus at SLAC.Stanford.edu * diff --git a/cpukit/libmisc/shell/main_medit.c b/cpukit/libmisc/shell/main_medit.c index d14a518800..e175868cac 100644 --- a/cpukit/libmisc/shell/main_medit.c +++ b/cpukit/libmisc/shell/main_medit.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MEDIT Shell Command Implmentation + */ + /* - * MEDIT Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mfill.c b/cpukit/libmisc/shell/main_mfill.c index 47a55d3a2f..4ac6bfcf31 100644 --- a/cpukit/libmisc/shell/main_mfill.c +++ b/cpukit/libmisc/shell/main_mfill.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MFILL Shell Command Implmentation + */ + /* - * MFILL Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mkdir.c b/cpukit/libmisc/shell/main_mkdir.c index 5595bfd3fd..c3027800bc 100644 --- a/cpukit/libmisc/shell/main_mkdir.c +++ b/cpukit/libmisc/shell/main_mkdir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MKDIR Shell Command Implmentation + */ + /* - * MKDIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mmove.c b/cpukit/libmisc/shell/main_mmove.c index a319355444..0029882d62 100644 --- a/cpukit/libmisc/shell/main_mmove.c +++ b/cpukit/libmisc/shell/main_mmove.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief MMOVE Shell Command Implmentation + */ + /* - * MMOVE Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -60,7 +62,7 @@ static int rtems_shell_main_mmove( /* * Now copy the memory. */ - memcpy(dst, src, length); + memmove(dst, src, length); return 0; } diff --git a/cpukit/libmisc/shell/main_mount.c b/cpukit/libmisc/shell/main_mount.c index d326a59097..5a6b36cede 100644 --- a/cpukit/libmisc/shell/main_mount.c +++ b/cpukit/libmisc/shell/main_mount.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief Shell Command Implmentation + */ + /* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_mount_nfs.c b/cpukit/libmisc/shell/main_mount_nfs.c index 8a2aaa4b29..c0ad3ebdb0 100644 --- a/cpukit/libmisc/shell/main_mount_nfs.c +++ b/cpukit/libmisc/shell/main_mount_nfs.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief Shell Command Implmentation + */ + /* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_pci.c b/cpukit/libmisc/shell/main_pci.c index 08fdae78ae..4902ed07b9 100644 --- a/cpukit/libmisc/shell/main_pci.c +++ b/cpukit/libmisc/shell/main_pci.c @@ -1,11 +1,30 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + /* LIBPCI Command Implementation * * COPYRIGHT (c) 2010. * Cobham Gaisler AB. * - * 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. + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */ #ifdef HAVE_CONFIG_H @@ -356,7 +375,7 @@ static int shell_pci_infodev( printf(" PCIID: 0x%04x\n", dev->busdevfun); bus = dev->bus; if (!bus) { - printf(" AT BUS: 0x%x via Host Bridge\n", bus->num); + printf(" AT BUS: via Host Bridge\n"); } else { printf(" AT BUS: 0x%x via Bridge at [%x:%x:%x]\n", bus->num, PCI_DEV_EXPAND(bus->dev.busdevfun)); diff --git a/cpukit/libmisc/shell/main_profreport.c b/cpukit/libmisc/shell/main_profreport.c index 2504282ae3..ab14cc1e49 100644 --- a/cpukit/libmisc/shell/main_profreport.c +++ b/cpukit/libmisc/shell/main_profreport.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2015 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2015 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_pwd.c b/cpukit/libmisc/shell/main_pwd.c index ea657dc848..1e3ef450e8 100644 --- a/cpukit/libmisc/shell/main_pwd.c +++ b/cpukit/libmisc/shell/main_pwd.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief PWD Shell Command Implmentation + */ + /* - * PWD Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_rmdir.c b/cpukit/libmisc/shell/main_rmdir.c index 250da83d27..b9cde24886 100644 --- a/cpukit/libmisc/shell/main_rmdir.c +++ b/cpukit/libmisc/shell/main_rmdir.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief RMDIR Shell Command Implmentation + */ + /* - * RMDIR Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_rtc.c b/cpukit/libmisc/shell/main_rtc.c index 320281b60b..940c7c9b52 100644 --- a/cpukit/libmisc/shell/main_rtc.c +++ b/cpukit/libmisc/shell/main_rtc.c @@ -5,12 +5,7 @@ */ /* - * Copyright (c) 2009 - * embedded brains GmbH - * Obere Lagerstr. 30 - * D-82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2009 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_rtems.c b/cpukit/libmisc/shell/main_rtems.c new file mode 100644 index 0000000000..956c6bcb72 --- /dev/null +++ b/cpukit/libmisc/shell/main_rtems.c @@ -0,0 +1,156 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup + * + * @brief This source file contains the kernel command. + */ + +/* + * Copyright (c) 2022 Chris Johns. 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#include <rtems.h> +#include <rtems/shell.h> +#include <rtems/version.h> + +static void kernel_summary(void) { + printf( + "RTEMS: %d.%d.%d", + rtems_version_major(), rtems_version_minor(), rtems_version_revision()); + if (rtems_version_control_key_is_valid(rtems_version_control_key())) { + printf(" (%s)", rtems_version_control_key()); + } +#if RTEMS_SMP + printf(" SMP:%d cores", rtems_scheduler_get_processor_maximum()); +#endif + printf("\n"); +} + +static void cpu_summary(void) { + printf("CPU: " CPU_NAME " (" CPU_MODEL_NAME ")\n"); +} + +static void bsp_summary(void) { + printf("BSP: %s\n", rtems_board_support_package()); +} + +static void tools_summary(void) { + printf( "Tools: " __VERSION__ "\n"); +} + +static void opts_summary(void) { + printf("Options:" +#if RTEMS_DEBUG + " DEBUG" +#endif +#if RTEMS_MULTIPROCESSING + " MULTIPROCESSING" +#endif +#if RTEMS_NETWORKING + " NETWORKING" +#endif +#if RTEMS_PARAVIRT + " PARAVIRT" +#endif +#if RTEMS_POSIX_API + " POSIX" +#endif +#if RTEMS_PROFILING + " PROFILING" +#endif +#if RTEMS_SMP + " SMP" +#endif + "\n"); +} + +static void help(void) { + printf( "Usage:: rtems <command>\n"); + printf( " where <command> is:\n"); + printf( " help : this help\n"); + printf( " ver : kernel version\n"); + printf( " cpu : kernel version\n"); + printf( " bsp : BSP name\n"); + printf( " tools : tools version\n"); + printf( " opts : options\n"); + printf( " all : all commands\n"); +} + +static int rtems_shell_main_rtems( + int argc, char *argv[]) { + + if (argc == 1) { + kernel_summary(); + } else if (argc == 2) { + if (strcmp(argv[1], "help") == 0) { + help(); + } else if (strcmp(argv[1], "ver") == 0) { + kernel_summary(); + } else if (strcmp(argv[1], "cpu") == 0) { + cpu_summary(); + } else if (strcmp(argv[1], "bsp") == 0) { + bsp_summary(); + } else if (strcmp(argv[1], "tools") == 0) { + tools_summary(); + } else if (strcmp(argv[1], "opts") == 0) { + opts_summary(); + } else if (strcmp(argv[1], "all") == 0) { + kernel_summary(); + cpu_summary(); + bsp_summary(); + tools_summary(); + opts_summary(); + } else { + printf("error: invalid command\n"); + return 1; + } + } else { + printf("error: invalid command\n"); + return 1; + } + return 0; +} + +#define HELP_LINE \ + "rtems <command> (eg. help)" + +rtems_shell_cmd_t rtems_shell_RTEMS_Command = { + "rtems", /* name */ + HELP_LINE, /* usage */ + "rtems", /* topic */ + rtems_shell_main_rtems, /* command */ + NULL, /* alias */ + NULL, /* next */ + 0500, /* mode */ + 0, /* uid */ + 0 /* gid */ +}; diff --git a/cpukit/libmisc/shell/main_setenv.c b/cpukit/libmisc/shell/main_setenv.c index a50f1a609c..ae8de67689 100644 --- a/cpukit/libmisc/shell/main_setenv.c +++ b/cpukit/libmisc/shell/main_setenv.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Set an environment variable + */ + /* - * Set an environment vairable. + * COPYRIGHT (C) 2009 Chris Johns <chrisj@rtems.org> + * + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_spi.c b/cpukit/libmisc/shell/main_spi.c index 487a22fc6c..9c47ba0054 100644 --- a/cpukit/libmisc/shell/main_spi.c +++ b/cpukit/libmisc/shell/main_spi.c @@ -1,7 +1,7 @@ /* * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (C) 2020 embedded brains GmbH. + * Copyright (C) 2020 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/cpukit/libmisc/shell/main_tty.c b/cpukit/libmisc/shell/main_tty.c index 29dc673dbb..9b884a612c 100644 --- a/cpukit/libmisc/shell/main_tty.c +++ b/cpukit/libmisc/shell/main_tty.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief TTY Shell Command Implmentation + */ + /* - * TTY Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_umask.c b/cpukit/libmisc/shell/main_umask.c index 66cd102195..a5c983d126 100644 --- a/cpukit/libmisc/shell/main_umask.c +++ b/cpukit/libmisc/shell/main_umask.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief UMASK Shell Command Implmentation + */ + /* - * UMASK Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_unmount.c b/cpukit/libmisc/shell/main_unmount.c index e7e5fddc68..8c56727f42 100644 --- a/cpukit/libmisc/shell/main_unmount.c +++ b/cpukit/libmisc/shell/main_unmount.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief Shell Command Implmentation + */ + /* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/main_unsetenv.c b/cpukit/libmisc/shell/main_unsetenv.c index af350c9283..60ba705f08 100644 --- a/cpukit/libmisc/shell/main_unsetenv.c +++ b/cpukit/libmisc/shell/main_unsetenv.c @@ -1,5 +1,34 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief Unset an environment variable + */ + /* - * Unset an environment vairable. + * COPYRIGHT (C) 2009 Chris Johns <chrisj@rtems.org> + * + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */ #ifdef HAVE_CONFIG_H diff --git a/cpukit/libmisc/shell/main_whoami.c b/cpukit/libmisc/shell/main_whoami.c index 8771c66c50..d2183266e6 100644 --- a/cpukit/libmisc/shell/main_whoami.c +++ b/cpukit/libmisc/shell/main_whoami.c @@ -1,9 +1,11 @@ +/** + * @file + * + * @brief WHOAMI Shell Command Implmentation + */ + /* - * WHOAMI Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/shell-wait-for-input.c b/cpukit/libmisc/shell/shell-wait-for-input.c index 69ab883dc0..60d6ea4225 100644 --- a/cpukit/libmisc/shell/shell-wait-for-input.c +++ b/cpukit/libmisc/shell/shell-wait-for-input.c @@ -1,11 +1,5 @@ /* - * Copyright (c) 2011 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Obere Lagerstr. 30 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> + * Copyright (c) 2011 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c index 1e5962b1e3..9cefc80255 100644 --- a/cpukit/libmisc/shell/shell.c +++ b/cpukit/libmisc/shell/shell.c @@ -1,11 +1,11 @@ -/* - * - * Instantatiate a new terminal shell. - * - * Author: +/** + * @file * - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * @brief Instantatiate a new terminal shell. + */ + +/* + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -49,11 +49,13 @@ #define shell_std_debug(...) #endif +#define SHELL_MAGIC rtems_build_name('S', 'E', 'N', 'V') + const rtems_shell_env_t rtems_global_shell_env = { - .magic = rtems_build_name('S', 'E', 'N', 'V'), + .magic = SHELL_MAGIC, .managed = false, .devname = CONSOLE_DEVICE_NAME, - .taskname = "SHGL", + .taskname = "RTSH", .exit_shell = false, .forever = true, .echo = false, @@ -198,6 +200,8 @@ static bool rtems_shell_set_shell_env( rtems_shell_env_key_handle *handle; int eno; + rtems_shell_init_environment(); + handle = malloc(sizeof(rtems_shell_env_key_handle)); if (handle == NULL) { rtems_error(0, "no memory for shell env key handle)"); @@ -267,12 +271,13 @@ void rtems_shell_dup_current_env(rtems_shell_env_t *copy) if (env != NULL) { shell_std_debug("dup: existing parent\n"); *copy = *env; - } - else { + + /* + * Duplicated environments are not managed. + */ + copy->managed = false; + } else { *copy = rtems_global_shell_env; - copy->magic = rtems_build_name('S', 'E', 'N', 'V'); - copy->devname = CONSOLE_DEVICE_NAME; - copy->taskname = "RTSH"; copy->parent_stdout = stdout; copy->parent_stdin = stdin; copy->parent_stderr = stderr; @@ -281,10 +286,6 @@ void rtems_shell_dup_current_env(rtems_shell_env_t *copy) fileno(copy->parent_stdout), copy->parent_stdout, fileno(copy->parent_stdin), copy->parent_stdin); } - /* - * Duplicated environments are not managed. - */ - copy->managed = false; } /* @@ -313,32 +314,21 @@ static int rtems_shell_line_editor( int c; int col; int last_col; - int output; char line[size]; char new_line[size]; int up; int cmd = -1; int inserting = 1; int in_fileno = fileno(in); - int out_fileno; - - _Assert(out != NULL); - out_fileno = fileno(out); - - /* - * Only this task can use this file descriptor because calling - * fileno will block if another thread call made a call on this - * descriptor. - */ - output = (out && isatty(in_fileno)); col = last_col = 0; tcdrain(in_fileno); - if (out) - tcdrain(out_fileno); + if (out != NULL) { + tcdrain(fileno(out)); + } - if (output && prompt) + if (out != NULL && prompt != NULL) fprintf(out, "\r%s", prompt); line[0] = 0; @@ -346,7 +336,7 @@ static int rtems_shell_line_editor( for (;;) { - if (output) + if (out != NULL) fflush(out); extended_key = rtems_shell_getchar(in); @@ -368,15 +358,14 @@ static int rtems_shell_line_editor( switch (c) { case RTEMS_SHELL_KEYS_END: - if (output) + if (out != NULL) fprintf(out, "%s", line + col); col = (int) strlen (line); break; case RTEMS_SHELL_KEYS_HOME: - if (output) { - if (prompt) - fprintf(out,"\r%s", prompt); + if (out != NULL && prompt != NULL) { + fprintf(out,"\r%s", prompt); } col = 0; break; @@ -407,7 +396,7 @@ static int rtems_shell_line_editor( int end; int bs; rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%s ", prompt, line); end = (int) strlen (line); for (bs = 0; bs < ((end - col) + 1); bs++) @@ -426,9 +415,8 @@ static int rtems_shell_line_editor( switch (c) { case 1: /*Control-a*/ - if (output) { - if (prompt) - fprintf(out,"\r%s", prompt); + if (out != NULL && prompt != NULL) { + fprintf(out,"\r%s", prompt); } col = 0; break; @@ -437,7 +425,7 @@ static int rtems_shell_line_editor( if (col > 0) { col--; - if (output) + if (out != NULL) fputc('\b', out); } break; @@ -446,7 +434,7 @@ static int rtems_shell_line_editor( if (strlen(line)) { if (col < strlen(line)) { rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { int bs; fprintf(out,"%s \b", line + col); for (bs = 0; bs < ((int) strlen (line) - col); bs++) @@ -458,26 +446,26 @@ static int rtems_shell_line_editor( /* Fall through */ case EOF: - if (output) + if (out != NULL) fputc('\n', out); return -2; case 5: /*Control-e*/ - if (output) + if (out != NULL) fprintf(out, "%s", line + col); col = (int) strlen (line); break; case 6: /* Control-F */ if ((col < size) && (line[col] != '\0')) { - if (output) + if (out != NULL) fputc(line[col], out); col++; } break; case 7: /* Control-G */ - if (output) { + if (out != NULL) { /* * The (int) cast is needed because the width specifier (%*) * must be an int, but strlen() returns a size_t. Without @@ -492,7 +480,7 @@ static int rtems_shell_line_editor( case 11: /*Control-k*/ if (line[col]) { - if (output) { + if (out != NULL) { int end = strlen(line); int bs; fprintf(out,"%*c", end - col, ' '); @@ -504,7 +492,7 @@ static int rtems_shell_line_editor( break; case '\f': - if (output) { + if (out != NULL) { int end; int bs; fputc('\f',out); @@ -522,7 +510,7 @@ static int rtems_shell_line_editor( int bs; col--; rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { fprintf(out,"\b%s \b", line + col); for (bs = 0; bs < ((int) strlen (line) - col); bs++) fputc('\b', out); @@ -536,7 +524,7 @@ static int rtems_shell_line_editor( /* * Process the command. */ - if (output) + if (out != NULL) fprintf(out,"\n"); /* @@ -564,7 +552,7 @@ static int rtems_shell_line_editor( case 16: /* Control-P */ if ((cmd >= (count - 1)) || (strlen(cmds[cmd + 1]) == 0)) { - if (output) + if (out != NULL) fputc('\x7', out); break; } @@ -584,7 +572,7 @@ static int rtems_shell_line_editor( cmd++; } else { if (cmd < 0) { - if (output) + if (out != NULL) fprintf(out, "\x7"); break; } @@ -602,7 +590,7 @@ static int rtems_shell_line_editor( col = strlen (line); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%*c", prompt, clen, ' '); fprintf(out,"\r%s%s", prompt, line); } @@ -615,17 +603,17 @@ static int rtems_shell_line_editor( char tmp; if (col == strlen(line)) { col--; - if (output) + if (out != NULL) fprintf(out,"\b"); } tmp = line[col]; line[col] = line[col - 1]; line[col - 1] = tmp; - if (output) + if (out != NULL) fprintf(out,"\b%c%c", line[col - 1], line[col]); col++; } else { - if (output) + if (out != NULL) fputc('\x7', out); } break; @@ -639,7 +627,7 @@ static int rtems_shell_line_editor( int bs; rtems_shell_move_left(line, col); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%*c", prompt, clen, ' '); fprintf(out,"\r%s%s", prompt, line); @@ -658,7 +646,7 @@ static int rtems_shell_line_editor( int ch, bs; for (ch = end + 1; ch > col; ch--) line[ch] = line[ch - 1]; - if (output) { + if (out != NULL) { fprintf(out, "%s", line + col); for (bs = 0; bs < (end - col + 1); bs++) fputc('\b', out); @@ -667,7 +655,7 @@ static int rtems_shell_line_editor( line[col++] = c; if (col > end) line[col] = '\0'; - if (output) + if (out != NULL) fputc(c, out); } break; @@ -817,6 +805,183 @@ void rtems_shell_print_env( } #endif +/* + * Wait for the string to return or timeout. + */ +static bool rtems_shell_term_wait_for(const int fd, const char* str, const int timeout) +{ + int msec = timeout; + int i = 0; + while (msec-- > 0 && str[i] != '\0') { + char ch[2]; + if (read(fd, &ch[0], 1) == 1) { + fflush(stdout); + if (ch[0] != str[i++]) { + return false; + } + msec = timeout; + } else { + usleep(1000); + } + } + if (msec == 0) { + return false; + } + return true; +} + +/* + * Buffer a string up to the end string + */ +static int rtems_shell_term_buffer_until(const int fd, + char* buf, + const int size, + const char* end, + const int timeout) +{ + int msec = timeout; + int i = 0; + int e = 0; + memset(&buf[0], 0, size); + while (msec-- > 0 && i < size && end[e] != '\0') { + char ch[2]; + if (read(fd, &ch[0], 1) == 1) { + fflush(stdout); + buf[i++] = ch[0]; + if (ch[0] == end[e]) { + e++; + } else { + e = 0; + } + msec = timeout; + } else { + usleep(1000); + } + } + if (msec == 0 || end[e] != '\0') { + return -1; + } + i -= e; + if (i < size) { + buf[i] = '\0'; + } + return i; +} + +/* + * Determine if the terminal has the row and column values + * swapped + * + * https://github.com/tmux/tmux/issues/3457 + * + * Tmux has a bug where the lines and cols are swapped. There is a lag + * in the time it takes to get the fix into code so see if tmux is + * running and which version and work around the bug. + * + * The terminal device needs to have VMIN=0, and VTIME=0 + */ +static bool rtems_shell_term_row_column_swapped(const int fd, const int timeout) { + char buf[64]; + memset(&buf[0], 0, sizeof(buf)); + /* + * CSI > Ps q + * Ps = 0 => DCS > | text ST + */ + fputs("\033[>0q", stdout); + fflush(stdout); + if (rtems_shell_term_wait_for(fd, "\033P>|", timeout)) { + int len = rtems_shell_term_buffer_until(fd, buf, sizeof(buf), "\033\\", timeout); + if (len > 0) { + if (memcmp(buf, "tmux ", 5) == 0) { + static const char* bad_versions[] = { + "3.2", "3.2a", "3.3", "3.3a" + }; + size_t i; + for (i = 0; i < RTEMS_ARRAY_SIZE(bad_versions); ++i) { + if (strcmp(bad_versions[i], buf + 5) == 0) { + return true; + } + } + } + } + } + return false; +} + +/* + * Direct method to get the size of an XTERM window. + * + * If you do not use an XTERM the env variables are not define. + */ +static void rtems_shell_winsize( void ) +{ + const int fd = fileno(stdin); + struct winsize ws; + const int timeout = 150; + char buf[64]; + bool ok = false; + int lines = 0; + int cols = 0; + int r; + r = ioctl(fd, TIOCGWINSZ, &ws); + if (r == 0) { + ok = true; + lines = ws.ws_row; + cols = ws.ws_col; + } else if (isatty(fd)) { + struct termios cterm; + if (tcgetattr(fd, &cterm) >= 0) { + struct termios term = cterm; + term.c_cc[VMIN] = 0; + term.c_cc[VTIME] = 0; + if (tcsetattr (fd, TCSADRAIN, &term) >= 0) { + memset(&buf[0], 0, sizeof(buf)); + /* + * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Miscellaneous + * + * CSI 1 8 t + */ + fputs("\033[18t", stdout); + fflush(stdout); + if (rtems_shell_term_wait_for(fd, "\033[8;", timeout)) { + int len = rtems_shell_term_buffer_until(fd, buf, sizeof(buf), ";", timeout); + if (len > 0) { + int i; + lines = 0; + i = 0; + while (i < len) { + lines *= 10; + lines += buf[i++] - '0'; + } + len = rtems_shell_term_buffer_until(fd, buf, sizeof(buf), "t", timeout); + if (len > 0) { + cols = 0; + i = 0; + while (i < len) { + cols *= 10; + cols += buf[i++] - '0'; + } + ok = true; + } + } + } + } + if (rtems_shell_term_row_column_swapped(fd, timeout)) { + int tmp = lines; + lines = cols; + cols = tmp; + } + tcsetattr (fd, TCSADRAIN, &cterm); + } + } + if (ok) { + snprintf(buf, sizeof(buf) - 1, "%d", lines); + setenv("LINES", buf, 1); + snprintf(buf, sizeof(buf) - 1, "%d", cols); + setenv("COLUMNS", buf, 1); + } +} + static rtems_task rtems_shell_task(rtems_task_argument task_argument) { rtems_shell_env_t *shell_env = (rtems_shell_env_t*) task_argument; @@ -851,129 +1016,32 @@ static bool rtems_shell_init_user_env(void) #define RTEMS_SHELL_CMD_COUNT (32) #define RTEMS_SHELL_PROMPT_SIZE (128) -bool rtems_shell_main_loop( - rtems_shell_env_t *shell_env +static bool shell_main_loop( + rtems_shell_env_t *shell_env, + bool interactive, + FILE *line_editor_output ) { - struct termios term; - struct termios previous_term; - char *prompt = NULL; - int cmd; - int cmd_count = 1; /* assume a script and so only 1 command line */ - char *cmds[RTEMS_SHELL_CMD_COUNT]; - char *cmd_argv; - int argc; - char *argv[RTEMS_SHELL_MAXIMUM_ARGUMENTS]; - bool result = true; - bool input_file = false; - int line = 0; - FILE *stdinToClose = NULL; - FILE *stdoutToClose = NULL; - - rtems_shell_init_environment(); - - if (shell_env->magic != rtems_build_name('S', 'E', 'N', 'V')) { - rtems_error(0, "invalid shell environment passed to the main loop)"); - return false; - } - - if (!rtems_shell_set_shell_env(shell_env)) - return false; - - if (!rtems_shell_init_user_env()) { - rtems_error(0, "rtems_shell_init_user_env"); - rtems_shell_clear_shell_env(); - return false; - } - - shell_std_debug("env: %p\n", shell_env); - - if (shell_env->output == NULL || strcmp(shell_env->output, "stdout") == 0) { - if (shell_env->parent_stdout != NULL) - stdout = shell_env->parent_stdout; - } - else if (strcmp(shell_env->output, "stderr") == 0) { - if (shell_env->parent_stderr != NULL) - stdout = shell_env->parent_stderr; - else - stdout = stderr; - } else if (strcmp(shell_env->output, "/dev/null") == 0) { - if (stdout == NULL) { - fprintf(stderr, "shell: stdout is NULLs\n"); - rtems_shell_clear_shell_env(); - return false; - } - fclose (stdout); - } else { - FILE *output = fopen(shell_env->output, - shell_env->output_append ? "a" : "w"); - if (output == NULL) { - fprintf(stderr, "shell: open output %s failed: %s\n", - shell_env->output, strerror(errno)); - rtems_shell_clear_shell_env(); - return false; - } - stdout = output; - stdoutToClose = output; - } - - if (shell_env->input == NULL || strcmp(shell_env->input, "stdin") == 0) { - if (shell_env->parent_stdin != NULL) - stdin = shell_env->parent_stdin; - } else { - FILE *input = fopen(shell_env->input, "r"); - if (input == NULL) { - fprintf(stderr, "shell: open input %s failed: %s\n", - shell_env->input, strerror(errno)); - if (stdoutToClose != NULL) - fclose(stdoutToClose); - rtems_shell_clear_shell_env(); + bool result = false; + int line = 0; + int cmd_count; + char *cmds[RTEMS_SHELL_CMD_COUNT]; + char *cmd_argv; + char *prompt; + + if (interactive) { + prompt = malloc(RTEMS_SHELL_PROMPT_SIZE); + if (prompt == NULL) { + fprintf(stderr, "shell: cannot allocate prompt memory\n"); return false; } - stdin = input; - stdinToClose = input; - shell_env->forever = false; - input_file = true; - } - if (!input_file) { - if (stdin == NULL) { - fprintf(stderr, "shell: stdin is NULLs\n"); - if (stdoutToClose != NULL) - fclose(stdoutToClose); - rtems_shell_clear_shell_env(); - return false; - } - /* Make a raw terminal, Linux Manuals */ - if (tcgetattr(fileno(stdin), &previous_term) >= 0) { - term = previous_term; - term.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); - term.c_oflag &= ~OPOST; - term.c_oflag |= (OPOST|ONLCR); /* But with cr+nl on output */ - term.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - term.c_cflag |= CLOCAL | CREAD; - term.c_cc[VMIN] = 1; - term.c_cc[VTIME] = 0; - if (tcsetattr (fileno(stdin), TCSADRAIN, &term) < 0) { - fprintf(stderr, - "shell: cannot set terminal attributes(%s)\n",shell_env->devname); - } - } cmd_count = RTEMS_SHELL_CMD_COUNT; - prompt = malloc(RTEMS_SHELL_PROMPT_SIZE); - if (!prompt) - fprintf(stderr, - "shell: cannot allocate prompt memory\n"); + } else { + prompt = NULL; + cmd_count = 1; } - shell_std_debug("child out: %d (%p)\n", fileno(stdout), stdout); - shell_std_debug("child in: %d (%p)\n", fileno(stdin), stdin); - - /* Do not buffer if interactive else leave buffered */ - if (!input_file) - setvbuf(stdin, NULL, _IONBF, 0); - setvbuf(stdout, NULL, _IONBF, 0); - /* * Allocate the command line buffers. */ @@ -988,6 +1056,7 @@ bool rtems_shell_main_loop( } if (cmd_argv && cmds[0]) { + size_t cmd; memset (cmds[0], 0, cmd_count * RTEMS_SHELL_CMD_SIZE); @@ -1018,23 +1087,25 @@ bool rtems_shell_main_loop( } if (result) { - const char *c; memset (cmds[0], 0, cmd_count * RTEMS_SHELL_CMD_SIZE); - if (!input_file) { + + if (interactive) { rtems_shell_cat_file(stdout,"/etc/motd"); fprintf(stdout, "\n" "RTEMS Shell on %s. Use 'help' to list commands.\n", shell_env->devname); - } - - if (input_file) - chdir(shell_env->cwd); - else chdir("/"); /* XXX: chdir to getpwent homedir */ + } else { + chdir(shell_env->cwd); + } shell_env->exit_shell = false; for (;;) { + const char *c; + int argc; + char *argv[RTEMS_SHELL_MAXIMUM_ARGUMENTS]; + /* Prompt section */ if (prompt) { rtems_shell_get_prompt(shell_env, prompt, @@ -1044,7 +1115,7 @@ bool rtems_shell_main_loop( /* getcmd section */ cmd = rtems_shell_line_editor(cmds, cmd_count, RTEMS_SHELL_CMD_SIZE, prompt, - stdin, stdout); + stdin, line_editor_output); if (cmd == -1) continue; /* empty line */ @@ -1090,7 +1161,9 @@ bool rtems_shell_main_loop( memcpy (cmd_argv, cmds[cmd], RTEMS_SHELL_CMD_SIZE); if (!rtems_shell_make_args(cmd_argv, &argc, argv, RTEMS_SHELL_MAXIMUM_ARGUMENTS)) { - int exit_code = rtems_shell_execute_cmd(argv[0], argc, argv); + int exit_code; + rtems_shell_winsize(); + exit_code = rtems_shell_execute_cmd(argv[0], argc, argv); if (shell_env->exit_code != NULL) *shell_env->exit_code = exit_code; if (exit_code != 0 && shell_env->exit_on_error) @@ -1107,16 +1180,156 @@ bool rtems_shell_main_loop( } shell_std_debug("end: %d %d\n", result, shell_env->forever); } while (result && shell_env->forever); + } + + free(cmds[0]); + free(cmd_argv); + free(prompt); + + return result; +} + +bool rtems_shell_run_main_loop( + rtems_shell_env_t *shell_env, + bool interactive, + FILE *line_editor_output +) +{ + bool result; + if (shell_env->magic != SHELL_MAGIC) { + return false; + } + + if (!rtems_shell_init_user_env()) { + return false; } - if (cmds[0]) - free (cmds[0]); - if (cmd_argv) - free (cmd_argv); - if (prompt) - free (prompt); + if (!rtems_shell_set_shell_env(shell_env)) { + return false; + } + + result = shell_main_loop(shell_env, interactive, line_editor_output); + rtems_shell_clear_shell_env(); + return result; +} + +bool rtems_shell_main_loop( + rtems_shell_env_t *shell_env +) +{ + struct termios term; + struct termios previous_term; + bool result; + bool interactive = true; + FILE *stdinToClose = NULL; + FILE *stdoutToClose = NULL; + FILE *line_editor_output; + + if (shell_env->magic != SHELL_MAGIC) { + rtems_error(0, "invalid shell environment passed to the main loop)"); + return false; + } + + if (!rtems_shell_set_shell_env(shell_env)) + return false; + + if (!rtems_shell_init_user_env()) { + rtems_error(0, "rtems_shell_init_user_env"); + rtems_shell_clear_shell_env(); + return false; + } + + shell_std_debug("env: %p\n", shell_env); + + if (shell_env->output == NULL || strcmp(shell_env->output, "stdout") == 0) { + if (shell_env->parent_stdout != NULL) + stdout = shell_env->parent_stdout; + } + else if (strcmp(shell_env->output, "stderr") == 0) { + if (shell_env->parent_stderr != NULL) + stdout = shell_env->parent_stderr; + else + stdout = stderr; + } else if (strcmp(shell_env->output, "/dev/null") == 0) { + if (stdout == NULL) { + fprintf(stderr, "shell: stdout is NULLs\n"); + rtems_shell_clear_shell_env(); + return false; + } + fclose (stdout); + } else { + FILE *output = fopen(shell_env->output, + shell_env->output_append ? "a" : "w"); + if (output == NULL) { + fprintf(stderr, "shell: open output %s failed: %s\n", + shell_env->output, strerror(errno)); + rtems_shell_clear_shell_env(); + return false; + } + stdout = output; + stdoutToClose = output; + } + + if (shell_env->input == NULL || strcmp(shell_env->input, "stdin") == 0) { + if (shell_env->parent_stdin != NULL) + stdin = shell_env->parent_stdin; + } else { + FILE *input = fopen(shell_env->input, "r"); + if (input == NULL) { + fprintf(stderr, "shell: open input %s failed: %s\n", + shell_env->input, strerror(errno)); + if (stdoutToClose != NULL) + fclose(stdoutToClose); + rtems_shell_clear_shell_env(); + return false; + } + stdin = input; + stdinToClose = input; + shell_env->forever = false; + interactive = false; + } + + if (interactive) { + if (stdin == NULL) { + fprintf(stderr, "shell: stdin is NULLs\n"); + if (stdoutToClose != NULL) + fclose(stdoutToClose); + rtems_shell_clear_shell_env(); + return false; + } + /* Make a raw terminal, Linux Manuals */ + if (tcgetattr(fileno(stdin), &previous_term) >= 0) { + term = previous_term; + term.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); + term.c_oflag &= ~OPOST; + term.c_oflag |= (OPOST|ONLCR); /* But with cr+nl on output */ + term.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); + term.c_cflag |= CLOCAL | CREAD; + term.c_cc[VMIN] = 1; + term.c_cc[VTIME] = 0; + if (tcsetattr (fileno(stdin), TCSADRAIN, &term) < 0) { + fprintf(stderr, + "shell: cannot set terminal attributes(%s)\n",shell_env->devname); + } + } + } + + shell_std_debug("child out: %d (%p)\n", fileno(stdout), stdout); + shell_std_debug("child in: %d (%p)\n", fileno(stdin), stdin); + + /* Do not buffer if interactive else leave buffered */ + if (interactive) + setvbuf(stdin, NULL, _IONBF, 0); + setvbuf(stdout, NULL, _IONBF, 0); + + if (isatty(fileno(stdin))) { + line_editor_output = stdout; + } else { + line_editor_output = NULL; + } + result = shell_main_loop(shell_env, interactive, line_editor_output); shell_std_debug("child in-to-close: %p\n", stdinToClose); shell_std_debug("child out-to-close: %p\n", stdoutToClose); @@ -1149,7 +1362,6 @@ static rtems_status_code rtems_shell_run ( const char *output, bool output_append, rtems_id wake_on_end, - int *exit_code, bool echo, rtems_shell_login_check_t login_check ) @@ -1165,7 +1377,7 @@ static rtems_status_code rtems_shell_run ( name = rtems_build_name( task_name[0], task_name[1], task_name[2], task_name[3]); else - name = rtems_build_name( 'S', 'E', 'N', 'V' ); + name = SHELL_MAGIC; sc = rtems_task_create( name, @@ -1202,7 +1414,6 @@ static rtems_status_code rtems_shell_run ( shell_env->parent_stdout = stdout; shell_env->parent_stderr = stderr; shell_env->wake_on_end = wake_on_end; - shell_env->exit_code = exit_code; shell_env->login_check = login_check; shell_env->uid = getuid(); shell_env->gid = getgid(); @@ -1229,7 +1440,7 @@ static rtems_status_code rtems_shell_run ( sc = rtems_event_receive (RTEMS_EVENT_1, RTEMS_WAIT, 0, &out); } - shell_std_debug("run: end: sc:%d ec:%d\n", sc, *exit_code); + shell_std_debug("run: end: sc:%d\n", sc); return sc; } @@ -1245,7 +1456,6 @@ rtems_status_code rtems_shell_init( ) { rtems_id to_wake = RTEMS_ID_NONE; - int exit_code = 0; if ( wait ) to_wake = rtems_task_self(); @@ -1261,7 +1471,6 @@ rtems_status_code rtems_shell_init( "stdout", /* output */ false, /* output_append */ to_wake, /* wake_on_end */ - &exit_code, /* exit code of command */ false, /* echo */ login_check /* login check */ ); @@ -1279,7 +1488,6 @@ rtems_status_code rtems_shell_script ( ) { rtems_id to_wake = RTEMS_ID_NONE; - int exit_code = 0; rtems_status_code sc; shell_std_debug("script: in: %s out: %s\n", input, output); @@ -1298,7 +1506,6 @@ rtems_status_code rtems_shell_script ( output, /* output */ output_append, /* output_append */ to_wake, /* wake_on_end */ - &exit_code, /* exit_code */ echo, /* echo */ NULL /* login check */ ); diff --git a/cpukit/libmisc/shell/shell_cmdset.c b/cpukit/libmisc/shell/shell_cmdset.c index 95f180bbb5..89a6aeb32b 100644 --- a/cpukit/libmisc/shell/shell_cmdset.c +++ b/cpukit/libmisc/shell/shell_cmdset.c @@ -1,10 +1,11 @@ +/** + * @file + * + * @brief Shell Command Set Management + */ + /* - * - * Shell Command Set Management - * - * Author: - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at diff --git a/cpukit/libmisc/shell/write_file.c b/cpukit/libmisc/shell/write_file.c index cc57f4c2c2..1cceb0c6ea 100644 --- a/cpukit/libmisc/shell/write_file.c +++ b/cpukit/libmisc/shell/write_file.c @@ -1,11 +1,11 @@ +/** + * @file + * + * @brief Write buffer to a file + */ + /* - * - * Write buffer to a file - * - * Author: - * - * WORK: fernando.ruiz@ctv.es - * HOME: correo@fernando-ruiz.com + * Copyright (c) 2001 Fernando Ruiz Casas <fruizcasas@gmail.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at |