summaryrefslogtreecommitdiff
path: root/nuttx/examples/nsh/nsh_main.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-14 23:34:37 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-03-14 23:34:37 +0000
commit6903177bb0e49e1771de6a1f0a2cba21eaa123be (patch)
tree3f25334f1ce2e64517ab8288a3371cd5483bcc03 /nuttx/examples/nsh/nsh_main.c
parent1df59ef5f64b5af480e4048e904f65d0682fc56b (diff)
downloadpx4-nuttx-6903177bb0e49e1771de6a1f0a2cba21eaa123be.tar.gz
px4-nuttx-6903177bb0e49e1771de6a1f0a2cba21eaa123be.tar.bz2
px4-nuttx-6903177bb0e49e1771de6a1f0a2cba21eaa123be.zip
Add 'ls' command to nsh
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@63 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/examples/nsh/nsh_main.c')
-rw-r--r--nuttx/examples/nsh/nsh_main.c95
1 files changed, 77 insertions, 18 deletions
diff --git a/nuttx/examples/nsh/nsh_main.c b/nuttx/examples/nsh/nsh_main.c
index 4135b2828..e9c8466c3 100644
--- a/nuttx/examples/nsh/nsh_main.c
+++ b/nuttx/examples/nsh/nsh_main.c
@@ -34,15 +34,12 @@
************************************************************/
/************************************************************
- * Compilation Switches
- ************************************************************/
-
-/************************************************************
* Included Files
************************************************************/
#include <stdio.h>
#include <stdlib.h>
+#include <dirent.h>
#include <string.h>
#include <sched.h>
@@ -51,12 +48,13 @@
************************************************************/
#define CONFIG_NSH_LINE_SIZE 80
+#undef CONFIG_FULL_PATH
/************************************************************
* Private Types
************************************************************/
-typedef void (*cmd_t)(const char *cmd, const char *arg);
+typedef void (*cmd_t)(const char *cmd, char *arg);
typedef void (*exec_t)(void);
struct cmdmap_s
@@ -70,11 +68,11 @@ struct cmdmap_s
* Private Function Prototypes
************************************************************/
-static void cmd_echo(const char *cmd, const char *arg);
-static void cmd_exec(const char *cmd, const char *arg);
-static void cmd_help(const char *cmd, const char *arg);
-static void cmd_ls(const char *cmd, const char *arg);
-static void cmd_ps(const char *cmd, const char *arg);
+static void cmd_echo(const char *cmd, char *arg);
+static void cmd_exec(const char *cmd, char *arg);
+static void cmd_help(const char *cmd, char *arg);
+static void cmd_ls(const char *cmd, char *arg);
+static void cmd_ps(const char *cmd, char *arg);
/************************************************************
* Private Data
@@ -114,11 +112,16 @@ static const char g_fmtargrequired[] = "nsh: %s: argument required\n";
static const char g_fmtarginvalid[] = "nsh: %s: argument invalid\n";
static const char g_fmtcmdnotfound[] = "nsh: %s: command not found\n";
static const char g_fmtcmdnotimpl[] = "nsh: %s: command not implemented\n";
+static const char g_fmtnosuch[] = "nsh: %s: no such %s: %s\n";
/************************************************************
* Private Functions
************************************************************/
+/************************************************************
+ * Name: trim_arg
+ ************************************************************/
+
static char *trim_arg(char *arg)
{
if (arg)
@@ -129,7 +132,7 @@ static char *trim_arg(char *arg)
while (strchr(" \t", *arg) != NULL) arg++;
- /* Skip any leading white space */
+ /* Skip any trailing white space */
len = strlen(arg);
if (len > 0)
@@ -149,10 +152,28 @@ static char *trim_arg(char *arg)
}
/************************************************************
+ * Name: trim_dir
+ ************************************************************/
+
+#ifdef CONFIG_FULL_PATH
+void trim_dir(char *arg)
+{
+ /* Skip any '/' characters white space */
+
+ int len = strlen(arg) - 1;
+ while (len > 0 && arg[len] == '/')
+ {
+ arg[len] = '\0';
+ len--;
+ }
+}
+#endif
+
+/************************************************************
* Name: cmd_echo
************************************************************/
-static void cmd_echo(const char *cmd, const char *arg)
+static void cmd_echo(const char *cmd, char *arg)
{
/* Echo the rest of the line */
@@ -163,7 +184,7 @@ static void cmd_echo(const char *cmd, const char *arg)
* Name: cmd_exec
************************************************************/
-static void cmd_exec(const char *cmd, const char *arg)
+static void cmd_exec(const char *cmd, char *arg)
{
char *endptr;
long addr;
@@ -189,7 +210,7 @@ static void cmd_exec(const char *cmd, const char *arg)
* Name: cmd_help
************************************************************/
-static void cmd_help(const char *cmd, const char *arg)
+static void cmd_help(const char *cmd, char *arg)
{
const struct cmdmap_s *ptr;
@@ -211,9 +232,47 @@ static void cmd_help(const char *cmd, const char *arg)
* Name: cmd_ls
************************************************************/
-static void cmd_ls(const char *cmd, const char *arg)
+static void cmd_ls(const char *cmd, char *arg)
{
- printf(g_fmtcmdnotimpl, cmd);
+ DIR *dirp;
+
+#ifdef CONFIG_FULL_PATH
+ trim_dir(arg);
+#endif
+ dirp = opendir(arg);
+
+ if (!dirp)
+ {
+ printf(g_fmtnosuch, cmd, "directory", arg);
+ }
+
+ for (;;)
+ {
+ struct dirent *entryp = readdir(dirp);
+ if (!entryp)
+ {
+ break;
+ }
+
+ if (DIRENT_ISFILE(entryp->d_type))
+ {
+#ifdef CONFIG_FULL_PATH
+ printf(" %s/%s\n", arg, entryp->d_name);
+#else
+ printf(" %s\n", entryp->d_name);
+#endif
+ }
+
+ if (DIRENT_ISDIRECTORY(entryp->d_type))
+ {
+#ifdef CONFIG_FULL_PATH
+ printf(" %s/%s/\n", arg, entryp->d_name);
+#else
+ printf(" %s/\n", entryp->d_name);
+#endif
+ }
+ }
+ closedir(dirp);
}
/************************************************************
@@ -251,7 +310,7 @@ static void ps_task(FAR _TCB *tcb, FAR void *arg)
* Name: cmd_ps
************************************************************/
-static void cmd_ps(const char *cmd, const char *arg)
+static void cmd_ps(const char *cmd, char *arg)
{
printf("PID PRI SCHD TYPE NP STATE NAME\n");
sched_foreach(ps_task, NULL);
@@ -261,7 +320,7 @@ static void cmd_ps(const char *cmd, const char *arg)
* Name: cmd_unrecognized
************************************************************/
-static void cmd_unrecognized(const char *cmd, const char *arg)
+static void cmd_unrecognized(const char *cmd, char *arg)
{
printf(g_fmtcmdnotfound, cmd);
}