[PATCH 21/22] shell: Add CMDLS, CMDCHOWN, CMDCHMOD commands
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Nov 18 14:37:27 UTC 2014
---
cpukit/libmisc/Makefile.am | 3 +
cpukit/libmisc/shell/main_cmdchmod.c | 85 ++++++++++++++++
cpukit/libmisc/shell/main_cmdchown.c | 106 ++++++++++++++++++++
cpukit/libmisc/shell/main_cmdls.c | 91 +++++++++++++++++
cpukit/libmisc/shell/shellconfig.h | 18 ++++
doc/shell/general.t | 186 +++++++++++++++++++++++++++++++++++
6 files changed, 489 insertions(+)
create mode 100644 cpukit/libmisc/shell/main_cmdchmod.c
create mode 100644 cpukit/libmisc/shell/main_cmdchown.c
create mode 100644 cpukit/libmisc/shell/main_cmdls.c
diff --git a/cpukit/libmisc/Makefile.am b/cpukit/libmisc/Makefile.am
index 021a251..0cc9851 100644
--- a/cpukit/libmisc/Makefile.am
+++ b/cpukit/libmisc/Makefile.am
@@ -112,6 +112,9 @@ libshell_a_SOURCES = shell/cat_file.c shell/cmds.c shell/internal.h \
shell/main_lsof.c shell/main_edit.c \
shell/main_blkstats.c \
shell/shell-wait-for-input.c
+libshell_a_SOURCES += shell/main_cmdls.c
+libshell_a_SOURCES += shell/main_cmdchown.c
+libshell_a_SOURCES += shell/main_cmdchmod.c
if LIBNETWORKING
libshell_a_SOURCES += \
diff --git a/cpukit/libmisc/shell/main_cmdchmod.c b/cpukit/libmisc/shell/main_cmdchmod.c
new file mode 100644
index 0000000..ea125fd
--- /dev/null
+++ b/cpukit/libmisc/shell/main_cmdchmod.c
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems at embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <rtems/shellconfig.h>
+#include <rtems/stringto.h>
+
+#include "internal.h"
+
+static int usage(void)
+{
+ puts(rtems_shell_CMDCHMOD_Command.usage);
+
+ return -1;
+}
+
+static void error(const char *s, int eno)
+{
+ printf("%s: %s\n", s, strerror(eno));
+}
+
+static int rtems_shell_main_cmdchmod(int argc, char **argv)
+{
+ if (argc >= 2) {
+ unsigned long mode;
+ rtems_status_code sc;
+ uid_t task_uid;
+ int i;
+
+ sc = rtems_string_to_unsigned_long(argv[1], &mode, NULL, 8);
+ if (sc != RTEMS_SUCCESSFUL) {
+ return usage();
+ }
+
+ task_uid = getuid();
+
+ for (i = 2; i < argc; ++i) {
+ const char *cmd = argv[i];
+ rtems_shell_cmd_t *shell_cmd = rtems_shell_lookup_cmd(cmd);
+
+ if (shell_cmd != NULL) {
+ if (task_uid == 0 || task_uid == shell_cmd->uid) {
+ shell_cmd->mode = mode
+ & (S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ } else if (rtems_shell_can_see_cmd(shell_cmd)) {
+ error(cmd, EACCES);
+ } else {
+ error(cmd, ENOENT);
+ }
+ } else {
+ error(cmd, ENOENT);
+ }
+ }
+ } else {
+ return usage();
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_CMDCHMOD_Command = {
+ .name = "cmdchmod",
+ .usage = "cmdchmod OCTAL-MODE COMMAND...",
+ .topic = "misc",
+ .command = rtems_shell_main_cmdchmod
+};
diff --git a/cpukit/libmisc/shell/main_cmdchown.c b/cpukit/libmisc/shell/main_cmdchown.c
new file mode 100644
index 0000000..9cc8c44
--- /dev/null
+++ b/cpukit/libmisc/shell/main_cmdchown.c
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems at embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <rtems/shellconfig.h>
+
+#include "internal.h"
+
+static int usage(void)
+{
+ puts(rtems_shell_CMDCHOWN_Command.usage);
+
+ return -1;
+}
+
+static void error(const char *s, int eno)
+{
+ printf("%s: %s\n", s, strerror(eno));
+}
+
+static int rtems_shell_main_cmdchown(int argc, char **argv)
+{
+ if (argc >= 2) {
+ const char *s = argv[1];
+ unsigned new_uid = UINT_MAX;
+ unsigned new_gid = UINT_MAX;
+ bool change_uid = false;
+ bool change_gid = false;
+ uid_t task_uid;
+ int i;
+
+ if (strcmp(s, ":") != 0) {
+ int n = sscanf(argv[1], "%u:%u", &new_uid, &new_gid);
+
+ if (n == 2) {
+ change_uid = true;
+ change_gid = true;
+ } else if (n == 1) {
+ change_uid = true;
+ } else {
+ n = sscanf(argv[1], ":%u", &new_gid);
+
+ if (n == 1) {
+ change_gid = true;
+ } else {
+ return usage();
+ }
+ }
+ }
+
+ task_uid = getuid();
+
+ for (i = 2; i < argc; ++i) {
+ const char *cmd = argv[i];
+ rtems_shell_cmd_t *shell_cmd = rtems_shell_lookup_cmd(cmd);
+
+ if (shell_cmd != NULL) {
+ if (task_uid == 0 || task_uid == shell_cmd->uid) {
+ if (change_uid) {
+ shell_cmd->uid = new_uid;
+ }
+
+ if (change_gid) {
+ shell_cmd->gid = new_gid;
+ }
+ } else if (rtems_shell_can_see_cmd(shell_cmd)) {
+ error(cmd, EACCES);
+ } else {
+ error(cmd, ENOENT);
+ }
+ } else {
+ error(cmd, ENOENT);
+ }
+ }
+ } else {
+ return usage();
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_CMDCHOWN_Command = {
+ .name = "cmdchown",
+ .usage = "cmdchown [OWNER][:[GROUP]] COMMAND...",
+ .topic = "misc",
+ .command = rtems_shell_main_cmdchown
+};
diff --git a/cpukit/libmisc/shell/main_cmdls.c b/cpukit/libmisc/shell/main_cmdls.c
new file mode 100644
index 0000000..f08925c
--- /dev/null
+++ b/cpukit/libmisc/shell/main_cmdls.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems at embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <rtems/shellconfig.h>
+
+#include "internal.h"
+
+static void error(const char *s, int eno)
+{
+ printf("%s: %s\n", s, strerror(eno));
+}
+
+static void print_cmd(const rtems_shell_cmd_t *shell_cmd)
+{
+ if (rtems_shell_can_see_cmd(shell_cmd)) {
+ mode_t m = shell_cmd->mode;
+
+ printf(
+ "%c%c%c%c%c%c%c%c%c %5u %5u %s\n",
+ (m & S_IRUSR) != 0 ? 'r' : '-',
+ (m & S_IWUSR) != 0 ? 'w' : '-',
+ (m & S_IXUSR) != 0 ? 'x' : '-',
+ (m & S_IRGRP) != 0 ? 'r' : '-',
+ (m & S_IWGRP) != 0 ? 'w' : '-',
+ (m & S_IXGRP) != 0 ? 'x' : '-',
+ (m & S_IROTH) != 0 ? 'r' : '-',
+ (m & S_IWOTH) != 0 ? 'w' : '-',
+ (m & S_IXOTH) != 0 ? 'x' : '-',
+ (unsigned) shell_cmd->uid,
+ (unsigned) shell_cmd->gid,
+ shell_cmd->name
+ );
+ }
+}
+
+static int rtems_shell_main_cmdls(int argc, char **argv)
+{
+ const rtems_shell_cmd_t *shell_cmd;
+
+ if (argc <= 1) {
+ shell_cmd = rtems_shell_first_cmd;
+
+ while (shell_cmd != NULL) {
+ print_cmd(shell_cmd);
+
+ shell_cmd = shell_cmd->next;
+ }
+ } else {
+ int i;
+
+ for (i = 1; i < argc; ++i) {
+ const char *cmd = argv[i];
+
+ shell_cmd = rtems_shell_lookup_cmd(cmd);
+
+ if (shell_cmd != NULL) {
+ print_cmd(shell_cmd);
+ } else {
+ error(cmd, ENOENT);
+ }
+ }
+ }
+
+ return 0;
+}
+
+rtems_shell_cmd_t rtems_shell_CMDLS_Command = {
+ .name = "cmdls",
+ .usage = "cmdls COMMAND...",
+ .topic = "misc",
+ .command = rtems_shell_main_cmdls
+};
diff --git a/cpukit/libmisc/shell/shellconfig.h b/cpukit/libmisc/shell/shellconfig.h
index c5fced3..cc2165b 100644
--- a/cpukit/libmisc/shell/shellconfig.h
+++ b/cpukit/libmisc/shell/shellconfig.h
@@ -24,6 +24,9 @@
extern rtems_shell_cmd_t rtems_shell_HELP_Command;
extern rtems_shell_cmd_t rtems_shell_ALIAS_Command;
extern rtems_shell_cmd_t rtems_shell_TIME_Command;
+extern rtems_shell_cmd_t rtems_shell_CMDLS_Command;
+extern rtems_shell_cmd_t rtems_shell_CMDCHOWN_Command;
+extern rtems_shell_cmd_t rtems_shell_CMDCHMOD_Command;
extern rtems_shell_cmd_t rtems_shell_LOGOFF_Command;
extern rtems_shell_cmd_t rtems_shell_SETENV_Command;
extern rtems_shell_cmd_t rtems_shell_GETENV_Command;
@@ -162,6 +165,21 @@ extern rtems_shell_alias_t * const rtems_shell_Initial_aliases[];
* Common commands that can be optional
*/
#if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
+ !defined(CONFIGURE_SHELL_NO_COMMAND_CMDLS)) || \
+ defined(CONFIGURE_SHELL_COMMAND_CMDLS)
+ &rtems_shell_CMDLS_Command,
+ #endif
+ #if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
+ !defined(CONFIGURE_SHELL_NO_COMMAND_CMDCHOWN)) || \
+ defined(CONFIGURE_SHELL_COMMAND_CMDCHOWN)
+ &rtems_shell_CMDCHOWN_Command,
+ #endif
+ #if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
+ !defined(CONFIGURE_SHELL_NO_COMMAND_CMDCHMOD)) || \
+ defined(CONFIGURE_SHELL_COMMAND_CMDCHMOD)
+ &rtems_shell_CMDCHMOD_Command,
+ #endif
+ #if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
!defined(CONFIGURE_SHELL_NO_COMMAND_JOEL)) || \
defined(CONFIGURE_SHELL_COMMAND_JOEL)
&rtems_shell_JOEL_Command,
diff --git a/doc/shell/general.t b/doc/shell/general.t
index c0df5c1..ce8a5bb 100644
--- a/doc/shell/general.t
+++ b/doc/shell/general.t
@@ -13,6 +13,9 @@ The RTEMS shell has the following general commands:
@item @code{help} - Print command help
@item @code{alias} - Add alias for an existing command
+ at item @code{cmdls} - List commands
+ at item @code{cmdchown} - Change user or owner of commands
+ at item @code{cmdchmod} - Change mode of commands
@item @code{date} - Print or set current date and time
@item @code{echo} - Produce message in a shell script
@item @code{sleep} - Delay for a specified amount of time
@@ -196,6 +199,189 @@ extern rtems_shell_cmd_t rtems_shell_ALIAS_Command;
@c
@c
@page
+ at subsection cmdls - List commands
+
+ at pgindex cmdls
+
+ at subheading SYNOPSYS:
+
+ at example
+cmdls COMMAND...
+ at end example
+
+ at subheading DESCRIPTION:
+
+This command lists the visible commands of the command set.
+
+ at subheading EXIT STATUS:
+
+This command returns 0 on success and non-zero if an error is encountered.
+
+ at subheading NOTES:
+
+The current user must have read permission to list a command.
+
+ at subheading EXAMPLES:
+
+The following is an example of how to use @code{cmdls}:
+
+ at example
+SHLL [/] # cmdls help shutdown
+r-xr-xr-x 0 0 help
+r-x------ 0 0 shutdown
+ at end example
+
+ at subheading CONFIGURATION:
+
+ at findex CONFIGURE_SHELL_NO_COMMAND_CMDLS
+ at findex CONFIGURE_SHELL_COMMAND_CMDLS
+
+This command is included in the default shell command set.
+When building a custom command set, define
+ at code{CONFIGURE_SHELL_COMMAND_CMDLS} to have this
+command included.
+
+This command can be excluded from the shell command set by
+defining @code{CONFIGURE_SHELL_NO_COMMAND_CMDLS} when all
+shell commands have been configured.
+
+ at subheading PROGRAMMING INFORMATION:
+
+The configuration structure for the @code{cmdls} has the
+following prototype:
+
+ at example
+extern rtems_shell_cmd_t rtems_shell_CMDLS_Command;
+ at end example
+
+ at c
+ at c
+ at c
+ at page
+ at subsection cmdchown - Change user or owner of commands
+
+ at pgindex cmdchown
+
+ at subheading SYNOPSYS:
+
+ at example
+cmdchown [OWNER][:[GROUP]] COMMAND...
+ at end example
+
+ at subheading DESCRIPTION:
+
+This command changes the user or owner of a command.
+
+ at subheading EXIT STATUS:
+
+This command returns 0 on success and non-zero if an error is encountered.
+
+ at subheading NOTES:
+
+The current user must have an UID of zero or be the command owner to change the
+owner or group.
+
+ at subheading EXAMPLES:
+
+The following is an example of how to use @code{cmdchown}:
+
+ at example
+[/] # cmdls help
+r-xr-xr-x 0 0 help
+[/] # cmdchown 1:1 help
+[/] # cmdls help
+r--r--r-- 1 1 help
+ at end example
+
+ at subheading CONFIGURATION:
+
+ at findex CONFIGURE_SHELL_NO_COMMAND_CMDCHOWN
+ at findex CONFIGURE_SHELL_COMMAND_CMDCHOWN
+
+This command is included in the default shell command set.
+When building a custom command set, define
+ at code{CONFIGURE_SHELL_COMMAND_CMDCHOWN} to have this
+command included.
+
+This command can be excluded from the shell command set by
+defining @code{CONFIGURE_SHELL_NO_COMMAND_CMDCHOWN} when all
+shell commands have been configured.
+
+ at subheading PROGRAMMING INFORMATION:
+
+The configuration structure for the @code{cmdchown} has the
+following prototype:
+
+ at example
+extern rtems_shell_cmd_t rtems_shell_CMDCHOWN_Command;
+ at end example
+
+ at c
+ at c
+ at c
+ at page
+ at subsection cmdchmod - Change mode of commands
+
+ at pgindex cmdchmod
+
+ at subheading SYNOPSYS:
+
+ at example
+cmdchmod OCTAL-MODE COMMAND...
+ at end example
+
+ at subheading DESCRIPTION:
+
+This command changes the mode of a command.
+
+ at subheading EXIT STATUS:
+
+This command returns 0 on success and non-zero if an error is encountered.
+
+ at subheading NOTES:
+
+The current user must have an UID of zero or be the command owner to change the
+mode.
+
+ at subheading EXAMPLES:
+
+The following is an example of how to use @code{cmdchmod}:
+
+ at example
+[/] # cmdls help
+r-xr-xr-x 0 0 help
+[/] # cmdchmod 544 help
+[/] # cmdls help
+r-xr--r-- 0 0 help
+ at end example
+
+ at subheading CONFIGURATION:
+
+ at findex CONFIGURE_SHELL_NO_COMMAND_CMDCHMOD
+ at findex CONFIGURE_SHELL_COMMAND_CMDCHMOD
+
+This command is included in the default shell command set.
+When building a custom command set, define
+ at code{CONFIGURE_SHELL_COMMAND_CMDCHMOD} to have this
+command included.
+
+This command can be excluded from the shell command set by
+defining @code{CONFIGURE_SHELL_NO_COMMAND_CMDCHMOD} when all
+shell commands have been configured.
+
+ at subheading PROGRAMMING INFORMATION:
+
+The configuration structure for the @code{cmdchmod} has the
+following prototype:
+
+ at example
+extern rtems_shell_cmd_t rtems_shell_CMDCHMOD_Command;
+ at end example
+
+ at c
+ at c
+ at c
+ at page
@subsection date - print or set current date and time
@pgindex date
--
1.8.4.5
More information about the devel
mailing list