apps/nshlib: Add a new NSH losmart command. losmart setups up a loop device for the smart MTD driver similar to losetup but with different syntax. From Ket Petit.
This commit is contained in:
parent
92b1eb36c8
commit
d82b8a2e23
@ -1474,3 +1474,7 @@
|
|||||||
* apps/nshlib: Remove all references to internal OS interface
|
* apps/nshlib: Remove all references to internal OS interface
|
||||||
netdev_foreach(). Logic in ifconfig, ifup, and ifown now use the
|
netdev_foreach(). Logic in ifconfig, ifup, and ifown now use the
|
||||||
procfs file system to examine networking status. (2015-11-27).
|
procfs file system to examine networking status. (2015-11-27).
|
||||||
|
* apps/nshlib: Add a new NSH losmart command. losmart setups up
|
||||||
|
a loop device for the smart MTD driver similar to losetup but
|
||||||
|
with different syntax. From Ket Petit (2015-11-28).
|
||||||
|
|
||||||
|
@ -262,6 +262,11 @@ config NSH_DISABLE_LOSETUP
|
|||||||
default y if DEFAULT_SMALL
|
default y if DEFAULT_SMALL
|
||||||
default n if !DEFAULT_SMALL
|
default n if !DEFAULT_SMALL
|
||||||
|
|
||||||
|
config NSH_DISABLE_LOSMART
|
||||||
|
bool "Disable losmart"
|
||||||
|
default y if DEFAULT_SMALL
|
||||||
|
default n if !DEFAULT_SMALL
|
||||||
|
|
||||||
config NSH_DISABLE_LS
|
config NSH_DISABLE_LS
|
||||||
bool "Disable ls"
|
bool "Disable ls"
|
||||||
default n
|
default n
|
||||||
|
@ -974,6 +974,9 @@ void nsh_usbtrace(void);
|
|||||||
# if defined(CONFIG_DEV_LOOP) && !defined(CONFIG_NSH_DISABLE_LOSETUP)
|
# if defined(CONFIG_DEV_LOOP) && !defined(CONFIG_NSH_DISABLE_LOSETUP)
|
||||||
int cmd_losetup(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
int cmd_losetup(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||||
# endif
|
# endif
|
||||||
|
# if defined(CONFIG_SMART_DEV_LOOP) && !defined(CONFIG_NSH_DISABLE_LOSMART)
|
||||||
|
int cmd_losmart(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||||
|
# endif
|
||||||
# ifndef CONFIG_NSH_DISABLE_MKFIFO
|
# ifndef CONFIG_NSH_DISABLE_MKFIFO
|
||||||
int cmd_mkfifo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
int cmd_mkfifo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||||
# endif
|
# endif
|
||||||
|
@ -248,6 +248,12 @@ static const struct cmdmap_s g_cmdmap[] =
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT)
|
||||||
|
# if defined(CONFIG_SMART_DEV_LOOP) && !defined(CONFIG_NSH_DISABLE_LOSMART)
|
||||||
|
{ "losmart", cmd_losmart, 2, 11, "[-d <dev-path>] | [[-m <minor>] [-o <offset>] [-e <erase-size>] [-s <sect-size>] [-r] <file-path>]" },
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CONFIG_NFILE_DESCRIPTORS > 0
|
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||||
# ifndef CONFIG_NSH_DISABLE_LS
|
# ifndef CONFIG_NSH_DISABLE_LS
|
||||||
{ "ls", cmd_ls, 1, 5, "[-lRs] <dir-path>" },
|
{ "ls", cmd_ls, 1, 5, "[-lRs] <dir-path>" },
|
||||||
|
@ -61,6 +61,10 @@
|
|||||||
# ifdef CONFIG_FS_SMARTFS
|
# ifdef CONFIG_FS_SMARTFS
|
||||||
# include <apps/fsutils/mksmartfs.h>
|
# include <apps/fsutils/mksmartfs.h>
|
||||||
# endif
|
# endif
|
||||||
|
# ifdef CONFIG_SMART_DEV_LOOP
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
# include <nuttx/fs/smart.h>
|
||||||
|
# endif
|
||||||
# ifdef CONFIG_NFS
|
# ifdef CONFIG_NFS
|
||||||
# include <sys/socket.h>
|
# include <sys/socket.h>
|
||||||
# include <netinet/in.h>
|
# include <netinet/in.h>
|
||||||
@ -783,6 +787,173 @@ errout_with_paths:
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: cmd_losmart
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT)
|
||||||
|
# if defined(CONFIG_SMART_DEV_LOOP) && !defined(CONFIG_NSH_DISABLE_LOSMART)
|
||||||
|
int cmd_losmart(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||||
|
{
|
||||||
|
FAR char *loopdev = NULL;
|
||||||
|
FAR char *filepath = NULL;
|
||||||
|
struct smart_losetup_s setup;
|
||||||
|
bool teardown = false;
|
||||||
|
bool readonly = false;
|
||||||
|
int minor = -1;
|
||||||
|
int erasesize = -1;
|
||||||
|
int sectsize = -1;
|
||||||
|
off_t offset = 0;
|
||||||
|
bool badarg = false;
|
||||||
|
int ret = ERROR;
|
||||||
|
int option;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
/* Get the losetup options: Two forms are supported:
|
||||||
|
*
|
||||||
|
* losmart -d <loop-device>
|
||||||
|
* losmart [-m minor-number] [-o <offset>] [-e erasesize] [-s sectsize] [-r] <filename>
|
||||||
|
*
|
||||||
|
* NOTE that the -o and -r options are accepted with the -d option, but
|
||||||
|
* will be ignored.
|
||||||
|
*/
|
||||||
|
|
||||||
|
while ((option = getopt(argc, argv, "d:e:m:o:rs:")) != ERROR)
|
||||||
|
{
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case 'd':
|
||||||
|
loopdev = nsh_getfullpath(vtbl, optarg);
|
||||||
|
teardown = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'e':
|
||||||
|
erasesize = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
minor = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'o':
|
||||||
|
offset = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
readonly = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
sectsize = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '?':
|
||||||
|
default:
|
||||||
|
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||||
|
badarg = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If a bad argument was encountered, then return without processing the command */
|
||||||
|
|
||||||
|
if (badarg)
|
||||||
|
{
|
||||||
|
goto errout_with_paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If this is not a tear down operation, then additional command line
|
||||||
|
* parameters are required.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!teardown)
|
||||||
|
{
|
||||||
|
/* There must be two arguments on the command line after the options */
|
||||||
|
|
||||||
|
if (optind < argc)
|
||||||
|
{
|
||||||
|
filepath = nsh_getfullpath(vtbl, argv[optind]);
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nsh_output(vtbl, g_fmtargrequired, argv[0]);
|
||||||
|
goto errout_with_paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* There should be nothing else on the command line */
|
||||||
|
|
||||||
|
if (optind < argc)
|
||||||
|
{
|
||||||
|
nsh_output(vtbl, g_fmttoomanyargs, argv[0]);
|
||||||
|
goto errout_with_paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open the loop device */
|
||||||
|
|
||||||
|
fd = open("/dev/smart", O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO);
|
||||||
|
goto errout_with_paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perform the teardown operation */
|
||||||
|
|
||||||
|
if (teardown)
|
||||||
|
{
|
||||||
|
/* Tear down the loop device. */
|
||||||
|
|
||||||
|
ret = ioctl(fd, SMART_LOOPIOC_TEARDOWN, (unsigned long)((uintptr_t) loopdev));
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "ioctl", NSH_ERRNO);
|
||||||
|
goto errout_with_fd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Set up the loop device */
|
||||||
|
|
||||||
|
setup.minor = minor; /* The loop block device to be created */
|
||||||
|
setup.filename = filepath; /* The file or character device to use */
|
||||||
|
setup.sectsize = sectsize; /* The sector size to use with the block device */
|
||||||
|
setup.erasesize = erasesize; /* The sector size to use with the block device */
|
||||||
|
setup.offset = offset; /* An offset that may be applied to the device */
|
||||||
|
setup.readonly = readonly; /* True: Read access will be supported only */
|
||||||
|
|
||||||
|
ret = ioctl(fd, SMART_LOOPIOC_SETUP, (unsigned long)((uintptr_t)&setup));
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "ioctl", NSH_ERRNO);
|
||||||
|
goto errout_with_fd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = OK;
|
||||||
|
|
||||||
|
/* Free resources */
|
||||||
|
|
||||||
|
errout_with_fd:
|
||||||
|
(void)close(fd);
|
||||||
|
|
||||||
|
errout_with_paths:
|
||||||
|
if (loopdev)
|
||||||
|
{
|
||||||
|
free(loopdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filepath)
|
||||||
|
{
|
||||||
|
free(filepath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: cmd_ls
|
* Name: cmd_ls
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user