diff --git a/nshlib/Kconfig b/nshlib/Kconfig
index 74687b39f..0a603c733 100644
--- a/nshlib/Kconfig
+++ b/nshlib/Kconfig
@@ -1,4 +1,5 @@
#
+#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#
@@ -318,7 +319,8 @@ config NSH_DISABLE_LOSMART
config NSH_DISABLE_LN
bool "Disable ln"
- default n
+ default y if DEFAULT_SMALL
+ default n if !DEFAULT_SMALL
depends on PSEUDOFS_SOFTLINKS
config NSH_DISABLE_LS
@@ -434,6 +436,12 @@ config NSH_DISABLE_PWD
bool "Disable pwd"
default n
+config NSH_DISABLE_READLINK
+ bool "Disable readlink"
+ default y if DEFAULT_SMALL
+ default n if !DEFAULT_SMALL
+ depends on PSEUDOFS_SOFTLINKS
+
config NSH_DISABLE_REBOOT
bool "Disable reboot"
default n if !DEFAULT_SMALL && !BOARDCTL_POWEROFF
diff --git a/nshlib/README.txt b/nshlib/README.txt
index 1c4bdaa22..05ba319e9 100644
--- a/nshlib/README.txt
+++ b/nshlib/README.txt
@@ -947,6 +947,10 @@ o pwd
/dev
nsh>
+o readlink
+
+ Show target of a soft link.
+
o reboot
Reset and reboot the system immediately. This command depends on hardware
@@ -1228,6 +1232,7 @@ Command Dependencies on Configuration Settings
ps CONFIG_FS_PROCFS && !CONFIG_FS_PROCFS_EXCLUDE_PROC
put CONFIG_NET && CONFIG_NET_UDP && CONFIG_NFILE_DESCRIPTORS > 0 && MTU >= 558 (see note 1,2)
pwd !CONFIG_DISABLE_ENVIRON && CONFIG_NFILE_DESCRIPTORS > 0
+ readlink CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_PSEUDOFS_SOFTLINK
reboot CONFIG_BOARDCTL_RESET
rm (((!CONFIG_DISABLE_MOUNTPOINT && CONFIG_FS_WRITABLE) || !CONFIG_DISABLE_PSEUDOFS_OPERATIONS) && CONFIG_NFILE_DESCRIPTORS > 0)
rmdir (((!CONFIG_DISABLE_MOUNTPOINT && CONFIG_FS_WRITABLE) || !CONFIG_DISABLE_PSEUDOFS_OPERATIONS) && CONFIG_NFILE_DESCRIPTORS > 0)
@@ -1278,13 +1283,13 @@ also allow it to squeeze into very small memory footprints.
CONFIG_NSH_DISABLE_MW, CONFIG_NSH_DISABLE_MV, CONFIG_NSH_DISABLE_NFSMOUNT,
CONFIG_NSH_DISABLE_NSLOOKUP, CONFIG_NSH_DISABLE_PASSWD, CONFIG_NSH_DISABLE_PING,
CONFIG_NSH_DISABLE_PING6, CONFIG_NSH_DISABLE_POWEROFF, CONFIG_NSH_DISABLE_PS,
- 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_DIABLE_TIME, CONFIG_NSH_DISABLE_UMOUNT,
- CONFIG_NSH_DISABLE_UNSET, CONFIG_NSH_DISABLE_URLDECODE, CONFIG_NSH_DISABLE_URLENCODE,
- CONFIG_NSH_DISABLE_USERADD, CONFIG_NSH_DISABLE_USERDEL, CONFIG_NSH_DISABLE_USLEEP,
- CONFIG_NSH_DISABLE_WGET, CONFIG_NSH_DISABLE_XD
+ CONFIG_NSH_DISABLE_PUT, CONFIG_NSH_DISABLE_PWD, CONFIG_NSH_DISABLE_READLINK,
+ 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_DIABLE_TIME,
+ CONFIG_NSH_DISABLE_UMOUNT, CONFIG_NSH_DISABLE_UNSET, CONFIG_NSH_DISABLE_URLDECODE,
+ CONFIG_NSH_DISABLE_URLENCODE, CONFIG_NSH_DISABLE_USERADD, CONFIG_NSH_DISABLE_USERDEL,
+ 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 eb70940ef..25ef9ce46 100644
--- a/nshlib/nsh.h
+++ b/nshlib/nsh.h
@@ -1017,6 +1017,9 @@ int cmd_lsmod(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
# if defined(CONFIG_RAMLOG_SYSLOG) && !defined(CONFIG_NSH_DISABLE_DMESG)
int cmd_dmesg(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
# endif
+# if !defined(CONFIG_NSH_DISABLE_READLINK) && defined(CONFIG_PSEUDOFS_SOFTLINKS)
+ int cmd_readlink(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
+# endif
# if CONFIG_NFILE_STREAMS > 0 && !defined(CONFIG_NSH_DISABLESCRIPT)
# ifndef CONFIG_NSH_DISABLE_SH
int cmd_sh(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c
index 80a8ed569..ad68fd7c9 100644
--- a/nshlib/nsh_command.c
+++ b/nshlib/nsh_command.c
@@ -410,6 +410,12 @@ static const struct cmdmap_s g_cmdmap[] =
# endif
#endif
+#if CONFIG_NFILE_DESCRIPTORS > 0
+# if !defined(CONFIG_NSH_DISABLE_READLINK) && defined(CONFIG_PSEUDOFS_SOFTLINKS)
+ { "readlink", cmd_readlink, 2, 2, "" },
+# endif
+#endif
+
#if defined(CONFIG_BOARDCTL_RESET) && !defined(CONFIG_NSH_DISABLE_REBOOT)
{ "reboot", cmd_reboot, 1, 1, NULL },
#endif
diff --git a/nshlib/nsh_fscmds.c b/nshlib/nsh_fscmds.c
index 598a09b93..a7d05c86d 100644
--- a/nshlib/nsh_fscmds.c
+++ b/nshlib/nsh_fscmds.c
@@ -1542,6 +1542,41 @@ errout_with_oldpath:
#endif
#endif
+/****************************************************************************
+ * Name: cmd_readlink
+ ****************************************************************************/
+
+#if CONFIG_NFILE_DESCRIPTORS > 0
+# if !defined(CONFIG_NSH_DISABLE_READLINK) && defined(CONFIG_PSEUDOFS_SOFTLINKS)
+int cmd_readlink(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
+{
+ FAR char *fullpath;
+ ssize_t len;
+
+ /* readlink */
+ /* Get the fullpath to the directory */
+
+ fullpath = nsh_getfullpath(vtbl, argv[1]);
+ if (!fullpath)
+ {
+ return ERROR;
+ }
+
+ len = readlink(fullpath, vtbl->iobuffer, IOBUFFERSIZE);
+ nsh_freefullpath(fullpath);
+
+ if (len < 0)
+ {
+ nsh_output(vtbl, g_fmtcmdfailed, "ls", "readlink", NSH_ERRNO);
+ return ERROR;
+ }
+
+ nsh_output(vtbl, "%s\n", vtbl->iobuffer);
+ return OK;
+}
+#endif
+#endif
+
/****************************************************************************
* Name: cmd_rm
****************************************************************************/