summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/shell
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libmisc/shell')
-rw-r--r--cpukit/libmisc/shell/cat_file.c12
-rw-r--r--cpukit/libmisc/shell/cmds.c12
-rw-r--r--cpukit/libmisc/shell/fdisk.c5
-rw-r--r--cpukit/libmisc/shell/hexdump-conv.c4
-rw-r--r--cpukit/libmisc/shell/login_check.c8
-rw-r--r--cpukit/libmisc/shell/login_prompt.c8
-rw-r--r--cpukit/libmisc/shell/main_alias.c12
-rw-r--r--cpukit/libmisc/shell/main_blkstats.c8
-rw-r--r--cpukit/libmisc/shell/main_blksync.c12
-rw-r--r--cpukit/libmisc/shell/main_cat.c12
-rw-r--r--cpukit/libmisc/shell/main_cd.c12
-rw-r--r--cpukit/libmisc/shell/main_chdir.c12
-rw-r--r--cpukit/libmisc/shell/main_chmod.c14
-rw-r--r--cpukit/libmisc/shell/main_chroot.c12
-rw-r--r--cpukit/libmisc/shell/main_cmdchmod.c8
-rw-r--r--cpukit/libmisc/shell/main_cmdchown.c8
-rw-r--r--cpukit/libmisc/shell/main_cmdls.c8
-rw-r--r--cpukit/libmisc/shell/main_cpuinfo.c8
-rw-r--r--cpukit/libmisc/shell/main_date.c15
-rw-r--r--cpukit/libmisc/shell/main_dir.c12
-rw-r--r--cpukit/libmisc/shell/main_drvmgr.c25
-rw-r--r--cpukit/libmisc/shell/main_edit.c40
-rw-r--r--cpukit/libmisc/shell/main_exit.c12
-rw-r--r--cpukit/libmisc/shell/main_flashdev.c584
-rw-r--r--cpukit/libmisc/shell/main_getenv.c31
-rw-r--r--cpukit/libmisc/shell/main_help.c94
-rw-r--r--cpukit/libmisc/shell/main_i2cdetect.c2
-rw-r--r--cpukit/libmisc/shell/main_i2cget.c2
-rw-r--r--cpukit/libmisc/shell/main_i2cset.c2
-rw-r--r--cpukit/libmisc/shell/main_id.c12
-rw-r--r--cpukit/libmisc/shell/main_logoff.c12
-rw-r--r--cpukit/libmisc/shell/main_lsof.c8
-rw-r--r--cpukit/libmisc/shell/main_mdump.c12
-rw-r--r--cpukit/libmisc/shell/main_medit.c12
-rw-r--r--cpukit/libmisc/shell/main_mfill.c12
-rw-r--r--cpukit/libmisc/shell/main_mkdir.c12
-rw-r--r--cpukit/libmisc/shell/main_mmove.c14
-rw-r--r--cpukit/libmisc/shell/main_mount.c12
-rw-r--r--cpukit/libmisc/shell/main_mount_nfs.c12
-rw-r--r--cpukit/libmisc/shell/main_pci.c27
-rw-r--r--cpukit/libmisc/shell/main_profreport.c8
-rw-r--r--cpukit/libmisc/shell/main_pwd.c12
-rw-r--r--cpukit/libmisc/shell/main_rmdir.c12
-rw-r--r--cpukit/libmisc/shell/main_rtc.c7
-rw-r--r--cpukit/libmisc/shell/main_rtems.c156
-rw-r--r--cpukit/libmisc/shell/main_setenv.c31
-rw-r--r--cpukit/libmisc/shell/main_spi.c2
-rw-r--r--cpukit/libmisc/shell/main_tty.c12
-rw-r--r--cpukit/libmisc/shell/main_umask.c12
-rw-r--r--cpukit/libmisc/shell/main_unmount.c12
-rw-r--r--cpukit/libmisc/shell/main_unsetenv.c31
-rw-r--r--cpukit/libmisc/shell/main_whoami.c12
-rw-r--r--cpukit/libmisc/shell/shell-wait-for-input.c8
-rw-r--r--cpukit/libmisc/shell/shell.c605
-rw-r--r--cpukit/libmisc/shell/shell_cmdset.c13
-rw-r--r--cpukit/libmisc/shell/write_file.c14
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