Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
10 changes: 10 additions & 0 deletions nshlib/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,16 @@ config NSH_DISABLE_CD
bool "Disable cd"
default DEFAULT_SMALL

config NSH_DISABLE_CHMOD
bool "Disable chmod"
default DEFAULT_SMALL
Comment thread
acassis marked this conversation as resolved.
depends on FS_PERMISSION

config NSH_DISABLE_CHOWN
bool "Disable chown"
default DEFAULT_SMALL
Comment thread
acassis marked this conversation as resolved.
depends on FS_PERMISSION

config NSH_DISABLE_CP
bool "Disable cp"
default DEFAULT_SMALL
Expand Down
6 changes: 6 additions & 0 deletions nshlib/nsh.h
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,12 @@ int cmd_irqinfo(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#ifndef CONFIG_NSH_DISABLE_CAT
int cmd_cat(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHMOD)
int cmd_chmod(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHOWN)
int cmd_chown(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
#ifndef CONFIG_NSH_DISABLE_CP
int cmd_cp(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
Expand Down
8 changes: 8 additions & 0 deletions nshlib/nsh_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,14 @@ static const struct cmdmap_s g_cmdmap[] =
CMD_MAP("cd", cmd_cd, 1, 2, "[<dir-path>|-|~|..]"),
#endif

#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHMOD)
CMD_MAP("chmod", cmd_chmod, 3, 3, "<octal-mode> <path>"),
#endif

#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHOWN)
CMD_MAP("chown", cmd_chown, 3, 3, "[<uid>][:<gid>] <path>"),
#endif

#ifndef CONFIG_NSH_DISABLE_CP
CMD_MAP("cp", cmd_cp, 3, 4, "[-r] <source-path> <dest-path>"),
#endif
Expand Down
123 changes: 123 additions & 0 deletions nshlib/nsh_fscmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,129 @@ int cmd_cat(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
}
#endif

/****************************************************************************
* Name: cmd_chmod
*
* Description:
* chmod <octal-mode> <path>
*
* Only numeric (octal) modes are supported.
*
****************************************************************************/

#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHMOD)
int cmd_chmod(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
{
FAR char *fullpath;
FAR char *endptr;
long mode;
int ret = ERROR;

UNUSED(argc);

mode = strtol(argv[1], &endptr, 8);
if (endptr == argv[1] || *endptr != '\0' || mode < 0 || mode > 0777)
{
nsh_error(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
}

fullpath = nsh_getfullpath(vtbl, argv[2]);
if (fullpath != NULL)
{
ret = chmod(fullpath, (mode_t)mode);
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chmod", NSH_ERRNO);
}

nsh_freefullpath(fullpath);
}

return ret;
}
#endif

/****************************************************************************
* Name: cmd_chown
*
* Description:
* chown <uid>[:<gid>] <path>
* chown [<uid>]:<gid> <path>
*
* Only numeric uid/gid forms are supported. Empty uid or gid fields
* leave that side unchanged.
*
****************************************************************************/

#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHOWN)
int cmd_chown(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
{
FAR const char *spec = argv[1];
FAR char *endptr;
FAR char *fullpath;
long value;
uid_t uid = (uid_t)-1;
gid_t gid = (gid_t)-1;
int ret = ERROR;

UNUSED(argc);

value = strtol(spec, &endptr, 10);
if (endptr != spec)
{
if (value < 0)
{
nsh_error(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
}

uid = (uid_t)value;
}

if (*endptr == ':')
{
FAR const char *gidstr = endptr + 1;
if (*gidstr != '\0')
{
value = strtol(gidstr, &endptr, 10);
if (*endptr != '\0' || value < 0)
{
nsh_error(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
}

gid = (gid_t)value;
}
}
else if (*endptr != '\0')
{
nsh_error(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
}

if (uid == (uid_t)-1 && gid == (gid_t)-1)
{
nsh_error(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
}

fullpath = nsh_getfullpath(vtbl, argv[2]);
if (fullpath != NULL)
{
ret = lchown(fullpath, uid, gid);
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chown", NSH_ERRNO);
}

nsh_freefullpath(fullpath);
}

return ret;
}
#endif

/****************************************************************************
* Name: cmd_dmesg
****************************************************************************/
Expand Down
Loading