From 178c9780a82ba4b35dfab1177be0b8fa58247b76 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 23 Nov 2015 10:21:15 -0600 Subject: [PATCH] NSH: Add support for basename and dirname commands --- ChangeLog.txt | 3 +++ nshlib/Kconfig | 10 ++++++++ nshlib/README.txt | 49 +++++++++++++++++++++++------------- nshlib/nsh.h | 6 +++++ nshlib/nsh_command.c | 8 ++++++ nshlib/nsh_fscmds.c | 60 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 118 insertions(+), 18 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 7b8f57455..8c378ae29 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1455,3 +1455,6 @@ uses only open and ioctl. From Ken Petit (2015-11-23). * apps/fsutils/smartfs/ and apps/nshlib/: Add configuration option to supported multiple root directories. From Ken Petit (2015-11-23). + * apps/nshlib: Add support for 'basename' and 'dirname' commands + (2015-11-23). + diff --git a/nshlib/Kconfig b/nshlib/Kconfig index 916d77cc0..649c16c66 100644 --- a/nshlib/Kconfig +++ b/nshlib/Kconfig @@ -164,6 +164,11 @@ config NSH_DISABLE_BASE64ENC default n if !DEFAULT_SMALL depends on NETUTILS_CODECS && CODECS_BASE64 +config NSH_DISABLE_BASENAME + bool "Disable basename" + default y if DEFAULT_SMALL + default n if !DEFAULT_SMALL + config NSH_DISABLE_CAT bool "Disable cat" default n @@ -201,6 +206,11 @@ config NSH_DISABLE_DELROUTE default y if DEFAULT_SMALL default n if !DEFAULT_SMALL +config NSH_DISABLE_DIRNAME + bool "Disable dirname" + default y if DEFAULT_SMALL + default n if !DEFAULT_SMALL + config NSH_DISABLE_ECHO bool "Disable echo" default n diff --git a/nshlib/README.txt b/nshlib/README.txt index 16bf825ff..e720ebf76 100644 --- a/nshlib/README.txt +++ b/nshlib/README.txt @@ -301,6 +301,11 @@ o base64dec [-w] [-f] o base64dec [-w] [-f] +o basename [] + + Extract the final string from a by removing the preceding path + segments and (optionally) removing any trailing . + o break The break command is only meaningful within the body of the a while or @@ -413,6 +418,11 @@ o df 512 985 2 983 /tmp nsh> +o dirname + + Extract the path string leading up to the full by removing + the final directory or file name. + o echo [ [...]] Copy the sequence of strings and expanded environment variables to @@ -1000,13 +1010,15 @@ Command Dependencies on Configuration Settings addroute CONFIG_NET && CONFIG_NET_ROUTE base64dec CONFIG_NETUTILS_CODECS && CONFIG_CODECS_BASE64 base64enc CONFIG_NETUTILS_CODECS && CONFIG_CODECS_BASE64 + basename -- break !CONFIG_NSH_DISABLESCRIPT && !CONFIG_NSH_DISABLE_LOOPS cat CONFIG_NFILE_DESCRIPTORS > 0 cd !CONFIG_DISABLE_ENVIRON && CONFIG_NFILE_DESCRIPTORS > 0 cp CONFIG_NFILE_DESCRIPTORS > 0 dd CONFIG_NFILE_DESCRIPTORS > 0 - delrout CONFIG_NET && CONFIG_NET_ROUTE + delroute CONFIG_NET && CONFIG_NET_ROUTE df !CONFIG_DISABLE_MOUNTPOINT && CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_FS_READABLE (see note 3) + dirname -- echo -- exec -- exit -- @@ -1069,23 +1081,24 @@ settings. All of these settings make the configuration of NSH potentially compl also allow it to squeeze into very small memory footprints. CONFIG_NSH_DISABLE_ADDROUTE, CONFIG_NSH_DISABLE_BASE64DEC, CONFIG_NSH_DISABLE_BASE64ENC, - CONFIG_NSH_DISABLE_CAT, CONFIG_NSH_DISABLE_CD, CONFIG_NSH_DISABLE_CP, - CONFIG_NSH_DISABLE_DD, CONFIG_NSH_DISABLE_DELROUTE, CONFIG_NSH_DISABLE_DF, - CONFIG_NSH_DISABLE_ECHO, CONFIG_NSH_DISABLE_EXEC, CONFIG_NSH_DISABLE_EXIT, - CONFIG_NSH_DISABLE_FREE, CONFIG_NSH_DISABLE_GET, CONFIG_NSH_DISABLE_HELP, - CONFIG_NSH_DISABLE_HEXDUMP, CONFIG_NSH_DISABLE_IFCONFIG, CONFIG_NSH_DISABLE_IFUPDOWN, - CONFIG_NSH_DISABLE_KILL, CONFIG_NSH_DISABLE_LOSETUP, CONFIG_NSH_DISABLE_LS, - CONFIG_NSH_DISABLE_MD5 CONFIG_NSH_DISABLE_MB, CONFIG_NSH_DISABLE_MKDIR, - CONFIG_NSH_DISABLE_MKFATFS, CONFIG_NSH_DISABLE_MKFIFO, CONFIG_NSH_DISABLE_MKRD, - CONFIG_NSH_DISABLE_MH, CONFIG_NSH_DISABLE_MOUNT, CONFIG_NSH_DISABLE_MW, - CONFIG_NSH_DISABLE_MV, CONFIG_NSH_DISABLE_NFSMOUNT, CONFIG_NSH_DISABLE_NSLOOKUP, - CONFIG_NSH_DISABLE_POWEROFF, CONFIG_NSH_DISABLE_PS, CONFIG_NSH_DISABLE_PING, - CONFIG_NSH_DISABLE_PING6, CONFIG_NSH_DISABLE_PUT, CONFIG_NSH_DISABLE_PWD, - CONFIG_NSH_DISABLE_REBOOT, CONFIG_NSH_DISABLE_RM, CONFIG_NSH_DISABLE_RMDIR, - CONFIG_NSH_DISABLE_SET, CONFIG_NSH_DISABLE_SH, CONFIG_NSH_DISABLE_SHUTDOWN, - CONFIG_NSH_DISABLE_SLEEP, CONFIG_NSH_DISABLE_TEST, CONFIG_NSH_DISABLE_UMOUNT, - CONFIG_NSH_DISABLE_UNSET, CONFIG_NSH_DISABLE_URLDECODE, CONFIG_NSH_DISABLE_URLENCODE, - CONFIG_NSH_DISABLE_USLEEP, CONFIG_NSH_DISABLE_WGET, CONFIG_NSH_DISABLE_XD + CONFIG_NSH_DISABLE_BASENAME, CONFIG_NSH_DISABLE_CAT, CONFIG_NSH_DISABLE_CD, + CONFIG_NSH_DISABLE_CP, CONFIG_NSH_DISABLE_DD, CONFIG_NSH_DISABLE_DELROUTE, + CONFIG_NSH_DISABLE_DF, CONFIG_NSH_DISABLE_DIRNAME, CONFIG_NSH_DISABLE_ECHO, + CONFIG_NSH_DISABLE_EXEC, CONFIG_NSH_DISABLE_EXIT, CONFIG_NSH_DISABLE_FREE, + CONFIG_NSH_DISABLE_GET, CONFIG_NSH_DISABLE_HELP, CONFIG_NSH_DISABLE_HEXDUMP, + CONFIG_NSH_DISABLE_IFCONFIG, CONFIG_NSH_DISABLE_IFUPDOWN, CONFIG_NSH_DISABLE_KILL, + CONFIG_NSH_DISABLE_LOSETUP, CONFIG_NSH_DISABLE_LS, CONFIG_NSH_DISABLE_MD5, + CONFIG_NSH_DISABLE_MB, CONFIG_NSH_DISABLE_MKDIR, CONFIG_NSH_DISABLE_MKFATFS, + CONFIG_NSH_DISABLE_MKFIFO, CONFIG_NSH_DISABLE_MKRD, CONFIG_NSH_DISABLE_MH, + CONFIG_NSH_DISABLE_MOUNT, CONFIG_NSH_DISABLE_MW, CONFIG_NSH_DISABLE_MV, + CONFIG_NSH_DISABLE_NFSMOUNT, CONFIG_NSH_DISABLE_NSLOOKUP, CONFIG_NSH_DISABLE_POWEROFF, + CONFIG_NSH_DISABLE_PS, CONFIG_NSH_DISABLE_PING, CONFIG_NSH_DISABLE_PING6, + CONFIG_NSH_DISABLE_PUT, CONFIG_NSH_DISABLE_PWD, CONFIG_NSH_DISABLE_REBOOT, + CONFIG_NSH_DISABLE_RM, CONFIG_NSH_DISABLE_RMDIR, CONFIG_NSH_DISABLE_SET, + CONFIG_NSH_DISABLE_SH, CONFIG_NSH_DISABLE_SHUTDOWN, CONFIG_NSH_DISABLE_SLEEP, + CONFIG_NSH_DISABLE_TEST, CONFIG_NSH_DISABLE_UMOUNT, CONFIG_NSH_DISABLE_UNSET, + CONFIG_NSH_DISABLE_URLDECODE, CONFIG_NSH_DISABLE_URLENCODE, CONFIG_NSH_DISABLE_USLEEP, + CONFIG_NSH_DISABLE_WGET, CONFIG_NSH_DISABLE_XD Verbose help output can be suppressed by defining CONFIG_NSH_HELP_TERSE. In that case, the help command is still available but will be slightly smaller. diff --git a/nshlib/nsh.h b/nshlib/nsh.h index 1b9656d90..fc685e118 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -821,9 +821,15 @@ void nsh_usbtrace(void); /* Shell command handlers */ +#ifndef CONFIG_NSH_DISABLE_BASENAME + int cmd_basename(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); +#endif #if !defined(CONFIG_NSH_DISABLESCRIPT) && !defined(CONFIG_NSH_DISABLE_LOOPS) int cmd_break(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif +#ifndef CONFIG_NSH_DISABLE_DIRNAME + int cmd_dirname(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); +#endif #ifndef CONFIG_NSH_DISABLE_ECHO int cmd_echo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c index a7a00c028..b8b08c60e 100644 --- a/nshlib/nsh_command.c +++ b/nshlib/nsh_command.c @@ -123,6 +123,10 @@ static const struct cmdmap_s g_cmdmap[] = # endif #endif +#ifndef CONFIG_NSH_DISABLE_BASENAME + { "basename", cmd_basename, 2, 3, " []" }, +#endif + #if !defined(CONFIG_NSH_DISABLESCRIPT) && !defined(CONFIG_NSH_DISABLE_LOOPS) { "break", cmd_break, 1, 1, NULL }, #endif @@ -144,6 +148,10 @@ static const struct cmdmap_s g_cmdmap[] = # endif #endif +#ifndef CONFIG_NSH_DISABLE_DIRNAME + { "dirname", cmd_dirname, 2, 2, "" }, +#endif + #ifndef CONFIG_NSH_DISABLE_DATE { "date", cmd_date, 1, 3, "[-s \"MMM DD HH:MM:SS YYYY\"]" }, #endif diff --git a/nshlib/nsh_fscmds.c b/nshlib/nsh_fscmds.c index d3a9845c6..681c81274 100644 --- a/nshlib/nsh_fscmds.c +++ b/nshlib/nsh_fscmds.c @@ -539,6 +539,66 @@ static int cat_common(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd, * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: cmd_basename + ****************************************************************************/ + +#ifndef CONFIG_NSH_DISABLE_BASENAME +int cmd_basename(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) +{ + FAR char *filename; + + /* Usage: basename [] + * + * NOTE: basename() may modify path. + */ + + filename = basename(argv[1]); + if (argc > 2) + { + FAR char *suffix = argv[2]; + int nndx; + int sndx; + + /* Check for any trailing sub-string */ + + nndx = strlen(filename); + sndx = strlen(suffix); + nndx -= sndx; + + if (nndx > 0 && strcmp(&filename[nndx], suffix) == 0) + { + filename[nndx] = '\0'; + } + } + + /* And output the resulting basename */ + + nsh_output(vtbl, "%s\n", filename); + return OK; +} +#endif + +/**************************************************************************** + * Name: cmd_dirname + ****************************************************************************/ + +#ifndef CONFIG_NSH_DISABLE_DIRNAME +int cmd_dirname(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) +{ + FAR char *filename; + + /* Usage: dirname + * + * NOTE: basename() may modify path. + */ + + filename = dirname(argv[1]); + nsh_output(vtbl, "%s\n", filename); + return OK; +} +#endif + /**************************************************************************** * Name: cmd_cat ****************************************************************************/