summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/shell/main_cmdchmod.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-11-18 14:05:15 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-11-20 10:30:26 +0100
commit3fe5d01bc0d54465a6a05aab0d715855bbbc8009 (patch)
tree245fb018fd38c0ff3c3586386f2619f8e5d754f7 /cpukit/libmisc/shell/main_cmdchmod.c
parentshell: Fix help topic header (diff)
downloadrtems-3fe5d01bc0d54465a6a05aab0d715855bbbc8009.tar.bz2
shell: Add CMDLS, CMDCHOWN, CMDCHMOD commands
Diffstat (limited to 'cpukit/libmisc/shell/main_cmdchmod.c')
-rw-r--r--cpukit/libmisc/shell/main_cmdchmod.c85
1 files changed, 85 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
+};