mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-21 05:43:34 +08:00
Resync new repository with old repo r5166
git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5153 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
@@ -0,0 +1,494 @@
|
||||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see misc/tools/kconfig-language.txt.
|
||||
#
|
||||
|
||||
config NSH_LIBRARY
|
||||
bool "NSH Library"
|
||||
default n
|
||||
select SYSTEM_READLINE
|
||||
---help---
|
||||
Build the NSH support library. This is used, for example, by examples/nsh
|
||||
in order to implement the full NuttShell (NSH).
|
||||
|
||||
if NSH_LIBRARY
|
||||
config NSH_BUILTIN_APPS
|
||||
bool "Enable built-in applications"
|
||||
default y
|
||||
depends on NAMEDAPP
|
||||
---help---
|
||||
Support external registered, "named" applications that can be
|
||||
executed from the NSH command line (see apps/README.txt for
|
||||
more information). This options requires support for named applications
|
||||
(NAMEDAPP).
|
||||
|
||||
menu "Disable Individual commands"
|
||||
config NSH_DISABLE_CAT
|
||||
bool "Disable cat"
|
||||
default n
|
||||
config NSH_DISABLE_CD
|
||||
bool "Disable cd"
|
||||
default n
|
||||
config NSH_DISABLE_CP
|
||||
bool "Disable cp"
|
||||
default n
|
||||
config NSH_DISABLE_DD
|
||||
bool "Disable dd"
|
||||
default n
|
||||
config NSH_DISABLE_ECHO
|
||||
bool "Disable echo"
|
||||
default n
|
||||
config NSH_DISABLE_EXEC
|
||||
bool "Disable exec"
|
||||
default n
|
||||
config NSH_DISABLE_EXIT
|
||||
bool "Disable exit"
|
||||
default n
|
||||
config NSH_DISABLE_FREE
|
||||
bool "Disable free"
|
||||
default n
|
||||
config NSH_DISABLE_GET
|
||||
bool "Disable get"
|
||||
default n
|
||||
config NSH_DISABLE_HELP
|
||||
bool "Disable help"
|
||||
default n
|
||||
config NSH_DISABLE_IFCONFIG
|
||||
bool "Disable ifconfig"
|
||||
default n
|
||||
config NSH_DISABLE_KILL
|
||||
bool "Disable kill"
|
||||
default n
|
||||
config NSH_DISABLE_LOSETUP
|
||||
bool "Disable losetup"
|
||||
default n
|
||||
config NSH_DISABLE_LS
|
||||
bool "Disable ls"
|
||||
default n
|
||||
config NSH_DISABLE_MB
|
||||
bool "Disable mb"
|
||||
default n
|
||||
config NSH_DISABLE_MKDIR
|
||||
bool "Disable mkdir"
|
||||
default n
|
||||
config NSH_DISABLE_MKFATFS
|
||||
bool "Disable mkfatfs"
|
||||
default n
|
||||
config NSH_DISABLE_MKFIFO
|
||||
bool "Disable mkfifo"
|
||||
default n
|
||||
config NSH_DISABLE_MKRD
|
||||
bool "Disable mkrd"
|
||||
default n
|
||||
config NSH_DISABLE_MH
|
||||
bool "Disable mh"
|
||||
default n
|
||||
config NSH_DISABLE_MOUNT
|
||||
bool "Disable mount"
|
||||
default n
|
||||
config NSH_DISABLE_MW
|
||||
bool "Disable mw"
|
||||
default n
|
||||
config NSH_DISABLE_NSFMOUNT
|
||||
bool "Disable nfsmount"
|
||||
default n
|
||||
config NSH_DISABLE_PS
|
||||
bool "Disable ps"
|
||||
default n
|
||||
config NSH_DISABLE_PING
|
||||
bool "Disable ping"
|
||||
default n
|
||||
config NSH_DISABLE_PUT
|
||||
bool "Disable put"
|
||||
default n
|
||||
config NSH_DISABLE_PWD
|
||||
bool "Disable pwd"
|
||||
default n
|
||||
config NSH_DISABLE_RM
|
||||
bool "Disable rm"
|
||||
default n
|
||||
config NSH_DISABLE_RMDIR
|
||||
bool "Disable rmdir"
|
||||
default n
|
||||
config NSH_DISABLE_SET
|
||||
bool "Disable set"
|
||||
default n
|
||||
config NSH_DISABLE_SH
|
||||
bool "Disable sh"
|
||||
default n
|
||||
config NSH_DISABLE_SLEEP
|
||||
bool "Disable sleep"
|
||||
default n
|
||||
config NSH_DISABLE_TEST
|
||||
bool "Disable test"
|
||||
default n
|
||||
config NSH_DISABLE_UMOUNT
|
||||
bool "Disable umount"
|
||||
default n
|
||||
config NSH_DISABLE_UNSET
|
||||
bool "Disable unset"
|
||||
default n
|
||||
config NSH_DISABLE_USLEEP
|
||||
bool "Disable usleep"
|
||||
default n
|
||||
config NSH_DISABLE_WGET
|
||||
bool "Disable wget"
|
||||
default n
|
||||
config NSH_DISABLE_XD
|
||||
bool "Disable xd"
|
||||
default n
|
||||
endmenu
|
||||
|
||||
config NSH_FILEIOSIZE
|
||||
int "NSH I/O buffer size"
|
||||
default 1024
|
||||
---help---
|
||||
Size of a static I/O buffer used for file access (ignored if
|
||||
there is no filesystem). Default is 1024.
|
||||
|
||||
config NSH_STRERROR
|
||||
bool "Use strerror()"
|
||||
default n
|
||||
depends on LIBC_STRERROR
|
||||
---help---
|
||||
strerror(errno) makes more readable output but strerror() is
|
||||
very large and will not be used unless this setting is 'y'
|
||||
This setting depends upon the strerror() having been enabled
|
||||
with LIBC_STRERROR.
|
||||
|
||||
config NSH_LINELEN
|
||||
int "Max command line length"
|
||||
default 80
|
||||
---help---
|
||||
The maximum length of one command line and of one output line.
|
||||
Default: 80
|
||||
|
||||
config NSH_NESTDEPTH
|
||||
int "Maximum command nesting"
|
||||
default 3
|
||||
---help---
|
||||
The maximum number of nested if-then[-else]-fi sequences that
|
||||
are permissable. Default: 3
|
||||
|
||||
config NSH_DISABLESCRIPT
|
||||
bool "Disable script support"
|
||||
default n
|
||||
---help---
|
||||
This can be set to 'y' to suppress support for scripting. This
|
||||
setting disables the 'sh', 'test', and '[' commands and the
|
||||
if-then[-else]-fi construct. This would only be set on systems
|
||||
where a minimal footprint is a necessity and scripting is not.
|
||||
|
||||
config NSH_DISABLEBG
|
||||
bool "Disable background commands"
|
||||
default n
|
||||
---help---
|
||||
This can be set to 'y' to suppress support for background
|
||||
commands. This setting disables the 'nice' command prefix and
|
||||
the '&' command suffix. This would only be set on systems
|
||||
where a minimal footprint is a necessity and background command
|
||||
execution is not.
|
||||
|
||||
config NSH_MMCSDMINOR
|
||||
int "MMC/SD minor device number"
|
||||
default 0
|
||||
---help---
|
||||
If the architecture supports an MMC/SD slot and if the NSH
|
||||
architecture specific logic is present, this option will provide
|
||||
the MMC/SD minor number, i.e., the MMC/SD block driver will
|
||||
be registered as /dev/mmcsdN where N is the minor number.
|
||||
Default is zero.
|
||||
|
||||
config NSH_ROMFSETC
|
||||
bool "Support ROMFS start-up script"
|
||||
default n
|
||||
depends on FS_ROMFS
|
||||
---help---
|
||||
Mount a ROMFS filesystem at /etc and provide a startup script
|
||||
at /etc/init.d/rcS. The default startup script will mount
|
||||
a FAT FS RAMDISK at /tmp but the logic is easily extensible.
|
||||
|
||||
endif
|
||||
|
||||
if NSH_ROMFSETC
|
||||
config NSH_ROMFSMOUNTPT
|
||||
string "ROMFS mount point"
|
||||
default "/etc"
|
||||
---help---
|
||||
The default mountpoint for the ROMFS volume is /etc, but that
|
||||
can be changed with this setting. This must be a absolute path
|
||||
beginning with '/'.
|
||||
|
||||
config NSH_INITSCRIPT
|
||||
string "Relative path to startup script"
|
||||
default "init.d/rcS"
|
||||
---help---
|
||||
This is the relative path to the startup script within the mountpoint.
|
||||
The default is init.d/rcS. This is a relative path and must not
|
||||
start with '/'.
|
||||
|
||||
config NSH_ROMFSDEVNO
|
||||
int "ROMFS block device minor number"
|
||||
default 0
|
||||
---help---
|
||||
This is the minor number of the ROMFS block device. The default is
|
||||
'0' corresponding to /dev/ram0.
|
||||
|
||||
config NSH_ROMFSSECTSIZE
|
||||
int "ROMFS sector size"
|
||||
default 64
|
||||
---help---
|
||||
This is the sector size to use with the ROMFS volume. Since the
|
||||
default volume is very small, this defaults to 64 but should be
|
||||
increased if the ROMFS volume were to be become large. Any value
|
||||
selected must be a power of 2.
|
||||
|
||||
config NSH_FATDEVNO
|
||||
int "FAT block device minor number"
|
||||
default 0
|
||||
depends on FS_FAT
|
||||
---help---
|
||||
When the default rcS file used when NSH_ROMFSETC is selected, it
|
||||
will mount a FAT FS under /tmp. This is the minor number of the FAT
|
||||
FS block device. The default is '1' corresponding to /dev/ram1.
|
||||
|
||||
config NSH_FATSECTSIZE
|
||||
int "FAT sector size"
|
||||
default 512
|
||||
depends on FS_FAT
|
||||
---help---
|
||||
When the default rcS file used when NSH_ROMFSETC is selected, it
|
||||
will mount a FAT FS under /tmp. This is the sector size use with the
|
||||
FAT FS. Default is 512.
|
||||
|
||||
config NSH_FATNSECTORS
|
||||
int "FAT number of sectors"
|
||||
default 1024
|
||||
depends on FS_FAT
|
||||
---help---
|
||||
When the default rcS file used when NSH_ROMFSETC is selected, it
|
||||
will mount a FAT FS under /tmp. This is the number of sectors to use
|
||||
with the FAT FS. Defualt is 1024. The amount of memory used by the
|
||||
FAT FS will be NSH_FATSECTSIZE * NSH_FATNSECTORS bytes.
|
||||
|
||||
config NSH_FATMOUNTPT
|
||||
string "FAT mount point"
|
||||
default "/tmp"
|
||||
depends on FS_FAT
|
||||
---help---
|
||||
When the default rcS file used when NSH_ROMFSETC is selected, it
|
||||
will mount a FAT FS under /tmp. This is the location where the FAT
|
||||
FS will be mounted. Default is "/tmp".
|
||||
|
||||
endif
|
||||
|
||||
if NSH_LIBRARY
|
||||
config NSH_CONSOLE
|
||||
bool "Use console"
|
||||
default y
|
||||
---help---
|
||||
If NSH_CONSOLE is set to 'y', then a character driver
|
||||
console front-end is selected (/dev/console).
|
||||
|
||||
Normally, the serial console device is a UART and RS-232
|
||||
interface. However, if CONFIG_USBDEV is defined, then a USB
|
||||
serial device may, instead, be used if the one of
|
||||
the following are defined:
|
||||
|
||||
CONFIG_PL2303 and CONFIG_PL2303_CONSOLE - Sets up the
|
||||
Prolifics PL2303 emulation as a console device at /dev/console.
|
||||
|
||||
CONFIG_CDCACM and CONFIG_CDCACM_CONSOLE - Sets up the
|
||||
CDC/ACM serial device as a console device at dev/console.
|
||||
|
||||
CONFIG_NSH_USBCONSOLE and CONFIG_NSH_USBCONDEV - Sets up the
|
||||
some other USB serial device as the NSH console (not necessarily
|
||||
dev/console).
|
||||
|
||||
config NSH_USBCONSOLE
|
||||
bool "Use a USB console"
|
||||
default n
|
||||
depends on NSH_CONSOLE && USBDEV
|
||||
---help---
|
||||
If defined, then the an arbitrary USB device may be used
|
||||
to as the NSH console. In this case, CONFIG_NSH_USBCONDEV
|
||||
must be defined to indicate which USB device to use as
|
||||
the console.
|
||||
|
||||
config NSH_USBCONDEV
|
||||
string "USB console device"
|
||||
default "/dev/ttyACM0"
|
||||
depends on NSH_USBCONSOLE
|
||||
---help---
|
||||
If CONFIG_NSH_USBCONSOLE is set to 'y', then CONFIG_NSH_USBCONDEV
|
||||
must also be set to select the USB device used to support
|
||||
the NSH console. This should be set to the quoted name of a
|
||||
readable/write-able USB driver such as:
|
||||
CONFIG_NSH_USBCONDEV="/dev/ttyACM0".
|
||||
|
||||
config UBSDEV_MINOR
|
||||
int "USB console device minor number"
|
||||
default 0
|
||||
depends on NSH_USBCONSOLE
|
||||
---help---
|
||||
If there are more than one USB devices, then a USB device
|
||||
minor number may also need to be provided. Default: 0
|
||||
|
||||
menu "USB Trace Support"
|
||||
depends on USBDEV && (DEBUG || USBDEV_TRACE)
|
||||
|
||||
config NSH_USBDEV_TRACEINIT
|
||||
bool "Show initialization events"
|
||||
default n
|
||||
---help---
|
||||
Show initialization events
|
||||
|
||||
config NSH_USBDEV_TRACECLASS
|
||||
bool "Show class driver events"
|
||||
default n
|
||||
---help---
|
||||
Show class driver events
|
||||
|
||||
config NSH_USBDEV_TRACETRANSFERS
|
||||
bool "Show data transfer events"
|
||||
default n
|
||||
---help---
|
||||
Show data transfer events
|
||||
|
||||
config NSH_USBDEV_TRACECONTROLLER
|
||||
bool "Show controller events"
|
||||
default n
|
||||
---help---
|
||||
Show controller events
|
||||
|
||||
config NSH_USBDEV_TRACEINTERRUPTS
|
||||
bool "Show interrupt-related events"
|
||||
default n
|
||||
---help---
|
||||
Show interrupt-related events
|
||||
|
||||
endmenu
|
||||
|
||||
config NSH_CONDEV
|
||||
bool "Default console device"
|
||||
default "/dev/console"
|
||||
depends on NSH_CONSOLE && !NSH_USBCONSOLE
|
||||
---help---
|
||||
If NSH_CONSOLE is set to 'y', then NSH_CONDEV
|
||||
may also be set to select the serial device used to support
|
||||
the NSH console. This should be set to the quoted name of a
|
||||
readable/write-able character driver such as:
|
||||
NSH_CONDEV="/dev/ttyS1". This is useful, for example,
|
||||
to separate the NSH command line from the system console when
|
||||
the system console is used to provide debug output. Default:
|
||||
stdin and stdout (probably "/dev/console")
|
||||
|
||||
NOTE: When any other device other than /dev/console is used
|
||||
for a user interface, (1) linefeeds (\n) will not be expanded to
|
||||
carriage return / linefeeds (\r\n). You will need to set
|
||||
your terminal program to account for this. And (2) input is
|
||||
not automatically echoed so you will have to turn local echo on.
|
||||
|
||||
config NSH_ARCHINIT
|
||||
bool "Have architecture-specific initialization"
|
||||
default n
|
||||
---help---
|
||||
Set if your board provides architecture specific initialization
|
||||
via the board-specific function nsh_archinitialize(). This
|
||||
function will be called early in NSH initialization to allow
|
||||
board logic to do such things as configure MMC/SD slots.
|
||||
|
||||
config NSH_TELNET
|
||||
bool "Use Telnet console"
|
||||
default n
|
||||
depends on NET && NET_TCP
|
||||
---help---
|
||||
If NSH_TELNET is set to 'y', then a TELENET
|
||||
server front-end is selected. When this option is provided,
|
||||
you may log into NuttX remotely using telnet in order to
|
||||
access NSH.
|
||||
|
||||
endif
|
||||
|
||||
if NSH_TELNET
|
||||
config NSH_TELNETD_PORT
|
||||
int "Telnet port number"
|
||||
default 23
|
||||
---help---
|
||||
The telnet daemon will listen on this TCP port number for connections.
|
||||
Default: 23
|
||||
|
||||
config NSH_TELNETD_DAEMONPRIO
|
||||
int "Telnet daemon priority"
|
||||
default 100
|
||||
---help---
|
||||
Priority of the Telnet daemon. Default: 100
|
||||
|
||||
config NSH_TELNETD_DAEMONSTACKSIZE
|
||||
int "Telnet daemon stack size"
|
||||
default 2048
|
||||
---help---
|
||||
Stack size allocated for the Telnet daemon. Default: 2048
|
||||
|
||||
config NSH_TELNETD_CLIENTPRIO
|
||||
int "Telnet client priority"
|
||||
default 100
|
||||
---help---
|
||||
Priority of the Telnet client. Default: 100
|
||||
|
||||
config NSH_TELNETD_CLIENTSTACKSIZE
|
||||
int "Telnet client stack size"
|
||||
default 2048
|
||||
---help---
|
||||
Stack size allocated for the Telnet client. Default: 2048
|
||||
|
||||
config NSH_IOBUFFER_SIZE
|
||||
int "Telnet I/O buffer size"
|
||||
default 512
|
||||
---help---
|
||||
Determines the size of the I/O buffer to use for sending/
|
||||
receiving TELNET commands/reponses. Default: 512
|
||||
endif
|
||||
|
||||
config NSH_DHCPC
|
||||
bool "Use DHCP to get IP address"
|
||||
default n
|
||||
depends on NSH_LIBRARY && NET && NET_UDP && NET_BROADCAST
|
||||
---help---
|
||||
Obtain the IP address via DHCP.
|
||||
|
||||
Per RFC2131 (p. 9), the DHCP client must be prepared to receive DHCP
|
||||
messages of up to 576 bytes (excluding Ethernet, IP, or UDP headers and FCS).
|
||||
|
||||
config NSH_IPADDR
|
||||
hex "Target IP address"
|
||||
default 0x10000002
|
||||
depends on NSH_LIBRARY && NET && !NSH_DHCPC
|
||||
---help---
|
||||
If NSH_DHCPC is NOT set, then the static IP address must be provided.
|
||||
This is a 32-bit integer value in host order. So, as an example,
|
||||
0x10000002 would be 10.0.0.2.
|
||||
|
||||
config NSH_DRIPADDR
|
||||
hex "Router IP address"
|
||||
default 0x10000001
|
||||
depends on NSH_LIBRARY && NET && !NSH_DHCPC
|
||||
---help---
|
||||
Default router IP address (aka, Gateway). This is a 32-bit integer
|
||||
value in host order. So, as an example, 0x10000001 would be 10.0.0.1.
|
||||
|
||||
config NSH_NETMASK
|
||||
hex "Network mask"
|
||||
default 0xffffff00
|
||||
depends on NSH_LIBRARY && NET && !NSH_DHCPC
|
||||
---help---
|
||||
Network mask. This is a 32-bit integer value in host order. So, as
|
||||
an example, 0xffffff00 would be 255.255.255.0.
|
||||
|
||||
config NSH_NOMAC
|
||||
bool "Hardware has no MAC address"
|
||||
default n
|
||||
depends on NSH_LIBRARY && NET
|
||||
---help---
|
||||
Set if your ethernet hardware has no built-in MAC address.
|
||||
If set, a bogus MAC will be assigned.
|
||||
@@ -0,0 +1,40 @@
|
||||
############################################################################
|
||||
# apps/nshlib/Make.defs
|
||||
# Adds selected applications to apps/ build
|
||||
#
|
||||
# Copyright (C) 2012 Gregory Nutt. All rights reserved.
|
||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name NuttX nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifeq ($(CONFIG_NSH_LIBRARY),y)
|
||||
CONFIGURED_APPS += nshlib
|
||||
endif
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
############################################################################
|
||||
# apps/nshlib/Makefile
|
||||
#
|
||||
# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name NuttX nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
-include $(TOPDIR)/.config
|
||||
-include $(TOPDIR)/Make.defs
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
# NSH Library
|
||||
|
||||
ASRCS =
|
||||
CSRCS = nsh_init.c nsh_parse.c nsh_console.c nsh_fscmds.c nsh_ddcmd.c \
|
||||
nsh_proccmds.c nsh_mmcmds.c nsh_envcmds.c nsh_dbgcmds.c
|
||||
|
||||
ifeq ($(CONFIG_NSH_BUILTIN_APPS),y)
|
||||
CSRCS += nsh_apps.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_NSH_ROMFSETC),y)
|
||||
CSRCS += nsh_romfsetc.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_NET),y)
|
||||
CSRCS += nsh_netinit.c nsh_netcmds.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_RTC),y)
|
||||
CSRCS += nsh_timcmds.c
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_DISABLE_MOUNTPOINT),y)
|
||||
CSRCS += nsh_mntcmds.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_NSH_CONSOLE),y)
|
||||
CSRCS += nsh_consolemain.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_NSH_TELNET),y)
|
||||
CSRCS += nsh_telnetd.c
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_NSH_DISABLESCRIPT),y)
|
||||
CSRCS += nsh_test.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USBDEV),y)
|
||||
CSRCS += nsh_usbdev.c
|
||||
endif
|
||||
|
||||
AOBJS = $(ASRCS:.S=$(OBJEXT))
|
||||
COBJS = $(CSRCS:.c=$(OBJEXT))
|
||||
|
||||
SRCS = $(ASRCS) $(CSRCS)
|
||||
OBJS = $(AOBJS) $(COBJS)
|
||||
|
||||
ifeq ($(WINTOOL),y)
|
||||
BIN = "${shell cygpath -w $(APPDIR)/libapps$(LIBEXT)}"
|
||||
else
|
||||
BIN = "$(APPDIR)/libapps$(LIBEXT)"
|
||||
endif
|
||||
|
||||
ROOTDEPPATH = --dep-path .
|
||||
VPATH =
|
||||
|
||||
# Build targets
|
||||
|
||||
all: .built
|
||||
.PHONY: context .depend depend clean distclean
|
||||
|
||||
$(AOBJS): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
|
||||
$(COBJS): %$(OBJEXT): %.c
|
||||
$(call COMPILE, $<, $@)
|
||||
|
||||
.built: $(OBJS)
|
||||
@( for obj in $(OBJS) ; do \
|
||||
$(call ARCHIVE, $(BIN), $${obj}); \
|
||||
done ; )
|
||||
@touch .built
|
||||
|
||||
context:
|
||||
|
||||
.depend: Makefile $(SRCS)
|
||||
@$(MKDEP) $(ROOTDEPPATH) \
|
||||
$(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
|
||||
@touch $@
|
||||
|
||||
depend: .depend
|
||||
|
||||
clean:
|
||||
@rm -f *.o *~ .*.swp .built
|
||||
$(call CLEAN)
|
||||
|
||||
distclean: clean
|
||||
@rm -f Make.dep .depend
|
||||
|
||||
-include Make.dep
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,611 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh.h
|
||||
*
|
||||
* Copyright (C) 2007-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __APPS_NSHLIB_NSH_H
|
||||
#define __APPS_NSHLIB_NSH_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <nuttx/usb/usbdev_trace.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
/* Configuration ************************************************************/
|
||||
/* The background commands require pthread support */
|
||||
|
||||
#ifdef CONFIG_DISABLE_PTHREAD
|
||||
# ifndef CONFIG_NSH_DISABLEBG
|
||||
# define CONFIG_NSH_DISABLEBG 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Telnetd requires networking support */
|
||||
|
||||
#ifndef CONFIG_NET
|
||||
# undef CONFIG_NSH_TELNET
|
||||
#endif
|
||||
|
||||
/* One front end must be defined */
|
||||
|
||||
#if !defined(CONFIG_NSH_CONSOLE) && !defined(CONFIG_NSH_TELNET)
|
||||
# error "No NSH front end defined"
|
||||
#endif
|
||||
|
||||
/* If a USB device is selected for the NSH console then we need to handle some
|
||||
* special start-up conditions.
|
||||
*/
|
||||
|
||||
#undef HAVE_USB_CONSOLE
|
||||
#if defined(CONFIG_USBDEV)
|
||||
|
||||
/* Check for a PL2303 serial console. Use console device "/dev/console". */
|
||||
|
||||
# if defined(CONFIG_PL2303) && defined(CONFIG_PL2303_CONSOLE)
|
||||
# define HAVE_USB_CONSOLE 1
|
||||
|
||||
/* Check for a CDC/ACM serial console. Use console device "/dev/console". */
|
||||
|
||||
# elif defined(CONFIG_CDCACM) && defined(CONFIG_CDCACM_CONSOLE)
|
||||
# define HAVE_USB_CONSOLE 1
|
||||
|
||||
/* Check for other USB console. USB console device must be provided in CONFIG_NSH_CONDEV */
|
||||
|
||||
# elif defined(CONFIG_NSH_USBCONSOLE)
|
||||
# define HAVE_USB_CONSOLE 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Defaults for the USB console */
|
||||
|
||||
#ifdef HAVE_USB_CONSOLE
|
||||
|
||||
/* The default USB console device minor number is 0*/
|
||||
|
||||
# ifndef CONFIG_NSH_UBSDEV_MINOR
|
||||
# define CONFIG_NSH_UBSDEV_MINOR 0
|
||||
# endif
|
||||
|
||||
/* The default console device is always /dev/console */
|
||||
|
||||
# ifndef CONFIG_NSH_USBCONDEV
|
||||
# define CONFIG_NSH_USBCONDEV "/dev/console"
|
||||
# endif
|
||||
|
||||
/* USB trace settings */
|
||||
|
||||
#ifdef CONFIG_NSH_USBDEV_TRACEINIT
|
||||
# define TRACE_INIT_BITS (TRACE_INIT_BIT)
|
||||
#else
|
||||
# define TRACE_INIT_BITS (0)
|
||||
#endif
|
||||
|
||||
#define TRACE_ERROR_BITS (TRACE_DEVERROR_BIT|TRACE_CLSERROR_BIT)
|
||||
|
||||
#ifdef CONFIG_NSH_USBDEV_TRACECLASS
|
||||
# define TRACE_CLASS_BITS (TRACE_CLASS_BIT|TRACE_CLASSAPI_BIT|TRACE_CLASSSTATE_BIT)
|
||||
#else
|
||||
# define TRACE_CLASS_BITS (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NSH_USBDEV_TRACETRANSFERS
|
||||
# define TRACE_TRANSFER_BITS (TRACE_OUTREQQUEUED_BIT|TRACE_INREQQUEUED_BIT|TRACE_READ_BIT|\
|
||||
TRACE_WRITE_BIT|TRACE_COMPLETE_BIT)
|
||||
#else
|
||||
# define TRACE_TRANSFER_BITS (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NSH_USBDEV_TRACECONTROLLER
|
||||
# define TRACE_CONTROLLER_BITS (TRACE_EP_BIT|TRACE_DEV_BIT)
|
||||
#else
|
||||
# define TRACE_CONTROLLER_BITS (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NSH_USBDEV_TRACEINTERRUPTS
|
||||
# define TRACE_INTERRUPT_BITS (TRACE_INTENTRY_BIT|TRACE_INTDECODE_BIT|TRACE_INTEXIT_BIT)
|
||||
#else
|
||||
# define TRACE_INTERRUPT_BITS (0)
|
||||
#endif
|
||||
|
||||
#define TRACE_BITSET (TRACE_INIT_BITS|TRACE_ERROR_BITS|TRACE_CLASS_BITS|\
|
||||
TRACE_TRANSFER_BITS|TRACE_CONTROLLER_BITS|TRACE_INTERRUPT_BITS)
|
||||
|
||||
#endif
|
||||
|
||||
/* If Telnet is selected for the NSH console, then we must configure
|
||||
* the resources used by the Telnet daemon and by the Telnet clients.
|
||||
*
|
||||
* CONFIG_NSH_TELNETD_PORT - The telnet daemon will listen on this.
|
||||
* port. Default: 23
|
||||
* CONFIG_NSH_TELNETD_DAEMONPRIO - Priority of the Telnet daemon.
|
||||
* Default: SCHED_PRIORITY_DEFAULT
|
||||
* CONFIG_NSH_TELNETD_DAEMONSTACKSIZE - Stack size allocated for the
|
||||
* Telnet daemon. Default: 2048
|
||||
* CONFIG_NSH_TELNETD_CLIENTPRIO- Priority of the Telnet client.
|
||||
* Default: SCHED_PRIORITY_DEFAULT
|
||||
* CONFIG_NSH_TELNETD_CLIENTSTACKSIZE - Stack size allocated for the
|
||||
* Telnet client. Default: 2048
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_NSH_TELNETD_PORT
|
||||
# define CONFIG_NSH_TELNETD_PORT 23
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_TELNETD_DAEMONPRIO
|
||||
# define CONFIG_NSH_TELNETD_DAEMONPRIO SCHED_PRIORITY_DEFAULT
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_TELNETD_DAEMONSTACKSIZE
|
||||
# define CONFIG_NSH_TELNETD_DAEMONSTACKSIZE 2048
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_TELNETD_CLIENTPRIO
|
||||
# define CONFIG_NSH_TELNETD_CLIENTPRIO SCHED_PRIORITY_DEFAULT
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_TELNETD_CLIENTSTACKSIZE
|
||||
# define CONFIG_NSH_TELNETD_CLIENTSTACKSIZE 2048
|
||||
#endif
|
||||
|
||||
/* Verify support for ROMFS /etc directory support options */
|
||||
|
||||
#ifdef CONFIG_NSH_ROMFSETC
|
||||
# ifdef CONFIG_DISABLE_MOUNTPOINT
|
||||
# error "Mountpoint support is disabled"
|
||||
# undef CONFIG_NSH_ROMFSETC
|
||||
# endif
|
||||
# if CONFIG_NFILE_DESCRIPTORS < 4
|
||||
# error "Not enough file descriptors"
|
||||
# undef CONFIG_NSH_ROMFSETC
|
||||
# endif
|
||||
# ifndef CONFIG_FS_ROMFS
|
||||
# error "ROMFS support not enabled"
|
||||
# undef CONFIG_NSH_ROMFSETC
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_ROMFSMOUNTPT
|
||||
# define CONFIG_NSH_ROMFSMOUNTPT "/etc"
|
||||
# endif
|
||||
# ifdef CONFIG_NSH_INIT
|
||||
# ifndef CONFIG_NSH_INITSCRIPT
|
||||
# define CONFIG_NSH_INITSCRIPT "init.d/rcS"
|
||||
# endif
|
||||
# endif
|
||||
# undef NSH_INITPATH
|
||||
# define NSH_INITPATH CONFIG_NSH_ROMFSMOUNTPT "/" CONFIG_NSH_INITSCRIPT
|
||||
# ifndef CONFIG_NSH_ROMFSDEVNO
|
||||
# define CONFIG_NSH_ROMFSDEVNO 0
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_ROMFSSECTSIZE
|
||||
# define CONFIG_NSH_ROMFSSECTSIZE 64
|
||||
# endif
|
||||
# define NSECTORS(b) (((b)+CONFIG_NSH_ROMFSSECTSIZE-1)/CONFIG_NSH_ROMFSSECTSIZE)
|
||||
# define STR_RAMDEVNO(m) #m
|
||||
# define MKMOUNT_DEVNAME(m) "/dev/ram" STR_RAMDEVNO(m)
|
||||
# define MOUNT_DEVNAME MKMOUNT_DEVNAME(CONFIG_NSH_ROMFSDEVNO)
|
||||
#else
|
||||
# undef CONFIG_NSH_ROMFSMOUNTPT
|
||||
# undef CONFIG_NSH_INIT
|
||||
# undef CONFIG_NSH_INITSCRIPT
|
||||
# undef CONFIG_NSH_ROMFSDEVNO
|
||||
# undef CONFIG_NSH_ROMFSSECTSIZE
|
||||
#endif
|
||||
|
||||
/* This is the maximum number of arguments that will be accepted for a command */
|
||||
|
||||
#define NSH_MAX_ARGUMENTS 6
|
||||
|
||||
/* strerror() produces much nicer output but is, however, quite large and
|
||||
* will only be used if CONFIG_NSH_STRERROR is defined. Note that the strerror
|
||||
* interface must also have been enabled with CONFIG_LIBC_STRERROR.
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_LIBC_STRERROR
|
||||
# undef CONFIG_NSH_STRERROR
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NSH_STRERROR
|
||||
# define NSH_ERRNO strerror(errno)
|
||||
# define NSH_ERRNO_OF(err) strerror(err)
|
||||
#else
|
||||
# define NSH_ERRNO (errno)
|
||||
# define NSH_ERRNO_OF(err) (err)
|
||||
#endif
|
||||
|
||||
/* Maximum size of one command line (telnet or serial) */
|
||||
|
||||
#ifndef CONFIG_NSH_LINELEN
|
||||
# define CONFIG_NSH_LINELEN 80
|
||||
#endif
|
||||
|
||||
/* The following two settings are used only in the telnetd interface */
|
||||
|
||||
#ifndef CONFIG_NSH_IOBUFFER_SIZE
|
||||
# define CONFIG_NSH_IOBUFFER_SIZE 512
|
||||
#endif
|
||||
|
||||
/* The maximum number of nested if-then[-else]-fi sequences that
|
||||
* are permissable.
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_NSH_NESTDEPTH
|
||||
# define CONFIG_NSH_NESTDEPTH 3
|
||||
#endif
|
||||
|
||||
/* Define to enable dumping of all input/output buffers */
|
||||
|
||||
#undef CONFIG_NSH_TELNETD_DUMPBUFFER
|
||||
#undef CONFIG_NSH_FULLPATH
|
||||
|
||||
/* Make sure that the home directory is defined */
|
||||
|
||||
#ifndef CONFIG_LIB_HOMEDIR
|
||||
# define CONFIG_LIB_HOMEDIR "/"
|
||||
#endif
|
||||
|
||||
/* Stubs used when working directory is not supported */
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS <= 0 || defined(CONFIG_DISABLE_ENVIRON)
|
||||
# define nsh_getfullpath(v,p) ((char*)(p))
|
||||
# define nsh_freefullpath(p)
|
||||
#endif
|
||||
|
||||
/* The size of the I/O buffer may be specified in the
|
||||
* configs/<board-name>defconfig file -- provided that it is at least as
|
||||
* large as PATH_MAX.
|
||||
*/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||
# ifdef CONFIG_NSH_FILEIOSIZE
|
||||
# if CONFIG_NSH_FILEIOSIZE > (PATH_MAX + 1)
|
||||
# define IOBUFFERSIZE CONFIG_NSH_FILEIOSIZE
|
||||
# else
|
||||
# define IOBUFFERSIZE (PATH_MAX + 1)
|
||||
# endif
|
||||
# else
|
||||
# define IOBUFFERSIZE 1024
|
||||
# endif
|
||||
# else
|
||||
# define IOBUFFERSIZE (PATH_MAX + 1)
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
enum nsh_parser_e
|
||||
{
|
||||
NSH_PARSER_NORMAL = 0,
|
||||
NSH_PARSER_IF,
|
||||
NSH_PARSER_THEN,
|
||||
NSH_PARSER_ELSE
|
||||
};
|
||||
|
||||
struct nsh_state_s
|
||||
{
|
||||
uint8_t ns_ifcond : 1; /* Value of command in 'if' statement */
|
||||
uint8_t ns_disabled : 1; /* TRUE: Unconditionally disabled */
|
||||
uint8_t ns_unused : 4;
|
||||
uint8_t ns_state : 2; /* Parser state (see enum nsh_parser_e) */
|
||||
};
|
||||
|
||||
struct nsh_parser_s
|
||||
{
|
||||
#ifndef CONFIG_NSH_DISABLEBG
|
||||
bool np_bg; /* true: The last command executed in background */
|
||||
#endif
|
||||
bool np_redirect; /* true: Output from the last command was re-directed */
|
||||
bool np_fail; /* true: The last command failed */
|
||||
#ifndef CONFIG_NSH_DISABLESCRIPT
|
||||
uint8_t np_ndx; /* Current index into np_st[] */
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLEBG
|
||||
int np_nice; /* "nice" value applied to last background cmd */
|
||||
#endif
|
||||
|
||||
/* This is a stack of parser state information. It supports nested
|
||||
* execution of commands that span multiple lines (like if-then-else-fi)
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLESCRIPT
|
||||
struct nsh_state_s np_st[CONFIG_NSH_NESTDEPTH];
|
||||
#endif
|
||||
};
|
||||
|
||||
struct nsh_vtbl_s; /* Defined in nsh_console.h */
|
||||
typedef int (*cmd_t)(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
extern const char g_nshgreeting[];
|
||||
extern const char g_nshprompt[];
|
||||
extern const char g_nshsyntax[];
|
||||
extern const char g_fmtargrequired[];
|
||||
extern const char g_fmtarginvalid[];
|
||||
extern const char g_fmtargrange[];
|
||||
extern const char g_fmtcmdnotfound[];
|
||||
extern const char g_fmtnosuch[];
|
||||
extern const char g_fmttoomanyargs[];
|
||||
extern const char g_fmtdeepnesting[];
|
||||
extern const char g_fmtcontext[];
|
||||
extern const char g_fmtcmdfailed[];
|
||||
extern const char g_fmtcmdoutofmemory[];
|
||||
extern const char g_fmtinternalerror[];
|
||||
#ifndef CONFIG_DISABLE_SIGNALS
|
||||
extern const char g_fmtsignalrecvd[];
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/* Initialization */
|
||||
|
||||
#ifdef CONFIG_NSH_ROMFSETC
|
||||
int nsh_romfsetc(void);
|
||||
#else
|
||||
# define nsh_romfsetc() (-ENOSYS)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET
|
||||
int nsh_netinit(void);
|
||||
#else
|
||||
# define nsh_netinit() (-ENOSYS)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_USB_CONSOLE
|
||||
int nsh_usbconsole(void);
|
||||
#else
|
||||
# define nsh_usbconsole() (-ENOSYS)
|
||||
#endif
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0 && !defined(CONFIG_NSH_DISABLESCRIPT)
|
||||
int nsh_script(FAR struct nsh_vtbl_s *vtbl, const char *cmd, const char *path);
|
||||
#endif
|
||||
|
||||
/* Architecture-specific initialization */
|
||||
|
||||
#ifdef CONFIG_NSH_ARCHINIT
|
||||
int nsh_archinitialize(void);
|
||||
#else
|
||||
# define nsh_archinitialize() (-ENOSYS)
|
||||
#endif
|
||||
|
||||
/* Message handler */
|
||||
|
||||
int nsh_parse(FAR struct nsh_vtbl_s *vtbl, char *cmdline);
|
||||
|
||||
/* Application interface */
|
||||
|
||||
#ifdef CONFIG_NSH_BUILTIN_APPS
|
||||
int nsh_execapp(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd, FAR char **argv);
|
||||
#endif
|
||||
|
||||
/* Working directory support */
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
FAR const char *nsh_getcwd(void);
|
||||
char *nsh_getfullpath(FAR struct nsh_vtbl_s *vtbl, const char *relpath);
|
||||
void nsh_freefullpath(char *relpath);
|
||||
#endif
|
||||
|
||||
/* Debug */
|
||||
|
||||
void nsh_dumpbuffer(FAR struct nsh_vtbl_s *vtbl, const char *msg,
|
||||
const uint8_t *buffer, ssize_t nbytes);
|
||||
|
||||
/* USB debug support */
|
||||
|
||||
#if defined(CONFIG_USBDEV_TRACE) && defined(HAVE_USB_CONSOLE)
|
||||
void nsh_usbtrace(void);
|
||||
#else
|
||||
# define nsh_usbtrace()
|
||||
#endif
|
||||
|
||||
/* Shell command handlers */
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_ECHO
|
||||
int cmd_echo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLE_EXEC
|
||||
int cmd_exec(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLE_MB
|
||||
int cmd_mb(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLE_MH
|
||||
int cmd_mh(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLE_MW
|
||||
int cmd_mw(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLE_FREE
|
||||
int cmd_free(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLE_PS
|
||||
int cmd_ps(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
#ifndef CONFIG_NSH_DISABLE_XD
|
||||
int cmd_xd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_NSH_DISABLESCRIPT) && !defined(CONFIG_NSH_DISABLE_TEST)
|
||||
int cmd_test(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
int cmd_lbracket(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_DISABLE_CLOCK
|
||||
# if defined (CONFIG_RTC) && !defined(CONFIG_NSH_DISABLE_DATE)
|
||||
int cmd_date(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||
# ifndef CONFIG_NSH_DISABLE_CAT
|
||||
int cmd_cat(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_CP
|
||||
int cmd_cp(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_DD
|
||||
int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_LS
|
||||
int cmd_ls(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# if defined(CONFIG_SYSLOG) && defined(CONFIG_RAMLOG_SYSLOG) && !defined(CONFIG_NSH_DISABLE_DMESG)
|
||||
int cmd_dmesg(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);
|
||||
# endif
|
||||
# endif /* CONFIG_NFILE_STREAMS && !CONFIG_NSH_DISABLESCRIPT */
|
||||
# ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
# ifndef CONFIG_NSH_DISABLE_LOSETUP
|
||||
int cmd_losetup(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_MKFIFO
|
||||
int cmd_mkfifo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifdef CONFIG_FS_READABLE
|
||||
# ifndef CONFIG_NSH_DISABLE_DF
|
||||
int cmd_df(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_MOUNT
|
||||
int cmd_mount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_UMOUNT
|
||||
int cmd_umount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifdef CONFIG_FS_WRITABLE
|
||||
# ifndef CONFIG_NSH_DISABLE_MKDIR
|
||||
int cmd_mkdir(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_MKRD
|
||||
int cmd_mkrd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_MV
|
||||
int cmd_mv(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_RM
|
||||
int cmd_rm(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_RMDIR
|
||||
int cmd_rmdir(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# endif /* CONFIG_FS_WRITABLE */
|
||||
# endif /* CONFIG_FS_READABLE */
|
||||
# ifdef CONFIG_FS_FAT
|
||||
# ifndef CONFIG_NSH_DISABLE_MKFATFS
|
||||
int cmd_mkfatfs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# endif /* CONFIG_FS_FAT */
|
||||
# endif /* !CONFIG_DISABLE_MOUNTPOINT */
|
||||
# if !defined(CONFIG_DISABLE_ENVIRON)
|
||||
# ifndef CONFIG_NSH_DISABLE_CD
|
||||
int cmd_cd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_PWD
|
||||
int cmd_pwd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# endif /* !CONFIG_DISABLE_MOUNTPOINT */
|
||||
#endif /* CONFIG_NFILE_DESCRIPTORS */
|
||||
|
||||
#if defined(CONFIG_NET)
|
||||
# ifndef CONFIG_NSH_DISABLE_IFCONFIG
|
||||
int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#if defined(CONFIG_NET_UDP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
# ifndef CONFIG_NSH_DISABLE_GET
|
||||
int cmd_get(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_PUT
|
||||
int cmd_put(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#endif
|
||||
#if defined(CONFIG_NET_TCP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
# ifndef CONFIG_NSH_DISABLE_WGET
|
||||
int cmd_wget(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#endif
|
||||
#if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_PING) && \
|
||||
!defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_DISABLE_SIGNALS)
|
||||
# ifndef CONFIG_NSH_DISABLE_PING
|
||||
int cmd_ping(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(CONFIG_DISABLE_MOUNTPOINT) && CONFIG_NFILE_DESCRIPTORS > 0 && \
|
||||
defined(CONFIG_FS_READABLE) && defined(CONFIG_NFS)
|
||||
# ifndef CONFIG_NSH_DISABLE_NFSMOUNT
|
||||
int cmd_nfsmount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_DISABLE_ENVIRON
|
||||
# ifndef CONFIG_NSH_DISABLE_SET
|
||||
int cmd_set(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_UNSET
|
||||
int cmd_unset(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#endif /* CONFIG_DISABLE_ENVIRON */
|
||||
|
||||
#ifndef CONFIG_DISABLE_SIGNALS
|
||||
# ifndef CONFIG_NSH_DISABLE_KILL
|
||||
int cmd_kill(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_SLEEP
|
||||
int cmd_sleep(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
# ifndef CONFIG_NSH_DISABLE_USLEEP
|
||||
int cmd_usleep(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
|
||||
# endif
|
||||
#endif /* CONFIG_DISABLE_SIGNALS */
|
||||
|
||||
#endif /* __APPS_NSHLIB_NSH_H */
|
||||
@@ -0,0 +1,187 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_apps.c
|
||||
*
|
||||
* Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2011 Uros Platise. All rights reserved.
|
||||
* Author: Uros Platise <uros.platise@isotel.eu>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#ifdef CONFIG_SCHED_WAITPID
|
||||
# include <sys/wait.h>
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <apps/apps.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
#ifdef CONFIG_NSH_BUILTIN_APPS
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_execapp
|
||||
*
|
||||
* Description:
|
||||
* Attempt to execute the application task whose name is 'cmd'
|
||||
*
|
||||
* Returned Value:
|
||||
* <0 If exec_namedapp() fails, then the negated errno value
|
||||
* is returned.
|
||||
* -1 (ERROR) if the application task corresponding to 'cmd' could not
|
||||
* be started (possibly because it doesn not exist).
|
||||
* 0 (OK) if the application task corresponding to 'cmd' was
|
||||
* and successfully started. If CONFIG_SCHED_WAITPID is
|
||||
* defined, this return value also indicates that the
|
||||
* application returned successful status (EXIT_SUCCESS)
|
||||
* 1 If CONFIG_SCHED_WAITPID is defined, then this return value
|
||||
* indicates that the application task was spawned successfully
|
||||
* but returned failure exit status.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_execapp(FAR struct nsh_vtbl_s *vtbl, FAR const char *cmd,
|
||||
FAR char **argv)
|
||||
{
|
||||
int ret = OK;
|
||||
|
||||
/* Lock the scheduler to prevent the application from running until the
|
||||
* waitpid() has been called.
|
||||
*/
|
||||
|
||||
sched_lock();
|
||||
|
||||
/* Try to find and execute the command within the list of builtin
|
||||
* applications.
|
||||
*/
|
||||
|
||||
ret = exec_namedapp(cmd, (FAR const char **)argv);
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* The application was successfully started (but still blocked because the
|
||||
* scheduler is locked). If the application was not backgrounded, then we
|
||||
* need to wait here for the application to exit.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_SCHED_WAITPID
|
||||
if (vtbl->np.np_bg == false)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
/* Wait for the application to exit. Since we have locked the
|
||||
* scheduler above, we know that the application has not yet
|
||||
* started and there is no possibility that it has already exited.
|
||||
* The scheduler will be unlocked while waitpid is waiting and the
|
||||
* application will be able to run.
|
||||
*/
|
||||
|
||||
ret = waitpid(ret, &rc, 0);
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* We can't return the exact status (nsh has nowhere to put it)
|
||||
* so just pass back zero/nonzero in a fashion that doesn't look
|
||||
* like an error.
|
||||
*/
|
||||
|
||||
ret = (rc == 0) ? OK : 1;
|
||||
|
||||
/* TODO: Set the environment variable '?' to a string corresponding
|
||||
* to WEXITSTATUS(rc) so that $? will expand to the exit status of
|
||||
* the most recently executed task.
|
||||
*/
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
struct sched_param param;
|
||||
sched_getparam(0, ¶m);
|
||||
nsh_output(vtbl, "%s [%d:%d]\n", cmd, ret, param.sched_priority);
|
||||
|
||||
/* Backgrounded commands always 'succeed' as long as we can start
|
||||
* them.
|
||||
*/
|
||||
|
||||
ret = OK;
|
||||
}
|
||||
}
|
||||
|
||||
sched_unlock();
|
||||
|
||||
/* If exec_namedapp() or waitpid() failed, then return the negated errno
|
||||
* value.
|
||||
*/
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
return -errno;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NSH_BUILTIN_APPS */
|
||||
@@ -0,0 +1,432 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_serial.c
|
||||
*
|
||||
* Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct serialsave_s
|
||||
{
|
||||
int cn_outfd; /* Re-directed output file descriptor */
|
||||
FILE *cn_outstream; /* Re-directed output stream */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLEBG
|
||||
static FAR struct nsh_vtbl_s *nsh_consoleclone(FAR struct nsh_vtbl_s *vtbl);
|
||||
#endif
|
||||
static void nsh_consolerelease(FAR struct nsh_vtbl_s *vtbl);
|
||||
static ssize_t nsh_consolewrite(FAR struct nsh_vtbl_s *vtbl, FAR const void *buffer, size_t nbytes);
|
||||
static int nsh_consoleoutput(FAR struct nsh_vtbl_s *vtbl, const char *fmt, ...);
|
||||
static FAR char *nsh_consolelinebuffer(FAR struct nsh_vtbl_s *vtbl);
|
||||
static void nsh_consoleredirect(FAR struct nsh_vtbl_s *vtbl, int fd, FAR uint8_t *save);
|
||||
static void nsh_consoleundirect(FAR struct nsh_vtbl_s *vtbl, FAR uint8_t *save);
|
||||
static void nsh_consoleexit(FAR struct nsh_vtbl_s *vtbl, int exitstatus);
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_openifnotopen
|
||||
****************************************************************************/
|
||||
|
||||
static int nsh_openifnotopen(struct console_stdio_s *pstate)
|
||||
{
|
||||
/* The stream is open in a lazy fashion. This is done because the file
|
||||
* descriptor may be opened on a different task than the stream.
|
||||
*/
|
||||
|
||||
if (!pstate->cn_outstream)
|
||||
{
|
||||
pstate->cn_outstream = fdopen(pstate->cn_outfd, "w");
|
||||
if (!pstate->cn_outstream)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_closeifnotclosed
|
||||
*
|
||||
* Description:
|
||||
* Close the output stream if it is not the standard output stream.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void nsh_closeifnotclosed(struct console_stdio_s *pstate)
|
||||
{
|
||||
if (pstate->cn_outstream == OUTSTREAM(pstate))
|
||||
{
|
||||
fflush(OUTSTREAM(pstate));
|
||||
pstate->cn_outfd = OUTFD(pstate);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pstate->cn_outstream)
|
||||
{
|
||||
fflush(pstate->cn_outstream);
|
||||
fclose(pstate->cn_outstream);
|
||||
}
|
||||
else if (pstate->cn_outfd >= 0 && pstate->cn_outfd != OUTFD(pstate))
|
||||
{
|
||||
close(pstate->cn_outfd);
|
||||
}
|
||||
|
||||
pstate->cn_outfd = -1;
|
||||
pstate->cn_outstream = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consolewrite
|
||||
*
|
||||
* Description:
|
||||
* write a buffer to the remote shell window.
|
||||
*
|
||||
* Currently only used by cat.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static ssize_t nsh_consolewrite(FAR struct nsh_vtbl_s *vtbl, FAR const void *buffer, size_t nbytes)
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl;
|
||||
ssize_t ret;
|
||||
|
||||
/* The stream is open in a lazy fashion. This is done because the file
|
||||
* descriptor may be opened on a different task than the stream. The
|
||||
* actual open will then occur with the first output from the new task.
|
||||
*/
|
||||
|
||||
if (nsh_openifnotopen(pstate) != 0)
|
||||
{
|
||||
return (ssize_t)ERROR;
|
||||
}
|
||||
|
||||
/* Write the data to the output stream */
|
||||
|
||||
ret = fwrite(buffer, 1, nbytes, pstate->cn_outstream);
|
||||
if (ret < 0)
|
||||
{
|
||||
dbg("[%d] Failed to send buffer: %d\n", pstate->cn_outfd, errno);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consoleoutput
|
||||
*
|
||||
* Description:
|
||||
* Print a string to the currently selected stream.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int nsh_consoleoutput(FAR struct nsh_vtbl_s *vtbl, const char *fmt, ...)
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl;
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
/* The stream is open in a lazy fashion. This is done because the file
|
||||
* descriptor may be opened on a different task than the stream. The
|
||||
* actual open will then occur with the first output from the new task.
|
||||
*/
|
||||
|
||||
if (nsh_openifnotopen(pstate) != 0)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
va_start(ap, fmt);
|
||||
ret = vfprintf(pstate->cn_outstream, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consolelinebuffer
|
||||
*
|
||||
* Description:
|
||||
* Return a reference to the current line buffer
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static FAR char *nsh_consolelinebuffer(FAR struct nsh_vtbl_s *vtbl)
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl;
|
||||
return pstate->cn_line;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consoleclone
|
||||
*
|
||||
* Description:
|
||||
* Make an independent copy of the vtbl
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLEBG
|
||||
static FAR struct nsh_vtbl_s *nsh_consoleclone(FAR struct nsh_vtbl_s *vtbl)
|
||||
{
|
||||
FAR struct console_stdio_s *pclone = nsh_newconsole();
|
||||
return &pclone->cn_vtbl;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consolerelease
|
||||
*
|
||||
* Description:
|
||||
* Release the cloned instance
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void nsh_consolerelease(FAR struct nsh_vtbl_s *vtbl)
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl;
|
||||
|
||||
/* Close the output stream */
|
||||
|
||||
nsh_closeifnotclosed(pstate);
|
||||
|
||||
/* Close the console stream */
|
||||
|
||||
#ifdef CONFIG_NSH_CONDEV
|
||||
(void)fclose(pstate->cn_constream);
|
||||
#endif
|
||||
|
||||
/* Then release the vtable container */
|
||||
|
||||
free(pstate);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consoleredirect
|
||||
*
|
||||
* Description:
|
||||
* Set up for redirected output. This function is called from nsh_parse()
|
||||
* in two different contexts:
|
||||
*
|
||||
* 1) Redirected background commands of the form: command > xyz.text &
|
||||
*
|
||||
* In this case:
|
||||
* - vtbl: A newly allocated and initialized instance created by
|
||||
* nsh_consoleclone,
|
||||
* - fd:- The file descriptor of the redirected output
|
||||
* - save: NULL
|
||||
*
|
||||
* nsh_consolerelease() will perform the clean-up when the clone is
|
||||
* destroyed.
|
||||
*
|
||||
* 2) Redirected foreground commands of the form: command > xyz.txt
|
||||
*
|
||||
* In this case:
|
||||
* - vtbl: The current state structure,
|
||||
* - fd: The file descriptor of the redirected output
|
||||
* - save: Where to save the re-directed registers.
|
||||
*
|
||||
* nsh_consoleundirect() will perform the clean-up after the redirected
|
||||
* command completes.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void nsh_consoleredirect(FAR struct nsh_vtbl_s *vtbl, int fd, FAR uint8_t *save)
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl;
|
||||
FAR struct serialsave_s *ssave = (FAR struct serialsave_s *)save;
|
||||
|
||||
/* Case 1: Redirected foreground commands */
|
||||
|
||||
if (ssave)
|
||||
{
|
||||
/* pstate->cn_outstream and cn_outfd refer refer to the
|
||||
* currently opened output stream. If the output stream is open, flush
|
||||
* any pending output.
|
||||
*/
|
||||
|
||||
if (pstate->cn_outstream)
|
||||
{
|
||||
fflush(pstate->cn_outstream);
|
||||
}
|
||||
|
||||
/* Save the current fd and stream values. These will be restored
|
||||
* when nsh_consoleundirect() is called.
|
||||
*/
|
||||
|
||||
ssave->cn_outfd = pstate->cn_outfd;
|
||||
ssave->cn_outstream = pstate->cn_outstream;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* nsh_consoleclone() set pstate->cn_outfd and cn_outstream to refer
|
||||
* to standard out. We just want to leave these alone and overwrite
|
||||
* them with the fd for the re-directed stream.
|
||||
*/
|
||||
}
|
||||
|
||||
/* In either case, set the fd of the new, re-directed output and nullify
|
||||
* the output stream (it will be fdopen'ed if it is used).
|
||||
*/
|
||||
|
||||
pstate->cn_outfd = fd;
|
||||
pstate->cn_outstream = NULL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consoleundirect
|
||||
*
|
||||
* Description:
|
||||
* Set up for redirected output
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void nsh_consoleundirect(FAR struct nsh_vtbl_s *vtbl, FAR uint8_t *save)
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = (FAR struct console_stdio_s *)vtbl;
|
||||
FAR struct serialsave_s *ssave = (FAR struct serialsave_s *)save;
|
||||
|
||||
nsh_closeifnotclosed(pstate);
|
||||
pstate->cn_outfd = ssave->cn_outfd;
|
||||
pstate->cn_outstream = ssave->cn_outstream;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consoleexit
|
||||
*
|
||||
* Description:
|
||||
* Exit the shell task
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void nsh_consoleexit(FAR struct nsh_vtbl_s *vtbl, int exitstatus)
|
||||
{
|
||||
/* Destroy ourself then exit with the provided status */
|
||||
|
||||
nsh_consolerelease(vtbl);
|
||||
exit(exitstatus);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_newconsole
|
||||
****************************************************************************/
|
||||
|
||||
FAR struct console_stdio_s *nsh_newconsole(void)
|
||||
{
|
||||
struct console_stdio_s *pstate = (struct console_stdio_s *)zalloc(sizeof(struct console_stdio_s));
|
||||
if (pstate)
|
||||
{
|
||||
/* Initialize the call table */
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLEBG
|
||||
pstate->cn_vtbl.clone = nsh_consoleclone;
|
||||
pstate->cn_vtbl.release = nsh_consolerelease;
|
||||
#endif
|
||||
pstate->cn_vtbl.write = nsh_consolewrite;
|
||||
pstate->cn_vtbl.output = nsh_consoleoutput;
|
||||
pstate->cn_vtbl.linebuffer = nsh_consolelinebuffer;
|
||||
pstate->cn_vtbl.redirect = nsh_consoleredirect;
|
||||
pstate->cn_vtbl.undirect = nsh_consoleundirect;
|
||||
pstate->cn_vtbl.exit = nsh_consoleexit;
|
||||
|
||||
/* (Re-) open the console input device */
|
||||
|
||||
#ifdef CONFIG_NSH_CONDEV
|
||||
pstate->cn_confd = open(CONFIG_NSH_CONDEV, O_RDWR);
|
||||
if (pstate->cn_confd < 0)
|
||||
{
|
||||
free(pstate);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create a standard C stream on the console device */
|
||||
|
||||
pstate->cn_constream = fdopen(pstate->cn_confd, "r+");
|
||||
if (!pstate->cn_constream)
|
||||
{
|
||||
close(pstate->cn_confd);
|
||||
free(pstate);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Initialize the output stream */
|
||||
|
||||
pstate->cn_outfd = OUTFD(pstate);
|
||||
pstate->cn_outstream = OUTSTREAM(pstate);
|
||||
}
|
||||
return pstate;
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_console.h
|
||||
*
|
||||
* Copyright (C) 2007-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __APPS_NSHLIB_NSH_CONSOLE_H
|
||||
#define __APPS_NSHLIB_NSH_CONSOLE_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
/* Method access macros */
|
||||
|
||||
#define nsh_clone(v) (v)->clone(v)
|
||||
#define nsh_release(v) (v)->release(v)
|
||||
#define nsh_write(v,b,n) (v)->write(v,b,n)
|
||||
#define nsh_linebuffer(v) (v)->linebuffer(v)
|
||||
#define nsh_redirect(v,f,s) (v)->redirect(v,f,s)
|
||||
#define nsh_undirect(v,s) (v)->undirect(v,s)
|
||||
#define nsh_exit(v,s) (v)->exit(v,s)
|
||||
|
||||
#ifdef CONFIG_CPP_HAVE_VARARGS
|
||||
# define nsh_output(v, fmt...) (v)->output(v, ##fmt)
|
||||
#else
|
||||
# define nsh_output vtbl->output
|
||||
#endif
|
||||
|
||||
/* Size of info to be saved in call to nsh_redirect */
|
||||
|
||||
#define SAVE_SIZE (sizeof(int) + sizeof(FILE*) + sizeof(bool))
|
||||
|
||||
/* Are we using the NuttX console for I/O? Or some other character device? */
|
||||
|
||||
#ifdef CONFIG_NSH_CONDEV
|
||||
# define INFD(p) ((p)->cn_confd)
|
||||
# define INSTREAM(p) ((p)->cn_constream)
|
||||
# define OUTFD(p) ((p)->cn_confd)
|
||||
# define OUTSTREAM(p) ((p)->cn_constream)
|
||||
#else
|
||||
# define INFD(p) 0
|
||||
# define INSTREAM(p) stdin
|
||||
# define OUTFD(p) 1
|
||||
# define OUTSTREAM(p) stdout
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
/* This describes a generic console front-end */
|
||||
|
||||
struct nsh_vtbl_s
|
||||
{
|
||||
/* This function pointers are "hooks" into the front end logic to
|
||||
* handle things like output of command results, redirection, etc.
|
||||
* -- all of which must be done in a way that is unique to the nature
|
||||
* of the front end.
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLEBG
|
||||
FAR struct nsh_vtbl_s *(*clone)(FAR struct nsh_vtbl_s *vtbl);
|
||||
void (*addref)(FAR struct nsh_vtbl_s *vtbl);
|
||||
void (*release)(FAR struct nsh_vtbl_s *vtbl);
|
||||
#endif
|
||||
ssize_t (*write)(FAR struct nsh_vtbl_s *vtbl, FAR const void *buffer, size_t nbytes);
|
||||
int (*output)(FAR struct nsh_vtbl_s *vtbl, const char *fmt, ...);
|
||||
FAR char *(*linebuffer)(FAR struct nsh_vtbl_s *vtbl);
|
||||
void (*redirect)(FAR struct nsh_vtbl_s *vtbl, int fd, FAR uint8_t *save);
|
||||
void (*undirect)(FAR struct nsh_vtbl_s *vtbl, FAR uint8_t *save);
|
||||
void (*exit)(FAR struct nsh_vtbl_s *vtbl, int exitstatus);
|
||||
|
||||
/* Parser state data */
|
||||
|
||||
struct nsh_parser_s np;
|
||||
};
|
||||
|
||||
/* This structure describes a console front-end that is based on stdin and
|
||||
* stdout (which is all of the supported console types at the time being).
|
||||
*/
|
||||
|
||||
struct console_stdio_s
|
||||
{
|
||||
/* NSH front-end call table */
|
||||
|
||||
struct nsh_vtbl_s cn_vtbl;
|
||||
|
||||
/* NSH input/output streams */
|
||||
|
||||
#ifdef CONFIG_NSH_CONDEV
|
||||
int cn_confd; /* Console I/O file descriptor */
|
||||
#endif
|
||||
int cn_outfd; /* Output file descriptor (possibly redirected) */
|
||||
#ifdef CONFIG_NSH_CONDEV
|
||||
FILE *cn_constream; /* Console I/O stream (possibly redirected) */
|
||||
#endif
|
||||
FILE *cn_outstream; /* Output stream */
|
||||
|
||||
/* Line input buffer */
|
||||
|
||||
char cn_line[CONFIG_NSH_LINELEN];
|
||||
};
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/* Defined in nsh_console.c *************************************************/
|
||||
|
||||
FAR struct console_stdio_s *nsh_newconsole(void);
|
||||
|
||||
#endif /* __APPS_NSHLIB_NSH_CONSOLE_H */
|
||||
@@ -0,0 +1,170 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_consolemain.c
|
||||
*
|
||||
* Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <apps/readline.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_consolemain
|
||||
*
|
||||
* Description:
|
||||
* This interfaces maybe to called or started with task_start to start a
|
||||
* single an NSH instance that operates on stdin and stdout (/dev/console).
|
||||
* This function does not return.
|
||||
*
|
||||
* Input Parameters:
|
||||
* Standard task start-up arguements. These are not used. argc may be
|
||||
* zero and argv may be NULL.
|
||||
*
|
||||
* Returned Values:
|
||||
* This function does not normally return. exit() is usually called to
|
||||
* terminate the NSH session. This function will return in the event of
|
||||
* an error. In that case, a nonzero value is returned (1).
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_consolemain(int argc, char *argv[])
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = nsh_newconsole();
|
||||
int ret;
|
||||
|
||||
DEBUGASSERT(pstate);
|
||||
|
||||
/* If we are using a USB serial console, then we will have to wait for the
|
||||
* USB to be connected to the host.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_USB_CONSOLE
|
||||
ret = nsh_usbconsole();
|
||||
DEBUGASSERT(ret == OK);
|
||||
#endif
|
||||
|
||||
/* Present a greeting */
|
||||
|
||||
fputs(g_nshgreeting, pstate->cn_outstream);
|
||||
fflush(pstate->cn_outstream);
|
||||
|
||||
/* Execute the startup script */
|
||||
|
||||
#ifdef CONFIG_NSH_ROMFSETC
|
||||
(void)nsh_script(&pstate->cn_vtbl, "init", NSH_INITPATH);
|
||||
#endif
|
||||
|
||||
/* Then enter the command line parsing loop */
|
||||
|
||||
for (;;)
|
||||
{
|
||||
/* For the case of debugging the USB console... dump collected USB trace data */
|
||||
|
||||
nsh_usbtrace();
|
||||
|
||||
/* Display the prompt string */
|
||||
|
||||
fputs(g_nshprompt, pstate->cn_outstream);
|
||||
fflush(pstate->cn_outstream);
|
||||
|
||||
/* Get the next line of input */
|
||||
|
||||
ret = readline(pstate->cn_line, CONFIG_NSH_LINELEN,
|
||||
INSTREAM(pstate), OUTSTREAM(pstate));
|
||||
if (ret > 0)
|
||||
{
|
||||
/* Parse process the command */
|
||||
|
||||
(void)nsh_parse(&pstate->cn_vtbl, pstate->cn_line);
|
||||
fflush(pstate->cn_outstream);
|
||||
}
|
||||
|
||||
/* Readline normally returns the number of characters read,
|
||||
* but will return 0 on end of file or a negative value
|
||||
* if an error occurs. Either will cause the session to
|
||||
* terminate.
|
||||
*/
|
||||
|
||||
else
|
||||
{
|
||||
fprintf(pstate->cn_outstream, g_fmtcmdfailed, "nsh_consolemain",
|
||||
"readline", NSH_ERRNO_OF(-ret));
|
||||
nsh_exit(&pstate->cn_vtbl, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up */
|
||||
|
||||
nsh_exit(&pstate->cn_vtbl, 0);
|
||||
|
||||
/* We do not get here, but this is necessary to keep some compilers happy */
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -0,0 +1,355 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/dbg_dbgcmds.c
|
||||
*
|
||||
* Copyright (C) 2008-2009, 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct dbgmem_s
|
||||
{
|
||||
bool dm_write; /* true: perfrom write operation */
|
||||
void *dm_addr; /* Address to access */
|
||||
uint32_t dm_value; /* Value to write */
|
||||
unsigned int dm_count; /* The number of bytes to access */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: mem_parse
|
||||
****************************************************************************/
|
||||
|
||||
int mem_parse(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
||||
struct dbgmem_s *mem)
|
||||
{
|
||||
char *pcvalue = strchr(argv[1], '=');
|
||||
unsigned long lvalue = 0;
|
||||
|
||||
/* Check if we are writing a value */
|
||||
|
||||
if (pcvalue)
|
||||
{
|
||||
*pcvalue = '\0';
|
||||
pcvalue++;
|
||||
|
||||
lvalue = (unsigned long)strtol(pcvalue, NULL, 16);
|
||||
if (lvalue > 0xffffffff)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mem->dm_write = true;
|
||||
mem->dm_value = (uint32_t)lvalue;
|
||||
}
|
||||
else
|
||||
{
|
||||
mem->dm_write = false;
|
||||
mem->dm_value = 0;
|
||||
}
|
||||
|
||||
/* Get the address to be accessed */
|
||||
|
||||
mem->dm_addr = (void*)((uintptr_t)strtol(argv[1], NULL, 16));
|
||||
|
||||
/* Get the number of bytes to access */
|
||||
|
||||
if (argc > 2)
|
||||
{
|
||||
mem->dm_count = (unsigned int)strtol(argv[2], NULL, 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
mem->dm_count = 1;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_mb
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_MB
|
||||
int cmd_mb(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct dbgmem_s mem;
|
||||
volatile uint8_t *ptr;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = mem_parse(vtbl, argc, argv, &mem);
|
||||
if (ret == 0)
|
||||
{
|
||||
/* Loop for the number of requested bytes */
|
||||
|
||||
for (i = 0, ptr = (volatile uint8_t*)mem.dm_addr; i < mem.dm_count; i++, ptr++)
|
||||
{
|
||||
/* Print the value at the address */
|
||||
|
||||
nsh_output(vtbl, " %p = 0x%02x", ptr, *ptr);
|
||||
|
||||
/* Are we supposed to write a value to this address? */
|
||||
|
||||
if (mem.dm_write)
|
||||
{
|
||||
/* Yes, was the supplied value within range? */
|
||||
|
||||
if (mem.dm_value > 0x000000ff)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtargrange, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Write the value and re-read the address so that we print its
|
||||
* current value (if the address is a process address, then the
|
||||
* value read might not necessarily be the value written).
|
||||
*/
|
||||
|
||||
*ptr = (uint8_t)mem.dm_value;
|
||||
nsh_output(vtbl, " -> 0x%02x", *ptr);
|
||||
}
|
||||
|
||||
/* Make sure we end it with a newline */
|
||||
|
||||
nsh_output(vtbl, "\n", *ptr);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_mh
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_MH
|
||||
int cmd_mh(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct dbgmem_s mem;
|
||||
volatile uint16_t *ptr;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = mem_parse(vtbl, argc, argv, &mem);
|
||||
if (ret == 0)
|
||||
{
|
||||
/* Loop for the number of requested bytes */
|
||||
|
||||
for (i = 0, ptr = (volatile uint16_t*)mem.dm_addr; i < mem.dm_count; i += 2, ptr++)
|
||||
{
|
||||
/* Print the value at the address */
|
||||
|
||||
nsh_output(vtbl, " %p = 0x%04x", ptr, *ptr);
|
||||
|
||||
/* Are we supposed to write a value to this address? */
|
||||
|
||||
if (mem.dm_write)
|
||||
{
|
||||
/* Yes, was the supplied value within range? */
|
||||
|
||||
if (mem.dm_value > 0x0000ffff)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtargrange, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Write the value and re-read the address so that we print its
|
||||
* current value (if the address is a process address, then the
|
||||
* value read might not necessarily be the value written).
|
||||
*/
|
||||
|
||||
*ptr = (uint16_t)mem.dm_value;
|
||||
nsh_output(vtbl, " -> 0x%04x", *ptr);
|
||||
}
|
||||
|
||||
/* Make sure we end it with a newline */
|
||||
|
||||
nsh_output(vtbl, "\n", *ptr);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_mw
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_MW
|
||||
int cmd_mw(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct dbgmem_s mem;
|
||||
volatile uint32_t *ptr;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = mem_parse(vtbl, argc, argv, &mem);
|
||||
if (ret == 0)
|
||||
{
|
||||
/* Loop for the number of requested bytes */
|
||||
|
||||
for (i = 0, ptr = (volatile uint32_t*)mem.dm_addr; i < mem.dm_count; i += 4, ptr++)
|
||||
{
|
||||
/* Print the value at the address */
|
||||
|
||||
nsh_output(vtbl, " %p = 0x%08x", ptr, *ptr);
|
||||
|
||||
/* Are we supposed to write a value to this address? */
|
||||
|
||||
if (mem.dm_write)
|
||||
{
|
||||
/* Write the value and re-read the address so that we print its
|
||||
* current value (if the address is a process address, then the
|
||||
* value read might not necessarily be the value written).
|
||||
*/
|
||||
|
||||
*ptr = mem.dm_value;
|
||||
nsh_output(vtbl, " -> 0x%08x", *ptr);
|
||||
}
|
||||
|
||||
/* Make sure we end it with a newline */
|
||||
|
||||
nsh_output(vtbl, "\n", *ptr);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_dumpbuffer
|
||||
****************************************************************************/
|
||||
|
||||
void nsh_dumpbuffer(FAR struct nsh_vtbl_s *vtbl, const char *msg,
|
||||
const uint8_t *buffer, ssize_t nbytes)
|
||||
{
|
||||
char line[128];
|
||||
int ch;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
nsh_output(vtbl, "%s:\n", msg);
|
||||
for (i = 0; i < nbytes; i += 16)
|
||||
{
|
||||
sprintf(line, "%04x: ", i);
|
||||
|
||||
for ( j = 0; j < 16; j++)
|
||||
{
|
||||
if (i + j < nbytes)
|
||||
{
|
||||
sprintf(&line[strlen(line)], "%02x ", buffer[i+j] );
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(&line[strlen(line)], " ");
|
||||
}
|
||||
}
|
||||
|
||||
for ( j = 0; j < 16; j++)
|
||||
{
|
||||
if (i + j < nbytes)
|
||||
{
|
||||
ch = buffer[i+j];
|
||||
sprintf(&line[strlen(line)], "%c", ch >= 0x20 && ch <= 0x7e ? ch : '.');
|
||||
}
|
||||
}
|
||||
nsh_output(vtbl, "%s\n", line);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_xd
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_XD
|
||||
int cmd_xd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
FAR char *addr;
|
||||
FAR char *endptr;
|
||||
int nbytes;
|
||||
|
||||
addr = (char*)((uintptr_t)strtol(argv[1], &endptr, 16));
|
||||
if (argv[0][0] == '\0' || *endptr != '\0')
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
nbytes = (int)strtol(argv[2], &endptr, 0);
|
||||
if (argv[0][0] == '\0' || *endptr != '\0' || nbytes < 0)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
nsh_dumpbuffer(vtbl, "Hex dump", (uint8_t*)addr, nbytes);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,643 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_ddcmd.c
|
||||
*
|
||||
* Copyright (C) 2008-2009, 2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <debug.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <nuttx/fs/fs.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_NSH_DISABLE_DD)
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* If no sector size is specified wity BS=, then the following default value
|
||||
* is used.
|
||||
*/
|
||||
|
||||
#define DEFAULT_SECTSIZE 512
|
||||
|
||||
/* At present, piping of input and output are not support, i.e., both of=
|
||||
* and if= arguments are required.
|
||||
*/
|
||||
|
||||
#undef CAN_PIPE_FROM_STD
|
||||
|
||||
/* Function pointer calls are only need if block drivers are supported
|
||||
* (or, rather, if mount points are supported in the file system)
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
# define DD_INFD ((dd)->inf.fd)
|
||||
# define DD_INHANDLE ((dd)->inf.handle)
|
||||
# define DD_OUTFD ((dd)->outf.fd)
|
||||
# define DD_OUTHANDLE ((dd)->outf.handle)
|
||||
# define DD_READ(dd) ((dd)->infread(dd))
|
||||
# define DD_WRITE(dd) ((dd)->outfwrite(dd))
|
||||
# define DD_INCLOSE(dd) ((dd)->infclose(dd))
|
||||
# define DD_OUTCLOSE(dd) ((dd)->outfclose(dd))
|
||||
#else
|
||||
# define DD_INFD ((dd)->infd)
|
||||
# undef DD_INHANDLE
|
||||
# define DD_OUTFD ((dd)->outfd)
|
||||
# undef DD_OUTHANDLE
|
||||
# define DD_READ(dd) dd_readch(dd)
|
||||
# define DD_WRITE(dd) dd_writech(dd)
|
||||
# define DD_INCLOSE(dd) dd_infclosech(dd)
|
||||
# define DD_OUTCLOSE(dd) dd_outfclosech(dd)
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct dd_s
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl;
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
union
|
||||
{
|
||||
FAR void *handle; /* BCH lib handle for block device*/
|
||||
int fd; /* File descriptor of the character device */
|
||||
} inf;
|
||||
#else
|
||||
int infd; /* File descriptor of the input device */
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
union
|
||||
{
|
||||
FAR void *handle; /* BCH lib handle for block device*/
|
||||
int fd; /* File descriptor of the character device */
|
||||
} outf;
|
||||
#else
|
||||
int outfd; /* File descriptor of the output device */
|
||||
#endif
|
||||
|
||||
uint32_t nsectors; /* Number of sectors to transfer */
|
||||
uint32_t sector; /* The current sector number */
|
||||
uint32_t skip; /* The number of sectors skipped on input */
|
||||
bool eof; /* true: The of the input or output file has been hit */
|
||||
uint16_t sectsize; /* Size of one sector */
|
||||
uint16_t nbytes; /* Number of valid bytes in the buffer */
|
||||
uint8_t *buffer; /* Buffer of data to write to the output file */
|
||||
|
||||
/* Function pointers to handle differences between block and character devices */
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
int (*infread)(struct dd_s *dd);
|
||||
void (*infclose)(struct dd_s *dd);
|
||||
int (*outfwrite)(struct dd_s *dd);
|
||||
void (*outfclose)(struct dd_s *dd);
|
||||
#endif
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static const char g_dd[] = "dd";
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_outfcloseblk
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
static void dd_outfcloseblk(struct dd_s *dd)
|
||||
{
|
||||
(void)bchlib_teardown(DD_OUTHANDLE);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_outfclosech
|
||||
****************************************************************************/
|
||||
|
||||
static void dd_outfclosech(struct dd_s *dd)
|
||||
{
|
||||
(void)close(DD_OUTFD);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_infcloseblk
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
static void dd_infcloseblk(struct dd_s *dd)
|
||||
{
|
||||
(void)bchlib_teardown(DD_INHANDLE);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_infclosech
|
||||
****************************************************************************/
|
||||
|
||||
static void dd_infclosech(struct dd_s *dd)
|
||||
{
|
||||
(void)close(DD_INFD);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_writeblk
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
static int dd_writeblk(struct dd_s *dd)
|
||||
{
|
||||
ssize_t nbytes;
|
||||
off_t offset = (dd->sector - dd->skip) * dd->sectsize;
|
||||
|
||||
/* Write the sector at the specified offset */
|
||||
|
||||
nbytes = bchlib_write(DD_OUTHANDLE, (char*)dd->buffer, offset, dd->sectsize);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
/* bchlib_write return -EFBIG on attempts to write past the end of
|
||||
* the device.
|
||||
*/
|
||||
|
||||
if (nbytes == -EFBIG)
|
||||
{
|
||||
dd->eof = true; /* Set end-of-file */
|
||||
}
|
||||
else
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = dd->vtbl;
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "bshlib_write", NSH_ERRNO_OF(-nbytes));
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_writech
|
||||
****************************************************************************/
|
||||
|
||||
static int dd_writech(struct dd_s *dd)
|
||||
{
|
||||
uint8_t *buffer = dd->buffer;
|
||||
uint16_t written ;
|
||||
ssize_t nbytes;
|
||||
|
||||
/* Is the out buffer full (or is this the last one)? */
|
||||
|
||||
written = 0;
|
||||
do
|
||||
{
|
||||
nbytes = write(DD_OUTFD, buffer, dd->sectsize - written);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = dd->vtbl;
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "write", NSH_ERRNO_OF(-nbytes));
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
written += nbytes;
|
||||
buffer += nbytes;
|
||||
}
|
||||
while (written < dd->sectsize);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_readblk
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
static int dd_readblk(struct dd_s *dd)
|
||||
{
|
||||
ssize_t nbytes;
|
||||
off_t offset = dd->sector * dd->sectsize;
|
||||
|
||||
nbytes = bchlib_read(DD_INHANDLE, (char*)dd->buffer, offset, dd->sectsize);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = dd->vtbl;
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "bshlib_read", NSH_ERRNO_OF(-nbytes));
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* bchlib_read return 0 on attempts to write past the end of the device. */
|
||||
|
||||
dd->nbytes = nbytes;
|
||||
dd->eof = (nbytes == 0);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_readch
|
||||
****************************************************************************/
|
||||
|
||||
static int dd_readch(struct dd_s *dd)
|
||||
{
|
||||
uint8_t *buffer = dd->buffer;
|
||||
ssize_t nbytes;
|
||||
|
||||
dd->nbytes = 0;
|
||||
do
|
||||
{
|
||||
nbytes = read(DD_INFD, buffer, dd->sectsize - dd->nbytes);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = dd->vtbl;
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "read", NSH_ERRNO_OF(-nbytes));
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
dd->nbytes += nbytes;
|
||||
buffer += nbytes;
|
||||
}
|
||||
while (dd->nbytes < dd->sectsize && nbytes > 0);
|
||||
|
||||
dd->eof |= (dd->nbytes == 0);
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_infopen
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
static int dd_filetype(const char *filename)
|
||||
{
|
||||
struct stat sb;
|
||||
int ret;
|
||||
|
||||
/* Get the type of the file */
|
||||
|
||||
ret = stat(filename, &sb);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ERROR; /* Return -1 on failure */
|
||||
}
|
||||
|
||||
return S_ISBLK(sb.st_mode); /* Return true(1) if block, false(0) if char */
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_infopen
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
static inline int dd_infopen(const char *name, struct dd_s *dd)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = dd->vtbl;
|
||||
int ret;
|
||||
int type;
|
||||
|
||||
/* Get the type of the input file */
|
||||
|
||||
type = dd_filetype(name);
|
||||
if (type < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "stat", NSH_ERRNO_OF(-type));
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Open the input file */
|
||||
|
||||
if (!type)
|
||||
{
|
||||
DD_INFD = open(name, O_RDONLY);
|
||||
if (DD_INFD < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "open", NSH_ERRNO);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
dd->infread = dd_readch; /* Character oriented read */
|
||||
dd->infclose = dd_infclosech;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = bchlib_setup(name, true, &DD_INHANDLE);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
dd->infread = dd_readblk;
|
||||
dd->infclose = dd_infcloseblk;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
#else
|
||||
static inline int dd_infopen(const char *name, struct dd_s *dd)
|
||||
{
|
||||
DD_INFD = open(name, O_RDONLY);
|
||||
if (DD_INFD < 0)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = dd->vtbl;
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "open", NSH_ERRNO);
|
||||
return ERROR;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: dd_outfopen
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
static inline int dd_outfopen(const char *name, struct dd_s *dd)
|
||||
{
|
||||
int type;
|
||||
int ret = OK;
|
||||
|
||||
/* Get the type of the output file */
|
||||
|
||||
type = dd_filetype(name);
|
||||
|
||||
/* Open the block driver for input */
|
||||
|
||||
if (type == true)
|
||||
{
|
||||
ret = bchlib_setup(name, true, &DD_OUTHANDLE);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
dd->outfwrite = dd_writeblk; /* Block oriented write */
|
||||
dd->outfclose = dd_outfcloseblk;
|
||||
}
|
||||
|
||||
/* Otherwise, the file is character oriented or does not exist */
|
||||
|
||||
else
|
||||
{
|
||||
DD_OUTFD = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0644);
|
||||
if (DD_OUTFD < 0)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = dd->vtbl;
|
||||
nsh_output(vtbl, g_fmtcmdfailed, g_dd, "open", NSH_ERRNO);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
dd->outfwrite = dd_writech; /* Character oriented write */
|
||||
dd->outfclose = dd_outfclosech;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
#else
|
||||
static inline int dd_outfopen(const char *name, struct dd_s *dd)
|
||||
{
|
||||
DD_OUTFD = open(name, O_WRONLY|O_CREAT|O_TRUNC, 0644);
|
||||
if (DD_OUTFD < 0)
|
||||
{
|
||||
nsh_output(dd->vtbl, g_fmtcmdfailed, g_dd, "open", NSH_ERRNO);
|
||||
return ERROR;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_dd
|
||||
****************************************************************************/
|
||||
|
||||
int cmd_dd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct dd_s dd;
|
||||
char *infile = NULL;
|
||||
char *outfile = NULL;
|
||||
int ret = ERROR;
|
||||
int i;
|
||||
|
||||
/* Initialize the dd structure */
|
||||
|
||||
memset(&dd, 0, sizeof(struct dd_s));
|
||||
dd.vtbl = vtbl; /* For nsh_output */
|
||||
dd.sectsize = DEFAULT_SECTSIZE; /* Sector size if 'bs=' not provided */
|
||||
dd.nsectors = 0xffffffff; /* MAX_UINT32 */
|
||||
|
||||
/* If no IF= option is provided on the command line, then read
|
||||
* from stdin.
|
||||
*/
|
||||
|
||||
#ifdef CAN_PIPE_FROM_STD
|
||||
DD_INFD = 0; /* stdin */
|
||||
#ifndef CONFIG_NSH_DISABLE_DD
|
||||
dd.infread = readch; /* Character oriented read */
|
||||
dd.infclose = noclose; /* Don't close stdin */
|
||||
#endif
|
||||
#endif
|
||||
/* If no OF= option is provided on the command line, then write
|
||||
* to stdout.
|
||||
*/
|
||||
|
||||
#ifdef CAN_PIPE_FROM_STD
|
||||
DD_OUTDF = 1; /* stdout */
|
||||
#ifndef CONFIG_NSH_DISABLE_DD
|
||||
dd.outfwrite = writech; /* Character oriented write */
|
||||
dd.outfclose = noclose; /* Don't close stdout */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Parse command line parameters */
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if (strncmp(argv[i], "if=", 3) == 0)
|
||||
{
|
||||
infile = nsh_getfullpath(vtbl, &argv[i][3]);
|
||||
}
|
||||
else if (strncmp(argv[i], "of=", 3) == 0)
|
||||
{
|
||||
outfile = nsh_getfullpath(vtbl, &argv[i][3]);
|
||||
}
|
||||
else if (strncmp(argv[i], "bs=", 3) == 0)
|
||||
{
|
||||
dd.sectsize = atoi(&argv[i][3]);
|
||||
}
|
||||
else if (strncmp(argv[i], "count=", 6) == 0)
|
||||
{
|
||||
dd.nsectors = atoi(&argv[i][6]);
|
||||
}
|
||||
else if (strncmp(argv[i], "skip=", 5) == 0)
|
||||
{
|
||||
dd.skip = atoi(&argv[i][5]);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef CAN_PIPE_FROM_STD
|
||||
if (!infile || !outfile)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtargrequired, g_dd);
|
||||
goto errout_with_paths;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (dd.skip < 0 || dd.skip > dd.nsectors)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, g_dd);
|
||||
goto errout_with_paths;
|
||||
}
|
||||
|
||||
/* Allocate the I/O buffer */
|
||||
|
||||
dd.buffer = malloc(dd.sectsize);
|
||||
if (!dd.buffer)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdoutofmemory, g_dd);
|
||||
goto errout_with_paths;
|
||||
}
|
||||
|
||||
/* Open the input file */
|
||||
|
||||
ret = dd_infopen(infile, &dd);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_with_paths;
|
||||
}
|
||||
|
||||
/* Open the output file */
|
||||
|
||||
ret = dd_outfopen(outfile, &dd);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_with_inf;
|
||||
}
|
||||
|
||||
/* Then perform the data transfer */
|
||||
|
||||
dd.sector = 0;
|
||||
while (!dd.eof && dd.nsectors > 0)
|
||||
{
|
||||
/* Read one sector from from the input */
|
||||
|
||||
ret = DD_READ(&dd);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_with_outf;
|
||||
}
|
||||
|
||||
/* Has the incoming data stream ended? */
|
||||
|
||||
if (!dd.eof)
|
||||
{
|
||||
/* Pad with zero if necessary (at the end of file only) */
|
||||
|
||||
for (i = dd.nbytes; i < dd.sectsize; i++)
|
||||
{
|
||||
dd.buffer[i] = 0;
|
||||
}
|
||||
|
||||
/* Write one sector to the output file */
|
||||
|
||||
if (dd.sector >= dd.skip)
|
||||
{
|
||||
ret = DD_WRITE(&dd);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_with_outf;
|
||||
}
|
||||
|
||||
/* Decrement to show that a sector was written */
|
||||
|
||||
dd.nsectors--;
|
||||
}
|
||||
|
||||
/* Increment the sector number */
|
||||
|
||||
dd.sector++;
|
||||
}
|
||||
}
|
||||
ret = OK;
|
||||
|
||||
errout_with_outf:
|
||||
DD_INCLOSE(&dd);
|
||||
errout_with_inf:
|
||||
DD_OUTCLOSE(&dd);
|
||||
free(dd.buffer);
|
||||
errout_with_paths:
|
||||
if (infile)
|
||||
{
|
||||
free(infile);
|
||||
}
|
||||
if (outfile)
|
||||
{
|
||||
free(outfile);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NFILE_DESCRIPTORS && !CONFIG_NSH_DISABLE_DD */
|
||||
|
||||
@@ -0,0 +1,338 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_envcmds.c
|
||||
*
|
||||
* Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <libgen.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
static const char g_pwd[] = "PWD";
|
||||
static const char g_oldpwd[] = "OLDPWD";
|
||||
static const char g_home[] = CONFIG_LIB_HOMEDIR;
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_getwd
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
static inline FAR const char *nsh_getwd(const char *wd)
|
||||
{
|
||||
const char *val;
|
||||
|
||||
/* If no working directory is defined, then default to the home directory */
|
||||
|
||||
val = getenv(wd);
|
||||
if (!val)
|
||||
{
|
||||
val = g_home;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_getdirpath
|
||||
****************************************************************************/
|
||||
|
||||
static inline char *nsh_getdirpath(FAR struct nsh_vtbl_s *vtbl,
|
||||
const char *dirpath, const char *relpath)
|
||||
{
|
||||
char *alloc;
|
||||
int len;
|
||||
|
||||
/* Handle the special case where the dirpath is simply "/" */
|
||||
|
||||
if (strcmp(dirpath, "/") == 0)
|
||||
{
|
||||
len = strlen(relpath) + 2;
|
||||
alloc = (char*)malloc(len);
|
||||
if (alloc)
|
||||
{
|
||||
sprintf(alloc, "/%s", relpath);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
len = strlen(dirpath) + strlen(relpath) + 2;
|
||||
alloc = (char*)malloc(len);
|
||||
if (alloc)
|
||||
{
|
||||
sprintf(alloc, "%s/%s", dirpath, relpath);
|
||||
}
|
||||
}
|
||||
|
||||
if (!alloc)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdoutofmemory, "nsh_getdirpath");
|
||||
}
|
||||
return alloc;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_getwd
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
FAR const char *nsh_getcwd(void)
|
||||
{
|
||||
return nsh_getwd(g_pwd);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_getfullpath
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
char *nsh_getfullpath(FAR struct nsh_vtbl_s *vtbl, const char *relpath)
|
||||
{
|
||||
const char *wd;
|
||||
|
||||
/* Handle some special cases */
|
||||
|
||||
if (!relpath || relpath[0] == '\0')
|
||||
{
|
||||
/* No relative path provided */
|
||||
|
||||
return strdup(g_home);
|
||||
}
|
||||
else if (relpath[0] == '/')
|
||||
{
|
||||
return strdup(relpath);
|
||||
}
|
||||
|
||||
/* Get the path to the current working directory */
|
||||
|
||||
wd = nsh_getcwd();
|
||||
|
||||
/* Fake the '.' directory */
|
||||
|
||||
if (strcmp(relpath, ".") == 0)
|
||||
{
|
||||
return strdup(wd);
|
||||
}
|
||||
|
||||
/* Return the full path */
|
||||
|
||||
return nsh_getdirpath(vtbl, wd, relpath);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_freefullpath
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
void nsh_freefullpath(char *relpath)
|
||||
{
|
||||
if (relpath)
|
||||
{
|
||||
free(relpath);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_cd
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
#ifndef CONFIG_NSH_DISABLE_CD
|
||||
int cmd_cd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
const char *path = argv[1];
|
||||
char *alloc = NULL;
|
||||
char *fullpath = NULL;
|
||||
int ret = OK;
|
||||
|
||||
/* Check for special arguments */
|
||||
|
||||
if (argc < 2 || strcmp(path, "~") == 0)
|
||||
{
|
||||
path = g_home;
|
||||
}
|
||||
else if (strcmp(path, "-") == 0)
|
||||
{
|
||||
alloc = strdup(nsh_getwd(g_oldpwd));
|
||||
path = alloc;
|
||||
}
|
||||
else if (strcmp(path, "..") == 0)
|
||||
{
|
||||
alloc = strdup(nsh_getcwd());
|
||||
path = dirname(alloc);
|
||||
}
|
||||
else
|
||||
{
|
||||
fullpath = nsh_getfullpath(vtbl, path);
|
||||
path = fullpath;
|
||||
}
|
||||
|
||||
/* Set the new workding directory */
|
||||
|
||||
ret = chdir(path);
|
||||
if (ret != 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "chdir", NSH_ERRNO);
|
||||
ret = ERROR;
|
||||
}
|
||||
|
||||
/* Free any memory that was allocated */
|
||||
|
||||
if (alloc)
|
||||
{
|
||||
free(alloc);
|
||||
}
|
||||
|
||||
if (fullpath)
|
||||
{
|
||||
nsh_freefullpath(fullpath);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_echo
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_ECHO
|
||||
int cmd_echo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* echo each argument, separated by a space as it must have been on the
|
||||
* command line
|
||||
*/
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
nsh_output(vtbl, "%s ", argv[i]);
|
||||
}
|
||||
nsh_output(vtbl, "\n");
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_pwd
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)
|
||||
#ifndef CONFIG_NSH_DISABLE_PWD
|
||||
int cmd_pwd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
nsh_output(vtbl, "%s\n", nsh_getcwd());
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_set
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_ENVIRON
|
||||
#ifndef CONFIG_NSH_DISABLE_SET
|
||||
int cmd_set(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
int ret = setenv(argv[1], argv[2], TRUE);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "setenv", NSH_ERRNO);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_unset
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_ENVIRON
|
||||
#ifndef CONFIG_NSH_DISABLE_UNSET
|
||||
int cmd_unset(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
int ret = unsetenv(argv[1]);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "unsetenv", NSH_ERRNO);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,102 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_init.c
|
||||
*
|
||||
* Copyright (C) 2007-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include "nsh.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_initialize
|
||||
*
|
||||
* Description:
|
||||
* This nterfaces is used to initialize the NuttShell (NSH).
|
||||
* nsh_initialize() should be called one during application start-up prior
|
||||
* to executing either nsh_consolemain() or nsh_telnetstart().
|
||||
*
|
||||
* Input Parameters:
|
||||
* None
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void nsh_initialize(void)
|
||||
{
|
||||
/* Mount the /etc filesystem */
|
||||
|
||||
(void)nsh_romfsetc();
|
||||
|
||||
/* Perform architecture-specific initialization (if available) */
|
||||
|
||||
(void)nsh_archinitialize();
|
||||
|
||||
/* Bring up the network */
|
||||
|
||||
(void)nsh_netinit();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_mmcmds.c
|
||||
*
|
||||
* Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_free
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_FREE
|
||||
int cmd_free(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct mallinfo mem;
|
||||
|
||||
#ifdef CONFIG_CAN_PASS_STRUCTS
|
||||
mem = mallinfo();
|
||||
#else
|
||||
(void)mallinfo(&mem);
|
||||
#endif
|
||||
|
||||
nsh_output(vtbl, " total used free largest\n");
|
||||
nsh_output(vtbl, "Mem: %11d%11d%11d%11d\n",
|
||||
mem.arena, mem.uordblks, mem.fordblks, mem.mxordblk);
|
||||
|
||||
return OK;
|
||||
}
|
||||
#endif /* !CONFIG_NSH_DISABLE_FREE */
|
||||
@@ -0,0 +1,434 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_mntcmds.c
|
||||
*
|
||||
* Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/statfs.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: df_handler
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT) && \
|
||||
defined(CONFIG_FS_READABLE) && !defined(CONFIG_NSH_DISABLE_MOUNT)
|
||||
static int df_handler(FAR const char *mountpoint,
|
||||
FAR struct statfs *statbuf, FAR void *arg)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = (FAR struct nsh_vtbl_s *)arg;
|
||||
|
||||
DEBUGASSERT(mountpoint && statbuf && vtbl);
|
||||
|
||||
nsh_output(vtbl, "%6ld %8ld %8ld %8ld %s\n",
|
||||
statbuf->f_bsize, statbuf->f_blocks,
|
||||
statbuf->f_blocks - statbuf->f_bavail, statbuf->f_bavail,
|
||||
mountpoint);
|
||||
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: mount_handler
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT) && \
|
||||
defined(CONFIG_FS_READABLE) && !defined(CONFIG_NSH_DISABLE_MOUNT)
|
||||
static int mount_handler(FAR const char *mountpoint,
|
||||
FAR struct statfs *statbuf, FAR void *arg)
|
||||
{
|
||||
FAR struct nsh_vtbl_s *vtbl = (FAR struct nsh_vtbl_s *)arg;
|
||||
FAR const char *fstype;
|
||||
|
||||
DEBUGASSERT(mountpoint && statbuf && vtbl);
|
||||
|
||||
/* Get the file system type */
|
||||
|
||||
switch (statbuf->f_type)
|
||||
{
|
||||
#ifdef CONFIG_FS_FAT
|
||||
case MSDOS_SUPER_MAGIC:
|
||||
fstype = "vfat";
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_ROMFS
|
||||
case ROMFS_MAGIC:
|
||||
fstype = "romfs";
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_APPS_BINDIR
|
||||
case BINFS_MAGIC:
|
||||
fstype = "bindir";
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_NXFFS
|
||||
case NXFFS_MAGIC:
|
||||
fstype = "nxffs";
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NFS
|
||||
case NFS_SUPER_MAGIC:
|
||||
fstype = "nfs";
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
fstype = "Unrecognized";
|
||||
break;
|
||||
}
|
||||
|
||||
nsh_output(vtbl, " %s type %s\n", mountpoint, fstype);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: mount_show
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT) && \
|
||||
defined(CONFIG_FS_READABLE) && !defined(CONFIG_NSH_DISABLE_MOUNT)
|
||||
static inline int mount_show(FAR struct nsh_vtbl_s *vtbl, FAR const char *progname)
|
||||
{
|
||||
return foreach_mountpoint(mount_handler, (FAR void *)vtbl);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_df
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT) && \
|
||||
defined(CONFIG_FS_READABLE) && !defined(CONFIG_NSH_DISABLE_DF)
|
||||
int cmd_df(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
nsh_output(vtbl, " Block Number\n");
|
||||
nsh_output(vtbl, " Size Blocks Used Available Mounted on\n");
|
||||
|
||||
return foreach_mountpoint(df_handler, (FAR void *)vtbl);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_mount
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT) && \
|
||||
defined(CONFIG_FS_READABLE) && !defined(CONFIG_NSH_DISABLE_MOUNT)
|
||||
int cmd_mount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
FAR char *source;
|
||||
FAR char *target;
|
||||
FAR char *filesystem = NULL;
|
||||
bool badarg = false;
|
||||
int option;
|
||||
int ret;
|
||||
|
||||
/* The mount command behaves differently if no parameters are provided */
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
return mount_show(vtbl, argv[0]);
|
||||
}
|
||||
|
||||
/* Get the mount options. NOTE: getopt() is not thread safe nor re-entrant.
|
||||
* To keep its state proper for the next usage, it is necessary to parse to
|
||||
* the end of the line even if an error occurs. If an error occurs, this
|
||||
* logic just sets 'badarg' and continues.
|
||||
*/
|
||||
|
||||
while ((option = getopt(argc, argv, ":t:")) != ERROR)
|
||||
{
|
||||
switch (option)
|
||||
{
|
||||
case 't':
|
||||
filesystem = optarg;
|
||||
break;
|
||||
|
||||
case ':':
|
||||
nsh_output(vtbl, g_fmtargrequired, argv[0]);
|
||||
badarg = true;
|
||||
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)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* There are two required arguments after the options: the source and target
|
||||
* paths.
|
||||
*/
|
||||
|
||||
if (optind + 2 < argc)
|
||||
{
|
||||
nsh_output(vtbl, g_fmttoomanyargs, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
else if (optind + 2 > argc)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtargrequired, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* While the above parsing for the -t argument looks nice, the -t argument
|
||||
* not really optional.
|
||||
*/
|
||||
|
||||
if (!filesystem)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtargrequired, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* The source and target paths might be relative to the current
|
||||
* working directory.
|
||||
*/
|
||||
|
||||
source = nsh_getfullpath(vtbl, argv[optind]);
|
||||
if (!source)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
target = nsh_getfullpath(vtbl, argv[optind+1]);
|
||||
if (!target)
|
||||
{
|
||||
nsh_freefullpath(source);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Perform the mount */
|
||||
|
||||
ret = mount(source, target, filesystem, 0, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "mount", NSH_ERRNO);
|
||||
}
|
||||
|
||||
nsh_freefullpath(source);
|
||||
nsh_freefullpath(target);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_nfsmount
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT) && \
|
||||
defined(CONFIG_NET) && defined(CONFIG_NFS) && !defined(CONFIG_NSH_DISABLE_NFSMOUNT)
|
||||
int cmd_nfsmount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct nfs_args data;
|
||||
FAR char *address;
|
||||
FAR char *lpath;
|
||||
FAR char *rpath;
|
||||
bool badarg = false;
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
FAR struct sockaddr_in6 *sin;
|
||||
struct in6_addr inaddr;
|
||||
#else
|
||||
FAR struct sockaddr_in *sin;
|
||||
struct in_addr inaddr;
|
||||
#endif
|
||||
int ret;
|
||||
|
||||
/* If a bad argument was encountered, then return without processing the
|
||||
* command.
|
||||
*/
|
||||
|
||||
if (badarg)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* The fist argument on the command line should be the NFS server IP address
|
||||
* in standard IPv4 (or IPv6) dot format.
|
||||
*/
|
||||
|
||||
address = argv[1];
|
||||
if (!address)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* The local mount point path (lpath) might be relative to the current working
|
||||
* directory.
|
||||
*/
|
||||
|
||||
lpath = nsh_getfullpath(vtbl, argv[2]);
|
||||
if (!lpath)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Get the remote mount point path */
|
||||
|
||||
rpath = argv[3];
|
||||
|
||||
/* Convert the IP address string into its binary form */
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
ret = inet_pton(AF_INET6, address, &inaddr);
|
||||
#else
|
||||
ret = inet_pton(AF_INET, address, &inaddr);
|
||||
#endif
|
||||
if (ret != 1)
|
||||
{
|
||||
nsh_freefullpath(lpath);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Place all of the NFS arguements into the nfs_args structure */
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
sin = (FAR struct sockaddr_in6 *)&data.addr;
|
||||
sin->sin_family = AF_INET6;
|
||||
sin->sin_port = htons(NFS_PMAPPORT);
|
||||
memcpy(&sin->sin6_addr, &inaddr, sizeof(struct in6_addr));
|
||||
data.addrlen = sizeof(struct sockaddr_in6);
|
||||
#else
|
||||
sin = (FAR struct sockaddr_in *)&data.addr;
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_port = htons(NFS_PMAPPORT);
|
||||
sin->sin_addr = inaddr;
|
||||
data.addrlen = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
|
||||
data.sotype = SOCK_DGRAM;
|
||||
data.path = rpath;
|
||||
data.flags = 0; /* 0=Use all defaults */
|
||||
|
||||
/* Perform the mount */
|
||||
|
||||
ret = mount(NULL, lpath, "nfs", 0, (FAR void *)&data);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "mount", NSH_ERRNO);
|
||||
}
|
||||
|
||||
/* We no longer need the allocated mount point path */
|
||||
|
||||
nsh_freefullpath(lpath);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_umount
|
||||
****************************************************************************/
|
||||
|
||||
#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_MOUNTPOINT) && \
|
||||
defined(CONFIG_FS_READABLE) && !defined(CONFIG_NSH_DISABLE_UMOUNT)
|
||||
int cmd_umount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
char *fullpath = nsh_getfullpath(vtbl, argv[1]);
|
||||
int ret = ERROR;
|
||||
|
||||
if (fullpath)
|
||||
{
|
||||
/* Perform the umount */
|
||||
|
||||
ret = umount(fullpath);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "umount", NSH_ERRNO);
|
||||
}
|
||||
nsh_freefullpath(fullpath);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,864 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_netcmds.c
|
||||
*
|
||||
* Copyright (C) 2007-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
#ifdef CONFIG_NET
|
||||
|
||||
#include <sys/stat.h> /* Needed for open */
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sched.h>
|
||||
#include <fcntl.h> /* Needed for open */
|
||||
#include <libgen.h> /* Needed for basename */
|
||||
#include <errno.h>
|
||||
|
||||
#include <nuttx/net/net.h>
|
||||
#include <nuttx/clock.h>
|
||||
#include <net/ethernet.h>
|
||||
#include <nuttx/net/uip/uip.h>
|
||||
#include <nuttx/net/uip/uip-arch.h>
|
||||
#include <netinet/ether.h>
|
||||
|
||||
#ifdef CONFIG_NET_STATISTICS
|
||||
# include <nuttx/net/uip/uip.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_PING) && \
|
||||
!defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_DISABLE_SIGNALS)
|
||||
# include <apps/netutils/uiplib.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_UDP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
# include <apps/netutils/uiplib.h>
|
||||
# include <apps/netutils/tftp.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_TCP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
# ifndef CONFIG_NSH_DISABLE_WGET
|
||||
# include <apps/netutils/uiplib.h>
|
||||
# include <apps/netutils/webclient.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define DEFAULT_PING_DATALEN 56
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_UDP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
struct tftpc_args_s
|
||||
{
|
||||
bool binary; /* true:binary ("octect") false:text ("netascii") */
|
||||
bool allocated; /* true: destpath is allocated */
|
||||
char *destpath; /* Path at destination */
|
||||
const char *srcpath; /* Path at src */
|
||||
in_addr_t ipaddr; /* Host IP address */
|
||||
};
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_PING) && \
|
||||
!defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_DISABLE_SIGNALS)
|
||||
static uint16_t g_pingid = 0;
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ping_newid
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_PING) && \
|
||||
!defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_DISABLE_SIGNALS)
|
||||
static inline uint16_t ping_newid(void)
|
||||
{
|
||||
irqstate_t save = irqsave();
|
||||
uint16_t ret = ++g_pingid;
|
||||
irqrestore(save);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: uip_statistics
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS) && !defined(CONFIG_NSH_DISABLE_IFCONFIG)
|
||||
static inline void uip_statistics(FAR struct nsh_vtbl_s *vtbl)
|
||||
{
|
||||
nsh_output(vtbl, "uIP IP ");
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " TCP");
|
||||
#endif
|
||||
#ifdef CONFIG_NET_UDP
|
||||
nsh_output(vtbl, " UDP");
|
||||
#endif
|
||||
#ifdef CONFIG_NET_ICMP
|
||||
nsh_output(vtbl, " ICMP");
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
|
||||
/* Received packets */
|
||||
|
||||
nsh_output(vtbl, "Received %04x",uip_stat.ip.recv);
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " %04x",uip_stat.tcp.recv);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_UDP
|
||||
nsh_output(vtbl, " %04x",uip_stat.udp.recv);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_ICMP
|
||||
nsh_output(vtbl, " %04x",uip_stat.icmp.recv);
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
|
||||
/* Dropped packets */
|
||||
|
||||
nsh_output(vtbl, "Dropped %04x",uip_stat.ip.drop);
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " %04x",uip_stat.tcp.drop);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_UDP
|
||||
nsh_output(vtbl, " %04x",uip_stat.udp.drop);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_ICMP
|
||||
nsh_output(vtbl, " %04x",uip_stat.icmp.drop);
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
|
||||
nsh_output(vtbl, " IP VHL: %04x HBL: %04x\n",
|
||||
uip_stat.ip.vhlerr, uip_stat.ip.hblenerr);
|
||||
nsh_output(vtbl, " LBL: %04x Frg: %04x\n",
|
||||
uip_stat.ip.lblenerr, uip_stat.ip.fragerr);
|
||||
|
||||
nsh_output(vtbl, " Checksum %04x",uip_stat.ip.chkerr);
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " %04x",uip_stat.tcp.chkerr);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_UDP
|
||||
nsh_output(vtbl, " %04x",uip_stat.udp.chkerr);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_ICMP
|
||||
nsh_output(vtbl, " ----");
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " TCP ACK: %04x SYN: %04x\n",
|
||||
uip_stat.tcp.ackerr, uip_stat.tcp.syndrop);
|
||||
nsh_output(vtbl, " RST: %04x %04x\n",
|
||||
uip_stat.tcp.rst, uip_stat.tcp.synrst);
|
||||
#endif
|
||||
|
||||
nsh_output(vtbl, " Type %04x",uip_stat.ip.protoerr);
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " ----");
|
||||
#endif
|
||||
#ifdef CONFIG_NET_UDP
|
||||
nsh_output(vtbl, " ----");
|
||||
#endif
|
||||
#ifdef CONFIG_NET_ICMP
|
||||
nsh_output(vtbl, " %04x",uip_stat.icmp.typeerr);
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
|
||||
/* Sent packets */
|
||||
|
||||
nsh_output(vtbl, "Sent ----",uip_stat.ip.sent);
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " %04x",uip_stat.tcp.sent);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_UDP
|
||||
nsh_output(vtbl, " %04x",uip_stat.udp.sent);
|
||||
#endif
|
||||
#ifdef CONFIG_NET_ICMP
|
||||
nsh_output(vtbl, " %04x",uip_stat.icmp.sent);
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
|
||||
#ifdef CONFIG_NET_TCP
|
||||
nsh_output(vtbl, " Rexmit ---- %04x",uip_stat.tcp.rexmit);
|
||||
#ifdef CONFIG_NET_UDP
|
||||
nsh_output(vtbl, " ----");
|
||||
#endif
|
||||
#ifdef CONFIG_NET_ICMP
|
||||
nsh_output(vtbl, " ----");
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
#endif
|
||||
nsh_output(vtbl, "\n");
|
||||
}
|
||||
#else
|
||||
# define uip_statistics(vtbl)
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ifconfig_callback
|
||||
****************************************************************************/
|
||||
|
||||
int ifconfig_callback(FAR struct uip_driver_s *dev, void *arg)
|
||||
{
|
||||
struct nsh_vtbl_s *vtbl = (struct nsh_vtbl_s*)arg;
|
||||
struct in_addr addr;
|
||||
|
||||
nsh_output(vtbl, "%s\tHWaddr %s\n", dev->d_ifname, ether_ntoa(&dev->d_mac));
|
||||
addr.s_addr = dev->d_ipaddr;
|
||||
nsh_output(vtbl, "\tIPaddr:%s ", inet_ntoa(addr));
|
||||
addr.s_addr = dev->d_draddr;
|
||||
nsh_output(vtbl, "DRaddr:%s ", inet_ntoa(addr));
|
||||
addr.s_addr = dev->d_netmask;
|
||||
nsh_output(vtbl, "Mask:%s\n\n", inet_ntoa(addr));
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: tftpc_parseargs
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_UDP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
int tftpc_parseargs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
||||
struct tftpc_args_s *args)
|
||||
{
|
||||
FAR const char *fmt = g_fmtarginvalid;
|
||||
bool badarg = false;
|
||||
int option;
|
||||
|
||||
/* Get the ping options */
|
||||
|
||||
memset(args, 0, sizeof(struct tftpc_args_s));
|
||||
while ((option = getopt(argc, argv, ":bnf:h:")) != ERROR)
|
||||
{
|
||||
switch (option)
|
||||
{
|
||||
case 'b':
|
||||
args->binary = true;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
args->binary = false;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
args->destpath = optarg;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
if (!uiplib_ipaddrconv(optarg, (FAR unsigned char*)&args->ipaddr))
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
badarg = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case ':':
|
||||
nsh_output(vtbl, g_fmtargrequired, argv[0]);
|
||||
badarg = true;
|
||||
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)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* There should be exactly one parameter left on the command-line */
|
||||
|
||||
if (optind == argc-1)
|
||||
{
|
||||
args->srcpath = argv[optind];
|
||||
}
|
||||
|
||||
/* optind == argc means that there is nothing left on the command-line */
|
||||
|
||||
else if (optind >= argc)
|
||||
{
|
||||
fmt = g_fmtargrequired;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* optind < argc-1 means that there are too many arguments on the
|
||||
* command-line
|
||||
*/
|
||||
|
||||
else
|
||||
{
|
||||
fmt = g_fmttoomanyargs;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* The HOST IP address is also required */
|
||||
|
||||
if (!args->ipaddr)
|
||||
{
|
||||
fmt = g_fmtargrequired;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* If the destpath was not provided, then we have do a little work. */
|
||||
|
||||
if (!args->destpath)
|
||||
{
|
||||
char *tmp1;
|
||||
char *tmp2;
|
||||
|
||||
/* Copy the srcpath... baseanme might modify it */
|
||||
|
||||
fmt = g_fmtcmdoutofmemory;
|
||||
tmp1 = strdup(args->srcpath);
|
||||
if (!tmp1)
|
||||
{
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Get the basename of the srcpath */
|
||||
|
||||
tmp2 = basename(tmp1);
|
||||
if (!tmp2)
|
||||
{
|
||||
free(tmp1);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Use that basename as the destpath */
|
||||
|
||||
args->destpath = strdup(tmp2);
|
||||
free(tmp1);
|
||||
if (!args->destpath)
|
||||
{
|
||||
goto errout;
|
||||
}
|
||||
args->allocated = true;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
nsh_output(vtbl, fmt, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: wget_callback
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_TCP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
#ifndef CONFIG_NSH_DISABLE_WGET
|
||||
static void wget_callback(FAR char **buffer, int offset, int datend,
|
||||
FAR int *buflen, FAR void *arg)
|
||||
{
|
||||
(void)write((int)arg, &((*buffer)[offset]), datend - offset);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_get
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_UDP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
#ifndef CONFIG_NSH_DISABLE_GET
|
||||
int cmd_get(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct tftpc_args_s args;
|
||||
char *fullpath;
|
||||
|
||||
/* Parse the input parameter list */
|
||||
|
||||
if (tftpc_parseargs(vtbl, argc, argv, &args) != OK)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Get the full path to the local file */
|
||||
|
||||
fullpath = nsh_getfullpath(vtbl, args.srcpath);
|
||||
|
||||
/* Then perform the TFTP get operation */
|
||||
|
||||
if (tftpget(args.srcpath, fullpath, args.ipaddr, args.binary) != OK)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "tftpget", NSH_ERRNO);
|
||||
}
|
||||
|
||||
/* Release any allocated memory */
|
||||
|
||||
if (args.allocated)
|
||||
{
|
||||
free(args.destpath);
|
||||
}
|
||||
free(fullpath);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_ifconfig
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_IFCONFIG
|
||||
int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct in_addr addr;
|
||||
in_addr_t ip;
|
||||
|
||||
/* With one or no arguments, ifconfig simply shows the status of ethernet
|
||||
* device:
|
||||
*
|
||||
* ifconfig
|
||||
* ifconfig [nic_name]
|
||||
*/
|
||||
|
||||
if (argc <= 2)
|
||||
{
|
||||
netdev_foreach(ifconfig_callback, vtbl);
|
||||
uip_statistics(vtbl);
|
||||
return OK;
|
||||
}
|
||||
|
||||
/* If both the network interface name and an IP address are supplied as
|
||||
* arguments, then ifconfig will set the address of the ethernet device:
|
||||
*
|
||||
* ifconfig nic_name ip_address
|
||||
*/
|
||||
|
||||
/* Set host ip address */
|
||||
|
||||
ip = addr.s_addr = inet_addr(argv[2]);
|
||||
uip_sethostaddr(argv[1], &addr);
|
||||
|
||||
/* Set gateway */
|
||||
|
||||
ip = NTOHL(ip);
|
||||
ip &= ~0x000000ff;
|
||||
ip |= 0x00000001;
|
||||
|
||||
addr.s_addr = HTONL(ip);
|
||||
uip_setdraddr(argv[1], &addr);
|
||||
|
||||
/* Set netmask */
|
||||
|
||||
addr.s_addr = inet_addr("255.255.255.0");
|
||||
uip_setnetmask(argv[1], &addr);
|
||||
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_ping
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_PING) && \
|
||||
!defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_DISABLE_SIGNALS)
|
||||
#ifndef CONFIG_NSH_DISABLE_PING
|
||||
int cmd_ping(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
FAR const char *fmt = g_fmtarginvalid;
|
||||
const char *staddr;
|
||||
uip_ipaddr_t ipaddr;
|
||||
uint32_t start;
|
||||
uint32_t next;
|
||||
uint32_t dsec = 10;
|
||||
uint16_t id;
|
||||
bool badarg = false;
|
||||
int count = 10;
|
||||
int option;
|
||||
int seqno;
|
||||
int replies = 0;
|
||||
int elapsed;
|
||||
int tmp;
|
||||
int i;
|
||||
|
||||
/* Get the ping options */
|
||||
|
||||
while ((option = getopt(argc, argv, ":c:i:")) != ERROR)
|
||||
{
|
||||
switch (option)
|
||||
{
|
||||
case 'c':
|
||||
count = atoi(optarg);
|
||||
if (count < 1 || count > 10000)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtargrange, argv[0]);
|
||||
badarg = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
tmp = atoi(optarg);
|
||||
if (tmp < 1 || tmp >= 4294)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtargrange, argv[0]);
|
||||
badarg = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
dsec = 10 * tmp;
|
||||
}
|
||||
break;
|
||||
|
||||
case ':':
|
||||
nsh_output(vtbl, g_fmtargrequired, argv[0]);
|
||||
badarg = true;
|
||||
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)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* There should be exactly on parameter left on the command-line */
|
||||
|
||||
if (optind == argc-1)
|
||||
{
|
||||
staddr = argv[optind];
|
||||
if (!uiplib_ipaddrconv(staddr, (FAR unsigned char*)&ipaddr))
|
||||
{
|
||||
goto errout;
|
||||
}
|
||||
}
|
||||
else if (optind >= argc)
|
||||
{
|
||||
fmt = g_fmttoomanyargs;
|
||||
goto errout;
|
||||
}
|
||||
else
|
||||
{
|
||||
fmt = g_fmtargrequired;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Get the ID to use */
|
||||
|
||||
id = ping_newid();
|
||||
|
||||
/* Loop for the specified count */
|
||||
|
||||
nsh_output(vtbl, "PING %s %d bytes of data\n", staddr, DEFAULT_PING_DATALEN);
|
||||
start = g_system_timer;
|
||||
for (i = 1; i <= count; i++)
|
||||
{
|
||||
/* Send the ECHO request and wait for the response */
|
||||
|
||||
next = g_system_timer;
|
||||
seqno = uip_ping(ipaddr, id, i, DEFAULT_PING_DATALEN, dsec);
|
||||
|
||||
/* Was any response returned? We can tell if a non-negative sequence
|
||||
* number was returned.
|
||||
*/
|
||||
|
||||
if (seqno >= 0 && seqno <= i)
|
||||
{
|
||||
/* Get the elpased time from the time that the request was
|
||||
* sent until the response was received. If we got a response
|
||||
* to an earlier request, then fudge the elpased time.
|
||||
*/
|
||||
|
||||
elapsed = TICK2MSEC(g_system_timer - next);
|
||||
if (seqno < i)
|
||||
{
|
||||
elapsed += 100*dsec*(i - seqno);
|
||||
}
|
||||
|
||||
/* Report the receipt of the reply */
|
||||
|
||||
nsh_output(vtbl, "%d bytes from %s: icmp_seq=%d time=%d ms\n",
|
||||
DEFAULT_PING_DATALEN, staddr, seqno, elapsed);
|
||||
replies++;
|
||||
}
|
||||
|
||||
/* Wait for the remainder of the interval. If the last seqno<i,
|
||||
* then this is a bad idea... we will probably lose the response
|
||||
* to the current request!
|
||||
*/
|
||||
|
||||
elapsed = TICK2DSEC(g_system_timer - next);
|
||||
if (elapsed < dsec)
|
||||
{
|
||||
usleep(100000*dsec);
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the total elapsed time */
|
||||
|
||||
elapsed = TICK2MSEC(g_system_timer - start);
|
||||
|
||||
/* Calculate the percentage of lost packets */
|
||||
|
||||
tmp = (100*(count - replies) + (count >> 1)) / count;
|
||||
|
||||
nsh_output(vtbl, "%d packets transmitted, %d received, %d%% packet loss, time %d ms\n",
|
||||
count, replies, tmp, elapsed);
|
||||
return OK;
|
||||
|
||||
errout:
|
||||
nsh_output(vtbl, fmt, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_NET_ICMP && CONFIG_NET_ICMP_PING */
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_put
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_UDP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
#ifndef CONFIG_NSH_DISABLE_PUT
|
||||
int cmd_put(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
struct tftpc_args_s args;
|
||||
char *fullpath;
|
||||
|
||||
/* Parse the input parameter list */
|
||||
|
||||
if (tftpc_parseargs(vtbl, argc, argv, &args) != OK)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Get the full path to the local file */
|
||||
|
||||
fullpath = nsh_getfullpath(vtbl, args.srcpath);
|
||||
|
||||
/* Then perform the TFTP put operation */
|
||||
|
||||
if (tftpput(fullpath, args.destpath, args.ipaddr, args.binary) != OK)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "tftpput", NSH_ERRNO);
|
||||
}
|
||||
|
||||
/* Release any allocated memory */
|
||||
|
||||
if (args.allocated)
|
||||
{
|
||||
free(args.destpath);
|
||||
}
|
||||
free(fullpath);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_wget
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_NET_TCP) && CONFIG_NFILE_DESCRIPTORS > 0
|
||||
#ifndef CONFIG_NSH_DISABLE_WGET
|
||||
int cmd_wget(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
char *localfile = NULL;
|
||||
char *allocfile = NULL;
|
||||
char *buffer = NULL;
|
||||
char *fullpath = NULL;
|
||||
char *url;
|
||||
const char *fmt;
|
||||
bool badarg = false;
|
||||
int option;
|
||||
int fd = -1;
|
||||
int ret;
|
||||
|
||||
/* Get the wget options */
|
||||
|
||||
while ((option = getopt(argc, argv, ":o:")) != ERROR)
|
||||
{
|
||||
switch (option)
|
||||
{
|
||||
case 'o':
|
||||
localfile = optarg;
|
||||
break;
|
||||
|
||||
case ':':
|
||||
nsh_output(vtbl, g_fmtargrequired, argv[0]);
|
||||
badarg = true;
|
||||
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)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* There should be exactly on parameter left on the command-line */
|
||||
|
||||
if (optind == argc-1)
|
||||
{
|
||||
url = argv[optind];
|
||||
}
|
||||
else if (optind >= argc)
|
||||
{
|
||||
fmt = g_fmttoomanyargs;
|
||||
goto errout;
|
||||
}
|
||||
else
|
||||
{
|
||||
fmt = g_fmtargrequired;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Get the local file name */
|
||||
|
||||
if (!localfile)
|
||||
{
|
||||
allocfile = strdup(url);
|
||||
localfile = basename(allocfile);
|
||||
}
|
||||
|
||||
/* Get the full path to the local file */
|
||||
|
||||
fullpath = nsh_getfullpath(vtbl, localfile);
|
||||
|
||||
/* Open the local file for writing */
|
||||
|
||||
fd = open(fullpath, O_WRONLY|O_CREAT|O_TRUNC, 0644);
|
||||
if (fd < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "open", NSH_ERRNO);
|
||||
ret = ERROR;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Allocate an I/O buffer */
|
||||
|
||||
buffer = malloc(512);
|
||||
if (!buffer)
|
||||
{
|
||||
fmt = g_fmtcmdoutofmemory;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* And perform the wget */
|
||||
|
||||
ret = wget(url, buffer, 512, wget_callback, (FAR void *)fd);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "wget", NSH_ERRNO);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Free allocated resources */
|
||||
|
||||
exit:
|
||||
if (fd >= 0)
|
||||
{
|
||||
close(fd);
|
||||
}
|
||||
if (allocfile)
|
||||
{
|
||||
free(allocfile);
|
||||
}
|
||||
if (fullpath)
|
||||
{
|
||||
free(fullpath);
|
||||
}
|
||||
if (buffer)
|
||||
{
|
||||
free(buffer);
|
||||
}
|
||||
return ret;
|
||||
|
||||
errout:
|
||||
nsh_output(vtbl, fmt, argv[0]);
|
||||
ret = ERROR;
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_NET */
|
||||
@@ -0,0 +1,171 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_netinit.c
|
||||
*
|
||||
* Copyright (C) 2010-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* This is influenced by similar logic from uIP:
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
* Copyright (c) 2003, Adam Dunkels.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the Institute nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <debug.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#include <apps/netutils/uiplib.h>
|
||||
#if defined(CONFIG_NSH_DHCPC)
|
||||
# include <apps/netutils/resolv.h>
|
||||
# include <apps/netutils/dhcpc.h>
|
||||
#endif
|
||||
|
||||
#include "nsh.h"
|
||||
|
||||
#ifdef CONFIG_NET
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_netinit
|
||||
*
|
||||
* Description:
|
||||
* Initialize the network per the selected NuttX configuration
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_netinit(void)
|
||||
{
|
||||
struct in_addr addr;
|
||||
#if defined(CONFIG_NSH_DHCPC)
|
||||
FAR void *handle;
|
||||
#endif
|
||||
#if defined(CONFIG_NSH_DHCPC) || defined(CONFIG_NSH_NOMAC)
|
||||
uint8_t mac[IFHWADDRLEN];
|
||||
#endif
|
||||
|
||||
/* Many embedded network interfaces must have a software assigned MAC */
|
||||
|
||||
#ifdef CONFIG_NSH_NOMAC
|
||||
mac[0] = 0x00;
|
||||
mac[1] = 0xe0;
|
||||
mac[2] = 0xde;
|
||||
mac[3] = 0xad;
|
||||
mac[4] = 0xbe;
|
||||
mac[5] = 0xef;
|
||||
uip_setmacaddr("eth0", mac);
|
||||
#endif
|
||||
|
||||
/* Set up our host address */
|
||||
|
||||
#if !defined(CONFIG_NSH_DHCPC)
|
||||
addr.s_addr = HTONL(CONFIG_NSH_IPADDR);
|
||||
#else
|
||||
addr.s_addr = 0;
|
||||
#endif
|
||||
uip_sethostaddr("eth0", &addr);
|
||||
|
||||
/* Set up the default router address */
|
||||
|
||||
addr.s_addr = HTONL(CONFIG_NSH_DRIPADDR);
|
||||
uip_setdraddr("eth0", &addr);
|
||||
|
||||
/* Setup the subnet mask */
|
||||
|
||||
addr.s_addr = HTONL(CONFIG_NSH_NETMASK);
|
||||
uip_setnetmask("eth0", &addr);
|
||||
|
||||
#if defined(CONFIG_NSH_DHCPC)
|
||||
/* Set up the resolver */
|
||||
|
||||
resolv_init();
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NSH_DHCPC)
|
||||
/* Get the MAC address of the NIC */
|
||||
|
||||
uip_getmacaddr("eth0", mac);
|
||||
|
||||
/* Set up the DHCPC modules */
|
||||
|
||||
handle = dhcpc_open(&mac, IFHWADDRLEN);
|
||||
|
||||
/* Get an IP address. Note that there is no logic for renewing the IP address in this
|
||||
* example. The address should be renewed in ds.lease_time/2 seconds.
|
||||
*/
|
||||
|
||||
if (handle)
|
||||
{
|
||||
struct dhcpc_state ds;
|
||||
(void)dhcpc_request(handle, &ds);
|
||||
uip_sethostaddr("eth1", &ds.ipaddr);
|
||||
if (ds.netmask.s_addr != 0)
|
||||
{
|
||||
uip_setnetmask("eth0", &ds.netmask);
|
||||
}
|
||||
if (ds.default_router.s_addr != 0)
|
||||
{
|
||||
uip_setdraddr("eth0", &ds.default_router);
|
||||
}
|
||||
if (ds.dnsaddr.s_addr != 0)
|
||||
{
|
||||
resolv_conf(&ds.dnsaddr);
|
||||
}
|
||||
dhcpc_close(handle);
|
||||
}
|
||||
#endif
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,310 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_proccmds.c
|
||||
*
|
||||
* Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sched.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/* The returned value should be zero for sucess or TRUE or non zero for
|
||||
* failure or FALSE.
|
||||
*/
|
||||
|
||||
typedef int (*exec_t)(void);
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_PS
|
||||
static const char *g_statenames[] =
|
||||
{
|
||||
"INVALID ",
|
||||
"PENDING ",
|
||||
"READY ",
|
||||
"RUNNING ",
|
||||
"INACTIVE",
|
||||
"WAITSEM ",
|
||||
#ifndef CONFIG_DISABLE_MQUEUE
|
||||
"WAITSIG ",
|
||||
#endif
|
||||
#ifndef CONFIG_DISABLE_MQUEUE
|
||||
"MQNEMPTY",
|
||||
"MQNFULL "
|
||||
#endif
|
||||
};
|
||||
|
||||
static const char *g_ttypenames[4] =
|
||||
{
|
||||
"TASK ",
|
||||
"PTHREAD",
|
||||
"KTHREAD",
|
||||
"--?-- "
|
||||
};
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ps_task
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_PS
|
||||
static void ps_task(FAR _TCB *tcb, FAR void *arg)
|
||||
{
|
||||
struct nsh_vtbl_s *vtbl = (struct nsh_vtbl_s*)arg;
|
||||
#if CONFIG_MAX_TASK_ARGS > 2
|
||||
int i;
|
||||
#endif
|
||||
|
||||
/* Show task status */
|
||||
|
||||
nsh_output(vtbl, "%5d %3d %4s %7s%c%c %8s ",
|
||||
tcb->pid, tcb->sched_priority,
|
||||
tcb->flags & TCB_FLAG_ROUND_ROBIN ? "RR " : "FIFO",
|
||||
g_ttypenames[(tcb->flags & TCB_FLAG_TTYPE_MASK) >> TCB_FLAG_TTYPE_SHIFT],
|
||||
tcb->flags & TCB_FLAG_NONCANCELABLE ? 'N' : ' ',
|
||||
tcb->flags & TCB_FLAG_CANCEL_PENDING ? 'P' : ' ',
|
||||
g_statenames[tcb->task_state]);
|
||||
|
||||
/* Show task name and arguments */
|
||||
|
||||
nsh_output(vtbl, "%s(", tcb->argv[0]);
|
||||
|
||||
/* Special case 1st argument (no comma) */
|
||||
|
||||
if (tcb->argv[1])
|
||||
{
|
||||
nsh_output(vtbl, "%p", tcb->argv[1]);
|
||||
}
|
||||
|
||||
/* Then any additional arguments */
|
||||
|
||||
#if CONFIG_MAX_TASK_ARGS > 2
|
||||
for (i = 2; i <= CONFIG_MAX_TASK_ARGS && tcb->argv[i]; i++)
|
||||
{
|
||||
nsh_output(vtbl, ", %p", tcb->argv[i]);
|
||||
}
|
||||
#endif
|
||||
nsh_output(vtbl, ")\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_exec
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_EXEC
|
||||
int cmd_exec(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
char *endptr;
|
||||
uintptr_t addr;
|
||||
|
||||
addr = (uintptr_t)strtol(argv[1], &endptr, 0);
|
||||
if (!addr || endptr == argv[1] || *endptr != '\0')
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
nsh_output(vtbl, "Calling %p\n", (exec_t)addr);
|
||||
return ((exec_t)addr)();
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_ps
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_NSH_DISABLE_PS
|
||||
int cmd_ps(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
nsh_output(vtbl, "PID PRI SCHD TYPE NP STATE NAME\n");
|
||||
sched_foreach(ps_task, vtbl);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_kill
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_SIGNALS
|
||||
#ifndef CONFIG_NSH_DISABLE_KILL
|
||||
int cmd_kill(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
char *ptr;
|
||||
char *endptr;
|
||||
long signal;
|
||||
long pid;
|
||||
|
||||
/* Check incoming parameters. The first parameter should be "-<signal>" */
|
||||
|
||||
ptr = argv[1];
|
||||
if (*ptr != '-' || ptr[1] < '0' || ptr[1] > '9')
|
||||
{
|
||||
goto invalid_arg;
|
||||
}
|
||||
|
||||
/* Extract the signal number */
|
||||
|
||||
signal = strtol(&ptr[1], &endptr, 0);
|
||||
|
||||
/* The second parameter should be <pid> */
|
||||
|
||||
ptr = argv[2];
|
||||
if (*ptr < '0' || *ptr > '9')
|
||||
{
|
||||
goto invalid_arg;
|
||||
}
|
||||
|
||||
/* Extract athe pid */
|
||||
|
||||
pid = strtol(ptr, &endptr, 0);
|
||||
|
||||
/* Send the signal. Kill return values:
|
||||
*
|
||||
* EINVAL An invalid signal was specified.
|
||||
* EPERM The process does not have permission to send the signal to any
|
||||
* of the target processes.
|
||||
* ESRCH The pid or process group does not exist.
|
||||
* ENOSYS Do not support sending signals to process groups.
|
||||
*/
|
||||
|
||||
if (kill((pid_t)pid, (int)signal) == 0)
|
||||
{
|
||||
return OK;
|
||||
}
|
||||
|
||||
switch (errno)
|
||||
{
|
||||
case EINVAL:
|
||||
goto invalid_arg;
|
||||
|
||||
case ESRCH:
|
||||
nsh_output(vtbl, g_fmtnosuch, argv[0], "task", argv[2]);
|
||||
return ERROR;
|
||||
|
||||
case EPERM:
|
||||
case ENOSYS:
|
||||
default:
|
||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "kill", NSH_ERRNO);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
invalid_arg:
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_sleep
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_SIGNALS
|
||||
#ifndef CONFIG_NSH_DISABLE_SLEEP
|
||||
int cmd_sleep(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
char *endptr;
|
||||
long secs;
|
||||
|
||||
secs = strtol(argv[1], &endptr, 0);
|
||||
if (!secs || endptr == argv[1] || *endptr != '\0')
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
sleep(secs);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_usleep
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_SIGNALS
|
||||
#ifndef CONFIG_NSH_DISABLE_USLEEP
|
||||
int cmd_usleep(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
char *endptr;
|
||||
long usecs;
|
||||
|
||||
usecs = strtol(argv[1], &endptr, 0);
|
||||
if (!usecs || endptr == argv[1] || *endptr != '\0')
|
||||
{
|
||||
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
usleep(usecs);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,124 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_romfsetc.c
|
||||
*
|
||||
* Copyright (C) 2008-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/mount.h>
|
||||
#include <debug.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <nuttx/ramdisk.h>
|
||||
|
||||
#include "nsh.h"
|
||||
|
||||
#ifdef CONFIG_NSH_ROMFSETC
|
||||
|
||||
/* Should we use the default ROMFS image? Or a custom, board-specific
|
||||
* ROMFS image?
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_NSH_ARCHROMFS
|
||||
# include <arch/board/nsh_romfsimg.h>
|
||||
#else
|
||||
# include "nsh_romfsimg.h"
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_romfsetc
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_romfsetc(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Create a ROM disk for the /etc filesystem */
|
||||
|
||||
ret = romdisk_register(CONFIG_NSH_ROMFSDEVNO, romfs_img,
|
||||
NSECTORS(romfs_img_len), CONFIG_NSH_ROMFSSECTSIZE);
|
||||
if (ret < 0)
|
||||
{
|
||||
dbg("nsh: romdisk_register failed: %d\n", -ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Mount the file system */
|
||||
|
||||
vdbg("Mounting ROMFS filesystem at target=%s with source=%s\n",
|
||||
CONFIG_NSH_ROMFSMOUNTPT, MOUNT_DEVNAME);
|
||||
|
||||
ret = mount(MOUNT_DEVNAME, CONFIG_NSH_ROMFSMOUNTPT, "romfs", MS_RDONLY, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
dbg("nsh: mount(%s,%s,romfs) failed: %d\n",
|
||||
MOUNT_DEVNAME, CONFIG_NSH_ROMFSMOUNTPT, errno);
|
||||
return ERROR;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NSH_ROMFSETC */
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
unsigned char romfs_img[] = {
|
||||
0x2d, 0x72, 0x6f, 0x6d, 0x31, 0x66, 0x73, 0x2d, 0x00, 0x00, 0x01, 0x50,
|
||||
0x9f, 0x13, 0x82, 0x87, 0x4e, 0x53, 0x48, 0x49, 0x6e, 0x69, 0x74, 0x56,
|
||||
0x6f, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49,
|
||||
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xff, 0x97,
|
||||
0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20,
|
||||
0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xff, 0x80, 0x2e, 0x2e, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
|
||||
0x68, 0x2d, 0x96, 0x03, 0x69, 0x6e, 0x69, 0x74, 0x2e, 0x64, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0,
|
||||
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xff, 0x00,
|
||||
0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x6e, 0x8d, 0x9c, 0xab, 0x58, 0x72, 0x63, 0x53, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x23, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x52,
|
||||
0x41, 0x4d, 0x44, 0x49, 0x53, 0x4b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d,
|
||||
0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x74, 0x20, 0x61, 0x74, 0x20, 0x2f,
|
||||
0x74, 0x6d, 0x70, 0x0a, 0x0a, 0x6d, 0x6b, 0x72, 0x64, 0x20, 0x2d, 0x6d,
|
||||
0x20, 0x32, 0x20, 0x2d, 0x73, 0x20, 0x35, 0x31, 0x32, 0x20, 0x31, 0x30,
|
||||
0x32, 0x34, 0x0a, 0x6d, 0x6b, 0x66, 0x61, 0x74, 0x66, 0x73, 0x20, 0x2f,
|
||||
0x64, 0x65, 0x76, 0x2f, 0x72, 0x61, 0x6d, 0x32, 0x0a, 0x6d, 0x6f, 0x75,
|
||||
0x6e, 0x74, 0x20, 0x2d, 0x74, 0x20, 0x76, 0x66, 0x61, 0x74, 0x20, 0x2f,
|
||||
0x64, 0x65, 0x76, 0x2f, 0x72, 0x61, 0x6d, 0x32, 0x20, 0x2f, 0x74, 0x6d,
|
||||
0x70, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
|
||||
0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xff, 0xe0, 0x2e, 0x2e, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
unsigned int romfs_img_len = 1024;
|
||||
@@ -0,0 +1,187 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_telnetd.c
|
||||
*
|
||||
* Copyright (C) 2007-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <apps/netutils/telnetd.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
#ifdef CONFIG_NSH_TELNET
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_telnetmain
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_telnetmain(int argc, char *argv[])
|
||||
{
|
||||
FAR struct console_stdio_s *pstate = nsh_newconsole();
|
||||
DEBUGASSERT(pstate != NULL);
|
||||
|
||||
dbg("Session [%d] Started\n", getpid());
|
||||
|
||||
/* Present a greeting */
|
||||
|
||||
fputs(g_nshgreeting, pstate->cn_outstream);
|
||||
fflush(pstate->cn_outstream);
|
||||
|
||||
/* Execute the startup script */
|
||||
|
||||
#if defined(CONFIG_NSH_ROMFSETC) && !defined(CONFIG_NSH_CONSOLE)
|
||||
(void)nsh_script(&pstate->cn_vtbl, "init", NSH_INITPATH);
|
||||
#endif
|
||||
|
||||
/* Then enter the command line parsing loop */
|
||||
|
||||
for (;;)
|
||||
{
|
||||
/* Display the prompt string */
|
||||
|
||||
fputs(g_nshprompt, pstate->cn_outstream);
|
||||
fflush(pstate->cn_outstream);
|
||||
|
||||
/* Get the next line of input from the Telnet client */
|
||||
|
||||
if (fgets(pstate->cn_line, CONFIG_NSH_LINELEN, INSTREAM(pstate)) != NULL)
|
||||
{
|
||||
/* Parse process the received Telnet command */
|
||||
|
||||
(void)nsh_parse(&pstate->cn_vtbl, pstate->cn_line);
|
||||
fflush(pstate->cn_outstream);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(pstate->cn_outstream, g_fmtcmdfailed, "nsh_telnetmain",
|
||||
"fgets", NSH_ERRNO);
|
||||
nsh_exit(&pstate->cn_vtbl, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up */
|
||||
|
||||
nsh_exit(&pstate->cn_vtbl, 0);
|
||||
|
||||
/* We do not get here, but this is necessary to keep some compilers happy */
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_telnetstart
|
||||
*
|
||||
* Description:
|
||||
* nsh_telnetstart() starts the Telnet daemon that will allow multiple
|
||||
* NSH connections via Telnet. This function returns immediately after
|
||||
* the daemon has been started.
|
||||
*
|
||||
* Input Parameters:
|
||||
* None. All of the properties of the Telnet daemon are controlled by
|
||||
* NuttX configuration setting.
|
||||
*
|
||||
* Returned Values:
|
||||
* Zero if the Telnet daemon was successfully started. A negated errno
|
||||
* value will be returned on failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_telnetstart(void)
|
||||
{
|
||||
struct telnetd_config_s config;
|
||||
int ret;
|
||||
|
||||
/* Configure the telnet daemon */
|
||||
|
||||
config.d_port = HTONS(CONFIG_NSH_TELNETD_PORT);
|
||||
config.d_priority = CONFIG_NSH_TELNETD_DAEMONPRIO;
|
||||
config.d_stacksize = CONFIG_NSH_TELNETD_DAEMONSTACKSIZE;
|
||||
config.t_priority = CONFIG_NSH_TELNETD_CLIENTPRIO;
|
||||
config.t_stacksize = CONFIG_NSH_TELNETD_CLIENTSTACKSIZE;
|
||||
config.t_entry = nsh_telnetmain;
|
||||
|
||||
/* Start the telnet daemon */
|
||||
|
||||
vdbg("Starting the Telnet daemon\n");
|
||||
ret = telnetd_start(&config);
|
||||
if (ret < 0)
|
||||
{
|
||||
dbg("Failed to tart the Telnet daemon: %d\n", ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NSH_TELNET */
|
||||
@@ -0,0 +1,438 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_test.c
|
||||
*
|
||||
* Copyright (C) 2008, 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/* Test syntax:
|
||||
*
|
||||
* expression = simple-expression | !expression |
|
||||
* expression -o expression | expression -a expression
|
||||
*
|
||||
* simple-expression = unary-expression | binary-expression
|
||||
*
|
||||
* unary-expression = string-unary | file-unary
|
||||
*
|
||||
* string-unary = -n string | -z string
|
||||
*
|
||||
* file-unary = -b file | -c file | -d file | -e file | -f file |
|
||||
* -r file | -s file | -w file
|
||||
*
|
||||
* binary-expression = string-binary | numeric-binary
|
||||
*
|
||||
* string-binary = string = string | string == string | string != string
|
||||
*
|
||||
* numeric-binary = integer -eq integer | integer -ge integer |
|
||||
* integer -gt integer | integer -le integer |
|
||||
* integer -lt integer | integer -ne integer
|
||||
*
|
||||
* Note that the smallest expression consists of two strings.
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
#if !defined(CONFIG_NSH_DISABLESCRIPT) && !defined(CONFIG_NSH_DISABLE_TEST)
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define TEST_TRUE OK
|
||||
#define TEST_FALSE ERROR
|
||||
#define TEST_ERROR 1
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: binaryexpression
|
||||
****************************************************************************/
|
||||
|
||||
static inline int binaryexpression(FAR struct nsh_vtbl_s *vtbl, char **argv)
|
||||
{
|
||||
char *endptr;
|
||||
long integer1;
|
||||
long integer2;
|
||||
|
||||
/* STRING2 = STRING2 */
|
||||
|
||||
if (strcmp(argv[1], "=") == 0 || strcmp(argv[1], "==") == 0)
|
||||
{
|
||||
/* Return true if the strings are identical */
|
||||
|
||||
return strcmp(argv[0], argv[2]) == 0 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* STRING1 != STRING2 */
|
||||
|
||||
if (strcmp(argv[1], "!=") == 0)
|
||||
{
|
||||
/* Return true if the strings are different */
|
||||
|
||||
return strcmp(argv[0], argv[2]) != 0 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* The remaining operators assuming that the two values are integers */
|
||||
|
||||
integer1 = strtol(argv[0], &endptr, 0);
|
||||
if (argv[0][0] == '\0' || *endptr != '\0')
|
||||
{
|
||||
return TEST_ERROR;
|
||||
}
|
||||
|
||||
integer2 = strtol(argv[2], &endptr, 0);
|
||||
if (argv[2][0] == '\0' || *endptr != '\0')
|
||||
{
|
||||
return TEST_ERROR;
|
||||
}
|
||||
|
||||
/* INTEGER1 -eq INTEGER2 */
|
||||
|
||||
if (strcmp(argv[1], "-eq") == 0)
|
||||
{
|
||||
/* Return true if the strings are different */
|
||||
|
||||
return integer1 == integer2 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* INTEGER1 -ge INTEGER2 */
|
||||
|
||||
if (strcmp(argv[1], "-ge") == 0)
|
||||
{
|
||||
/* Return true if the strings are different */
|
||||
|
||||
return integer1 >= integer2 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* INTEGER1 -gt INTEGER2 */
|
||||
|
||||
if (strcmp(argv[1], "-gt") == 0)
|
||||
{
|
||||
/* Return true if the strings are different */
|
||||
|
||||
return integer1 > integer2 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* INTEGER1 -le INTEGER2 */
|
||||
|
||||
if (strcmp(argv[1], "-le") == 0)
|
||||
{
|
||||
/* Return true if the strings are different */
|
||||
|
||||
return integer1 <= integer2 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* INTEGER1 -lt INTEGER2 */
|
||||
|
||||
if (strcmp(argv[1], "-lt") == 0)
|
||||
{
|
||||
/* Return true if the strings are different */
|
||||
|
||||
return integer1 < integer2 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* INTEGER1 -ne INTEGER2 */
|
||||
|
||||
if (strcmp(argv[1], "-ne") == 0)
|
||||
{
|
||||
/* Return true if the strings are different */
|
||||
|
||||
return integer1 != integer2 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
return TEST_ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: unaryexpression
|
||||
****************************************************************************/
|
||||
|
||||
static inline int unaryexpression(FAR struct nsh_vtbl_s *vtbl, char **argv)
|
||||
{
|
||||
struct stat buf;
|
||||
char *fullpath;
|
||||
int ret;
|
||||
|
||||
/* -n STRING */
|
||||
|
||||
if (strcmp(argv[0], "-n") == 0)
|
||||
{
|
||||
/* Return true if the length of the string is non-zero */
|
||||
|
||||
return strlen(argv[1]) != 0 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -z STRING */
|
||||
|
||||
if (strcmp(argv[0], "-z") == 0)
|
||||
{
|
||||
/* Return true if the length of the string is zero */
|
||||
|
||||
return strlen(argv[1]) == 0 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* All of the remaining assume that the following argument is the
|
||||
* path to a file.
|
||||
*/
|
||||
|
||||
fullpath = nsh_getfullpath(vtbl, argv[1]);
|
||||
if (!fullpath)
|
||||
{
|
||||
return TEST_FALSE;
|
||||
}
|
||||
|
||||
ret = stat(fullpath, &buf);
|
||||
nsh_freefullpath(fullpath);
|
||||
|
||||
if (ret != 0)
|
||||
{
|
||||
/* The file does not exist (or another error occurred) -- return FALSE */
|
||||
|
||||
return TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -b FILE */
|
||||
|
||||
if (strcmp(argv[0], "-b") == 0)
|
||||
{
|
||||
/* Return true if the path is a block device */
|
||||
|
||||
return S_ISBLK(buf.st_mode) ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -c FILE */
|
||||
|
||||
if (strcmp(argv[0], "-c") == 0)
|
||||
{
|
||||
/* Return true if the path is a character device */
|
||||
|
||||
return S_ISCHR(buf.st_mode) ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -d FILE */
|
||||
|
||||
if (strcmp(argv[0], "-d") == 0)
|
||||
{
|
||||
/* Return true if the path is a directory */
|
||||
|
||||
return S_ISDIR(buf.st_mode) ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -e FILE */
|
||||
|
||||
if (strcmp(argv[0], "-e") == 0)
|
||||
{
|
||||
/* Return true if the file exists */
|
||||
|
||||
return TEST_TRUE;
|
||||
}
|
||||
|
||||
/* -f FILE */
|
||||
|
||||
if (strcmp(argv[0], "-f") == 0)
|
||||
{
|
||||
/* Return true if the path refers to a regular file */
|
||||
|
||||
return S_ISREG(buf.st_mode) ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -r FILE */
|
||||
|
||||
if (strcmp(argv[0], "-r") == 0)
|
||||
{
|
||||
/* Return true if the file is readable */
|
||||
|
||||
return (buf.st_mode & (S_IRUSR|S_IRGRP|S_IROTH)) != 0 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -s FILE */
|
||||
|
||||
if (strcmp(argv[0], "-s") == 0)
|
||||
{
|
||||
/* Return true if the size of the file is greater than zero */
|
||||
|
||||
return buf.st_size > 0 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* -w FILE */
|
||||
|
||||
if (strcmp(argv[0], "-w") == 0)
|
||||
{
|
||||
/* Return true if the file is write-able */
|
||||
|
||||
return (buf.st_mode & (S_IWUSR|S_IWGRP|S_IWOTH)) != 0 ? TEST_TRUE : TEST_FALSE;
|
||||
}
|
||||
|
||||
/* Unrecognized operator */
|
||||
|
||||
return TEST_ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: expression
|
||||
****************************************************************************/
|
||||
|
||||
static int expression(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
int value;
|
||||
int i = 0;
|
||||
|
||||
/* Check for unary operations on expressions */
|
||||
|
||||
if (strcmp(argv[0], "!") == 0)
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
goto errout_syntax;
|
||||
}
|
||||
return expression(vtbl, argc-1, &argv[1]) == TEST_TRUE ? TEST_FALSE : TEST_TRUE;
|
||||
}
|
||||
|
||||
/* Check for unary operations on simple, typed arguments */
|
||||
|
||||
else if (argv[0][0] == '-')
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
goto errout_syntax;
|
||||
}
|
||||
i += 2;
|
||||
value = unaryexpression(vtbl, argv);
|
||||
}
|
||||
|
||||
/* Check for binary operations on simple, typed arguments */
|
||||
|
||||
else
|
||||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
goto errout_syntax;
|
||||
}
|
||||
i += 3;
|
||||
value = binaryexpression(vtbl, argv);
|
||||
}
|
||||
|
||||
/* Test if there any failure */
|
||||
|
||||
if (value == TEST_ERROR)
|
||||
{
|
||||
goto errout_syntax;
|
||||
}
|
||||
|
||||
/* Is there anything after the simple expression? */
|
||||
|
||||
if (i < argc)
|
||||
{
|
||||
/* EXPRESSION -a EXPRESSION */
|
||||
|
||||
if (strcmp(argv[i], "-a") == 0)
|
||||
{
|
||||
if (value != TEST_TRUE)
|
||||
{
|
||||
return TEST_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
return expression(vtbl, argc-i, &argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* EXPRESSION -o EXPRESSION */
|
||||
|
||||
else if (strcmp(argv[i], "-o") == 0)
|
||||
{
|
||||
if (value == TEST_TRUE)
|
||||
{
|
||||
return TEST_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
return expression(vtbl, argc-i, &argv[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
goto errout_syntax;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
|
||||
errout_syntax:
|
||||
nsh_output(vtbl, g_nshsyntax, "test");
|
||||
return TEST_FALSE;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_test
|
||||
****************************************************************************/
|
||||
|
||||
int cmd_test(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
return expression(vtbl, argc-1, &argv[1]);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_lbracket
|
||||
****************************************************************************/
|
||||
|
||||
int cmd_lbracket(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
if (strcmp(argv[argc-1], "]") != 0)
|
||||
{
|
||||
nsh_output(vtbl, g_nshsyntax, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
return expression(vtbl, argc-2, &argv[1]);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_NSH_DISABLESCRIPT && !CONFIG_NSH_DISABLE_TEST */
|
||||
@@ -0,0 +1,331 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/dbg_timcmds.c
|
||||
*
|
||||
* Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "nsh.h"
|
||||
#include "nsh_console.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define MAX_TIME_STRING 80
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
#if defined (CONFIG_RTC) && !defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_NSH_DISABLE_DATE)
|
||||
static FAR const char * const g_datemontab[] =
|
||||
{
|
||||
"jan", "feb", "mar", "apr", "may", "jun",
|
||||
"jul", "aug", "sep", "oct", "nov", "dec"
|
||||
};
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: date_month
|
||||
****************************************************************************/
|
||||
|
||||
#if defined (CONFIG_RTC) && !defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_NSH_DISABLE_DATE)
|
||||
static inline int date_month(FAR const char *abbrev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 12; i++)
|
||||
{
|
||||
if (strncasecmp(g_datemontab[i], abbrev, 3) == 0)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: date_gettime
|
||||
****************************************************************************/
|
||||
|
||||
#if defined (CONFIG_RTC) && !defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_NSH_DISABLE_DATE)
|
||||
static inline int date_showtime(FAR struct nsh_vtbl_s *vtbl, FAR const char *name)
|
||||
{
|
||||
static const char format[] = "%b %d %H:%M:%S %Y";
|
||||
struct timespec ts;
|
||||
struct tm tm;
|
||||
char timbuf[MAX_TIME_STRING];
|
||||
int ret;
|
||||
|
||||
/* Get the current time */
|
||||
|
||||
ret = clock_gettime(CLOCK_REALTIME, &ts);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, name, "clock_gettime", NSH_ERRNO);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Break the current time up into the format needed by strftime */
|
||||
|
||||
(void)gmtime_r((FAR const time_t*)&ts.tv_sec, &tm);
|
||||
|
||||
/* Show the current time in the requested format */
|
||||
|
||||
(void)strftime(timbuf, MAX_TIME_STRING, format, &tm);
|
||||
nsh_output(vtbl, "%s\n", timbuf);
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: date_settime
|
||||
****************************************************************************/
|
||||
|
||||
#if defined (CONFIG_RTC) && !defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_NSH_DISABLE_DATE)
|
||||
static inline int date_settime(FAR struct nsh_vtbl_s *vtbl, FAR const char *name,
|
||||
FAR char *newtime)
|
||||
{
|
||||
struct timespec ts;
|
||||
struct tm tm;
|
||||
FAR char *token;
|
||||
FAR char *saveptr;
|
||||
long result;
|
||||
int ret;
|
||||
|
||||
/* Only this date format is supported: MMM DD HH:MM:SS YYYY */
|
||||
/* Get the month abbreviation */
|
||||
|
||||
token = strtok_r(newtime, " \t",&saveptr);
|
||||
if (token == NULL)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
|
||||
tm.tm_mon = date_month(token);
|
||||
if (tm.tm_mon < 0)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
|
||||
/* Get the day of the month. NOTE: Accepts day-of-month up to 31 for all months */
|
||||
|
||||
token = strtok_r(NULL, " \t",&saveptr);
|
||||
if (token == NULL)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
|
||||
result = strtol(token, NULL, 10);
|
||||
if (result < 1 || result > 31)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
tm.tm_mday = (int)result;
|
||||
|
||||
/* Get the hours */
|
||||
|
||||
token = strtok_r(NULL, " \t:", &saveptr);
|
||||
if (token == NULL)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
|
||||
result = strtol(token, NULL, 10);
|
||||
if (result < 0 || result > 23)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
tm.tm_hour = (int)result;
|
||||
|
||||
/* Get the minutes */
|
||||
|
||||
token = strtok_r(NULL, " \t:", &saveptr);
|
||||
if (token == NULL)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
|
||||
result = strtol(token, NULL, 10);
|
||||
if (result < 0 || result > 59)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
tm.tm_min = (int)result;
|
||||
|
||||
/* Get the seconds */
|
||||
|
||||
token = strtok_r(NULL, " \t:", &saveptr);
|
||||
if (token == NULL)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
|
||||
result = strtol(token, NULL, 10);
|
||||
if (result < 0 || result > 61)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
tm.tm_sec = (int)result;
|
||||
|
||||
/* And finally the year */
|
||||
|
||||
token = strtok_r(NULL, " \t", &saveptr);
|
||||
if (token == NULL)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
|
||||
result = strtol(token, NULL, 10);
|
||||
if (result < 1900 || result > 2100)
|
||||
{
|
||||
goto errout_bad_parm;
|
||||
}
|
||||
tm.tm_year = (int)result - 1900;
|
||||
|
||||
/* Convert this to the right form, then set the timer */
|
||||
|
||||
ts.tv_sec = mktime(&tm);
|
||||
ts.tv_nsec = 0;
|
||||
|
||||
ret = clock_settime(CLOCK_REALTIME, &ts);
|
||||
if (ret < 0)
|
||||
{
|
||||
nsh_output(vtbl, g_fmtcmdfailed, name, "clock_settime", NSH_ERRNO);
|
||||
return ERROR;
|
||||
}
|
||||
return OK;
|
||||
|
||||
errout_bad_parm:
|
||||
nsh_output(vtbl, g_fmtarginvalid, name);
|
||||
return ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmd_date
|
||||
****************************************************************************/
|
||||
|
||||
#if defined (CONFIG_RTC) && !defined(CONFIG_DISABLE_CLOCK) && !defined(CONFIG_NSH_DISABLE_DATE)
|
||||
int cmd_date(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
|
||||
{
|
||||
FAR char *newtime = NULL;
|
||||
FAR const char *errfmt;
|
||||
bool badarg = false;
|
||||
int option;
|
||||
int ret;
|
||||
|
||||
/* Get the date options: date [-s time] [+FORMAT] */
|
||||
|
||||
while ((option = getopt(argc, argv, "s:")) != ERROR)
|
||||
{
|
||||
if (option == 's')
|
||||
{
|
||||
/* We will be setting the time */
|
||||
|
||||
newtime = optarg;
|
||||
}
|
||||
else /* option = '?' */
|
||||
{
|
||||
/* We need to parse to the end anyway so that getopt stays healthy */
|
||||
|
||||
badarg = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* If a bad argument was encountered then exit with an error */
|
||||
|
||||
if (badarg)
|
||||
{
|
||||
errfmt = g_fmtarginvalid;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* optind < argc-1 means that there are additional, unexpected arguments on
|
||||
* th command-line
|
||||
*/
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
errfmt = g_fmttoomanyargs;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Display or set the time */
|
||||
|
||||
if (newtime)
|
||||
{
|
||||
ret = date_settime(vtbl, argv[0], newtime);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = date_showtime(vtbl, argv[0]);
|
||||
}
|
||||
return ret;
|
||||
|
||||
errout:
|
||||
nsh_output(vtbl, errfmt, argv[0]);
|
||||
return ERROR;
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,243 @@
|
||||
/****************************************************************************
|
||||
* apps/nshlib/nsh_usbdev.c
|
||||
*
|
||||
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <assert.h>
|
||||
#include <debug.h>
|
||||
|
||||
#ifdef CONFIG_CDCACM
|
||||
# include <nuttx/usb/cdcacm.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CDCACM
|
||||
# include <nuttx/usb/pl2303.h>
|
||||
#endif
|
||||
|
||||
#include "nsh.h"
|
||||
|
||||
#ifdef CONFIG_USBDEV
|
||||
|
||||
/****************************************************************************
|
||||
* Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_DEBUG) || defined(CONFIG_NSH_USBCONSOLE)
|
||||
# define trmessage lib_lowprintf
|
||||
#else
|
||||
# define trmessage printf
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_tracecallback
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_USBDEV_TRACE
|
||||
static int nsh_tracecallback(struct usbtrace_s *trace, void *arg)
|
||||
{
|
||||
usbtrace_trprintf((trprintf_t)trmessage, trace->event, trace->value);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_usbconsole
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef HAVE_USB_CONSOLE
|
||||
int nsh_usbconsole(void)
|
||||
{
|
||||
char inch;
|
||||
ssize_t nbytes;
|
||||
int nlc;
|
||||
int fd;
|
||||
int ret;
|
||||
|
||||
/* Initialize any USB tracing options that were requested */
|
||||
|
||||
#ifdef CONFIG_USBDEV_TRACE
|
||||
usbtrace_enable(TRACE_BITSET);
|
||||
#endif
|
||||
|
||||
/* Don't start the NSH console until the console device is ready. Chances
|
||||
* are, we get here with no functional console. The USB console will not
|
||||
* be available until the device is connected to the host and until the
|
||||
* host-side application opens the connection.
|
||||
*/
|
||||
|
||||
/* Initialize the USB serial driver */
|
||||
|
||||
#if defined(CONFIG_PL2303) || defined(CONFIG_CDCACM)
|
||||
#ifdef CONFIG_CDCACM
|
||||
ret = cdcacm_initialize(CONFIG_NSH_UBSDEV_MINOR, NULL);
|
||||
#else
|
||||
ret = usbdev_serialinitialize(CONFIG_NSH_UBSDEV_MINOR);
|
||||
#endif
|
||||
DEBUGASSERT(ret == OK);
|
||||
#endif
|
||||
|
||||
/* Open the USB serial device for read/write access */
|
||||
|
||||
do
|
||||
{
|
||||
/* Try to open the console */
|
||||
|
||||
fd = open(CONFIG_NSH_USBCONDEV, O_RDWR);
|
||||
if (fd < 0)
|
||||
{
|
||||
/* ENOTCONN means that the USB device is not yet connected. Anything
|
||||
* else is bad.
|
||||
*/
|
||||
|
||||
DEBUGASSERT(errno == ENOTCONN);
|
||||
|
||||
/* Sleep a bit and try again */
|
||||
|
||||
sleep(2);
|
||||
}
|
||||
}
|
||||
while (fd < 0);
|
||||
|
||||
/* Now waiting until we successfully read a carriage return a few times.
|
||||
* That is a sure way of know that there is something at the other end of
|
||||
* the USB serial connection that is ready to talk with us. The user needs
|
||||
* to hit ENTER a few times to get things started.
|
||||
*/
|
||||
|
||||
nlc = 0;
|
||||
do
|
||||
{
|
||||
/* Read one byte */
|
||||
|
||||
inch = 0;
|
||||
nbytes = read(fd, &inch, 1);
|
||||
|
||||
/* Is it a carriage return (or maybe a newline)? */
|
||||
|
||||
if (nbytes == 1 && (inch == '\n' || inch == '\r'))
|
||||
{
|
||||
/* Yes.. increment the count */
|
||||
|
||||
nlc++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No.. Reset the count. We need to see 3 in a row to continue. */
|
||||
|
||||
nlc = 0;
|
||||
}
|
||||
}
|
||||
while (nlc < 3);
|
||||
|
||||
/* Make sure the stdin, stdout, and stderr are closed */
|
||||
|
||||
(void)fclose(stdin);
|
||||
(void)fclose(stdout);
|
||||
(void)fclose(stderr);
|
||||
|
||||
/* Dup the fd to create standard fd 0-2 */
|
||||
|
||||
(void)dup2(fd, 0);
|
||||
(void)dup2(fd, 1);
|
||||
(void)dup2(fd, 2);
|
||||
|
||||
/* We can close the original file descriptor now (unless it was one of 0-2) */
|
||||
|
||||
if (fd > 2)
|
||||
{
|
||||
close(fd);
|
||||
}
|
||||
|
||||
/* fdopen to get the stdin, stdout and stderr streams. The following logic depends
|
||||
* on the fact that the library layer will allocate FILEs in order. And since
|
||||
* we closed stdin, stdout, and stderr above, that is what we should get.
|
||||
*
|
||||
* fd = 0 is stdin (read-only)
|
||||
* fd = 1 is stdout (write-only, append)
|
||||
* fd = 2 is stderr (write-only, append)
|
||||
*/
|
||||
|
||||
(void)fdopen(0, "r");
|
||||
(void)fdopen(1, "a");
|
||||
(void)fdopen(2, "a");
|
||||
return OK;
|
||||
}
|
||||
|
||||
#endif /* HAVE_USB_CONSOLE */
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_usbtrace
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_USBDEV_TRACE) && defined(HAVE_USB_CONSOLE)
|
||||
void nsh_usbtrace(void)
|
||||
{
|
||||
(void)usbtrace_enumerate(nsh_tracecallback, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_USBDEV */
|
||||
@@ -0,0 +1,5 @@
|
||||
# Create a RAMDISK and mount it at XXXRDMOUNTPOUNTXXX
|
||||
|
||||
mkrd -m XXXMKRDMINORXXX -s XXMKRDSECTORSIZEXXX XXMKRDBLOCKSXXX
|
||||
mkfatfs /dev/ramXXXMKRDMINORXXX
|
||||
mount -t vfat /dev/ramXXXMKRDMINORXXX XXXRDMOUNTPOUNTXXX
|
||||
Reference in New Issue
Block a user