Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions nshlib/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@ config NSH_DISABLE_CD
bool "Disable cd"
default DEFAULT_SMALL

config NSH_DISABLE_CHROOT
bool "Disable chroot"
default DEFAULT_SMALL
depends on FS_CHROOT

config NSH_DISABLE_CHMOD
bool "Disable chmod"
default DEFAULT_SMALL
Expand Down
3 changes: 3 additions & 0 deletions nshlib/nsh.h
Original file line number Diff line number Diff line change
Expand Up @@ -1084,6 +1084,9 @@ int cmd_irqinfo(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#ifndef CONFIG_NSH_DISABLE_CD
int cmd_cd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
#if defined(CONFIG_FS_CHROOT) && !defined(CONFIG_NSH_DISABLE_CHROOT)
int cmd_chroot(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
#ifndef CONFIG_NSH_DISABLE_PWD
int cmd_pwd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
Expand Down
5 changes: 5 additions & 0 deletions nshlib/nsh_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ static const struct cmdmap_s g_cmdmap[] =
CMD_MAP("cd", cmd_cd, 1, 2, "[<dir-path>|-|~|..]"),
#endif

#if defined(CONFIG_FS_CHROOT) && !defined(CONFIG_NSH_DISABLE_CHROOT)
CMD_MAP("chroot", cmd_chroot, 2, CONFIG_NSH_MAXARGUMENTS,
"<newroot> [<command> [args...]]"),
#endif

#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHMOD)
CMD_MAP("chmod", cmd_chmod, 3, 3, "<octal-mode> <path>"),
#endif
Expand Down
58 changes: 58 additions & 0 deletions nshlib/nsh_envcmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,64 @@ int cmd_cd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
}
#endif

/****************************************************************************
* Name: cmd_chroot
****************************************************************************/

#if defined(CONFIG_FS_CHROOT) && !defined(CONFIG_NSH_DISABLE_CHROOT)
int cmd_chroot(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Abhishekmishra2808 it's better to implement chroot to a standalone command since nsh doesn't has the root permission normally.

{
FAR char *fullpath;
int ret;

fullpath = nsh_getfullpath(vtbl, argv[1]);
if (fullpath == NULL)
{
nsh_error(vtbl, g_fmtcmdoutofmemory, argv[0]);
return ERROR;
}

ret = chdir(fullpath);
nsh_freefullpath(fullpath);
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chdir", NSH_ERRNO);
return ERROR;
}

ret = chroot(".");
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chroot", NSH_ERRNO);
return ERROR;
}

ret = chdir("/");
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chdir", NSH_ERRNO);
return ERROR;
}

#ifdef CONFIG_LIBC_EXECFUNCS
if (argc > 2)
{
execvp(argv[2], &argv[2]);
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "execvp", NSH_ERRNO);
return ERROR;
}
#else
if (argc > 2)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "execvp", NSH_ERRNO);
return ERROR;
}
#endif

return OK;
}
#endif /* CONFIG_FS_CHROOT && !CONFIG_NSH_DISABLE_CHROOT */

/****************************************************************************
* Name: cmd_echo
****************************************************************************/
Expand Down