apps/nshlib: Add support for a truncate command. This will be used to test the new ftruncate file system support.
This commit is contained in:
parent
8566a16a82
commit
7a2aac8876
@ -491,6 +491,10 @@ config NSH_DISABLE_TELNETD
|
||||
default n if !NSH_NETLOCAL
|
||||
default y if NSH_NETLOCAL
|
||||
|
||||
config NSH_DISABLE_TRUNCATE
|
||||
bool "Disable truncate"
|
||||
default y
|
||||
|
||||
config NSH_DISABLE_UMOUNT
|
||||
bool "Disable umount"
|
||||
default n
|
||||
|
@ -1145,6 +1145,34 @@ o time "<command>"
|
||||
nsh>
|
||||
2.0100 sec
|
||||
|
||||
o truncate -s <length> <file-path>
|
||||
|
||||
Shrink or extend the size of the regular file at <file-path> to the
|
||||
specified <length>.
|
||||
|
||||
A <file-path> argument that does not exist is created. The <length>
|
||||
option is NOT optional.
|
||||
|
||||
If a <file-path> is larger than the specified size, the extra data is
|
||||
lost. If a <file-path> is shorter, it is extended and the extended part
|
||||
reads as zero bytes.
|
||||
|
||||
o umount <dir-path>
|
||||
|
||||
Un-mount the file system at mount point <dir-path>. The umount command
|
||||
can only be used to un-mount volumes previously mounted using mount
|
||||
command.
|
||||
|
||||
Example:
|
||||
nsh> ls /mnt/fs
|
||||
/mnt/fs:
|
||||
TESTDIR/
|
||||
nsh> umount /mnt/fs
|
||||
nsh> ls /mnt/fs
|
||||
/mnt/fs:
|
||||
nsh: ls: no such directory: /mnt/fs
|
||||
nsh>
|
||||
|
||||
o unset <name>
|
||||
|
||||
Remove the value associated with the environment variable
|
||||
@ -1330,6 +1358,7 @@ Command Dependencies on Configuration Settings
|
||||
test !CONFIG_NSH_DISABLESCRIPT
|
||||
telnetd CONFIG_NSH_TELNET && !CONFIG_NSH_DISABLE_TELNETD
|
||||
time ---
|
||||
truncate !CONFIG_DISABLE_MOUNTPOINT && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
umount !CONFIG_DISABLE_MOUNTPOINT && CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_FS_READABLE
|
||||
uname !CONFIG_NSH_DISABLE_UNAME
|
||||
unset !CONFIG_DISABLE_ENVIRON
|
||||
@ -1374,9 +1403,10 @@ also allow it to squeeze into very small memory footprints.
|
||||
CONFIG_NSH_DISABLE_RM, CONFIG_NSH_DISABLE_RMDIR, CONFIG_NSH_DISABLE_ROUTE,
|
||||
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_TRUNCATE, 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.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh.h
|
||||
*
|
||||
* Copyright (C) 2007-2017 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2018 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -1141,6 +1141,9 @@ int cmd_lsmod(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
int cmd_mksmartfs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# endif /* CONFIG_FS_SMARTFS */
|
||||
# ifndef CONFIG_NSH_DISABLE_TRUNCATE
|
||||
int cmd_truncate(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# if defined(CONFIG_NSH_LOGIN_PASSWD) && defined(CONFIG_FS_WRITABLE) && \
|
||||
!defined(CONFIG_FSUTILS_PASSWD_READONLY)
|
||||
# ifndef CONFIG_NSH_DISABLE_USERADD
|
||||
|
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_command.c
|
||||
*
|
||||
* Copyright (C) 2007-2017 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2018 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -489,6 +489,12 @@ static const struct cmdmap_s g_cmdmap[] =
|
||||
{ "true", cmd_true, 1, 1, NULL },
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_DISABLE_MOUNTPOINT) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
# ifndef CONFIG_NSH_DISABLE_TRUNCATE
|
||||
{ "truncate", cmd_truncate, 4, 4, "-s <length> <file-path>" },
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_UNAME
|
||||
#ifdef CONFIG_NET
|
||||
{ "uname", cmd_uname, 1, 7, "[-a | -imnoprsv]" },
|
||||
|
@ -1,7 +1,8 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_fscmds.c
|
||||
*
|
||||
* Copyright (C) 2007-2009, 2011-2014, 2017 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2007-2009, 2011-2014, 2017-2018 Gregory Nutt. All rights
|
||||
* reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -1776,3 +1777,95 @@ errout:
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_truncate
|
||||
****************************************************************************/
|
||||
|
||||
#if !defined(CONFIG_DISABLE_MOUNTPOINT) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
#ifndef CONFIG_NSH_DISABLE_TRUNCATE
|
||||
int cmd_truncate(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
FAR char *fullpath;
|
||||
FAR char *endptr;
|
||||
struct stat buf;
|
||||
unsigned long length;
|
||||
int ret;
|
||||
|
||||
/* truncate -s <length> <file-path> */
|
||||
|
||||
if (strcmp(argv[1], "-s") != 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
length = strtoul(argv[2], &endptr, 0);
|
||||
if (*endptr != '\0')
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Get the full path to the file */
|
||||
|
||||
fullpath = nsh_getfullpath(vtbl, argv[3]);
|
||||
if (fullpath == NULL)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdoutofmemory, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* stat the file */
|
||||
|
||||
ret = stat(fullpath, &buf);
|
||||
if (ret < 0)
|
||||
{
|
||||
int errval = errno;
|
||||
|
||||
/* If stat() failed because the file does not exist, then try to
|
||||
* create it.
|
||||
*/
|
||||
|
||||
if (errval == ENOENT)
|
||||
{
|
||||
int fd = creat(fullpath, 0666);
|
||||
if (fd < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "stat", NSH_ERRNO);
|
||||
ret = ERROR;
|
||||
goto errout_with_fullpath;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
else
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "stat",
|
||||
NSH_ERRNO_OF(errval));
|
||||
ret = ERROR;
|
||||
goto errout_with_fullpath;
|
||||
}
|
||||
}
|
||||
else if (!S_ISREG(buf.st_mode))
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
ret = ERROR;
|
||||
goto errout_with_fullpath;
|
||||
}
|
||||
|
||||
/* Everything looks good... perform the truncation */
|
||||
|
||||
ret = truncate(fullpath, length);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "truncate", NSH_ERRNO);
|
||||
}
|
||||
|
||||
errout_with_fullpath:
|
||||
nsh_freefullpath(fullpath);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user