diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-11-18 14:05:15 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-11-20 10:30:26 +0100 |
commit | 3fe5d01bc0d54465a6a05aab0d715855bbbc8009 (patch) | |
tree | 245fb018fd38c0ff3c3586386f2619f8e5d754f7 /cpukit/libmisc/shell | |
parent | shell: Fix help topic header (diff) | |
download | rtems-3fe5d01bc0d54465a6a05aab0d715855bbbc8009.tar.bz2 |
shell: Add CMDLS, CMDCHOWN, CMDCHMOD commands
Diffstat (limited to 'cpukit/libmisc/shell')
-rw-r--r-- | cpukit/libmisc/shell/main_cmdchmod.c | 85 | ||||
-rw-r--r-- | cpukit/libmisc/shell/main_cmdchown.c | 106 | ||||
-rw-r--r-- | cpukit/libmisc/shell/main_cmdls.c | 91 | ||||
-rw-r--r-- | cpukit/libmisc/shell/shellconfig.h | 18 |
4 files changed, 300 insertions, 0 deletions
diff --git a/cpukit/libmisc/shell/main_cmdchmod.c b/cpukit/libmisc/shell/main_cmdchmod.c new file mode 100644 index 0000000000..ea125fddd8 --- /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@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 0000000000..9cc8c4435e --- /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@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 0000000000..f08925c3f3 --- /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@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 c5fced3513..cc2165b419 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, |