summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-03-20 18:18:19 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-03-20 18:18:19 +0000
commiteafaeb9398216dacb92de69683ccdda6007efb1d (patch)
treee513e4fd791670d9b74d33821682d4059ed73098 /apps
parentf68c474e8ae9cfa5c9124a6eb92ec06fe2bf40a1 (diff)
downloadnuttx-eafaeb9398216dacb92de69683ccdda6007efb1d.tar.gz
nuttx-eafaeb9398216dacb92de69683ccdda6007efb1d.tar.bz2
nuttx-eafaeb9398216dacb92de69683ccdda6007efb1d.zip
Move nuttx/examples to apps/examples
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3405 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps')
-rw-r--r--apps/Makefile23
-rw-r--r--apps/examples/Makefile65
-rw-r--r--apps/examples/README.txt636
-rw-r--r--apps/examples/dhcpd/Makefile91
-rw-r--r--apps/examples/dhcpd/Makefile.host62
-rw-r--r--apps/examples/dhcpd/host.c58
-rw-r--r--apps/examples/dhcpd/target.c143
-rw-r--r--apps/examples/hello/Makefile90
-rw-r--r--apps/examples/hello/main.c77
-rwxr-xr-xapps/examples/helloxx/Makefile107
-rwxr-xr-xapps/examples/helloxx/main.cxx128
-rw-r--r--apps/examples/hidkbd/Makefile90
-rw-r--r--apps/examples/hidkbd/hidkbd_main.c239
-rwxr-xr-xapps/examples/igmp/Makefile90
-rwxr-xr-xapps/examples/igmp/igmp.c155
-rwxr-xr-xapps/examples/igmp/igmp.h61
-rw-r--r--apps/examples/mm/Makefile90
-rw-r--r--apps/examples/mm/mm_main.c308
-rw-r--r--apps/examples/mount/Makefile90
-rw-r--r--apps/examples/mount/mount.h96
-rw-r--r--apps/examples/mount/mount_main.c762
-rw-r--r--apps/examples/mount/ramdisk.c141
-rw-r--r--apps/examples/nettest/Makefile121
-rw-r--r--apps/examples/nettest/host.c63
-rw-r--r--apps/examples/nettest/nettest.c122
-rw-r--r--apps/examples/nettest/nettest.h95
-rw-r--r--apps/examples/nettest/nettest_client.c204
-rw-r--r--apps/examples/nettest/nettest_server.c234
-rw-r--r--apps/examples/nsh/Makefile90
-rw-r--r--apps/examples/nsh/nsh_main.c157
-rw-r--r--apps/examples/null/Makefile90
-rw-r--r--apps/examples/null/null_main.c75
-rw-r--r--apps/examples/nx/Makefile93
-rw-r--r--apps/examples/nx/nx_events.c337
-rw-r--r--apps/examples/nx/nx_internal.h306
-rw-r--r--apps/examples/nx/nx_kbdin.c467
-rw-r--r--apps/examples/nx/nx_main.c894
-rw-r--r--apps/examples/nx/nx_server.c152
-rw-r--r--apps/examples/nxflat/Makefile95
-rw-r--r--apps/examples/nxflat/nxflat_main.c232
-rw-r--r--apps/examples/nxflat/tests/Makefile103
-rw-r--r--apps/examples/nxflat/tests/errno/Makefile78
-rw-r--r--apps/examples/nxflat/tests/errno/errno.c83
-rw-r--r--apps/examples/nxflat/tests/hello++/Makefile180
-rw-r--r--apps/examples/nxflat/tests/hello++/hello++1.cpp60
-rw-r--r--apps/examples/nxflat/tests/hello++/hello++2.cpp123
-rw-r--r--apps/examples/nxflat/tests/hello++/hello++3.cpp132
-rw-r--r--apps/examples/nxflat/tests/hello++/hello++4.cpp150
-rw-r--r--apps/examples/nxflat/tests/hello/Makefile78
-rw-r--r--apps/examples/nxflat/tests/hello/hello.c78
-rw-r--r--apps/examples/nxflat/tests/longjmp/Makefile78
-rw-r--r--apps/examples/nxflat/tests/longjmp/longjmp.c128
-rwxr-xr-xapps/examples/nxflat/tests/mkdirlist.sh35
-rwxr-xr-xapps/examples/nxflat/tests/mksymtab.sh39
-rw-r--r--apps/examples/nxflat/tests/mutex/Makefile78
-rw-r--r--apps/examples/nxflat/tests/mutex/mutex.c149
-rw-r--r--apps/examples/nxflat/tests/pthread/Makefile78
-rw-r--r--apps/examples/nxflat/tests/pthread/pthread.c143
-rw-r--r--apps/examples/nxflat/tests/signal/Makefile78
-rw-r--r--apps/examples/nxflat/tests/signal/signal.c308
-rw-r--r--apps/examples/nxflat/tests/struct/Makefile80
-rw-r--r--apps/examples/nxflat/tests/struct/struct.h89
-rw-r--r--apps/examples/nxflat/tests/struct/struct_dummy.c65
-rw-r--r--apps/examples/nxflat/tests/struct/struct_main.c109
-rw-r--r--apps/examples/nxflat/tests/task/Makefile79
-rw-r--r--apps/examples/nxflat/tests/task/task.c143
-rw-r--r--apps/examples/ostest/Makefile130
-rw-r--r--apps/examples/ostest/barrier.c200
-rw-r--r--apps/examples/ostest/cancel.c333
-rw-r--r--apps/examples/ostest/cond.c294
-rw-r--r--apps/examples/ostest/dev_null.c92
-rw-r--r--apps/examples/ostest/main.c523
-rw-r--r--apps/examples/ostest/mqueue.c394
-rw-r--r--apps/examples/ostest/mutex.c142
-rw-r--r--apps/examples/ostest/ostest.h162
-rw-r--r--apps/examples/ostest/posixtimer.c268
-rw-r--r--apps/examples/ostest/prioinherit.c541
-rw-r--r--apps/examples/ostest/rmutex.c166
-rw-r--r--apps/examples/ostest/roundrobin.c232
-rw-r--r--apps/examples/ostest/sem.c246
-rw-r--r--apps/examples/ostest/sighand.c279
-rw-r--r--apps/examples/ostest/timedmqueue.c393
-rw-r--r--apps/examples/ostest/timedwait.c201
-rw-r--r--apps/examples/pashello/Makefile97
-rw-r--r--apps/examples/pashello/README.txt34
-rw-r--r--apps/examples/pashello/device.c110
-rw-r--r--apps/examples/pashello/hello.h23
-rw-r--r--apps/examples/pashello/hello.pas5
-rw-r--r--apps/examples/pashello/hello.pexbin0 -> 232 bytes
-rwxr-xr-xapps/examples/pashello/mkhello.sh141
-rw-r--r--apps/examples/pashello/pashello.c143
-rw-r--r--apps/examples/pashello/pashello.h55
-rw-r--r--apps/examples/pipe/Makefile90
-rw-r--r--apps/examples/pipe/interlock_test.c224
-rw-r--r--apps/examples/pipe/pipe.h74
-rw-r--r--apps/examples/pipe/pipe_main.c197
-rw-r--r--apps/examples/pipe/redirect_test.c326
-rw-r--r--apps/examples/pipe/transfer_test.c242
-rw-r--r--apps/examples/poll/Makefile90
-rw-r--r--apps/examples/poll/Makefile.host54
-rw-r--r--apps/examples/poll/host.c166
-rw-r--r--apps/examples/poll/net_listener.c428
-rw-r--r--apps/examples/poll/net_reader.c317
-rw-r--r--apps/examples/poll/poll_internal.h128
-rw-r--r--apps/examples/poll/poll_listener.c262
-rw-r--r--apps/examples/poll/poll_main.c229
-rw-r--r--apps/examples/poll/select_listener.c193
-rw-r--r--apps/examples/romfs/Makefile107
-rw-r--r--apps/examples/romfs/romfs_main.c506
-rw-r--r--apps/examples/romfs/romfs_testdir.h89
-rw-r--r--apps/examples/romfs/testdir.tar.gzbin0 -> 387 bytes
-rw-r--r--apps/examples/romfs/testdir.txt105
-rw-r--r--apps/examples/sendmail/Makefile92
-rw-r--r--apps/examples/sendmail/Makefile.host77
-rw-r--r--apps/examples/sendmail/host.c103
-rwxr-xr-xapps/examples/sendmail/hostdefs.h69
-rw-r--r--apps/examples/sendmail/target.c169
-rw-r--r--apps/examples/serloop/Makefile91
-rw-r--r--apps/examples/serloop/main.c113
-rw-r--r--apps/examples/thttpd/Makefile95
-rw-r--r--apps/examples/thttpd/content/Makefile104
-rw-r--r--apps/examples/thttpd/content/hello/Makefile78
-rw-r--r--apps/examples/thttpd/content/hello/hello.c79
-rw-r--r--apps/examples/thttpd/content/index.html30
-rwxr-xr-xapps/examples/thttpd/content/mksymtab.sh39
-rw-r--r--apps/examples/thttpd/content/netstat/Makefile78
-rwxr-xr-xapps/examples/thttpd/content/netstat/netstat.c134
-rw-r--r--apps/examples/thttpd/content/style.css80
-rwxr-xr-xapps/examples/thttpd/content/tasks/Makefile78
-rwxr-xr-xapps/examples/thttpd/content/tasks/tasks.c168
-rw-r--r--apps/examples/thttpd/main.c280
-rw-r--r--apps/examples/udp/Makefile119
-rw-r--r--apps/examples/udp/host.c63
-rw-r--r--apps/examples/udp/target.c104
-rw-r--r--apps/examples/udp/udp-client.c133
-rw-r--r--apps/examples/udp/udp-internal.h90
-rw-r--r--apps/examples/udp/udp-server.c173
-rw-r--r--apps/examples/uip/Makefile91
-rw-r--r--apps/examples/uip/main.c220
-rw-r--r--apps/examples/usbserial/Makefile92
-rw-r--r--apps/examples/usbserial/Makefile.host66
-rw-r--r--apps/examples/usbserial/host.c293
-rw-r--r--apps/examples/usbserial/main.c466
-rw-r--r--apps/examples/usbstorage/Makefile91
-rw-r--r--apps/examples/usbstorage/usbstrg.h119
-rw-r--r--apps/examples/usbstorage/usbstrg_main.c404
-rw-r--r--apps/examples/wget/Makefile92
-rw-r--r--apps/examples/wget/Makefile.host77
-rw-r--r--apps/examples/wget/host.c100
-rwxr-xr-xapps/examples/wget/hostdefs.h69
-rw-r--r--apps/examples/wget/target.c162
-rwxr-xr-xapps/examples/wlan/Makefile92
-rwxr-xr-xapps/examples/wlan/wlan_main.c240
-rw-r--r--apps/netutils/Makefile17
-rw-r--r--apps/nshlib/Makefile2
-rw-r--r--apps/nshlib/nsh_parse.c (renamed from apps/nshlib/nsh_main.c)2
-rw-r--r--apps/nshlib/nsh_romfsetc.c2
-rw-r--r--apps/nshlib/nsh_serial.c2
158 files changed, 24519 insertions, 23 deletions
diff --git a/apps/Makefile b/apps/Makefile
index d81606a3f..76eeb1e92 100644
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -36,10 +36,6 @@
-include $(TOPDIR)/Make.defs
-ifeq ($(WINTOOL),y)
-INCDIROPT = -w
-endif
-
APPDIR = ${shell pwd}
# Application Directories
@@ -47,7 +43,7 @@ APPDIR = ${shell pwd}
# SUBDIRS is the list of all directories containing Makefiles. It is used
# only for cleaning.
-SUBDIRS = nshlib netutils vsn
+SUBDIRS = nshlib netutils examples vsn
# we use a non-existing .built_always to guarantee that Makefile
# always walks into the sub-directories and asks for build
@@ -93,7 +89,8 @@ $(foreach BUILT, $(AVAILABLE_APPS), $(eval $(call BUILTIN_ADD_BUILT,$(BUILT))))
endif
-ROOTDEPPATH = --dep-path .
+# Source and object files
+
ASRCS =
CSRCS = exec_nuttapp.c
@@ -105,9 +102,11 @@ OBJS = $(AOBJS) $(COBJS)
BIN = libapps$(LIBEXT)
+ROOTDEPPATH = --dep-path .
VPATH =
all: $(BIN)
+.PHONY: .depend depend clean distclean
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
@@ -138,21 +137,21 @@ $(BIN): $(OBJS) $(BUILTIN_APPS_BUILT)
depend: .depend
-define MAKECLEAN
- @(MAKE) -C $1 $2 TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR)
-endef
-
clean:
@rm -f $(BIN) *~ .*.swp *.o libapps.a
$(call CLEAN)
- $(foreach DIR, $(SUBDIRS), $(eval $(call MAKECLEAN,$(DIR),clean)))
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir clean TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
distclean: clean
@rm -f .config
@rm -f Make.dep .depend
@rm -f exec_nuttapp_list.h
@rm -f exec_nuttapp_proto.h
- $(foreach DIR, $(SUBDIRS), $(eval $(call MAKECLEAN,$(DIR),distclean)))
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir distclean TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
-include Make.dep
diff --git a/apps/examples/Makefile b/apps/examples/Makefile
new file mode 100644
index 000000000..21c11a783
--- /dev/null
+++ b/apps/examples/Makefile
@@ -0,0 +1,65 @@
+############################################################################
+# apps/examples/Makefile
+#
+# Copyright (C) 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+
+# Sub-directories
+
+SUBDIRS = dhcpd hello helloxx hidkbd igmp mm mount nettest nsh null nx \
+ nxflat ostest pashello pipe poll romfs sendmail serloop thttpd \
+ udp uip usbserial usbstorage wget wlan
+
+all: nothing
+.PHONY: nothing depend clean distclean
+
+nothing:
+
+depend:
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir depend TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
+
+clean:
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir clean TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
+
+distclean: clean
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir distclean TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
+
+-include Make.dep
+
diff --git a/apps/examples/README.txt b/apps/examples/README.txt
new file mode 100644
index 000000000..2dbef2e06
--- /dev/null
+++ b/apps/examples/README.txt
@@ -0,0 +1,636 @@
+examples
+^^^^^^^^
+
+ The examples directory contains several sample applications that
+ can be linked with NuttX. The specific example is selected in the
+ configs/<board-name>/appconfig file via the CONFIGURED_APPS setting.
+ This setting provides the path to the directory containing the
+ application Makefile (this path is a relative to the apps/ top-
+ level directory). For example,
+
+ CONFIGURE_APPS += examples/ostest=.built_always
+
+ Selects the examples/ostest example.
+
+examples/dhcpd
+^^^^^^^^^^^^^^
+
+ This examples builds a tiny DCHP server for the target system.
+
+ NOTE: For test purposes, this example can be built as a
+ host-based DHCPD server. This can be built as follows:
+
+ cd examples/dhcpd
+ make -f Makefile.host TOPDIR=<nuttx-directory>
+
+ NuttX configuration settings:
+
+ CONFIG_NET=y - Of course
+ CONFIG_NSOCKET_DESCRIPTORS - And, of course, you must allocate some
+ socket descriptors.
+ CONFIG_NET_UDP=y - UDP support is required for DHCP
+ (as well as various other UDP-related
+ configuration settings)
+ CONFIG_NET_BROADCAST=y - UDP broadcast support is needed.
+
+ CONFIG_EXAMPLE_DHCPD_NOMAC - (May be defined to use software assigned MAC)
+ CONFIG_EXAMPLE_DHCPD_IPADDR - Target IP address
+ CONFIG_EXAMPLE_DHCPD_DRIPADDR - Default router IP addess
+ CONFIG_EXAMPLE_DHCPD_NETMASK - Network mask
+
+ See also CONFIG_NETUTILS_DHCPD_* settings described elsewhere
+ and used in netutils/dhcpd/dhcpd.c. These settings are required
+ to described the behavior of the daemon.
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+
+examples/hello
+^^^^^^^^^^^^^^
+
+ This is the mandatory, "Hello, World!!" example. It is little more
+ than examples/null with a single printf statement. Again useful only
+ for bringing up new NuttX architectures.
+
+ NuttX configuration settings:
+
+ CONFIG_EXAMPLE_HELLOXX_NOSTATICCONST - Set if system does not support
+ static constructors.
+ CONFIG_EXAMPLE_HELLOXX_NOSTACKCONST - Set if the systgem does not
+ support constructionof objects on the stack.
+
+examples/helloxx
+^^^^^^^^^^^^^^^^
+
+ This is C++ version of the "Hello, World!!" example. It is intended
+ only to verify that the C++ compiler is function, that basic C++
+ library suupport is available, and that class are instantiated
+ correctly.
+
+examples/hidkbd
+^^^^^^^^^^^^^^^^
+
+ This is a simple test to debug/verify the USB host HID keyboard class
+ driver.
+
+ CONFIG_EXAMPLES_HIDKBD_DEFPRIO - Priority of "waiter" thread.
+ CONFIG_EXAMPLES_HIDKBD_STACKSIZE - Stacksize of "waiter" thread.
+
+examples/igmp
+^^^^^^^^^^^^^
+
+ This is a trivial test of the NuttX IGMP capability. It present it
+ does not do much of value -- Much more is needed in order to verify
+ the IGMP features!
+
+ * CONFIG_EXAMPLE_IGMP_NOMAC
+ Set if the hardware has no MAC address; one will be assigned
+ * CONFIG_EXAMPLE_IGMP_IPADDR
+ Target board IP address
+ * CONFIG_EXAMPLE_IGMP_DRIPADDR
+ Default router address
+ * CONFIG_EXAMPLE_IGMP_NETMASK
+ Network mask
+ * CONFIG_EXAMPLE_IGMP_GRPADDR
+ Multicast group address
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+
+examples/mm
+^^^^^^^^^^^
+
+ This is a simplified version of the "built-in" memory manager test of
+ mm/mm_test.c. It is simplified because it does not have access to the
+ internals of the memory manager as does mm/mm_test.c, but it has the
+ advantage that it runs in the actual NuttX tasking environment (the
+ mm/mm_test.c only runs in a PC simulation environment).
+
+examples/mount
+^^^^^^^^^^^^^^
+
+ This contains a simple test of filesystem mountpoints.
+
+ * CONFIG_EXAMPLES_MOUNT_DEVNAME
+ The name of the user-provided block device to mount.
+ If CONFIG_EXAMPLES_MOUNT_DEVNAME is not provided, then
+ a RAM disk will be configured.
+
+ * CONFIG_EXAMPLES_MOUNT_NSECTORS
+ The number of "sectors" in the RAM disk used when
+ CONFIG_EXAMPLES_MOUNT_DEVNAME is not defined.
+
+ * CONFIG_EXAMPLES_MOUNT_SECTORSIZE
+ The size of each sectors in the RAM disk used when
+ CONFIG_EXAMPLES_MOUNT_DEVNAME is not defined.
+
+ * CONFIG_EXAMPLES_MOUNT_RAMDEVNO
+ The RAM device minor number used to mount the RAM disk used
+ when CONFIG_EXAMPLES_MOUNT_DEVNAME is not defined. The
+ default is zero (meaning that "/dev/ram0" will be used).
+
+examples/netttest
+^^^^^^^^^^^^^^^^^
+
+ This is a simple network test for verifying client- and server-
+ functionality in a TCP/IP connection.
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+
+examples/nsh
+^^^^^^^^^^^^
+
+ This directory provides an example of how to configure and use
+ the NuttShell (NSH) application. NSH is a simple shell
+ application. NSH is described in its own README located at
+ apps/nshlib/README.txt
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = nshlib=.built_always
+
+ And if networking is included:
+
+ CONFIGURED_APPS = uiplib=.built_always
+ CONFIGURED_APPS = dhcpc=.built_always
+ CONFIGURED_APPS = resolv=.built_always
+ CONFIGURED_APPS = tftp=.built_always
+ CONFIGURED_APPS = webclient=.built_always
+
+examples/nx
+^^^^^^^^^^^
+
+ This directory contains a simple test of a subset of the NX APIs
+ defined in include/nuttx/nx.h. The following configuration options
+ can be selected:
+
+ CONFIG_EXAMPLES_NX_VPLANE -- The plane to select from the frame-
+ buffer driver for use in the test. Default: 0
+ CONFIG_EXAMPLES_NX_DEVNO - The LCD device to select from the LCD
+ driver for use in the test: Default: 0
+ CONFIG_EXAMPLES_NX_BGCOLOR -- The color of the background. Default depends on
+ CONFIG_EXAMPLES_NX_BPP.
+ CONFIG_EXAMPLES_NX_COLOR1 -- The color of window 1. Default depends on
+ CONFIG_EXAMPLES_NX_BPP.
+ CONFIG_EXAMPLES_NX_COLOR2 -- The color of window 2. Default depends on
+ CONFIG_EXAMPLES_NX_BPP.
+ CONFIG_EXAMPLES_NX_TBCOLOR -- The color of the toolbar. Default depends on
+ CONFIG_EXAMPLES_NX_BPP.
+ CONFIG_EXAMPLES_NX_FONTCOLOR -- The color of the toolbar. Default depends on
+ CONFIG_EXAMPLES_NX_BPP.
+ CONFIG_EXAMPLES_NX_BPP -- Pixels per pixel to use. Valid options
+ include 2, 4, 8, 16, 24, and 32. Default is 32.
+ CONFIG_EXAMPLES_NX_RAWWINDOWS -- Use raw windows; Default is to
+ use pretty, framed NXTK windows with toolbars.
+ CONFIG_EXAMPLES_NX_EXTERNINIT - The driver for the graphics device on
+ this platform requires some unusual initialization. This is the
+ for, for example, SPI LCD/OLED devices. If this configuration is
+ selected, then the platform code must provide an LCD initialization
+ function with a prototype like:
+
+ #ifdef CONFIG_NX_LCDDRIVER
+ FAR struct lcd_dev_s *up_nxdrvinit(unsigned int devno);
+ #else
+ FAR struct fb_vtable_s *up_nxdrvinit(unsigned int devno);
+ #endif
+
+ This test can be performed with either the single-user version of
+ NX or with the multiple user version of NX selected with CONFIG_NX_MULTIUSER.
+ If CONFIG_NX_MULTIUSER is defined, then the following configuration
+ options also apply:
+
+ CONFIG_EXAMPLES_NX_STACKSIZE -- The stacksize to use when creating
+ the NX server. Default 2048
+ CONFIG_EXAMPLES_NX_CLIENTPRIO -- The client priority. Default: 100
+ CONFIG_EXAMPLES_NX_SERVERPRIO -- The server priority. Default: 120
+ CONFIG_EXAMPLES_NX_LISTENERPRIO -- The priority of the event listener
+ thread. Default 80.
+ CONFIG_EXAMPLES_NX_NOTIFYSIGNO -- The signal number to use with
+ nx_eventnotify(). Default: 4
+
+ If CONFIG_NX_MULTIUSER is defined, then the example also expects the
+ following settings and will generate an error if they are not as expected:
+
+ CONFIG_DISABLE_MQUEUE=n
+ CONFIG_DISABLE_SIGNALS=n
+ CONFIG_DISABLE_PTHREAD=n
+ CONFIG_NX_BLOCKING=y
+
+examples/nxflat
+^^^^^^^^^^^^^^^
+
+ This example builds a small NXFLAT test case. This includes several
+ test programs under examples/nxflat tests. These tests are build using
+ the NXFLAT format and installed in a ROMFS file system. At run time,
+ each program in the ROMFS file system is executed. Requires CONFIG_NXFLAT.
+
+examples/null
+^^^^^^^^^^^^^
+
+ This is the do nothing application. It is only used for bringing
+ up new NuttX architectures in the most minimal of environments.
+
+examples/ostest
+^^^^^^^^^^^^^^^
+
+ This is the NuttX 'qualification' suite. It attempts to exercise
+ a broad set of OS functionality. Its coverage is not very extensive
+ as of this writing, but it is used to qualify each NuttX release.
+
+ The behavior of the ostest can be modified with the following
+ settings in the configs/<board-name>/defconfig file:
+
+ * CONFIG_EXAMPLES_OSTEST_LOOPS
+ Used to control the number of executions of the test. If
+ undefined, the test executes one time. If defined to be
+ zero, the test runs forever.
+ * CONFIG_EXAMPLES_OSTEST_STACKSIZE
+ Used to create the ostest task. Default is 8192.
+ * CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS
+ Specifies the number of threads to create in the barrier
+ test. The default is 8 but a smaller number may be needed on
+ systems without sufficient memory to start so many threads.
+
+examples/pashello
+^^^^^^^^^^^^^^^^^
+
+ This is "Hello, World" implemented via the Pascal P-Code interpreter
+
+examples/pipe
+^^^^^^^^^^^^^
+
+ A test of the mkfifo() and pipe() APIs.
+
+ * CONFIG_EXAMPLES_PIPE_STACKSIZE
+ Sets the size of the stack to use when creating the child tasks.
+ The default size is 1024.
+
+examples/poll
+^^^^^^^^^^^^^
+
+ A test of the poll() and select() APIs using FIFOs and, if available,
+ stdin, and a TCP/IP socket. In order to build this test, you must the
+ following selected in your NuttX configuration file:
+
+ CONFIG_NFILE_DESCRIPTORS - Defined to be greater than 0
+ CONFIG_DISABLE_POLL - NOT defined
+
+ In order to use the TCP/IP select test, you have also the following
+ additional things selected in your NuttX configuration file:
+
+ CONFIG_NET - Defined for general network support
+ CONFIG_NET_TCP - Defined for TCP/IP support
+ CONFIG_NSOCKET_DESCRIPTORS - Defined to be greater than 0
+ CONFIG_NET_NTCP_READAHEAD_BUFFERS - Defined to be greater than zero
+
+ CONFIG_EXAMPLE_POLL_NOMAC - (May be defined to use software assigned MAC)
+ CONFIG_EXAMPLE_POLL_IPADDR - Target IP address
+ CONFIG_EXAMPLE_POLL_DRIPADDR - Default router IP addess
+ CONFIG_EXAMPLE_POLL_NETMASK - Network mask
+
+ In order to for select to work with incoming connections, you
+ must also select:
+
+ CONFIG_NET_TCPBACKLOG - Incoming connections pend in a backlog until accept() is called.
+
+ In additional to the target device-side example, there is also
+ a host-side application in this directory. It can be compiled under
+ Linux or Cygwin as follows:
+
+ cd examples/usbserial
+ make -f Makefile.host TOPDIR=<nuttx-directory> TARGETIP=<target-ip>
+
+ Where <target-ip> is the IP address of your target board.
+
+ This will generate a small program called 'host'. Usage:
+
+ 1. Build the examples/poll target program with TCP/IP poll support
+ and start the target.
+
+ 3. Then start the host application:
+
+ ./host
+
+ The host and target will exchange are variety of small messages. Each
+ message sent from the host should cause the select to return in target.
+ The target example should read the small message and send it back to
+ the host. The host should then receive the echo'ed message.
+
+ If networking is enabled, applications using this example will need to
+ provide an appconfig file in the configuration driver with instruction
+ to build applications like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+
+examples/romfs
+^^^^^^^^^^^^^^
+
+ This example exercises the romfs filesystem. Configuration options
+ include:
+
+ * CONFIG_EXAMPLES_ROMFS_RAMDEVNO
+ The minor device number to use for the ROM disk. The default is
+ 1 (meaning /dev/ram1)
+
+ * CONFIG_EXAMPLES_ROMFS_SECTORSIZE
+ The ROM disk sector size to use. Default is 64.
+
+ * CONFIG_EXAMPLES_ROMFS_MOUNTPOINT
+ The location to mount the ROM disk. Deafault: "/usr/local/share"
+
+examples/sendmail
+^^^^^^^^^^^^^^^^^
+
+ This examples exercises the uIP SMTP logic by sending a test message
+ to a selected recipient. This test can also be built to execute on
+ the Cygwin/Linux host environment:
+
+ cd examples/sendmail
+ make -f Makefile.host TOPDIR=<nuttx-directory>
+
+ Settings unique to this example include:
+
+ CONFIG_EXAMPLE_SENDMAIL_NOMAC - May be defined to use software assigned MAC (optional)
+ CONFIG_EXAMPLE_SENDMAIL_IPADDR - Target IP address (required)
+ CONFIG_EXAMPLE_SENDMAIL_DRIPADDR - Default router IP addess (required)
+ CONFIG_EXAMPLE_SENDMAILT_NETMASK - Network mask (required)
+ CONFIG_EXAMPLE_SENDMAIL_RECIPIENT - The recipient of the email (required)
+ CONFIG_EXAMPLE_SENDMAIL_SENDER - Optional. Default: "nuttx-testing@example.com"
+ CONFIG_EXAMPLE_SENDMAIL_SUBJECT - Optional. Default: "Testing SMTP from NuttX"
+ CONFIG_EXAMPLE_SENDMAIL_BODY - Optional. Default: "Test message sent by NuttX"
+
+ NOTE: This test has not been verified on the NuttX target environment.
+ As of this writing, unit-tested in the Cygwin/Linux host environment.
+
+ NOTE 2: This sendmail example only works for the simplest of
+ environments. Virus protection software on your host may have
+ to be disabled to allow you to send messages. Only very open,
+ unprotected recipients can be used. Most will protect themselves
+ from this test email because it looks like SPAM.
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+ CONFIGURED_APPS = smtp=.built_always
+
+examples/serloop
+^^^^^^^^^^^^^^^^
+
+ This is a mindlessly simple loopback test on the console. Useful
+ for testing new serial drivers. Configuration options include:
+
+ * CONFIG_EXAMPLES_SERLOOP_BUFIO
+ Use C buffered I/O (getchar/putchar) vs. raw console I/O
+ (read/read).
+
+examples/thttpd
+^^^^^^^^^^^^^^^
+
+ An example that builds netutils/thttpd with some simple NXFLAT
+ CGI programs. see configs/README.txt for most THTTPD settings.
+ In addition to those, this example accepts:
+
+ CONFIG_EXAMPLE_THTTPD_NOMAC - (May be defined to use software assigned MAC)
+ CONFIG_EXAMPLE_THTTPD_DRIPADDR - Default router IP addess
+ CONFIG_EXAMPLE_THTTPD_NETMASK - Network mask
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+ CONFIGURED_APPS = thttpd=.built_always
+
+examples/udp
+^^^^^^^^^^^^
+
+ This is a simple network test for verifying client- and server-
+ functionality over UDP.
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+
+examples/uip
+^^^^^^^^^^^^
+
+ This is a port of uIP tiny webserver example application. Settings
+ specific to this example include:
+
+ CONFIG_EXAMPLE_UIP_NOMAC - (May be defined to use software assigned MAC)
+ CONFIG_EXAMPLE_UIP_IPADDR - Target IP address
+ CONFIG_EXAMPLE_UIP_DRIPADDR - Default router IP addess
+ CONFIG_EXAMPLE_UIP_NETMASK - Network mask
+ CONFIG_EXAMPLE_UIP_DHCPC - Select to get IP address via DHCP
+
+ If you use DHCPC, then some special configuration network options are
+ required. These include:
+
+ CONFIG_NET=y - Of course
+ CONFIG_NSOCKET_DESCRIPTORS - And, of course, you must allocate some
+ socket descriptors.
+ CONFIG_NET_UDP=y - UDP support is required for DHCP
+ (as well as various other UDP-related
+ configuration settings).
+ CONFIG_NET_BROADCAST=y - UDP broadcast support is needed.
+ CONFIG_NET_BUFSIZE=650 - Per RFC2131 (p. 9), the DHCP client must be
+ (or larger) prepared to receive DHCP messages of up to
+ 576 bytes (excluding Ethernet, IP, or UDP
+ headers and FCS).
+
+ Other configuration items apply also to the selected webserver net utility.
+ Additional relevant settings for the uIP webserver net utility are:
+
+ CONFIG_NETUTILS_HTTPDSTACKSIZE
+ CONFIG_NETUTILS_HTTPDFILESTATS
+ CONFIG_NETUTILS_HTTPDNETSTATS
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+ CONFIGURED_APPS = dhcpc=.built_always
+ CONFIGURED_APPS = resolv=.built_always
+ CONFIGURED_APPS = webserver=.built_always
+
+examples/usbserial
+^^^^^^^^^^^^^^^^^^
+
+ TARGET CONFIGURATION:
+
+ This is another implementation of "Hello, World" but this one uses
+ a USB serial driver. Configuration options can be used to simply
+ the test. These options include:
+
+ CONFIG_EXAMPLES_USBSERIAL_INONLY
+ Only verify IN (device-to-host) data transfers. Default: both
+ CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ Only verify OUT (host-to-device) data transfers. Default: both
+ CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL
+ Send only small, single packet messages. Default: Send large and small.
+ CONFIG_EXAMPLES_USBSERIAL_ONLYBIG
+ Send only large, multi-packet messages. Default: Send large and small.
+
+ If CONFIG_USBDEV_TRACE is enabled (or CONFIG_DEBUG and CONFIG_DEBUG_USB), then
+ the example code will also manage the USB trace output. The amount of trace output
+ can be controlled using:
+
+ CONFIG_EXAMPLES_USBSERIAL_TRACEINIT
+ Show initialization events
+ CONFIG_EXAMPLES_USBSERIAL_TRACECLASS
+ Show class driver events
+ CONFIG_EXAMPLES_USBSERIAL_TRACETRANSFERS
+ Show data transfer events
+ CONFIG_EXAMPLES_USBSERIAL_TRACECONTROLLER
+ Show controller events
+ CONFIG_EXAMPLES_USBSERIAL_TRACEINTERRUPTS
+ Show interrupt-related events.
+
+ Error results are always shown in the trace output
+
+ HOST-SIDE TEST PROGRAM
+
+ In additional to the target device-side example, there is also a
+ host-side application in this directory. This host side application
+ must be executed on a Linux host in order to perform the USBSERIAL
+ test. The host application can be compiled under Linux (or Cygwin?)
+ as follows:
+
+ cd examples/usbserial
+ make -f Makefile.host TOPDIR=<nuttx-directory>
+
+ RUNNING THE TEST
+
+ This will generate a small program called 'host'. Usage:
+
+ 1. Build the examples/usbserial target program and start the target.
+
+ 2. Wait a bit, then do enter:
+
+ dmesg
+
+ At the end of the dmesg output, you should see the serial
+ device was successfully idenfied and assigned to a tty device,
+ probably /dev/ttyUSB0.
+
+ 3. Then start the host application:
+
+ ./host [<tty-dev>]
+
+ Where:
+
+ <tty-dev> is the USB TTY device to use. The default is /dev/ttyUSB0.
+
+ The host and target will exchange are variety of very small and very large
+ serial messages.
+
+examples/usbstorage
+^^^^^^^^^^^^^^^^^^^
+
+ This example registers a block device driver, then exports the block
+ the device using the USB storage class driver. In order to use this
+ example, your board-specific logic must provide the function:
+
+ void usbstrg_archinitialize(void);
+
+ This function will be called by the example/usbstorage in order to
+ do the actual registration of the block device drivers. For examples
+ of the implementation of usbstrg_archinitialize() see
+ configs/mcu123-lpc124x/src/up_usbstrg.c or
+ configs/stm3210e-eval/src/usbstrg.c
+
+ Configuration options:
+
+ CONFIG_EXAMPLES_USBSTRG_NLUNS
+ Defines the number of logical units (LUNs) exported by the USB storage
+ driver. Each LUN corresponds to one exported block driver (or partition
+ of a block driver). May be 1, 2, or 3. Default is 1.
+ CONFIG_EXAMPLES_USBSTRG_DEVMINOR1
+ The minor device number of the block driver for the first LUN. For
+ example, N in /dev/mmcsdN. Used for registering the block driver. Default
+ is zero.
+ CONFIG_EXAMPLES_USBSTRG_DEVPATH1
+ The full path to the registered block driver. Default is "/dev/mmcsd0"
+ CONFIG_EXAMPLES_USBSTRG_DEVMINOR2 and CONFIG_EXAMPLES_USBSTRG_DEVPATH2
+ Similar parameters that would have to be provided if CONFIG_EXAMPLES_USBSTRG_NLUNS
+ is 2 or 3. No defaults.
+ CONFIG_EXAMPLES_USBSTRG_DEVMINOR3 and CONFIG_EXAMPLES_USBSTRG_DEVPATH3
+ Similar parameters that would have to be provided if CONFIG_EXAMPLES_USBSTRG_NLUNS
+ is 3. No defaults.
+
+ If CONFIG_USBDEV_TRACE is enabled (or CONFIG_DEBUG and CONFIG_DEBUG_USB), then
+ the example code will also manage the USB trace output. The amount of trace output
+ can be controlled using:
+
+ CONFIG_EXAMPLES_USBSTRG_TRACEINIT
+ Show initialization events
+ CONFIG_EXAMPLES_USBSTRG_TRACECLASS
+ Show class driver events
+ CONFIG_EXAMPLES_USBSTRG_TRACETRANSFERS
+ Show data transfer events
+ CONFIG_EXAMPLES_USBSTRG_TRACECONTROLLER
+ Show controller events
+ CONFIG_EXAMPLES_USBSTRG_TRACEINTERRUPTS
+ Show interrupt-related events.
+
+ Error results are always shown in the trace output
+
+examples/wget
+^^^^^^^^^^^^^
+
+ A simple web client example. It will obtain a file from a server using the HTTP
+ protocol. Settings unique to this example include:
+
+ CONFIG_EXAMPLE_WGET_URL - The URL of the file to get
+ CONFIG_EXAMPLE_WGET_NOMAC - (May be defined to use software assigned MAC)
+ CONFIG_EXAMPLE_WGET_IPADDR - Target IP address
+ CONFIG_EXAMPLE_WGET_DRIPADDR - Default router IP addess
+ CONFIG_EXAMPLE_WGET_NETMASK - Network mask
+
+ This example uses netutils/webclient. Additional configuration settings apply
+ to that code as follows (but built-in defaults are probably OK):
+
+ CONFIG_WEBCLIENT_GETMIMETYPE, CONFIG_WEBCLIENT_MAXHTTPLINE,
+ CONFIG_WEBCLIENT_MAXMIMESIZE, CONFIG_WEBCLIENT_MAXHOSTNAME,
+ CONFIG_WEBCLIENT_MAXFILENAME
+
+ Of course, the example also requires other settings including CONFIG_NET and
+ CONFIG_NET_TCP. The example also uses the uIP resolver which requires CONFIG_UDP.
+
+ WARNNG: As of this writing, wget is untested on the target platform. At present
+ it has been tested only in the host-based configuration described in the following
+ note. The primary difference is that the target version will rely on the also
+ untested uIP name resolver.
+
+ NOTE: For test purposes, this example can be built as a host-based wget function.
+ This can be built as follows:
+
+ cd examples/wget
+ make -f Makefile.host
+
+ Applications using this example will need to provide an appconfig
+ file in the configuration driver with instruction to build applications
+ like:
+
+ CONFIGURED_APPS = uiplib=.built_always
+ CONFIGURED_APPS = resolv=.built_always
+ CONFIGURED_APPS = webclient=.built_always
+
+
diff --git a/apps/examples/dhcpd/Makefile b/apps/examples/dhcpd/Makefile
new file mode 100644
index 000000000..d3ebff901
--- /dev/null
+++ b/apps/examples/dhcpd/Makefile
@@ -0,0 +1,91 @@
+############################################################################
+# apps/examples/dhcpd/Makefile
+#
+# Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# DHCP Daemon Example
+
+ASRCS =
+CSRCS = target.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/dhcpd/Makefile.host b/apps/examples/dhcpd/Makefile.host
new file mode 100644
index 000000000..19af5f42f
--- /dev/null
+++ b/apps/examples/dhcpd/Makefile.host
@@ -0,0 +1,62 @@
+############################################################################
+# apps/examples/dhcpd/Makefile.host
+#
+# Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+
+# TOPDIR must be defined on the make command line
+
+include $(TOPDIR)/Make.defs
+
+OBJS = host.o1 dhcpd.o1
+BIN = dhcpd
+
+HOSTCFLAGS += -DCONFIG_NETUTILS_DHCPD_HOST=1
+HOSTCFLAGS += -DCONFIG_NETUTILS_DHCPD_INTERFACE=\"eth1\"
+HOSTCFLAGS += -DHAVE_SO_REUSEADDR=1
+HOSTCFLAGS += -DHAVE_SO_BROADCAST=1
+
+VPATH = $(TOPDIR)/netutils/dhcpd:.
+
+all: $(BIN)
+.PHONY: clean context clean_context distclean
+
+$(OBJS): %.o1: %.c
+ $(HOSTCC) -c $(HOSTCFLAGS) $< -o $@
+
+$(BIN): $(OBJS)
+ $(HOSTCC) $(HOSTLDFLAGS) $^ -o $@
+
+clean:
+ @rm -f $(BIN).* *.o1 *~
+
+
diff --git a/apps/examples/dhcpd/host.c b/apps/examples/dhcpd/host.c
new file mode 100644
index 000000000..9e654819b
--- /dev/null
+++ b/apps/examples/dhcpd/host.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * examples/dhcpd/host.c
+ *
+ * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+extern int dhcpd_run(void);
+
+/****************************************************************************
+ * main
+ ****************************************************************************/
+
+int main(int argc, char **argv, char **envp)
+{
+ dhcpd_run();
+ return 0;
+}
diff --git a/apps/examples/dhcpd/target.c b/apps/examples/dhcpd/target.c
new file mode 100644
index 000000000..1878c2bc8
--- /dev/null
+++ b/apps/examples/dhcpd/target.c
@@ -0,0 +1,143 @@
+/****************************************************************************
+ * examples/dhcpd/target.c
+ *
+ * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <netinet/in.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+
+#include <apps/netutils/uiplib.h>
+#include <apps/netutils/dhcpd.h>
+
+/****************************************************************************
+ * Preprocessor Definitions
+ ****************************************************************************/
+
+/* Configuation Checkes *****************************************************/
+/* BEWARE:
+ * There are other configuration settings needed in netutitls/dhcpd/dhcpdc.s,
+ * but there are default values for those so we cannot check them here.
+ */
+
+#ifndef CONFIG_EXAMPLE_DHCPD_IPADDR
+# error "You must define CONFIG_EXAMPLE_DHCPD_IPADDR"
+#endif
+
+#ifndef CONFIG_EXAMPLE_DHCPD_DRIPADDR
+# error "You must define "
+#endif
+
+#ifndef CONFIG_EXAMPLE_DHCPD_NETMASK
+# error "You must define CONFIG_EXAMPLE_DHCPD_NETMASK"
+#endif
+
+#ifndef CONFIG_NET
+# error "You must define CONFIG_NET"
+#endif
+
+#ifndef CONFIG_NET_UDP
+# error "You must define CONFIG_NET_UDP"
+#endif
+
+#ifndef CONFIG_NET_BROADCAST
+# error "You must define CONFIG_NET_BROADCAST"
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+#if defined(CONFIG_EXAMPLE_DHCPD_NOMAC)
+ uint8_t mac[IFHWADDRLEN];
+#endif
+
+/* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_DHCPD_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_DHCPD_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_DHCPD_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_DHCPD_NETMASK);
+ uip_setnetmask("eth0", &addr);
+
+ /* Then start the server */
+
+ dhcpd_run();
+ return 0;
+}
diff --git a/apps/examples/hello/Makefile b/apps/examples/hello/Makefile
new file mode 100644
index 000000000..73430c5c5
--- /dev/null
+++ b/apps/examples/hello/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/examples/hello/Makefile
+#
+# Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Hello, World! Example
+
+ASRCS =
+CSRCS = main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/hello/main.c b/apps/examples/hello/main.c
new file mode 100644
index 000000000..44c8384eb
--- /dev/null
+++ b/apps/examples/hello/main.c
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * examples/hello/main.c
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ printf("Hello, World!!\n");
+ return 0;
+}
+
diff --git a/apps/examples/helloxx/Makefile b/apps/examples/helloxx/Makefile
new file mode 100755
index 000000000..69c4e08eb
--- /dev/null
+++ b/apps/examples/helloxx/Makefile
@@ -0,0 +1,107 @@
+############################################################################
+# apps/examples/helloxx/Makefile
+#
+# Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Hello, World! C++ Example
+
+ASRCS =
+CSRCS =
+CXXSRCS = main.cxx
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+CXXOBJS = $(CXXSRCS:.cxx=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS)
+OBJS = $(AOBJS) $(COBJS) $(CXXOBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean chkcxx
+
+chkcxx:
+ifneq ($(CONFIG_HAVE_CXX),y)
+ @echo ""
+ @echo "In order to use this example, you toolchain must support must"
+ @echo ""
+ @echo " (1) Explicitly seelct CONFIG_HAVE_CXX to build in C++ support"
+ @echo " (2) Define CXX, CXXFLAGS, and COMPILEXX in the Make.defs file"
+ @echo " of the configuration that you are using."
+ @echo ""
+ @exit 1
+endif
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(CXXOBJS): %$(OBJEXT): %.cxx
+ $(call COMPILEXX, $<, $@)
+
+$(BIN): chkcxx $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/helloxx/main.cxx b/apps/examples/helloxx/main.cxx
new file mode 100755
index 000000000..df84375a2
--- /dev/null
+++ b/apps/examples/helloxx/main.cxx
@@ -0,0 +1,128 @@
+//***************************************************************************
+// examples/helloxx/main.c
+//
+// Copyright (C) 2009 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+//
+// 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 <nuttx/init.h>
+#include <cstdio>
+#include <debug.h>
+
+//***************************************************************************
+// Definitions
+//***************************************************************************
+
+//***************************************************************************
+// Private Classes
+//***************************************************************************
+
+class CHelloWorld
+{
+ public:
+ CHelloWorld(void) : mSecret(42) { lldbg("Constructor\n"); };
+ ~CHelloWorld(void) { lldbg("Destructor\n"); };
+
+ bool HelloWorld(void)
+ {
+ if (mSecret != 42)
+ {
+ printf("CONSTRUCTION FAILED!\n");
+ return false;
+ }
+ else
+ {
+ printf("Hello, World!!\n");
+ return true;
+ }
+ };
+
+ private:
+ int mSecret;
+};
+
+//***************************************************************************
+// Private Data
+//***************************************************************************
+
+#ifndef CONFIG_EXAMPLE_HELLOXX_NOSTATICCONST
+static CHelloWorld g_HelloWorld;
+#endif
+
+//***************************************************************************
+// Public Functions
+//***************************************************************************
+
+//***************************************************************************
+// user_initialize
+//***************************************************************************
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ // Stub that must be provided only if the toolchain does not support weak
+ // functions.
+}
+#endif
+
+//***************************************************************************
+// user_start
+//***************************************************************************
+
+int user_start(int argc, char *argv[])
+{
+#ifndef CONFIG_EXAMPLE_HELLOXX_NOSTACKCONST
+ CHelloWorld HelloWorld;
+#endif
+ CHelloWorld *pHelloWorld = new CHelloWorld;
+
+ printf("Saying hello from the dynamically constructed instance\n");
+ pHelloWorld->HelloWorld();
+
+#ifndef CONFIG_EXAMPLE_HELLOXX_NOSTACKCONST
+ printf("Saying hello from the statically constructed instance\n");
+ HelloWorld.HelloWorld();
+#endif
+
+#ifndef CONFIG_EXAMPLE_HELLOXX_NOSTATICCONST
+ printf("Saying hello from the statically constructed instance\n");
+ g_HelloWorld.HelloWorld();
+#endif
+
+ delete pHelloWorld;
+ return 0;
+}
+
diff --git a/apps/examples/hidkbd/Makefile b/apps/examples/hidkbd/Makefile
new file mode 100644
index 000000000..c0c21d6da
--- /dev/null
+++ b/apps/examples/hidkbd/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/examples/hidkbd/Makefile
+#
+# Copyright (C) 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# USB Host HID keyboard Example
+
+ASRCS =
+CSRCS = hidkbd_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/hidkbd/hidkbd_main.c b/apps/examples/hidkbd/hidkbd_main.c
new file mode 100644
index 000000000..0a082f67c
--- /dev/null
+++ b/apps/examples/hidkbd/hidkbd_main.c
@@ -0,0 +1,239 @@
+/****************************************************************************
+ * examples/hidkbd/null_main.c
+ *
+ * Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <errno.h>
+
+#include <nuttx/usb/usbhost.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+/* Configuration ************************************************************/
+
+/* Sanity checking */
+
+#ifndef CONFIG_USBHOST
+# error "CONFIG_USBHOST is not defined"
+#endif
+
+#ifdef CONFIG_USBHOST_INT_DISABLE
+# error "Interrupt endpoints are disabled (CONFIG_USBHOST_INT_DISABLE)"
+#endif
+
+#ifndef CONFIG_NFILE_DESCRIPTORS
+# error "CONFIG_NFILE_DESCRIPTORS > 0 needed"
+#endif
+
+/* Provide some default values for other configuration settings */
+
+#ifndef CONFIG_EXAMPLES_HIDKBD_DEFPRIO
+# define CONFIG_EXAMPLES_HIDKBD_DEFPRIO 50
+#endif
+
+#ifndef CONFIG_EXAMPLES_HIDKBD_STACKSIZE
+# define CONFIG_EXAMPLES_HIDKBD_STACKSIZE 1024
+#endif
+
+#ifndef CONFIG_EXAMPLES_HIDKBD_DEVNAME
+# define CONFIG_EXAMPLES_HIDKBD_DEVNAME "/dev/kbda"
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct usbhost_driver_s *g_drvr;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: hidkbd_waiter
+ *
+ * Description:
+ * Wait for USB devices to be connected.
+ *
+ ****************************************************************************/
+
+static int hidkbd_waiter(int argc, char *argv[])
+{
+ bool connected = false;
+ int ret;
+
+ printf("hidkbd_waiter: Running\n");
+ for (;;)
+ {
+ /* Wait for the device to change state */
+
+ ret = DRVR_WAIT(g_drvr, connected);
+ DEBUGASSERT(ret == OK);
+
+ connected = !connected;
+ printf("hidkbd_waiter: %s\n", connected ? "connected" : "disconnected");
+
+ /* Did we just become connected? */
+
+ if (connected)
+ {
+ /* Yes.. enumerate the newly connected device */
+
+ (void)DRVR_ENUMERATE(g_drvr);
+ }
+ }
+
+ /* Keep the compiler from complaining */
+
+ return 0;
+}
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ char buffer[256];
+ pid_t pid;
+ ssize_t nbytes;
+ int fd;
+ int ret;
+
+ /* First, register all of the USB host HID keyboard class driver */
+
+ printf("user_start: Register class drivers\n");
+ ret = usbhost_kbdinit();
+ if (ret != OK)
+ {
+ printf("user_start: Failed to register the KBD class\n");
+ }
+
+ /* Then get an instance of the USB host interface */
+
+ printf("user_start: Initialize USB host keyboard driver\n");
+ g_drvr = usbhost_initialize(0);
+ if (g_drvr)
+ {
+ /* Start a thread to handle device connection. */
+
+ printf("user_start: Start hidkbd_waiter\n");
+
+#ifndef CONFIG_CUSTOM_STACK
+ pid = task_create("usbhost", CONFIG_EXAMPLES_HIDKBD_DEFPRIO,
+ CONFIG_EXAMPLES_HIDKBD_STACKSIZE,
+ (main_t)hidkbd_waiter, (const char **)NULL);
+#else
+ pid = task_create("usbhost", CONFIG_EXAMPLES_HIDKBD_DEFPRIO,
+ (main_t)hidkbd_waiter, (const char **)NULL);
+#endif
+
+ /* Now just sleep. Eventually logic here will open the kbd device and
+ * perform the HID keyboard test.
+ */
+
+ for (;;)
+ {
+ /* Open the keyboard device. Loop until the device is successfully
+ * opened.
+ */
+
+ do
+ {
+ printf("Opening device %s\n", CONFIG_EXAMPLES_HIDKBD_DEVNAME);
+ fd = open(CONFIG_EXAMPLES_HIDKBD_DEVNAME, O_RDONLY);
+ if (fd < 0)
+ {
+ printf("Failed: %d\n", errno);
+ fflush(stdout);
+ sleep(3);
+ }
+ }
+ while (fd < 0);
+
+ printf("Device %s opened\n", CONFIG_EXAMPLES_HIDKBD_DEVNAME);
+ fflush(stdout);
+
+ /* Loop until there is a read failure */
+
+ do
+ {
+ /* Read a buffer of data */
+
+ nbytes = read(fd, buffer, 256);
+ if (nbytes > 0)
+ {
+ /* On success, echo the buffer to stdout */
+
+ (void)write(1, buffer, nbytes);
+ }
+ }
+ while (nbytes >= 0);
+
+ printf("Closing device %s: %d\n", CONFIG_EXAMPLES_HIDKBD_DEVNAME, (int)nbytes);
+ fflush(stdout);
+ close(fd);
+ }
+ }
+ return 0;
+}
diff --git a/apps/examples/igmp/Makefile b/apps/examples/igmp/Makefile
new file mode 100755
index 000000000..99971469b
--- /dev/null
+++ b/apps/examples/igmp/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/examples/igmp/Makefile
+#
+# Copyright (C) 2010 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# IGMP Networking Example
+
+ASRCS =
+CSRCS = igmp.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/igmp/igmp.c b/apps/examples/igmp/igmp.c
new file mode 100755
index 000000000..734a7e599
--- /dev/null
+++ b/apps/examples/igmp/igmp.c
@@ -0,0 +1,155 @@
+/****************************************************************************
+ * examples/igmp/igmp.c
+ *
+ * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <debug.h>
+
+#include <net/if.h>
+#include <net/uip/uip.h>
+#include <apps/netutils/uiplib.h>
+#include <apps/netutils/ipmsfilter.h>
+
+#include "igmp.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Check if the destination address is a multicast address
+ *
+ * - IPv4: multicast addresses lie in the class D group -- The address range
+ * 224.0.0.0 to 239.255.255.255 (224.0.0.0/4)
+ *
+ * - IPv6 multicast addresses are have the high-order octet of the
+ * addresses=0xff (ff00::/8.)
+ */
+
+#if ((CONFIG_EXAMPLE_IGMP_GRPADDR & 0xffff0000) < 0xe0000000ul) || \
+ ((CONFIG_EXAMPLE_IGMP_GRPADDR & 0xffff0000) > 0xeffffffful)
+# error "Bad range for IGMP group address"
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does
+ * not support weak functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+#if defined(CONFIG_EXAMPLE_IGMP_NOMAC)
+ uint8_t mac[IFHWADDRLEN];
+#endif
+
+ message("Configuring Ethernet...\n");
+
+ /* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_IGMP_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_IGMP_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_IGMP_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_IGMP_NETMASK);
+ uip_setnetmask("eth0", &addr);
+
+ /* Not much of a test for now */
+ /* Join the group */
+
+ message("Join group...\n");
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_IGMP_GRPADDR);
+ ipmsfilter("eth0", &addr, MCAST_INCLUDE);
+
+ /* Wait a while */
+
+ message("Wait for timeout...\n");
+ sleep(5);
+
+ /* Leave the group */
+
+ message("Leave group...\n");
+ ipmsfilter("eth0", &addr, MCAST_EXCLUDE);
+
+ /* Wait a while */
+
+ sleep(5);
+ message("Exiting...\n");
+ return 0;
+}
diff --git a/apps/examples/igmp/igmp.h b/apps/examples/igmp/igmp.h
new file mode 100755
index 000000000..e241467c6
--- /dev/null
+++ b/apps/examples/igmp/igmp.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * examples/igmp/igmp.h
+ *
+ * Copyright (C) 2010 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_IGMP_H
+#define __EXAMPLES_IGMP_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <debug.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Used lib_rawprintf() so that there is no confusion from buffered IO */
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# define message(...) lib_rawprintf(__VA_ARGS__)
+#else
+# define message lib_rawprintf
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#endif /* __EXAMPLES_IGMP_H */
diff --git a/apps/examples/mm/Makefile b/apps/examples/mm/Makefile
new file mode 100644
index 000000000..c9ef6f907
--- /dev/null
+++ b/apps/examples/mm/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/examples/mm/Makefile
+#
+# Copyright (C) 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Memory Management Test
+
+ASRCS =
+CSRCS = mm_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/mm/mm_main.c b/apps/examples/mm/mm_main.c
new file mode 100644
index 000000000..0e23e0cfb
--- /dev/null
+++ b/apps/examples/mm/mm_main.c
@@ -0,0 +1,308 @@
+/****************************************************************************
+ * examples/mm/mm_main.c
+ *
+ * Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define NTEST_ALLOCS 32
+
+/* #define STOP_ON_ERRORS do{}while(0) */
+#define STOP_ON_ERRORS exit(1)
+
+/* All other definitions derive from these two */
+
+#define MM_MIN_SHIFT 4 /* 16 bytes */
+#define MM_MIN_CHUNK (1 << MM_MIN_SHIFT)
+#define MM_GRAN_MASK (MM_MIN_CHUNK-1)
+#define MM_ALIGN_UP(a) (((a) + MM_GRAN_MASK) & ~MM_GRAN_MASK)
+#define MM_ALIGN_DOWN(a) ((a) & ~MM_GRAN_MASK)
+
+#ifdef CONFIG_SMALL_MEMORY
+# define SIZEOF_MM_ALLOCNODE 4
+#else
+# define SIZEOF_MM_ALLOCNODE 8
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+/* Test allocations */
+
+static const int alloc_sizes[NTEST_ALLOCS] =
+{
+ 1024, 12, 962, 5692, 10254, 111, 9932, 601,
+ 222, 2746, 3, 124321, 68, 776, 6750, 852,
+ 4732, 28, 901, 480, 5011, 1536, 2011, 81647,
+ 646, 1646, 69179, 194, 2590, 7, 969, 70
+};
+
+static const int realloc_sizes[NTEST_ALLOCS] =
+{
+ 18, 3088, 963, 123, 511, 11666, 3723, 42,
+ 9374, 1990, 1412, 6, 592, 4088, 11, 5040,
+ 8663, 91255, 28, 4346, 9172, 168, 229, 4734,
+ 59139, 221, 7830, 30421, 1666, 4, 812, 416
+};
+
+static const int random1[NTEST_ALLOCS] =
+{
+ 20, 11, 3, 31, 9, 29, 7, 17,
+ 21, 2, 26, 18, 14, 25, 0, 10,
+ 27, 19, 22, 28, 8, 30, 12, 15,
+ 4, 1, 24, 6, 16, 13, 5, 23
+};
+
+static const int random2[NTEST_ALLOCS] =
+{
+ 2, 19, 12, 23, 30, 11, 27, 4,
+ 20, 7, 0, 16, 28, 15, 5, 24,
+ 10, 17, 25, 31, 8, 29, 3, 26,
+ 9, 18, 22, 13, 1, 21, 14, 6
+};
+
+static const int random3[NTEST_ALLOCS] =
+{
+ 8, 17, 3, 18, 26, 23, 30, 11,
+ 12, 22, 4, 20, 25, 10, 27, 1,
+ 29, 14, 19, 21, 0, 31, 7, 24,
+ 9, 15, 2, 28, 16, 6, 13, 5
+};
+
+static const int alignment[NTEST_ALLOCS/2] =
+{
+ 128, 2048, 131072, 8192, 32, 32768, 16384 , 262144,
+ 512, 4096, 65536, 8, 64, 1024, 16, 4
+};
+
+static void *allocs[NTEST_ALLOCS];
+static struct mallinfo alloc_info;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static void mm_showmallinfo(void)
+{
+ alloc_info = mallinfo();
+ printf(" mallinfo:\n");
+ printf(" Total space allocated from system = %ld\n",
+ alloc_info.arena);
+ printf(" Number of non-inuse chunks = %ld\n",
+ alloc_info.ordblks);
+ printf(" Largest non-inuse chunk = %ld\n",
+ alloc_info.mxordblk);
+ printf(" Total allocated space = %ld\n",
+ alloc_info.uordblks);
+ printf(" Total non-inuse space = %ld\n",
+ alloc_info.fordblks);
+}
+
+static void do_mallocs(void **mem, const int *size, const int *seq, int n)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < n; i++)
+ {
+ j = seq[i];
+ if (!mem[j])
+ {
+ printf("(%d)Allocating %d bytes\n", i, size[j]);
+ mem[j] = malloc(size[j]);
+ printf("(%d)Memory allocated at %p\n", i, mem[j]);
+ if (mem[j] == NULL)
+ {
+ int allocsize = MM_ALIGN_UP(size[j] + SIZEOF_MM_ALLOCNODE);
+ fprintf(stderr, "(%d)malloc failed for allocsize=%d\n", i, allocsize);
+ if (allocsize > alloc_info.mxordblk)
+ {
+ fprintf(stderr, " Normal, largest free block is only %ld\n", alloc_info.mxordblk);
+ }
+ else
+ {
+ fprintf(stderr, " ERROR largest free block is %ld\n", alloc_info.mxordblk);
+ exit(1);
+ }
+ }
+ else
+ {
+ memset(mem[j], 0xAA, size[j]);
+ }
+
+ mm_showmallinfo();
+ }
+ }
+}
+
+static void do_reallocs(void **mem, const int *oldsize, const int *newsize, const int *seq, int n)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < n; i++)
+ {
+ j = seq[i];
+ printf("(%d)Re-allocating at %p from %d to %d bytes\n",
+ i, mem[j], oldsize[j], newsize[j]);
+ mem[j] = realloc(mem[j], newsize[j]);
+ printf("(%d)Memory re-allocated at %p\n", i, mem[j]);
+ if (mem[j] == NULL)
+ {
+ int allocsize = MM_ALIGN_UP(newsize[j] + SIZEOF_MM_ALLOCNODE);
+ fprintf(stderr, "(%d)realloc failed for allocsize=%d\n", i, allocsize);
+ if (allocsize > alloc_info.mxordblk)
+ {
+ fprintf(stderr, " Normal, largest free block is only %ld\n", alloc_info.mxordblk);
+ }
+ else
+ {
+ fprintf(stderr, " ERROR largest free block is %ld\n", alloc_info.mxordblk);
+ exit(1);
+ }
+ }
+ else
+ {
+ memset(mem[j], 0x55, newsize[j]);
+ }
+
+ mm_showmallinfo();
+ }
+}
+
+static void do_memaligns(void **mem, const int *size, const int *align, const int *seq, int n)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < n; i++)
+ {
+ j = seq[i];
+ printf("(%d)Allocating %d bytes aligned to 0x%08x\n",
+ i, size[j], align[i]);
+ mem[j] = memalign(align[i], size[j]);
+ printf("(%d)Memory allocated at %p\n", i, mem[j]);
+ if (mem[j] == NULL)
+ {
+ int allocsize = MM_ALIGN_UP(size[j] + SIZEOF_MM_ALLOCNODE) + 2*align[i];
+ fprintf(stderr, "(%d)memalign failed for allocsize=%d\n", i, allocsize);
+ if (allocsize > alloc_info.mxordblk)
+ {
+ fprintf(stderr, " Normal, largest free block is only %ld\n", alloc_info.mxordblk);
+ }
+ else
+ {
+ fprintf(stderr, " ERROR largest free block is %ld\n", alloc_info.mxordblk);
+ exit(1);
+ }
+ }
+ else
+ {
+ memset(mem[j], 0x33, size[j]);
+ }
+
+ mm_showmallinfo();
+ }
+}
+
+static void do_frees(void **mem, const int *size, const int *seq, int n)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < n; i++)
+ {
+ j = seq[i];
+ printf("(%d)Releasing memory at %p (size=%d bytes)\n",
+ i, mem[j], size[j]);
+ free(mem[j]);
+ mem[j] = NULL;
+
+ mm_showmallinfo();
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ mm_showmallinfo();
+
+ /* Allocate some memory */
+
+ do_mallocs(allocs, alloc_sizes, random1, NTEST_ALLOCS);
+
+ /* Re-allocate the memory */
+
+ do_reallocs(allocs, alloc_sizes, realloc_sizes, random2, NTEST_ALLOCS);
+
+ /* Release the memory */
+
+ do_frees(allocs, realloc_sizes, random3, NTEST_ALLOCS);
+
+ /* Allocate aligned memory */
+
+ do_memaligns(allocs, alloc_sizes, alignment, random2, NTEST_ALLOCS/2);
+ do_memaligns(allocs, alloc_sizes, alignment, &random2[NTEST_ALLOCS/2], NTEST_ALLOCS/2);
+
+ /* Release aligned memory */
+
+ do_frees(allocs, alloc_sizes, random1, NTEST_ALLOCS);
+
+ printf("TEST COMPLETE\n");
+ return 0;
+}
diff --git a/apps/examples/mount/Makefile b/apps/examples/mount/Makefile
new file mode 100644
index 000000000..46a8c0576
--- /dev/null
+++ b/apps/examples/mount/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/Makefile
+#
+# Copyright (C) 2007-2008, 2010-2010 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# mount() test
+
+ASRCS =
+CSRCS = mount_main.c ramdisk.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/mount/mount.h b/apps/examples/mount/mount.h
new file mode 100644
index 000000000..68a03674d
--- /dev/null
+++ b/apps/examples/mount/mount.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * examples/mount/mount.h
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_MOUNT_MOUNT_H
+#define __EXAMPLES_MOUNT_MOUNT_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Configure the test */
+
+#if defined(CONFIG_EXAMPLES_MOUNT_DEVNAME)
+# if !defined(CONFIG_FS_WRITABLE)
+# error "Writable filesystem required in this configuration"
+# endif
+# undef CONFIG_EXAMPLES_MOUNT_NSECTORS
+# undef CONFIG_EXAMPLES_MOUNT_SECTORSIZE
+# undef CONFIG_EXAMPLES_MOUNT_RAMDEVNO
+# define MOUNT_DEVNAME CONFIG_EXAMPLES_MOUNT_DEVNAME
+#else
+# if !defined(CONFIG_FS_FAT)
+# error "CONFIG_FS_FAT required in this configuration"
+# endif
+# if !defined(CONFIG_EXAMPLES_MOUNT_SECTORSIZE)
+# define CONFIG_EXAMPLES_MOUNT_SECTORSIZE 512
+# endif
+# if !defined(CONFIG_EXAMPLES_MOUNT_NSECTORS)
+# define CONFIG_EXAMPLES_MOUNT_NSECTORS 2048
+# endif
+# if !defined(CONFIG_EXAMPLES_MOUNT_RAMDEVNO)
+# define CONFIG_EXAMPLES_MOUNT_RAMDEVNO 0
+# endif
+# define STR_RAMDEVNO(m) #m
+# define MKMOUNT_DEVNAME(m) "/dev/ram" STR_RAMDEVNO(m)
+# define MOUNT_DEVNAME MKMOUNT_DEVNAME(CONFIG_EXAMPLES_MOUNT_RAMDEVNO)
+#endif
+
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Variables
+ ****************************************************************************/
+
+extern const char g_source[]; /* Mount 'source' path */
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_MOUNT_DEVNAME
+extern int create_ramdisk(void);
+#endif
+
+#endif /* __EXAMPLES_MOUNT_MOUNT_H */
diff --git a/apps/examples/mount/mount_main.c b/apps/examples/mount/mount_main.c
new file mode 100644
index 000000000..05bda8150
--- /dev/null
+++ b/apps/examples/mount/mount_main.c
@@ -0,0 +1,762 @@
+/****************************************************************************
+ * mount_main.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/statfs.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <errno.h>
+
+#include "mount.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define TEST_USE_STAT 1
+#define TEST_SHOW_DIRECTORIES 1
+#define TEST_USE_STATFS 1
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char g_mntdir[] = "/mnt";
+static const char g_target[] = "/mnt/fs";
+static const char g_filesystemtype[] = "vfat";
+
+static const char g_testdir1[] = "/mnt/fs/TestDir";
+static const char g_testdir2[] = "/mnt/fs/NewDir1";
+static const char g_testdir3[] = "/mnt/fs/NewDir2";
+static const char g_testdir4[] = "/mnt/fs/NewDir3";
+#ifdef CONFIG_EXAMPLES_MOUNT_DEVNAME
+static const char g_testfile1[] = "/mnt/fs/TestDir/TestFile.txt";
+#endif
+static const char g_testfile2[] = "/mnt/fs/TestDir/WrTest1.txt";
+static const char g_testfile3[] = "/mnt/fs/NewDir1/WrTest2.txt";
+static const char g_testfile4[] = "/mnt/fs/NewDir3/Renamed.txt";
+static const char g_testmsg[] = "This is a write test";
+
+static int g_nerrors = 0;
+
+static char g_namebuffer[256];
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+ const char g_source[] = MOUNT_DEVNAME;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+#ifdef TEST_USE_STAT
+static void show_stat(const char *path, struct stat *ps)
+{
+ printf("%s stat:\n", path);
+ printf("\tmode : %08x\n", ps->st_mode);
+ if (S_ISREG(ps->st_mode))
+ {
+ printf("\ttype : File\n");
+ }
+ else if (S_ISDIR(ps->st_mode))
+ {
+ printf("\ttype : Directory\n");
+ }
+ else if (S_ISCHR(ps->st_mode))
+ {
+ printf("\ttype : Character driver\n");
+ }
+ else if (S_ISBLK(ps->st_mode))
+ {
+ printf("\ttype : Block driver\n");
+ }
+ else
+ {
+ printf("\ttype : Unknown\n");
+ }
+
+ printf("\tsize : %d (bytes)\n", ps->st_size);
+ printf("\tblock size : %d (bytes)\n", ps->st_blksize);
+ printf("\tsize : %d (blocks)\n", ps->st_blocks);
+ printf("\taccess time : %d\n", ps->st_atime);
+ printf("\tmodify time : %d\n", ps->st_mtime);
+ printf("\tchange time : %d\n", ps->st_ctime);
+}
+#endif
+
+/****************************************************************************
+ * Name: show_statfs
+ ****************************************************************************/
+
+#ifdef TEST_USE_STATFS
+static void show_statfs(const char *path)
+{
+ struct statfs buf;
+ int ret;
+
+ /* Try stat() against a file or directory. It should fail with expectederror */
+
+ printf("show_statfs: Try statfs(%s)\n", path);
+ ret = statfs(path, &buf);
+ if (ret == 0)
+ {
+ printf("show_statfs: statfs(%s) succeeded\n", path);
+ printf("\tFS Type : %0x\n", buf.f_type);
+ printf("\tBlock size : %d\n", buf.f_bsize);
+ printf("\tNumber of blocks : %d\n", buf.f_blocks);
+ printf("\tFree blocks : %d\n", buf.f_bfree);
+ printf("\tFree user blocks : %d\n", buf.f_bavail);
+ printf("\tNumber file nodes : %d\n", buf.f_files);
+ printf("\tFree file nodes : %d\n", buf.f_ffree);
+ printf("\tFile name length : %d\n", buf.f_namelen);
+ }
+ else
+ {
+ printf("show_statfs: ERROR statfs(%s) failed with errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+}
+#else
+# define show_statfs(p)
+#endif
+
+/****************************************************************************
+ * Name: show_directories
+ ****************************************************************************/
+
+#ifdef TEST_SHOW_DIRECTORIES
+static void show_directories(const char *path, int indent)
+{
+ DIR *dirp;
+ struct dirent *direntry;
+ int i;
+
+ dirp = opendir(path);
+ if ( !dirp )
+ {
+ printf("show_directories: ERROR opendir(\"%s\") failed with errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ return;
+ }
+
+ for (direntry = readdir(dirp); direntry; direntry = readdir(dirp))
+ {
+ for (i = 0; i < 2*indent; i++)
+ {
+ putchar(' ');
+ }
+ if (DIRENT_ISDIRECTORY(direntry->d_type))
+ {
+ char *subdir;
+ printf("%s/\n", direntry->d_name);
+ sprintf(g_namebuffer, "%s/%s", path, direntry->d_name);
+ subdir = strdup(g_namebuffer);
+ show_directories( subdir, indent + 1);
+ free(subdir);
+ }
+ else
+ {
+ printf("%s\n", direntry->d_name);
+ }
+ }
+
+ closedir(dirp);
+}
+#else
+# define show_directories(p,i)
+#endif
+
+/****************************************************************************
+ * Name: fail_read_open
+ ****************************************************************************/
+#ifdef CONFIG_EXAMPLES_MOUNT_DEVNAME
+static void fail_read_open(const char *path, int expectederror)
+{
+ int fd;
+
+ printf("fail_read_open: Try open(%s) for reading\n", path);
+
+ fd = open(path, O_RDONLY);
+ if (fd >= 0)
+ {
+ printf("fail_read_open: ERROR open(%s) succeeded\n", path);
+ g_nerrors++;
+ close(fd);
+ }
+ else if (errno != expectederror)
+ {
+ printf("fail_read_open: ERROR open(%s) failed with errno=%d (expected %d)\n",
+ path, errno, expectederror);
+ g_nerrors++;
+ }
+}
+#endif
+
+/****************************************************************************
+ * Name: read_test_file
+ ****************************************************************************/
+
+static void read_test_file(const char *path)
+{
+ char buffer[128];
+ int nbytes;
+ int fd;
+
+ /* Read a test file that is already on the test file system image */
+
+ printf("read_test_file: opening %s for reading\n", path);
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ {
+ printf("read_test_file: ERROR failed to open %s, errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+ else
+ {
+ memset(buffer, 0, 128);
+ nbytes = read(fd, buffer, 128);
+ if (nbytes < 0)
+ {
+ printf("read_test_file: ERROR failed to read from %s, errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+ else
+ {
+ buffer[127]='\0';
+ printf("read_test_file: Read \"%s\" from %s\n", buffer, path);
+ }
+ close(fd);
+ }
+}
+
+/****************************************************************************
+ * Name: write_test_file
+ ****************************************************************************/
+
+static void write_test_file(const char *path)
+{
+ int fd;
+
+ /* Write a test file into a pre-existing file on the test file system */
+
+ printf("write_test_file: opening %s for writing\n", path);
+
+ fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ if (fd < 0)
+ {
+ printf("write_test_file: ERROR failed to open %s for writing, errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+ else
+ {
+ int nbytes = write(fd, g_testmsg, strlen(g_testmsg));
+ if (nbytes < 0)
+ {
+ printf("write_test_file: ERROR failed to write to %s, errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+ else
+ {
+ printf("write_test_file: wrote %d bytes to %s\n", nbytes, path);
+ }
+ close(fd);
+ }
+}
+
+/****************************************************************************
+ * Name: fail_mkdir
+ ****************************************************************************/
+
+static void fail_mkdir(const char *path, int expectederror)
+{
+ int ret;
+
+ /* Try mkdir() against a file or directory. It should fail with expectederror */
+
+ printf("fail_mkdir: Try mkdir(%s)\n", path);
+
+ ret = mkdir(path, 0666);
+ if (ret == 0)
+ {
+ printf("fail_mkdir: ERROR mkdir(%s) succeeded\n", path);
+ g_nerrors++;
+ }
+ else if (errno != expectederror)
+ {
+ printf("fail_mkdir: ERROR mkdir(%s) failed with errno=%d (expected %d)\n",
+ path, errno, expectederror);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: succeed_mkdir
+ ****************************************************************************/
+
+static void succeed_mkdir(const char *path)
+{
+ int ret;
+
+ printf("succeed_mkdir: Try mkdir(%s)\n", path);
+
+ ret = mkdir(path, 0666);
+ if (ret != 0)
+ {
+ printf("succeed_mkdir: ERROR mkdir(%s) failed with errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: fail_rmdir
+ ****************************************************************************/
+
+static void fail_rmdir(const char *path, int expectederror)
+{
+ int ret;
+
+ /* Try rmdir() against a file or directory. It should fail with expectederror */
+
+ printf("fail_rmdir: Try rmdir(%s)\n", path);
+
+ ret = rmdir(path);
+ if (ret == 0)
+ {
+ printf("fail_rmdir: ERROR rmdir(%s) succeeded\n", path);
+ g_nerrors++;
+ }
+ else if (errno != expectederror)
+ {
+ printf("fail_rmdir: ERROR rmdir(%s) failed with errno=%d (expected %d)\n",
+ path, errno, expectederror);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: succeed_rmdir
+ ****************************************************************************/
+
+static void succeed_rmdir(const char *path)
+{
+ int ret;
+
+ printf("succeed_rmdir: Try rmdir(%s)\n", path);
+
+ ret = rmdir(path);
+ if (ret != 0)
+ {
+ printf("succeed_rmdir: ERROR rmdir(%s) failed with errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: fail_unlink
+ ****************************************************************************/
+
+static void fail_unlink(const char *path, int expectederror)
+{
+ int ret;
+
+ /* Try unlink() against a file or directory. It should fail with expectederror */
+
+ printf("fail_unlink: Try unlink(%s)\n", path);
+
+ ret = unlink(path);
+ if (ret == 0)
+ {
+ printf("fail_unlink: ERROR unlink(%s) succeeded\n", path);
+ g_nerrors++;
+ }
+ else if (errno != expectederror)
+ {
+ printf("fail_unlink: ERROR unlink(%s) failed with errno=%d (expected %d)\n",
+ path, errno, expectederror);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: succeed_unlink
+ ****************************************************************************/
+
+static void succeed_unlink(const char *path)
+{
+ int ret;
+
+ /* Try unlink() against the test file. It should succeed. */
+
+ printf("succeed_unlink: Try unlink(%s)\n", path);
+
+ ret = unlink(path);
+ if (ret != 0)
+ {
+ printf("succeed_unlink: ERROR unlink(%s) failed with errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: fail_rename
+ ****************************************************************************/
+
+static void fail_rename(const char *oldpath, const char *newpath, int expectederror)
+{
+ int ret;
+
+ /* Try rename() against a file or directory. It should fail with expectederror */
+
+ printf("fail_rename: Try rename(%s->%s)\n", oldpath, newpath);
+
+ ret = rename(oldpath, newpath);
+ if (ret == 0)
+ {
+ printf("fail_rename: ERROR rename(%s->%s) succeeded\n",
+ oldpath, newpath);
+ g_nerrors++;
+ }
+ else if (errno != expectederror)
+ {
+ printf("fail_rename: ERROR rename(%s->%s) failed with errno=%d (expected %d)\n",
+ oldpath, newpath, errno, expectederror);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: succeed_rename
+ ****************************************************************************/
+
+static void succeed_rename(const char *oldpath, const char *newpath)
+{
+ int ret;
+
+ printf("succeed_rename: Try rename(%s->%s)\n", oldpath, newpath);
+
+ ret = rename(oldpath, newpath);
+ if (ret != 0)
+ {
+ printf("succeed_rename: ERROR rename(%s->%s) failed with errno=%d\n",
+ oldpath, newpath, errno);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: fail_stat
+ ****************************************************************************/
+
+#ifdef TEST_USE_STAT
+static void fail_stat(const char *path, int expectederror)
+{
+ struct stat buf;
+ int ret;
+
+ /* Try stat() against a file or directory. It should fail with expectederror */
+
+ printf("fail_stat: Try stat(%s)\n", path);
+
+ ret = stat(path, &buf);
+ if (ret == 0)
+ {
+ printf("fail_stat: ERROR stat(%s) succeeded\n", path);
+ show_stat(path, &buf);
+ g_nerrors++;
+ }
+ else if (errno != expectederror)
+ {
+ printf("fail_stat: ERROR stat(%s) failed with errno=%d (expected %d)\n",
+ path, errno, expectederror);
+ g_nerrors++;
+ }
+}
+#else
+# define fail_stat(p,e);
+#endif
+
+/****************************************************************************
+ * Name: succeed_stat
+ ****************************************************************************/
+
+#ifdef TEST_USE_STAT
+static void succeed_stat(const char *path)
+{
+ struct stat buf;
+ int ret;
+
+ printf("succeed_stat: Try stat(%s)\n", path);
+
+ ret = stat(path, &buf);
+ if (ret != 0)
+ {
+ printf("succeed_stat: ERROR stat(%s) failed with errno=%d\n",
+ path, errno);
+ g_nerrors++;
+ }
+ else
+ {
+ printf("succeed_stat: stat(%s) succeeded\n", path);
+ show_stat(path, &buf);
+ }
+}
+#else
+#define succeed_stat(p)
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ int ret;
+
+#ifndef CONFIG_EXAMPLES_MOUNT_DEVNAME
+ /* Create a RAM disk for the test */
+
+ ret = create_ramdisk();
+ if (ret < 0)
+ {
+ printf("user_start: ERROR failed to create RAM disk\n");
+ return 1;
+ }
+#endif
+
+ /* Mount the test file system (see arch/sim/src/up_deviceimage.c */
+
+ printf("user_start: mounting %s filesystem at target=%s with source=%s\n",
+ g_filesystemtype, g_target, g_source);
+
+ ret = mount(g_source, g_target, g_filesystemtype, 0, NULL);
+ printf("user_start: mount() returned %d\n", ret);
+
+ if (ret == 0)
+ {
+ show_statfs(g_mntdir);
+ show_statfs(g_target);
+
+#ifdef CONFIG_EXAMPLES_MOUNT_DEVNAME
+ /* Read a test file that is already on the test file system image */
+
+ show_directories("", 0);
+ succeed_stat(g_testfile1);
+ show_statfs(g_testfile1);
+ read_test_file(g_testfile1);
+#else
+ /* Create the test directory that would have been on the canned filesystem */
+
+ succeed_mkdir(g_testdir1);
+ show_directories("", 0);
+ succeed_stat(g_testdir1);
+ show_statfs(g_testdir1);
+#endif
+
+ /* Write a test file into a pre-existing directory on the test file system */
+
+ fail_stat(g_testfile2, ENOENT);
+ write_test_file(g_testfile2);
+ show_directories("", 0);
+ succeed_stat(g_testfile2);
+ show_statfs(g_testfile2);
+
+ /* Read the file that we just wrote */
+
+ read_test_file(g_testfile2);
+
+ /* Try rmdir() against a file on the directory. It should fail with ENOTDIR */
+#ifdef CONFIG_EXAMPLES_MOUNT_DEVNAME
+ fail_rmdir(g_testfile1, ENOTDIR);
+#endif
+
+ /* Try rmdir() against the test directory. It should fail with ENOTEMPTY */
+
+ fail_rmdir(g_testdir1, ENOTEMPTY);
+
+ /* Try unlink() against the test directory. It should fail with EISDIR */
+
+ fail_unlink(g_testdir1, EISDIR);
+
+ /* Try unlink() against the test file1. It should succeed. */
+#ifdef CONFIG_EXAMPLES_MOUNT_DEVNAME
+ succeed_unlink(g_testfile1);
+ fail_stat(g_testfile1, ENOENT);
+ show_directories("", 0);
+#endif
+
+ /* Attempt to open testfile1 should fail with ENOENT */
+#ifdef CONFIG_EXAMPLES_MOUNT_DEVNAME
+ fail_read_open(g_testfile1, ENOENT);
+#endif
+ /* Try rmdir() against the test directory. It should still fail with ENOTEMPTY */
+
+ fail_rmdir(g_testdir1, ENOTEMPTY);
+
+ /* Try mkdir() against the test file2. It should fail with EEXIST. */
+
+ fail_mkdir(g_testfile2, EEXIST);
+
+ /* Try unlink() against the test file2. It should succeed. */
+
+ succeed_unlink(g_testfile2);
+ show_directories("", 0);
+ fail_stat(g_testfile2, ENOENT);
+
+ /* Try mkdir() against the test dir1. It should fail with EEXIST. */
+
+ fail_mkdir(g_testdir1, EEXIST);
+
+ /* Try rmdir() against the test directory. mkdir should now succeed. */
+
+ succeed_rmdir(g_testdir1);
+ show_directories("", 0);
+ fail_stat(g_testdir1, ENOENT);
+
+ /* Try mkdir() against the test dir2. It should succeed */
+
+ succeed_mkdir(g_testdir2);
+ show_directories("", 0);
+ succeed_stat(g_testdir2);
+ show_statfs(g_testdir2);
+
+ /* Try mkdir() against the test dir2. It should fail with EXIST */
+
+ fail_mkdir(g_testdir2, EEXIST);
+
+ /* Write a test file into a new directory on the test file system */
+
+ fail_stat(g_testfile3, ENOENT);
+ write_test_file(g_testfile3);
+ show_directories("", 0);
+ succeed_stat(g_testfile3);
+ show_statfs(g_testfile3);
+
+ /* Read the file that we just wrote */
+
+ read_test_file(g_testfile3);
+
+ /* Use mkdir() to create test dir3. It should succeed */
+
+ fail_stat(g_testdir3, ENOENT);
+ succeed_mkdir(g_testdir3);
+ show_directories("", 0);
+ succeed_stat(g_testdir3);
+ show_statfs(g_testdir3);
+
+ /* Try rename() on the root directory. Should fail with EXDEV*/
+
+ fail_rename(g_target, g_testdir4, EXDEV);
+
+ /* Try rename() to an existing directory. Should fail with EEXIST */
+
+ fail_rename(g_testdir2, g_testdir3, EEXIST);
+
+ /* Try rename() to a non-existing directory. Should succeed */
+
+ fail_stat(g_testdir4, ENOENT);
+ succeed_rename(g_testdir3, g_testdir4);
+ show_directories("", 0);
+ fail_stat(g_testdir3, ENOENT);
+ succeed_stat(g_testdir4);
+ show_statfs(g_testdir4);
+
+ /* Try rename() of file. Should work. */
+
+ fail_stat(g_testfile4, ENOENT);
+ succeed_rename(g_testfile3, g_testfile4);
+ show_directories("", 0);
+ fail_stat(g_testfile3, ENOENT);
+ succeed_stat(g_testfile4);
+ show_statfs(g_testfile4);
+
+ /* Make sure that we can still read the renamed file */
+
+ read_test_file(g_testfile4);
+
+ /* Unmount the file system */
+
+ printf("user_start: Try unmount(%s)\n", g_target);
+
+ ret = umount(g_target);
+ if (ret != 0)
+ {
+ printf("user_start: ERROR umount() failed, errno %d\n", errno);
+ g_nerrors++;
+ }
+
+ printf("user_start: %d errors reported\n", g_nerrors);
+ }
+
+ fflush(stdout);
+ return 0;
+}
diff --git a/apps/examples/mount/ramdisk.c b/apps/examples/mount/ramdisk.c
new file mode 100644
index 000000000..f596dae52
--- /dev/null
+++ b/apps/examples/mount/ramdisk.c
@@ -0,0 +1,141 @@
+/****************************************************************************
+ * examples/mount/ramdisk.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <nuttx/ramdisk.h>
+#include <nuttx/mkfatfs.h>
+
+#include "mount.h"
+
+#ifndef CONFIG_EXAMPLES_MOUNT_DEVNAME
+
+/****************************************************************************
+ * Private Definitions
+ ****************************************************************************/
+
+#define BUFFER_SIZE (CONFIG_EXAMPLES_MOUNT_NSECTORS*CONFIG_EXAMPLES_MOUNT_SECTORSIZE)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct fat_format_s g_fmt = FAT_FORMAT_INITIALIZER;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: create_ramdisk
+ *
+ * Description:
+ * Create a RAM disk of the specified size formatting with a FAT file
+ * system
+ *
+ * Input Parameters:
+ * None
+ *
+ * Return:
+ * Zero on success, a negated errno on failure.
+ *
+ ****************************************************************************/
+
+int create_ramdisk(void)
+{
+ char *pbuffer;
+ int ret;
+
+ /* Allocate a buffer to hold the file system image. */
+
+ pbuffer = (char*)malloc(BUFFER_SIZE);
+ if (!pbuffer)
+ {
+ printf("create_ramdisk: Failed to allocate ramdisk of size %d\n",
+ BUFFER_SIZE);
+ return -ENOMEM;
+ }
+
+ /* Register a RAMDISK device to manage this RAM image */
+
+ ret = ramdisk_register(CONFIG_EXAMPLES_MOUNT_RAMDEVNO,
+ pbuffer,
+ CONFIG_EXAMPLES_MOUNT_NSECTORS,
+ CONFIG_EXAMPLES_MOUNT_SECTORSIZE,
+ true);
+ if (ret < 0)
+ {
+ printf("create_ramdisk: Failed to register ramdisk at %s: %d\n",
+ g_source, -ret);
+ free(pbuffer);
+ return ret;
+ }
+
+ /* Create a FAT filesystem on the ramdisk */
+
+ ret = mkfatfs(g_source, &g_fmt);
+ if (ret < 0)
+ {
+ printf("create_ramdisk: Failed to create FAT filesystem on ramdisk at %s\n",
+ g_source);
+ /* free(pbuffer); -- RAM disk is registered */
+ return ret;
+ }
+
+ return 0;
+}
+#endif /* !CONFIG_EXAMPLES_MOUNT_DEVNAME */
diff --git a/apps/examples/nettest/Makefile b/apps/examples/nettest/Makefile
new file mode 100644
index 000000000..37d00914e
--- /dev/null
+++ b/apps/examples/nettest/Makefile
@@ -0,0 +1,121 @@
+############################################################################
+# examples/nettest/Makefile
+#
+# Copyright (C) 2007-2008, 2010-2010 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Basic TCP networking test
+
+TARG_ASRCS =
+TARG_AOBJS = $(TARG_ASRCS:.S=$(OBJEXT))
+
+TARG_CSRCS = nettest.c
+ifeq ($(CONFIG_EXAMPLE_NETTEST_SERVER),y)
+TARG_CSRCS += nettest_server.c
+else
+TARG_CSRCS += nettest_client.c
+endif
+
+TARG_COBJS = $(TARG_CSRCS:.c=$(OBJEXT))
+
+TARG_SRCS = $(TARG_ASRCS) $(TARG_CSRCS)
+TARG_OBJS = $(TARG_AOBJS) $(TARG_COBJS)
+
+TARG_BIN = ../../libapps$(LIBEXT)
+
+HOSTCFLAGS += -DCONFIG_EXAMPLE_NETTEST_HOST=1
+ifeq ($(CONFIG_EXAMPLE_NETTEST_SERVER),y)
+HOSTCFLAGS += -DCONFIG_EXAMPLE_NETTEST_SERVER=1 \
+ -DCONFIG_EXAMPLE_NETTEST_CLIENTIP="$(CONFIG_EXAMPLE_NETTEST_CLIENTIP)"
+endif
+
+HOST_SRCS = host.c
+ifeq ($(CONFIG_EXAMPLE_NETTEST_SERVER),y)
+HOST_SRCS += nettest_client.c
+else
+HOST_SRCS += nettest_server.c
+endif
+
+HOST_OBJS = $(HOST_SRCS:.c=.o)
+HOST_BIN = host
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(TARG_AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(TARG_COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(TARG_BIN): $(TARG_OBJS) $(HOST_BIN)
+ @( for obj in $(TARG_OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+
+$(HOST_OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(HOSTCC) -c $(HOSTCFLAGS) $< -o $@
+
+$(HOST_BIN): $(HOST_OBJS)
+ @echo "LD: $@"
+ @$(HOSTCC) $(HOSTLDFLAGS) $(HOST_OBJS) -o $@
+
+.built: $(TARG_BIN) $(HOST_BIN)
+ @touch .built
+
+.depend: Makefile $(TARG_SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(TARG_SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(TARG_BIN) $(HOST_BIN) .built *.o *~ .*.swp
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/nettest/host.c b/apps/examples/nettest/host.c
new file mode 100644
index 000000000..8b0bffd7d
--- /dev/null
+++ b/apps/examples/nettest/host.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * examples/nettest/host.c
+ *
+ * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 "nettest.h"
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * main
+ ****************************************************************************/
+
+int main(int argc, char **argv, char **envp)
+{
+#ifdef CONFIG_EXAMPLE_NETTEST_SERVER
+ send_client();
+#else
+ recv_server();
+#endif
+
+ return 0;
+}
diff --git a/apps/examples/nettest/nettest.c b/apps/examples/nettest/nettest.c
new file mode 100644
index 000000000..c7492fff6
--- /dev/null
+++ b/apps/examples/nettest/nettest.c
@@ -0,0 +1,122 @@
+/****************************************************************************
+ * examples/nettest/nettest.c
+ *
+ * Copyright (C) 2007, 2009-2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdint.h>
+#include <stdio.h>
+#include <debug.h>
+
+#include <net/if.h>
+#include <net/uip/uip.h>
+#include <apps/netutils/uiplib.h>
+
+#include "nettest.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does
+ * not support weak functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+#ifdef CONFIG_EXAMPLE_NETTEST_NOMAC
+ uint8_t mac[IFHWADDRLEN];
+#endif
+
+/* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_NETTEST_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_NETTEST_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_NETTEST_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_NETTEST_NETMASK);
+ uip_setnetmask("eth0", &addr);
+
+#ifdef CONFIG_EXAMPLE_NETTEST_SERVER
+ recv_server();
+#else
+ send_client();
+#endif
+
+ return 0;
+}
diff --git a/apps/examples/nettest/nettest.h b/apps/examples/nettest/nettest.h
new file mode 100644
index 000000000..b5b619175
--- /dev/null
+++ b/apps/examples/nettest/nettest.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * examples/nettest/nettest.h
+ *
+ * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_NETTEST_H
+#define __EXAMPLES_NETTEST_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLE_NETTEST_HOST
+#else
+# include <debug.h>
+#endif
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLE_NETTEST_HOST
+ /* HTONS/L macros are unique to uIP */
+
+# define HTONS(a) htons(a)
+# define HTONL(a) htonl(a)
+
+ /* Used printf for debug output */
+
+# ifdef CONFIG_CPP_HAVE_VARARGS
+# define message(...) printf(__VA_ARGS__)
+# else
+# define message printf
+# endif
+
+ /* Have SO_LINGER */
+
+# define NETTEST_HAVE_SOLINGER 1
+
+#else
+
+ /* Used lib_rawprintf() so that there is not confusion from buffered IO */
+
+# ifdef CONFIG_CPP_HAVE_VARARGS
+# define message(...) lib_rawprintf(__VA_ARGS__)
+# else
+# define message lib_rawprintf
+# endif
+
+ /* At present, uIP does only abortive disconnects */
+
+# undef NETTEST_HAVE_SOLINGER
+#endif
+
+#define PORTNO 5471
+#define SENDSIZE 4096
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+extern void send_client(void);
+extern void recv_server(void);
+
+#endif /* __EXAMPLES_NETTEST_H */
diff --git a/apps/examples/nettest/nettest_client.c b/apps/examples/nettest/nettest_client.c
new file mode 100644
index 000000000..b879f8438
--- /dev/null
+++ b/apps/examples/nettest/nettest_client.c
@@ -0,0 +1,204 @@
+/****************************************************************************
+ * examples/nettest/nettest-client.c
+ *
+ * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/socket.h>
+#include <netinet/in.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include "nettest.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void send_client(void)
+{
+ struct sockaddr_in myaddr;
+ char *outbuf;
+#ifndef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ char *inbuf;
+#endif
+ int sockfd;
+ int nbytessent;
+#ifndef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ int nbytesrecvd;
+ int totalbytesrecvd;
+#endif
+ int ch;
+ int i;
+
+ /* Allocate buffers */
+
+ outbuf = (char*)malloc(SENDSIZE);
+#ifndef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ inbuf = (char*)malloc(SENDSIZE);
+ if (!outbuf || !inbuf)
+#else
+ if (!outbuf)
+#endif
+ {
+ message("client: failed to allocate buffers\n");
+ exit(1);
+ }
+
+
+ /* Create a new TCP socket */
+
+ sockfd = socket(PF_INET, SOCK_STREAM, 0);
+ if (sockfd < 0)
+ {
+ message("client socket failure %d\n", errno);
+ goto errout_with_buffers;
+ }
+
+ /* Connect the socket to the server */
+
+ myaddr.sin_family = AF_INET;
+ myaddr.sin_port = HTONS(PORTNO);
+#if 0
+ myaddr.sin_addr.s_addr = HTONL(INADDR_LOOPBACK);
+#else
+ myaddr.sin_addr.s_addr = HTONL(CONFIG_EXAMPLE_NETTEST_CLIENTIP);
+#endif
+
+ message("client: Connecting...\n");
+ if (connect( sockfd, (struct sockaddr*)&myaddr, sizeof(struct sockaddr_in)) < 0)
+ {
+ message("client: connect failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+ message("client: Connected\n");
+
+ /* Initialize the buffer */
+
+ ch = 0x20;
+ for (i = 0; i < SENDSIZE; i++ )
+ {
+ outbuf[i] = ch;
+ if (++ch > 0x7e)
+ {
+ ch = 0x20;
+ }
+ }
+
+#ifdef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ /* Then receive messages forever */
+
+ for (;;)
+ {
+ nbytessent = send(sockfd, outbuf, 512, 0);
+ if (nbytessent < 0)
+ {
+ message("client: send failed: %d\n", errno);
+ goto errout_with_socket;
+ }
+ else if (nbytessent != 512)
+ {
+ message("client: Bad send length=%d: %d\n", nbytessent);
+ goto errout_with_socket;
+ }
+ }
+#else
+ /* Then send and receive one message */
+
+ message("client: Sending %d bytes\n", SENDSIZE);
+ nbytessent = send(sockfd, outbuf, SENDSIZE, 0);
+ message("client: Sent %d bytes\n", nbytessent);
+
+ if (nbytessent < 0)
+ {
+ message("client: send failed: %d\n", errno);
+ goto errout_with_socket;
+ }
+ else if (nbytessent != SENDSIZE)
+ {
+ message("client: Bad send length: %d Expected: %d\n", nbytessent, SENDSIZE);
+ goto errout_with_socket;
+ }
+
+ totalbytesrecvd = 0;
+ do
+ {
+ message("client: Receiving...\n");
+ nbytesrecvd = recv(sockfd, &inbuf[totalbytesrecvd], SENDSIZE - totalbytesrecvd, 0);
+
+ if (nbytesrecvd < 0)
+ {
+ message("client: recv failed: %d\n", errno);
+ goto errout_with_socket;
+ }
+ totalbytesrecvd += nbytesrecvd;
+ message("client: Received %d of %d bytes\n", totalbytesrecvd, SENDSIZE);
+ }
+ while (totalbytesrecvd < SENDSIZE);
+
+ if (totalbytesrecvd != SENDSIZE)
+ {
+ message("client: Bad recv length: %d Expected: %d\n", totalbytesrecvd, SENDSIZE);
+ goto errout_with_socket;
+ }
+ else if (memcmp(inbuf, outbuf, SENDSIZE) != 0)
+ {
+ message("client: Received buffer does not match sent buffer\n");
+ goto errout_with_socket;
+ }
+
+ close(sockfd);
+ free(outbuf);
+#ifndef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ free(inbuf);
+#endif
+ return;
+#endif
+
+errout_with_socket:
+ close(sockfd);
+
+errout_with_buffers:
+ free(outbuf);
+#ifndef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ free(inbuf);
+#endif
+ exit(1);
+}
diff --git a/apps/examples/nettest/nettest_server.c b/apps/examples/nettest/nettest_server.c
new file mode 100644
index 000000000..6d9ccaeba
--- /dev/null
+++ b/apps/examples/nettest/nettest_server.c
@@ -0,0 +1,234 @@
+/****************************************************************************
+ * examples/nettest/nettest-server.c
+ *
+ * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "nettest.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void recv_server(void)
+{
+ struct sockaddr_in myaddr;
+#ifdef NETTEST_HAVE_SOLINGER
+ struct linger ling;
+#endif
+ char *buffer;
+ int listensd;
+ int acceptsd;
+ socklen_t addrlen;
+ int nbytesread;
+#ifndef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ int totalbytesread;
+ int nbytessent;
+ int ch;
+ int i;
+#endif
+ int optval;
+
+ /* Allocate a BIG buffer */
+
+ buffer = (char*)malloc(2*SENDSIZE);
+ if (!buffer)
+ {
+ message("server: failed to allocate buffer\n");
+ exit(1);
+ }
+
+
+ /* Create a new TCP socket */
+
+ listensd = socket(PF_INET, SOCK_STREAM, 0);
+ if (listensd < 0)
+ {
+ message("server: socket failure: %d\n", errno);
+ goto errout_with_buffer;
+ }
+
+ /* Set socket to reuse address */
+
+ optval = 1;
+ if (setsockopt(listensd, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, sizeof(int)) < 0)
+ {
+ message("server: setsockopt SO_REUSEADDR failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ /* Bind the socket to a local address */
+
+ myaddr.sin_family = AF_INET;
+ myaddr.sin_port = HTONS(PORTNO);
+ myaddr.sin_addr.s_addr = INADDR_ANY;
+
+ if (bind(listensd, (struct sockaddr*)&myaddr, sizeof(struct sockaddr_in)) < 0)
+ {
+ message("server: bind failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ /* Listen for connections on the bound TCP socket */
+
+ if (listen(listensd, 5) < 0)
+ {
+ message("server: listen failure %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ /* Accept only one connection */
+
+ message("server: Accepting connections on port %d\n", PORTNO);
+ addrlen = sizeof(struct sockaddr_in);
+ acceptsd = accept(listensd, (struct sockaddr*)&myaddr, &addrlen);
+ if (acceptsd < 0)
+ {
+ message("server: accept failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+ message("server: Connection accepted -- receiving\n");
+
+ /* Configure to "linger" until all data is sent when the socket is closed */
+
+#ifdef NETTEST_HAVE_SOLINGER
+ ling.l_onoff = 1;
+ ling.l_linger = 30; /* timeout is seconds */
+ if (setsockopt(acceptsd, SOL_SOCKET, SO_LINGER, &ling, sizeof(struct linger)) < 0)
+ {
+ message("server: setsockopt SO_LINGER failure: %d\n", errno);
+ goto errout_with_acceptsd;
+ }
+#endif
+
+#ifdef CONFIG_EXAMPLE_NETTEST_PERFORMANCE
+ /* Then receive data forever */
+
+ for (;;)
+ {
+ nbytesread = recv(acceptsd, buffer, 2*SENDSIZE, 0);
+ if (nbytesread <= 0)
+ {
+ message("server: recv failed: %d\n", errno);
+ goto errout_with_acceptsd;
+ }
+ }
+#else
+ /* Receive canned message */
+
+ totalbytesread = 0;
+ while (totalbytesread < SENDSIZE)
+ {
+ message("server: Reading...\n");
+ nbytesread = recv(acceptsd, &buffer[totalbytesread], 2*SENDSIZE - totalbytesread, 0);
+ if (nbytesread <= 0)
+ {
+ message("server: recv failed: %d\n", errno);
+ goto errout_with_acceptsd;
+ }
+
+ totalbytesread += nbytesread;
+ message("server: Received %d of %d bytes\n", totalbytesread, SENDSIZE);
+ }
+
+ /* Verify the message */
+
+ if (totalbytesread != SENDSIZE)
+ {
+ message("server: Received %d / Expected %d bytes\n", totalbytesread, SENDSIZE);
+ goto errout_with_acceptsd;
+ }
+
+ ch = 0x20;
+ for (i = 0; i < SENDSIZE; i++ )
+ {
+ if (buffer[i] != ch)
+ {
+ message("server: Byte %d is %02x / Expected %02x\n", i, buffer[i], ch);
+ goto errout_with_acceptsd;
+ }
+
+ if (++ch > 0x7e)
+ {
+ ch = 0x20;
+ }
+ }
+
+ /* Then send the same data back to the client */
+
+ message("server: Sending %d bytes\n", totalbytesread);
+ nbytessent = send(acceptsd, buffer, totalbytesread, 0);
+ if (nbytessent <= 0)
+ {
+ message("server: send failed: %d\n", errno);
+ goto errout_with_acceptsd;
+ }
+ message("server: Sent %d bytes\n", nbytessent);
+
+ /* If this platform only does abortive disconnects, then wait a bit to get the
+ * client side a change to receive the data.
+ */
+
+#if 1 /* Do it for all platforms */
+ message("server: Wait before closing\n");
+ sleep(60);
+#endif
+
+ close(listensd);
+ close(acceptsd);
+ free(buffer);
+ return;
+#endif
+
+errout_with_acceptsd:
+ close(acceptsd);
+
+errout_with_listensd:
+ close(listensd);
+
+errout_with_buffer:
+ free(buffer);
+ exit(1);
+}
diff --git a/apps/examples/nsh/Makefile b/apps/examples/nsh/Makefile
new file mode 100644
index 000000000..92fd8e157
--- /dev/null
+++ b/apps/examples/nsh/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/examples/nsh/Makefile
+#
+# Copyright (C) 2007-2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# NuttShell (NSH) Example
+
+ASRCS =
+CSRCS = nsh_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/nsh/nsh_main.c b/apps/examples/nsh/nsh_main.c
new file mode 100644
index 000000000..6f63308b4
--- /dev/null
+++ b/apps/examples/nsh/nsh_main.c
@@ -0,0 +1,157 @@
+/****************************************************************************
+ * examples/nsh/nsh_main.c
+ *
+ * Copyright (C) 2007-2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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/stat.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <sched.h>
+#include <errno.h>
+
+#include <apps/nsh.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_BUILTIN_APPS
+# warning "This example requires CONFIG_BUILTIN_APPS..."
+# warning " You must have an appconfig file in your config directory to use this example"
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+/* In order to support user_initialize if CONFIG_PAGING is defined, this
+ * function (and only this function) would need to get moved to the locked
+ * text region.
+ */
+
+#ifndef CONFIG_PAGING
+void user_initialize(void)
+{
+ /* stub */
+}
+#endif
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ int mid_priority;
+#if defined(CONFIG_NSH_CONSOLE) && defined(CONFIG_NSH_TELNET)
+ int ret;
+#endif
+
+ /* Initialize the NSH library */
+
+ nsh_initialize();
+
+ /* Set the priority of this task to something in the middle so that 'nice'
+ * can both raise and lower the priority.
+ */
+
+ mid_priority = (sched_get_priority_max(SCHED_NSH) + sched_get_priority_min(SCHED_NSH)) >> 1;
+ {
+ struct sched_param param;
+
+ param.sched_priority = mid_priority;
+ (void)sched_setscheduler(0, SCHED_NSH, &param);
+ }
+
+ /* If both the console and telnet are selected as front-ends, then run
+ * the telnet front end on another thread.
+ */
+
+#if defined(CONFIG_NSH_CONSOLE) && defined(CONFIG_NSH_TELNET)
+# ifndef CONFIG_CUSTOM_STACK
+ ret = task_create("nsh_telnetmain", mid_priority, CONFIG_NSH_STACKSIZE,
+ nsh_telnetmain, NULL);
+# else
+ ret = task_create("nsh_telnetmain", mid_priority, nsh_telnetmain, NULL);
+# endif
+ if (ret < 0)
+ {
+ /* The daemon is NOT running. Report the the error then fail...
+ * either with the serial console up or just exiting.
+ */
+
+ fprintf(stderr, "ERROR: Failed to start TELNET daemon: %d\n", errno);
+ }
+
+ /* If only the telnet front-end is selected, run it on this thread */
+
+#elif defined(CONFIG_NSH_TELNET)
+ return nsh_telnetmain(0, NULL);
+#endif
+
+/* If the serial console front end is selected, then run it on this thread */
+
+#ifdef CONFIG_NSH_CONSOLE
+ return nsh_consolemain(0, NULL);
+#endif
+}
diff --git a/apps/examples/null/Makefile b/apps/examples/null/Makefile
new file mode 100644
index 000000000..2b4171e7f
--- /dev/null
+++ b/apps/examples/null/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# examples/null/Makefile
+#
+# Copyright (C) 2007-2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# The smallest thing you can build -- the NULL example.
+
+ASRCS =
+CSRCS = null_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/null/null_main.c b/apps/examples/null/null_main.c
new file mode 100644
index 000000000..fa0a1473d
--- /dev/null
+++ b/apps/examples/null/null_main.c
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * examples/null/null_main.c
+ *
+ * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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
+ ****************************************************************************/
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ return 0;
+}
diff --git a/apps/examples/nx/Makefile b/apps/examples/nx/Makefile
new file mode 100644
index 000000000..bfb0d473e
--- /dev/null
+++ b/apps/examples/nx/Makefile
@@ -0,0 +1,93 @@
+############################################################################
+# apps/examples/nxflat/Makefile
+#
+# Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# NuttX NX Graphics Example.
+
+ASRCS =
+CSRCS = nx_main.c nx_events.c nx_kbdin.c
+ifeq ($(CONFIG_NX_MULTIUSER),y)
+CSRCS += nx_server.c
+endif
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/nx/nx_events.c b/apps/examples/nx/nx_events.c
new file mode 100644
index 000000000..d1074b419
--- /dev/null
+++ b/apps/examples/nx/nx_events.c
@@ -0,0 +1,337 @@
+/****************************************************************************
+ * examples/nx/nx_events.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdint.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <semaphore.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/nx.h>
+#include <nuttx/nxtk.h>
+#include "nx_internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static void nxeg_redraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
+ bool morem, FAR void *arg);
+static void nxeg_position(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
+ FAR const struct nxgl_point_s *pos,
+ FAR const struct nxgl_rect_s *bounds,
+ FAR void *arg);
+#ifdef CONFIG_NX_MOUSE
+static void nxeg_mousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
+ uint8_t buttons, FAR void *arg);
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static void nxeg_tbredraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
+ bool morem, FAR void *arg);
+static void nxeg_tbposition(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
+ FAR const struct nxgl_point_s *pos,
+ FAR const struct nxgl_rect_s *bounds,
+ FAR void *arg);
+#ifdef CONFIG_NX_MOUSE
+static void nxeg_tbmousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
+ uint8_t buttons, FAR void *arg);
+#endif
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+const struct nx_callback_s g_nxcb =
+{
+ nxeg_redraw, /* redraw */
+ nxeg_position /* position */
+#ifdef CONFIG_NX_MOUSE
+ , nxeg_mousein /* mousein */
+#endif
+#ifdef CONFIG_NX_KBD
+ , nxeg_kbdin /* my kbdin */
+#endif
+};
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+const struct nx_callback_s g_tbcb =
+{
+ nxeg_tbredraw, /* redraw */
+ nxeg_tbposition /* position */
+#ifdef CONFIG_NX_MOUSE
+ , nxeg_tbmousein /* mousein */
+#endif
+#ifdef CONFIG_NX_KBD
+ , nxeg_tbkbdin /* my kbdin */
+#endif
+};
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxeg_fillwindow
+ ****************************************************************************/
+
+static inline void nxeg_fillwindow(NXEGWINDOW hwnd,
+ FAR const struct nxgl_rect_s *rect,
+ FAR struct nxeg_state_s *st)
+{
+ int ret;
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+ ret = nx_fill(hwnd, rect, st->color);
+ if (ret < 0)
+ {
+ message("nxeg_fillwindow: nx_fill failed: %d\n", errno);
+ }
+#else
+ ret = nxtk_fillwindow(hwnd, rect, st->color);
+ if (ret < 0)
+ {
+ message("nxeg_fillwindow: nxtk_fillwindow failed: %d\n", errno);
+ }
+#endif
+#ifdef CONFIG_NX_KBD
+ nxeg_filltext(hwnd, rect, st);
+#endif
+}
+
+/****************************************************************************
+ * Name: nxeg_fillwindow
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline void nxeg_filltoolbar(NXTKWINDOW htb,
+ FAR const struct nxgl_rect_s *rect,
+ nxgl_mxpixel_t color[CONFIG_NX_NPLANES])
+{
+ int ret;
+
+ ret = nxtk_filltoolbar(htb, rect, color);
+ if (ret < 0)
+ {
+ message("nxeg_filltoolbar: nxtk_filltoolbar failed: %d\n", errno);
+ }
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_redraw
+ ****************************************************************************/
+
+static void nxeg_redraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
+ bool more, FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+ message("nxeg_redraw%d: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n",
+ st->wnum, hwnd,
+ rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y,
+ more ? "true" : "false");
+
+ nxeg_fillwindow(hwnd, rect, st);
+}
+
+/****************************************************************************
+ * Name: nxeg_position
+ ****************************************************************************/
+
+static void nxeg_position(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
+ FAR const struct nxgl_point_s *pos,
+ FAR const struct nxgl_rect_s *bounds,
+ FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+
+ /* Report the position */
+
+ message("nxeg_position%d: hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n",
+ st->wnum, hwnd, size->w, size->h, pos->x, pos->y,
+ bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y);
+
+ /* Have we picked off the window bounds yet? */
+
+ if (!b_haveresolution)
+ {
+ /* Save the window limits (these should be the same for all places and all windows */
+
+ g_xres = bounds->pt2.x;
+ g_yres = bounds->pt2.y;
+
+ b_haveresolution = true;
+ sem_post(&g_semevent);
+ message("nxeg_position2: Have xres=%d yres=%d\n", g_xres, g_yres);
+ }
+}
+
+/****************************************************************************
+ * Name: nxeg_mousein
+ ****************************************************************************/
+
+#ifdef CONFIG_NX_MOUSE
+static void nxeg_mousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
+ uint8_t buttons, FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+ message("nxeg_mousein%d: hwnd=%p pos=(%d,%d) button=%02x\n",
+ st->wnum, hwnd, pos->x, pos->y, buttons);
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_tbredraw
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static void nxeg_tbredraw(NXEGWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
+ bool more, FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+ message("nxeg_tbredraw%d: hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n",
+ st->wnum, hwnd,
+ rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y,
+ more ? "true" : "false");
+ nxeg_filltoolbar(hwnd, rect, g_tbcolor);
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_position
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static void nxeg_tbposition(NXEGWINDOW hwnd, FAR const struct nxgl_size_s *size,
+ FAR const struct nxgl_point_s *pos,
+ FAR const struct nxgl_rect_s *bounds,
+ FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+
+ /* Report the position */
+
+ message("nxeg_ptbosition%d: hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n",
+ st->wnum, hwnd, size->w, size->h, pos->x, pos->y,
+ bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y);
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_tbmousein
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+#ifdef CONFIG_NX_MOUSE
+static void nxeg_tbmousein(NXEGWINDOW hwnd, FAR const struct nxgl_point_s *pos,
+ uint8_t buttons, FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+
+ message("nxeg_tbmousein%d: hwnd=%p pos=(%d,%d) button=%02x\n",
+ st->wnum, hwnd, pos->x, pos->y, buttons);
+}
+#endif
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nx_listenerthread
+ ****************************************************************************/
+
+#ifdef CONFIG_NX_MULTIUSER
+FAR void *nx_listenerthread(FAR void *arg)
+{
+ int ret;
+
+ /* Process events forever */
+
+ for (;;)
+ {
+ /* Handle the next event. If we were configured blocking, then
+ * we will stay right here until the next event is received. Since
+ * we have dedicated a while thread to servicing events, it would
+ * be most natural to also select CONFIG_NX_BLOCKING -- if not, the
+ * following would be a tight infinite loop (unless we added addition
+ * logic with nx_eventnotify and sigwait to pace it).
+ */
+
+ ret = nx_eventhandler(g_hnx);
+ if (ret < 0)
+ {
+ /* An error occurred... assume that we have lost connection with
+ * the server.
+ */
+
+ message("nx_listenerthread: Lost server connection: %d\n", errno);
+ exit(NXEXIT_LOSTSERVERCONN);
+ }
+
+ /* If we received a message, we must be connected */
+
+ if (!g_connected)
+ {
+ g_connected = true;
+ sem_post(&g_semevent);
+ message("nx_listenerthread: Connected\n");
+ }
+ }
+}
+#endif
diff --git a/apps/examples/nx/nx_internal.h b/apps/examples/nx/nx_internal.h
new file mode 100644
index 000000000..3af7329a4
--- /dev/null
+++ b/apps/examples/nx/nx_internal.h
@@ -0,0 +1,306 @@
+/****************************************************************************
+ * examples/nx/nx_internal.h
+ *
+ * Copyright (C) 2008-2010 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_NX_NX_INTERNAL_H
+#define __EXAMPLES_NX_NX_INTERNAL_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <semaphore.h>
+#include <nuttx/nx.h>
+#include <nuttx/nxtk.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Configuration ************************************************************/
+
+#ifndef CONFIG_NX
+# error "NX is not enabled (CONFIG_NX)"
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_VPLANE
+# define CONFIG_EXAMPLES_NX_VPLANE 0
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_BPP
+# define CONFIG_EXAMPLES_NX_BPP 32
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_BGCOLOR
+# if CONFIG_EXAMPLES_NX_BPP == 24 || CONFIG_EXAMPLES_NX_BPP == 32
+# define CONFIG_EXAMPLES_NX_BGCOLOR 0x007b68ee
+# elif CONFIG_EXAMPLES_NX_BPP == 16
+# define CONFIG_EXAMPLES_NX_BGCOLOR 0x7b5d
+# else
+# define CONFIG_EXAMPLES_NX_BGCOLOR ' '
+# endif
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_COLOR1
+# if CONFIG_EXAMPLES_NX_BPP == 24 || CONFIG_EXAMPLES_NX_BPP == 32
+# define CONFIG_EXAMPLES_NX_COLOR1 0x00e6e6fa
+# elif CONFIG_EXAMPLES_NX_BPP == 16
+# define CONFIG_EXAMPLES_NX_COLOR1 0xe73f
+# else
+# define CONFIG_EXAMPLES_NX_COLOR1 '1'
+# endif
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_COLOR2
+# if CONFIG_EXAMPLES_NX_BPP == 24 || CONFIG_EXAMPLES_NX_BPP == 32
+# define CONFIG_EXAMPLES_NX_COLOR2 0x00dcdcdc
+# elif CONFIG_EXAMPLES_NX_BPP == 16
+# define CONFIG_EXAMPLES_NX_COLOR2 0xdefb
+# else
+# define CONFIG_EXAMPLES_NX_COLOR2 '2'
+# endif
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_TBCOLOR
+# if CONFIG_EXAMPLES_NX_BPP == 24 || CONFIG_EXAMPLES_NX_BPP == 32
+# define CONFIG_EXAMPLES_NX_TBCOLOR 0x00a9a9a9
+# elif CONFIG_EXAMPLES_NX_BPP == 16
+# define CONFIG_EXAMPLES_NX_TBCOLOR 0xad55
+# else
+# define CONFIG_EXAMPLES_NX_TBCOLOR 'T'
+# endif
+#endif
+
+#ifndef CONFIG_EXAMPLES_NX_FONTCOLOR
+# if CONFIG_EXAMPLES_NX_BPP == 24 || CONFIG_EXAMPLES_NX_BPP == 32
+# define CONFIG_EXAMPLES_NX_FONTCOLOR 0x00000000
+# elif CONFIG_EXAMPLES_NX_BPP == 16
+# define CONFIG_EXAMPLES_NX_FONTCOLOR 0x0000
+# else
+# define CONFIG_EXAMPLES_NX_FONTCOLOR 'F'
+# endif
+#endif
+
+#ifndef CONFIG_TOOLBAR_HEIGHT
+# define CONFIG_TOOLBAR_HEIGHT 16
+#endif
+
+#ifdef CONFIG_NX_MULTIUSER
+# ifdef CONFIG_DISABLE_MQUEUE
+# error "The multi-threaded example requires MQ support (CONFIG_DISABLE_MQUEUE=n)"
+# endif
+# ifdef CONFIG_DISABLE_SIGNALS
+# error "This example requires signal support (CONFIG_DISABLE_SIGNALS=n)"
+# endif
+# ifdef CONFIG_DISABLE_PTHREAD
+# error "This example requires pthread support (CONFIG_DISABLE_PTHREAD=n)"
+# endif
+# ifndef CONFIG_NX_BLOCKING
+# error "This example depends on CONFIG_NX_BLOCKING"
+# endif
+# ifndef CONFIG_EXAMPLES_NX_STACKSIZE
+# define CONFIG_EXAMPLES_NX_STACKSIZE 2048
+# endif
+# ifndef CONFIG_EXAMPLES_NX_LISTENERPRIO
+# define CONFIG_EXAMPLES_NX_LISTENERPRIO 100
+# endif
+# ifndef CONFIG_EXAMPLES_NX_CLIENTPRIO
+# define CONFIG_EXAMPLES_NX_CLIENTPRIO 100
+# endif
+# ifndef CONFIG_EXAMPLES_NX_SERVERPRIO
+# define CONFIG_EXAMPLES_NX_SERVERPRIO 120
+# endif
+# ifndef CONFIG_EXAMPLES_NX_NOTIFYSIGNO
+# define CONFIG_EXAMPLES_NX_NOTIFYSIGNO 4
+# endif
+#endif
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+# define NXEGWINDOW NXWINDOW
+#else
+# define NXEGWINDOW NXTKWINDOW
+#endif
+
+#define NXTK_MAXKBDCHARS 16
+
+/* Debug ********************************************************************/
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(...) lib_lowprintf(__VA_ARGS__)
+# define msgflush()
+# else
+# define message(...) printf(__VA_ARGS__)
+# define msgflush() fflush(stdout)
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message lib_lowprintf
+# define msgflush()
+# else
+# define message printf
+# define msgflush() fflush(stdout)
+# endif
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+enum exitcode_e
+{
+ NXEXIT_SUCCESS = 0,
+ NXEXIT_SIGPROCMASK,
+ NXEXIT_SCHEDSETPARAM,
+ NXEXIT_EVENTNOTIFY,
+ NXEXIT_TASKCREATE,
+ NXEXIT_PTHREADCREATE,
+ NXEXIT_EXTINITIALIZE,
+ NXEXIT_FBINITIALIZE,
+ NXEXIT_FBGETVPLANE,
+ NXEXIT_LCDINITIALIZE,
+ NXEXIT_LCDGETDEV,
+ NXEXIT_NXOPEN,
+ NXEXIT_NXOPENTOOLBAR,
+ NXEXIT_NXCONNECT,
+ NXEXIT_NXSETBGCOLOR,
+ NXEXIT_NXOPENWINDOW,
+ NXEXIT_NXSETSIZE,
+ NXEXIT_NXSETPOSITION,
+ NXEXIT_NXLOWER,
+ NXEXIT_NXRAISE,
+ NXEXIT_NXCLOSEWINDOW,
+ NXEXIT_LOSTSERVERCONN
+};
+
+/* Describes one cached glyph bitmap */
+
+struct nxeg_glyph_s
+{
+ uint8_t code; /* Character code */
+ uint8_t height; /* Height of this glyph (in rows) */
+ uint8_t width; /* Width of this glyph (in pixels) */
+ uint8_t stride; /* Width of the glyph row (in bytes) */
+ FAR uint8_t *bitmap; /* Allocated bitmap memory */
+};
+
+/* Describes on character on the display */
+
+struct nxeg_bitmap_s
+{
+ struct nxgl_rect_s bounds; /* Size/position of bitmap */
+ FAR const struct nxeg_glyph_s *glyph; /* The cached glyph */
+};
+
+/* Describes the overall state of on one window */
+
+struct nxeg_state_s
+{
+ uint8_t wnum; /* Window number */
+ nxgl_mxpixel_t color[CONFIG_NX_NPLANES]; /* Window color */
+
+#ifdef CONFIG_NX_KBD
+ uint8_t height; /* Max height of a font in pixels */
+ uint8_t width; /* Max width of a font in pixels */
+ uint8_t spwidth; /* The width of a space */
+
+ uint8_t nchars; /* Number of KBD chars received */
+ uint8_t nglyphs; /* Number of glyphs cached */
+
+ struct nxeg_bitmap_s bm[NXTK_MAXKBDCHARS];
+ struct nxeg_glyph_s glyph[NXTK_MAXKBDCHARS];
+#endif
+};
+
+/****************************************************************************
+ * Public Variables
+ ****************************************************************************/
+
+/* The connecton handler */
+
+extern NXHANDLE g_hnx;
+
+/* NX callback vtables */
+
+extern const struct nx_callback_s g_nxcb;
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+extern const struct nx_callback_s g_tbcb;
+#endif
+
+/* The screen resolution */
+
+nxgl_coord_t g_xres;
+nxgl_coord_t g_yres;
+
+extern bool b_haveresolution;
+#ifdef CONFIG_NX_MULTIUSER
+extern bool g_connected;
+#endif
+extern sem_t g_semevent;
+
+/* Colors used to fill window 1 & 2 */
+
+extern nxgl_mxpixel_t g_color1[CONFIG_NX_NPLANES];
+extern nxgl_mxpixel_t g_color2[CONFIG_NX_NPLANES];
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+extern nxgl_mxpixel_t g_tbcolor[CONFIG_NX_NPLANES];
+#endif
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_NX_EXTERNINIT
+extern FAR NX_DRIVERTYPE *up_nxdrvinit(unsigned int devno);
+#endif
+
+#if defined(CONFIG_NX) && defined(CONFIG_NX_MULTIUSER)
+extern int nx_servertask(int argc, char *argv[]);
+extern FAR void *nx_listenerthread(FAR void *arg);
+#endif
+
+#ifdef CONFIG_NX_KBD
+extern void nxeg_kbdin(NXWINDOW hwnd, uint8_t nch, const uint8_t *ch, FAR void *arg);
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+extern void nxeg_tbkbdin(NXWINDOW hwnd, uint8_t nch, const uint8_t *ch, FAR void *arg);
+#endif
+extern void nxeg_filltext(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
+ FAR struct nxeg_state_s *st);
+#endif
+
+#endif /* __EXAMPLES_NX_NX_INTERNAL_H */
diff --git a/apps/examples/nx/nx_kbdin.c b/apps/examples/nx/nx_kbdin.c
new file mode 100644
index 000000000..3626eded9
--- /dev/null
+++ b/apps/examples/nx/nx_kbdin.c
@@ -0,0 +1,467 @@
+/****************************************************************************
+ * examples/nx/nx_kbdin.c
+ *
+ * Copyright (C) 2008, 2010 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/nx.h>
+#include <nuttx/nxtk.h>
+#include <nuttx/nxfonts.h>
+
+#include "nx_internal.h"
+
+#ifdef CONFIG_NX_KBD
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Select renderer -- Some additional logic would be required to support
+ * pixel depths that are not directly addressable (1,2,4, and 24).
+ */
+
+#if CONFIG_EXAMPLES_NX_BPP == 1
+# define RENDERER nxf_convert_1bpp
+#elif CONFIG_EXAMPLES_NX_BPP == 2
+# define RENDERER nxf_convert_2bpp
+#elif CONFIG_EXAMPLES_NX_BPP == 4
+# define RENDERER nxf_convert_4bpp
+#elif CONFIG_EXAMPLES_NX_BPP == 8
+# define RENDERER nxf_convert_8bpp
+#elif CONFIG_EXAMPLES_NX_BPP == 16
+# define RENDERER nxf_convert_16bpp
+#elif CONFIG_EXAMPLES_NX_BPP == 24
+# define RENDERER nxf_convert_24bpp
+#elif CONFIG_EXAMPLES_NX_BPP == 32
+# define RENDERER nxf_convert_32bpp
+#else
+# error "Unsupported CONFIG_EXAMPLES_NX_BPP"
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxeg_fillchar
+ ****************************************************************************/
+
+static void nxeg_fillchar(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
+ FAR const struct nxeg_bitmap_s *bm)
+{
+ FAR void *src = (FAR void *)bm->glyph->bitmap;
+ struct nxgl_rect_s intersection;
+ int ret;
+
+ /* Handle the special case of spaces which have no glyph bitmap */
+
+ if (src)
+ {
+ /* Get the intersection of the redraw region and the characer bitmap */
+
+ nxgl_rectintersect(&intersection, rect, &bm->bounds);
+ if (!nxgl_nullrect(&intersection))
+ {
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+ ret = nxtk_bitmapwindow((NXTKWINDOW)hwnd, &intersection, &src,
+ &bm->bounds.pt1,
+ (unsigned int)bm->glyph->stride);
+ if (ret < 0)
+ {
+ message("nxeg_fillchar: nxtk_bitmapwindow failed: %d\n", errno);
+ }
+#else
+ ret = nx_bitmap((NXWINDOW)hwnd, &intersection, &src,
+ &bm->bounds.pt1,
+ (unsigned int)bm->glyph->stride);
+ if (ret < 0)
+ {
+ message("nxeg_fillchar: nx_bitmapwindow failed: %d\n", errno);
+ }
+#endif
+ }
+ }
+}
+
+/****************************************************************************
+ * Name: nxeg_renderglyph
+ ****************************************************************************/
+
+static inline FAR const struct nxeg_glyph_s *
+nxeg_renderglyph(FAR struct nxeg_state_s *st,
+ FAR const struct nx_fontbitmap_s *bm, uint8_t ch)
+{
+ FAR struct nxeg_glyph_s *glyph = NULL;
+ FAR nxgl_mxpixel_t *ptr;
+#if CONFIG_EXAMPLES_NX_BPP < 8
+ nxgl_mxpixel_t pixel;
+#endif
+ int bmsize;
+ int row;
+ int col;
+ int ret;
+
+ /* Make sure that there is room for another glyph */
+
+ message("nxeg_renderglyph: ch=%02x\n", ch);
+ if (st->nglyphs < NXTK_MAXKBDCHARS)
+ {
+ /* Allocate the glyph */
+
+ glyph = &st->glyph[st->nglyphs];
+ glyph->code = ch;
+
+ /* Get the dimensions of the glyph */
+
+ glyph->width = bm->metric.width + bm->metric.xoffset;
+ glyph->height = bm->metric.height + bm->metric.yoffset;
+
+ /* Allocate memory to hold the glyph with its offsets */
+
+ glyph->stride = (glyph->width * CONFIG_EXAMPLES_NX_BPP + 7) / 8;
+ bmsize = glyph->stride * glyph->height;
+ glyph->bitmap = (FAR uint8_t *)malloc(bmsize);
+
+ if (glyph->bitmap)
+ {
+ /* Initialize the glyph memory to the background color */
+
+#if CONFIG_EXAMPLES_NX_BPP < 8
+ pixel = st->color[0];
+# if CONFIG_EXAMPLES_NX_BPP == 1
+ /* Pack 1-bit pixels into a 2-bits */
+
+ pixel &= 0x01;
+ pixel = (pixel) << 1 |pixel;
+# endif
+# if CONFIG_EXAMPLES_NX_BPP < 4
+ /* Pack 2-bit pixels into a nibble */
+
+ pixel &= 0x03;
+ pixel = (pixel) << 2 |pixel;
+# endif
+
+ /* Pack 4-bit nibbles into a byte */
+
+ pixel &= 0x0f;
+ pixel = (pixel) << 4 | pixel;
+
+ ptr = (FAR nxgl_mxpixel_t *)glyph->bitmap;
+ for (row = 0; row < glyph->height; row++)
+ {
+ for (col = 0; col < glyph->stride; col++)
+ {
+ /* Transfer the packed bytes into the buffer */
+
+ *ptr++ = pixel;
+ }
+ }
+
+#elif CONFIG_EXAMPLES_NX_BPP == 24
+# error "Additional logic is needed here for 24bpp support"
+
+#else /* CONFIG_EXAMPLES_NX_BPP = {8,16,32} */
+
+ ptr = (FAR nxgl_mxpixel_t *)glyph->bitmap;
+ for (row = 0; row < glyph->height; row++)
+ {
+ /* Just copy the color value into the glyph memory */
+
+ for (col = 0; col < glyph->width; col++)
+ {
+ *ptr++ = st->color[0];
+ }
+ }
+#endif
+
+ /* Then render the glyph into the allocated memory */
+
+ ret = RENDERER((FAR nxgl_mxpixel_t*)glyph->bitmap,
+ glyph->height, glyph->width, glyph->stride,
+ bm, CONFIG_EXAMPLES_NX_FONTCOLOR);
+ if (ret < 0)
+ {
+ /* Actually, the RENDERER never returns a failure */
+
+ message("nxeg_renderglyph: RENDERER failed\n");
+ free(glyph->bitmap);
+ glyph->bitmap = NULL;
+ glyph = NULL;
+ }
+ else
+ {
+ /* Make it permanent */
+
+ st->nglyphs++;
+ }
+ }
+ }
+
+ return glyph;
+}
+
+/****************************************************************************
+ * Name: nxeg_addspace
+ ****************************************************************************/
+
+static inline FAR const struct nxeg_glyph_s *
+nxeg_addspace(FAR struct nxeg_state_s *st, uint8_t ch)
+{
+ FAR struct nxeg_glyph_s *glyph = NULL;
+
+ /* Make sure that there is room for another glyph */
+
+ if (st->nglyphs < NXTK_MAXKBDCHARS)
+ {
+ /* Allocate the NULL glyph */
+
+ glyph = &st->glyph[st->nglyphs];
+ memset(glyph, 0, sizeof(struct nxeg_glyph_s));
+
+ glyph->code = ' ';
+ glyph->width = st->spwidth;
+
+ st->nglyphs++;
+ }
+ return glyph;
+}
+
+/****************************************************************************
+ * Name: nxeg_findglyph
+ ****************************************************************************/
+
+static FAR const struct nxeg_glyph_s *
+nxeg_findglyph(FAR struct nxeg_state_s *st, uint8_t ch)
+{
+ int i;
+
+ /* First, try to find the glyph in the cache of pre-rendered glyphs */
+
+ for (i = 0; i < st->nglyphs; i++)
+ {
+ if (st->glyph[i].code == ch)
+ {
+ return &st->glyph[i];
+ }
+ }
+ return NULL;
+}
+
+/****************************************************************************
+ * Name: nxeg_getglyph
+ ****************************************************************************/
+
+static FAR const struct nxeg_glyph_s *
+nxeg_getglyph(FAR struct nxeg_state_s *st, uint8_t ch)
+{
+ FAR const struct nxeg_glyph_s *glyph;
+ FAR const struct nx_fontbitmap_s *bm;
+
+ /* First, try to find the glyph in the cache of pre-rendered glyphs */
+
+ glyph = nxeg_findglyph(st, ch);
+ if (!glyph)
+ {
+ /* No, it is not cached... Does the code map to a glyph? */
+
+ bm = nxf_getbitmap(ch);
+ if (!bm)
+ {
+ /* No, there is no glyph for this code. Use space */
+
+ glyph = nxeg_findglyph(st, ' ');
+ if (!glyph)
+ {
+ /* There isn't fake glyph for ' ' yet... create one */
+
+ glyph = nxeg_addspace(st, ' ');
+ }
+ }
+ else
+ {
+ glyph = nxeg_renderglyph(st, bm, ch);
+ }
+ }
+ return glyph;
+}
+
+/****************************************************************************
+ * Name: nxeg_addchar
+ ****************************************************************************/
+
+static FAR const struct nxeg_bitmap_s *
+nxeg_addchar(FAR struct nxeg_state_s *st, uint8_t ch)
+{
+ FAR struct nxeg_bitmap_s *bm = NULL;
+ FAR struct nxeg_bitmap_s *bmleft;
+ nxgl_coord_t leftx;
+
+ /* Is there space for another character on the display? */
+
+ if (st->nchars < NXTK_MAXKBDCHARS)
+ {
+ /* Yes, setup the bitmap */
+
+ bm = &st->bm[st->nchars];
+
+ /* Find the matching glyph */
+
+ bm->glyph = nxeg_getglyph(st, ch);
+ if (!bm->glyph)
+ {
+ return NULL;
+ }
+
+ /* Set up the bounds for the bitmap */
+
+ if (st->nchars <= 0)
+ {
+ /* The first character is one space from the left */
+
+ leftx = st->spwidth;
+ }
+ else
+ {
+ /* Otherwise, it is to the left of the preceding char */
+
+ bmleft = &st->bm[st->nchars-1];
+ leftx = bmleft->bounds.pt2.x + 1;
+ }
+
+ bm->bounds.pt1.x = leftx;
+ bm->bounds.pt1.y = 2;
+ bm->bounds.pt2.x = leftx + bm->glyph->width - 1;
+ bm->bounds.pt2.y = 2 + bm->glyph->height - 1;
+
+ st->nchars++;
+ }
+ return bm;
+}
+
+/****************************************************************************
+ * Name: nxeg_addchars
+ ****************************************************************************/
+
+static inline void nxeg_addchars(NXWINDOW hwnd, FAR struct nxeg_state_s *st,
+ uint8_t nch, FAR const uint8_t *ch)
+{
+ FAR const struct nxeg_bitmap_s *bm;
+
+ while (nch--)
+ {
+ bm = nxeg_addchar(st, *ch++);
+ if (bm)
+ {
+ nxeg_fillchar(hwnd, &bm->bounds, bm);
+ }
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxeg_kbdin
+ ****************************************************************************/
+
+void nxeg_kbdin(NXWINDOW hwnd, uint8_t nch, FAR const uint8_t *ch,
+ FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+ message("nxeg_kbdin%d: hwnd=%p nch=%d\n", st->wnum, hwnd, nch);
+ nxeg_addchars(hwnd, st, nch, ch);
+}
+
+/****************************************************************************
+ * Name: nxeg_tbkbdin
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+void nxeg_tbkbdin(NXWINDOW hwnd, uint8_t nch, const uint8_t *ch, FAR void *arg)
+{
+ FAR struct nxeg_state_s *st = (FAR struct nxeg_state_s *)arg;
+ message("nxeg_tbkbdin: ERROR -- toolbar should not received keyboard input\n");
+ message("nxeg_tbkbdin%d: hwnd=%p nch=%d\n", st->wnum, hwnd, nch);
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_tbkbdin
+ ****************************************************************************/
+
+void nxeg_filltext(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
+ FAR struct nxeg_state_s *st)
+{
+ int i;
+
+ /* Fill each character on the display (Only the characters within rect
+ * will actually be redrawn).
+ */
+
+ for (i = 0; i < st->nchars; i++)
+ {
+ nxeg_fillchar(hwnd, rect, &st->bm[i]);
+ }
+}
+
+#endif /* CONFIG_NX_KBD */
diff --git a/apps/examples/nx/nx_main.c b/apps/examples/nx/nx_main.c
new file mode 100644
index 000000000..d35ea4ff0
--- /dev/null
+++ b/apps/examples/nx/nx_main.c
@@ -0,0 +1,894 @@
+/****************************************************************************
+ * examples/nx/nx_main.c
+ *
+ * Copyright (C) 2008-2010 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sched.h>
+#include <pthread.h>
+#include <errno.h>
+#include <debug.h>
+
+#ifdef CONFIG_NX_LCDDRIVER
+# include <nuttx/lcd/lcd.h>
+#else
+# include <nuttx/fb.h>
+#endif
+
+#include <nuttx/arch.h>
+#include <nuttx/nx.h>
+#include <nuttx/nxtk.h>
+#include <nuttx/nxfonts.h>
+
+#include "nx_internal.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Configuration ************************************************************/
+/* If not specified, assume that the hardware supports one video plane */
+
+#ifndef CONFIG_EXAMPLES_NX_VPLANE
+# define CONFIG_EXAMPLES_NX_VPLANE 0
+#endif
+
+/* If not specified, assume that the hardware supports one LCD device */
+
+#ifndef CONFIG_EXAMPLES_NX_DEVNO
+# define CONFIG_EXAMPLES_NX_DEVNO 0
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static int g_exitcode = NXEXIT_SUCCESS;
+
+static struct nxeg_state_s g_wstate[2];
+
+#ifdef CONFIG_NX_KBD
+static const uint8_t g_kbdmsg1[] = "NuttX is cool!";
+static const uint8_t g_kbdmsg2[] = "NuttX is fun!";
+#endif
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* The connecton handler */
+
+NXHANDLE g_hnx = NULL;
+
+/* The screen resolution */
+
+nxgl_coord_t g_xres;
+nxgl_coord_t g_yres;
+
+bool b_haveresolution = false;
+#ifdef CONFIG_NX_MULTIUSER
+bool g_connected = false;
+#endif
+sem_t g_semevent = {0};
+
+/* Colors used to fill window 1 & 2 */
+
+nxgl_mxpixel_t g_color1[CONFIG_NX_NPLANES];
+nxgl_mxpixel_t g_color2[CONFIG_NX_NPLANES];
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+nxgl_mxpixel_t g_tbcolor[CONFIG_NX_NPLANES];
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxeg_drivemouse
+ ****************************************************************************/
+
+#ifdef CONFIG_NX_MOUSE
+static void nxeg_drivemouse(void)
+{
+ nxgl_coord_t x;
+ nxgl_coord_t y;
+ nxgl_coord_t xstep = g_xres / 8;
+ nxgl_coord_t ystep = g_yres / 8;
+
+ for (x = 0; x < g_xres; x += xstep)
+ {
+ for (y = 0; y < g_yres; y += ystep)
+ {
+ message("nxeg_drivemouse: Mouse left button at (%d,%d)\n", x, y);
+ (void)nx_mousein(g_hnx, x, y, NX_MOUSE_LEFTBUTTON);
+ }
+ }
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_initstate
+ ****************************************************************************/
+
+static void nxeg_initstate(FAR struct nxeg_state_s *st, int wnum,
+ nxgl_mxpixel_t color)
+{
+#ifdef CONFIG_NX_KBD
+ FAR const struct nx_font_s *fontset;
+#endif
+
+ /* Initialize the window number (used for debug output only) and color
+ * (used for redrawing the window)
+ */
+
+ st->wnum = wnum;
+ st->color[0] = color;
+
+ /* Get information about the font set being used and save this in the
+ * state structure
+ */
+
+#ifdef CONFIG_NX_KBD
+ fontset = nxf_getfontset();
+ st->nchars = 0;
+ st->nglyphs = 0;
+ st->height = fontset->mxheight;
+ st->width = fontset->mxwidth;
+ st->spwidth = fontset->spwidth;
+#endif
+}
+
+/****************************************************************************
+ * Name: nxeg_freestate
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static void nxeg_freestate(FAR struct nxeg_state_s *st)
+{
+#ifdef CONFIG_NX_KBD
+ int i;
+
+ if (st)
+ {
+ for (i = 0; i < st->nglyphs; i++)
+ {
+ if (st->glyph[i].bitmap)
+ {
+ free(st->glyph[i].bitmap);
+ }
+ st->glyph[i].bitmap = NULL;
+ }
+ st->nchars = 0;
+ }
+#endif
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_openwindow
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline NXEGWINDOW nxeg_openwindow(FAR const struct nx_callback_s *cb,
+ FAR struct nxeg_state_s *state)
+{
+ NXEGWINDOW hwnd;
+
+ hwnd = nx_openwindow(g_hnx, cb, (FAR void *)state);
+ if (!hwnd)
+ {
+ message("user_start: nx_openwindow failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXOPENWINDOW;
+ }
+ return hwnd;
+}
+#else
+static inline NXEGWINDOW nxeg_openwindow(FAR const struct nx_callback_s *cb,
+ FAR struct nxeg_state_s *state)
+{
+ NXEGWINDOW hwnd;
+
+ hwnd = nxtk_openwindow(g_hnx, cb, (FAR void *)state);
+ if (!hwnd)
+ {
+ message("user_start: nxtk_openwindow failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXOPENWINDOW;
+ }
+ return hwnd;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_closewindow
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline int nxeg_closewindow(NXEGWINDOW hwnd, FAR struct nxeg_state_s *state)
+{
+ int ret = nx_closewindow(hwnd);
+ if (ret < 0)
+ {
+ message("user_start: nx_closewindow failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXCLOSEWINDOW;
+ }
+ return ret;
+}
+#else
+static inline int nxeg_closewindow(NXEGWINDOW hwnd, FAR struct nxeg_state_s *state)
+{
+ int ret = nxtk_closewindow(hwnd);
+ if (ret < 0)
+ {
+ message("user_start: nxtk_closewindow failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXCLOSEWINDOW;
+ }
+ nxeg_freestate(state);
+ return ret;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_setsize
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline int nxeg_setsize(NXEGWINDOW hwnd, FAR struct nxgl_size_s *size)
+{
+ int ret = nx_setsize(hwnd, size);
+ if (ret < 0)
+ {
+ message("user_start: nx_setsize failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXSETSIZE;
+ }
+ return ret;
+}
+#else
+static inline int nxeg_setsize(NXEGWINDOW hwnd, FAR struct nxgl_size_s *size)
+{
+ int ret = nxtk_setsize(hwnd, size);
+ if (ret < 0)
+ {
+ message("user_start: nxtk_setsize failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXSETSIZE;
+ }
+ return ret;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_setposition
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline int nxeg_setposition(NXEGWINDOW hwnd, FAR struct nxgl_point_s *pos)
+{
+ int ret = nx_setposition(hwnd, pos);
+ if (ret < 0)
+ {
+ message("user_start: nx_setposition failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXSETPOSITION;
+ }
+ return ret;
+}
+#else
+static inline int nxeg_setposition(NXEGWINDOW hwnd, FAR struct nxgl_point_s *pos)
+{
+ int ret = nxtk_setposition(hwnd, pos);
+ if (ret < 0)
+ {
+ message("user_start: nxtk_setposition failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXSETPOSITION;
+ }
+ return ret;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeq_opentoolbar
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline int nxeq_opentoolbar(NXEGWINDOW hwnd, nxgl_coord_t height,
+ FAR const struct nx_callback_s *cb,
+ FAR struct nxeg_state_s *state)
+{
+ int ret;
+ ret = nxtk_opentoolbar(hwnd, height, cb, (FAR void *)state);
+ if (ret < 0)
+ {
+ message("user_start: nxtk_opentoolbar failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXOPENTOOLBAR;
+ }
+ return ret;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_lower
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline int nxeg_lower(NXEGWINDOW hwnd)
+{
+ int ret = nx_lower(hwnd);
+ if (ret < 0)
+ {
+ message("user_start: nx_lower failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXLOWER;
+ }
+ return ret;
+}
+#else
+static inline int nxeg_lower(NXEGWINDOW hwnd)
+{
+ int ret = nxtk_lower(hwnd);
+ if (ret < 0)
+ {
+ message("user_start: nxtk_lower failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXLOWER;
+ }
+ return ret;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_raise
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_NX_RAWWINDOWS
+static inline int nxeg_raise(NXEGWINDOW hwnd)
+{
+ int ret = nx_raise(hwnd);
+ if (ret < 0)
+ {
+ message("user_start: nx_raise failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXRAISE;
+ }
+ return ret;
+}
+#else
+static inline int nxeg_raise(NXEGWINDOW hwnd)
+{
+ int ret = nxtk_raise(hwnd);
+ if (ret < 0)
+ {
+ message("user_start: nxtk_raise failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXRAISE;
+ }
+ return ret;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_suinitialize
+ ****************************************************************************/
+
+#ifndef CONFIG_NX_MULTIUSER
+static inline int nxeg_suinitialize(void)
+{
+ FAR NX_DRIVERTYPE *dev;
+
+#if defined(CONFIG_EXAMPLES_NX_EXTERNINIT)
+ /* Use external graphics driver initialization */
+
+ message("nxeg_initialize: Initializing external graphics device\n");
+ dev = up_nxdrvinit(CONFIG_EXAMPLES_NX_DEVNO);
+ if (!dev)
+ {
+ message("nxeg_initialize: up_nxdrvinit failed, devno=%d\n", CONFIG_EXAMPLES_NX_DEVNO);
+ g_exitcode = NXEXIT_EXTINITIALIZE;
+ return ERROR;
+ }
+
+#elif defined(CONFIG_NX_LCDDRIVER)
+ int ret;
+
+ /* Initialize the LCD device */
+
+ message("nxeg_initialize: Initializing LCD\n");
+ ret = up_lcdinitialize();
+ if (ret < 0)
+ {
+ message("nxeg_initialize: up_lcdinitialize failed: %d\n", -ret);
+ g_exitcode = NXEXIT_LCDINITIALIZE;
+ return ERROR;
+ }
+
+ /* Get the device instance */
+
+ dev = up_lcdgetdev(CONFIG_EXAMPLES_NX_DEVNO);
+ if (!dev)
+ {
+ message("nxeg_initialize: up_lcdgetdev failed, devno=%d\n", CONFIG_EXAMPLES_NX_DEVNO);
+ g_exitcode = NXEXIT_LCDGETDEV;
+ return ERROR;
+ }
+
+ /* Turn the LCD on at 75% power */
+
+ (void)dev->setpower(dev, ((3*CONFIG_LCD_MAXPOWER + 3)/4));
+#else
+ int ret;
+
+ /* Initialize the frame buffer device */
+
+ message("nxeg_initialize: Initializing framebuffer\n");
+ ret = up_fbinitialize();
+ if (ret < 0)
+ {
+ message("nxeg_initialize: up_fbinitialize failed: %d\n", -ret);
+ g_exitcode = NXEXIT_FBINITIALIZE;
+ return ERROR;
+ }
+
+ dev = up_fbgetvplane(CONFIG_EXAMPLES_NX_VPLANE);
+ if (!dev)
+ {
+ message("nxeg_initialize: up_fbgetvplane failed, vplane=%d\n", CONFIG_EXAMPLES_NX_VPLANE);
+ g_exitcode = NXEXIT_FBGETVPLANE;
+ return ERROR;
+ }
+#endif
+
+ /* Then open NX */
+
+ message("nxeg_initialize: Open NX\n");
+ g_hnx = nx_open(dev);
+ if (!g_hnx)
+ {
+ message("user_start: nx_open failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXOPEN;
+ return ERROR;
+ }
+ return OK;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_initialize
+ ****************************************************************************/
+
+#ifdef CONFIG_NX_MULTIUSER
+static inline int nxeg_muinitialize(void)
+{
+ struct sched_param param;
+ pthread_t thread;
+ pid_t servrid;
+ int ret;
+
+ /* Set the client task priority */
+
+ param.sched_priority = CONFIG_EXAMPLES_NX_CLIENTPRIO;
+ ret = sched_setparam(0, &param);
+ if (ret < 0)
+ {
+ message("nxeg_initialize: sched_setparam failed: %d\n" , ret);
+ g_exitcode = NXEXIT_SCHEDSETPARAM;
+ return ERROR;
+ }
+
+ /* Start the server task */
+
+ message("nxeg_initialize: Starting nx_servertask task\n");
+ servrid = task_create("NX Server", CONFIG_EXAMPLES_NX_SERVERPRIO,
+ CONFIG_EXAMPLES_NX_STACKSIZE, nx_servertask, NULL);
+ if (servrid < 0)
+ {
+ message("nxeg_initialize: Failed to create nx_servertask task: %d\n", errno);
+ g_exitcode = NXEXIT_TASKCREATE;
+ return ERROR;
+ }
+
+ /* Wait a bit to let the server get started */
+
+ sleep(1);
+
+ /* Connect to the server */
+
+ g_hnx = nx_connect();
+ if (g_hnx)
+ {
+ pthread_attr_t attr;
+
+ /* Start a separate thread to listen for server events. This is probably
+ * the least efficient way to do this, but it makes this example flow more
+ * smoothly.
+ */
+
+ (void)pthread_attr_init(&attr);
+ param.sched_priority = CONFIG_EXAMPLES_NX_LISTENERPRIO;
+ (void)pthread_attr_setschedparam(&attr, &param);
+ (void)pthread_attr_setstacksize(&attr, CONFIG_EXAMPLES_NX_STACKSIZE);
+
+ ret = pthread_create(&thread, &attr, nx_listenerthread, NULL);
+ if (ret != 0)
+ {
+ printf("nxeg_initialize: pthread_create failed: %d\n", ret);
+ g_exitcode = NXEXIT_PTHREADCREATE;
+ return ERROR;
+ }
+
+ /* Don't return until we are connected to the server */
+
+ while (!g_connected)
+ {
+ /* Wait for the listener thread to wake us up when we really
+ * are connected.
+ */
+
+ (void)sem_wait(&g_semevent);
+ }
+ }
+ else
+ {
+ message("nxeg_initialize: nx_connect failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXCONNECT;
+ return ERROR;
+ }
+ return OK;
+}
+#endif
+
+/****************************************************************************
+ * Name: nxeg_initialize
+ ****************************************************************************/
+
+static int nxeg_initialize(void)
+{
+ int i;
+
+ /* Initialize window colors */
+
+ for (i = 0; i < CONFIG_NX_NPLANES; i++)
+ {
+ g_color1[i] = CONFIG_EXAMPLES_NX_COLOR1;
+ g_color2[i] = CONFIG_EXAMPLES_NX_COLOR2;
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+ g_tbcolor[i] = CONFIG_EXAMPLES_NX_TBCOLOR;
+#endif
+ }
+
+#ifdef CONFIG_NX_MULTIUSER
+ return nxeg_muinitialize();
+#else
+ return nxeg_suinitialize();
+#endif
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ NXEGWINDOW hwnd1;
+ NXEGWINDOW hwnd2;
+ struct nxgl_size_s size;
+ struct nxgl_point_s pt;
+ nxgl_mxpixel_t color;
+ int ret;
+
+ /* Initialize */
+
+ ret = nxeg_initialize();
+ message("user_start: NX handle=%p\n", g_hnx);
+ if (!g_hnx || ret < 0)
+ {
+ message("user_start: Failed to get NX handle: %d\n", errno);
+ g_exitcode = NXEXIT_NXOPEN;
+ goto errout;
+ }
+
+ /* Set the background to the configured background color */
+
+ message("user_start: Set background color=%d\n", CONFIG_EXAMPLES_NX_BGCOLOR);
+ color = CONFIG_EXAMPLES_NX_BGCOLOR;
+ ret = nx_setbgcolor(g_hnx, &color);
+ if (ret < 0)
+ {
+ message("user_start: nx_setbgcolor failed: %d\n", errno);
+ g_exitcode = NXEXIT_NXSETBGCOLOR;
+ goto errout_with_nx;
+ }
+
+ /* Create window #1 */
+
+ message("user_start: Create window #1\n");
+ nxeg_initstate(&g_wstate[0], 1, CONFIG_EXAMPLES_NX_COLOR1);
+ hwnd1 = nxeg_openwindow(&g_nxcb, &g_wstate[0]);
+ message("user_start: hwnd1=%p\n", hwnd1);
+ if (!hwnd1)
+ {
+ goto errout_with_nx;
+ }
+
+ /* Wait until we have the screen resolution */
+
+ while (!b_haveresolution)
+ {
+ (void)sem_wait(&g_semevent);
+ }
+ message("user_start: Screen resolution (%d,%d)\n", g_xres, g_yres);
+
+ /* Set the size of the window 1 */
+
+ size.w = g_xres / 2;
+ size.h = g_yres / 2;
+
+ message("user_start: Set window #1 size to (%d,%d)\n", size.w, size.h);
+ ret = nxeg_setsize(hwnd1, &size);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd1;
+ }
+
+ /* Sleep a bit -- both so that we can see the result of the above operations
+ * but also, in the multi-user case, so that the server can get a chance to
+ * actually do them!
+ */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+
+ /* Set the position of window #1 */
+
+ pt.x = g_xres / 8;
+ pt.y = g_yres / 8;
+
+ message("user_start: Set window #1 postion to (%d,%d)\n", pt.x, pt.y);
+ ret = nxeg_setposition(hwnd1, &pt);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd1;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+
+ /* Open the toolbar */
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+ message("user_start: Add toolbar to window #1\n");
+ ret = nxeq_opentoolbar(hwnd1, CONFIG_TOOLBAR_HEIGHT, &g_tbcb, &g_wstate[0]);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd1;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+#endif
+
+ /* Create window #2 */
+
+ message("user_start: Create window #2\n");
+ nxeg_initstate(&g_wstate[1], 2, CONFIG_EXAMPLES_NX_COLOR2);
+ hwnd2 = nxeg_openwindow(&g_nxcb, &g_wstate[1]);
+ message("user_start: hwnd2=%p\n", hwnd2);
+ if (!hwnd2)
+ {
+ goto errout_with_hwnd1;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+
+ /* Set the size of the window 2 == size of window 1*/
+
+ message("user_start: Set hwnd2 size to (%d,%d)\n", size.w, size.h);
+ ret = nxeg_setsize(hwnd2, &size);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd2;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+
+ /* Set the position of window #2 */
+
+ pt.x = g_xres - size.w - pt.x;
+ pt.y = g_yres - size.h - pt.y;
+
+ message("user_start: Set hwnd2 postion to (%d,%d)\n", pt.x, pt.y);
+ ret = nxeg_setposition(hwnd2, &pt);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd2;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+
+#ifndef CONFIG_EXAMPLES_NX_RAWWINDOWS
+ message("user_start: Add toolbar to window #2\n");
+ ret = nxeq_opentoolbar(hwnd2, CONFIG_TOOLBAR_HEIGHT, &g_tbcb, &g_wstate[1]);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd2;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+#endif
+
+ /* Give keyboard input to the top window -- should be window #2 */
+
+#ifdef CONFIG_NX_KBD
+ message("user_start: Send keyboard input: %s\n", g_kbdmsg1);
+ ret = nx_kbdin(g_hnx, strlen((FAR const char *)g_kbdmsg1), g_kbdmsg1);
+ if (ret < 0)
+ {
+ message("user_start: nx_kbdin failed: %d\n", errno);
+ goto errout_with_hwnd2;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+#endif
+
+ /* Lower window 2 */
+
+ message("user_start: Lower window #2\n");
+ ret = nxeg_lower(hwnd2);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd2;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+
+ /* Put mouse left-button clicks all over the screen and see who responds */
+
+#ifdef CONFIG_NX_MOUSE
+ nxeg_drivemouse();
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+#endif
+
+ /* Give keyboard input to the top window -- should be window #1 */
+
+#ifdef CONFIG_NX_KBD
+ message("user_start: Send keyboard input: %s\n", g_kbdmsg2);
+ ret = nx_kbdin(g_hnx, strlen((FAR const char *)g_kbdmsg2), g_kbdmsg2);
+ if (ret < 0)
+ {
+ message("user_start: nx_kbdin failed: %d\n", errno);
+ goto errout_with_hwnd2;
+ }
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(1);
+#endif
+
+ /* Raise window 2 */
+
+ message("user_start: Raise window #2\n");
+ ret = nxeg_raise(hwnd2);
+ if (ret < 0)
+ {
+ goto errout_with_hwnd2;
+ }
+
+ /* Put mouse left-button clicks all over the screen and see who responds */
+
+#ifdef CONFIG_NX_MOUSE
+ nxeg_drivemouse();
+#endif
+
+ /* Sleep a bit */
+
+ message("user_start: Sleeping\n\n");
+ sleep(2);
+
+ /* Close the window 2 */
+
+errout_with_hwnd2:
+ message("user_start: Close window #2\n");
+ (void)nxeg_closewindow(hwnd2, &g_wstate[1]);
+
+ /* Close the window1 */
+
+errout_with_hwnd1:
+ message("user_start: Close window #1\n");
+ (void)nxeg_closewindow(hwnd1, &g_wstate[0]);
+
+errout_with_nx:
+#ifdef CONFIG_NX_MULTIUSER
+ /* Disconnect from the server */
+
+ message("user_start: Disconnect from the server\n");
+ nx_disconnect(g_hnx);
+#else
+ /* Close the server */
+
+ message("user_start: Close NX\n");
+ nx_close(g_hnx);
+#endif
+errout:
+ return g_exitcode;
+}
diff --git a/apps/examples/nx/nx_server.c b/apps/examples/nx/nx_server.c
new file mode 100644
index 000000000..8677c0008
--- /dev/null
+++ b/apps/examples/nx/nx_server.c
@@ -0,0 +1,152 @@
+/****************************************************************************
+ * examples/nx/nx_server.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/nx.h>
+
+#ifdef CONFIG_NX_LCDDRIVER
+# include <nuttx/lcd/lcd.h>
+#else
+# include <nuttx/fb.h>
+#endif
+
+#include "nx_internal.h"
+
+#ifdef CONFIG_NX_MULTIUSER
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nx_servertask
+ ****************************************************************************/
+
+int nx_servertask(int argc, char *argv[])
+{
+ FAR NX_DRIVERTYPE *dev;
+ int ret;
+
+#if defined(CONFIG_EXAMPLES_NX_EXTERNINIT)
+ /* Use external graphics driver initialization */
+
+ message("nxeg_initialize: Initializing external graphics device\n");
+ dev = up_nxdrvinit(CONFIG_EXAMPLES_NX_DEVNO);
+ if (!dev)
+ {
+ message("nxeg_initialize: up_nxdrvinit failed, devno=%d\n", CONFIG_EXAMPLES_NX_DEVNO);
+ g_exitcode = NXEXIT_EXTINITIALIZE;
+ return ERROR;
+ }
+
+#elif defined(CONFIG_NX_LCDDRIVER)
+ /* Initialize the LCD device */
+
+ message("nx_servertask: Initializing LCD\n");
+ ret = up_lcdinitialize();
+ if (ret < 0)
+ {
+ message("nx_servertask: up_lcdinitialize failed: %d\n", -ret);
+ return 1;
+ }
+
+ /* Get the device instance */
+
+ dev = up_lcdgetdev(CONFIG_EXAMPLES_NX_DEVNO);
+ if (!dev)
+ {
+ message("nx_servertask: up_lcdgetdev failed, devno=%d\n", CONFIG_EXAMPLES_NX_DEVNO);
+ return 2;
+ }
+
+ /* Turn the LCD on at 75% power */
+
+ (void)dev->setpower(dev, ((3*CONFIG_LCD_MAXPOWER + 3)/4));
+#else
+ /* Initialize the frame buffer device */
+
+ message("nx_servertask: Initializing framebuffer\n");
+ ret = up_fbinitialize();
+ if (ret < 0)
+ {
+ message("nx_servertask: up_fbinitialize failed: %d\n", -ret);
+ return 1;
+ }
+
+ dev = up_fbgetvplane(CONFIG_EXAMPLES_NX_VPLANE);
+ if (!dev)
+ {
+ message("nx_servertask: up_fbgetvplane failed, vplane=%d\n", CONFIG_EXAMPLES_NX_VPLANE);
+ return 2;
+ }
+#endif
+
+ /* Then start the server */
+
+ ret = nx_run(dev);
+ message("nx_servertask: nx_run returned: %d\n", errno);
+ return 3;
+}
+
+#endif /* CONFIG_NX_MULTIUSER */
diff --git a/apps/examples/nxflat/Makefile b/apps/examples/nxflat/Makefile
new file mode 100644
index 000000000..b5f3e2d8c
--- /dev/null
+++ b/apps/examples/nxflat/Makefile
@@ -0,0 +1,95 @@
+############################################################################
+# apps/examples/nxflat/Makefile
+#
+# Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# NXFLAT Example
+
+ASRCS =
+CSRCS = nxflat_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: headers .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+headers:
+ @$(MAKE) -C tests TOPDIR=$(TOPDIR) APPDIR=$(APPDIR) CROSSDEV=$(CROSSDEV)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+# We can't make dependencies in this directory because the required
+# header files may not yet exist.
+
+.depend:
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/nxflat/nxflat_main.c b/apps/examples/nxflat/nxflat_main.c
new file mode 100644
index 000000000..a710112c3
--- /dev/null
+++ b/apps/examples/nxflat/nxflat_main.c
@@ -0,0 +1,232 @@
+/****************************************************************************
+ * examples/nxflat/nxflat_main.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <nuttx/compiler.h>
+
+#include <sys/mount.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/ramdisk.h>
+#include <nuttx/binfmt.h>
+#include <nuttx/nxflat.h>
+
+#include "tests/romfs.h"
+#include "tests/dirlist.h"
+#include "tests/symtab.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Check configuration. This is not all of the configuration settings that
+ * are required -- only the more obvious.
+ */
+
+#if CONFIG_NFILE_DESCRIPTORS < 1
+# error "You must provide file descriptors via CONFIG_NFILE_DESCRIPTORS in your configuration file"
+#endif
+
+#ifndef CONFIG_NXFLAT
+# error "You must select CONFIG_NXFLAT in your configuration file"
+#endif
+
+#ifndef CONFIG_FS_ROMFS
+# error "You must select CONFIG_FS_ROMFS in your configuration file"
+#endif
+
+#ifdef CONFIG_DISABLE_MOUNTPOINT
+# error "You must not disable mountpoints via CONFIG_DISABLE_MOUNTPOINT in your configuration file"
+#endif
+
+#ifdef CONFIG_BINFMT_DISABLE
+# error "You must not disable loadable modules via CONFIG_BINFMT_DISABLE in your configuration file"
+#endif
+
+/* Describe the ROMFS file system */
+
+#define SECTORSIZE 512
+#define NSECTORS(b) (((b)+SECTORSIZE-1)/SECTORSIZE)
+#define ROMFSDEV "/dev/ram0"
+#define MOUNTPT "/mnt/romfs"
+
+/* If CONFIG_DEBUG is enabled, use dbg instead of printf so that the
+ * output will be synchronous with the debug output.
+ */
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(format, arg...) dbg(format, ##arg)
+# define err(format, arg...) dbg(format, ##arg)
+# else
+# define message(format, arg...) printf(format, ##arg)
+# define err(format, arg...) fprintf(stderr, format, ##arg)
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message dbg
+# define err dbg
+# else
+# define message printf
+# define err printf
+# endif
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char delimiter[] =
+ "****************************************************************************";
+
+static char path[128];
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: testheader
+ ****************************************************************************/
+
+static inline void testheader(FAR const char *progname)
+{
+ message("\n%s\n* Executing %s\n%s\n\n", delimiter, progname, delimiter);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct binary_s bin;
+ int ret;
+ int i;
+
+ /* Initialize the NXFLAT binary loader */
+
+ message("Initializing the NXFLAT binary loader\n");
+ ret = nxflat_initialize();
+ if (ret < 0)
+ {
+ err("ERROR: Initialization of the NXFLAT loader failed: %d\n", ret);
+ exit(1);
+ }
+
+ /* Create a ROM disk for the ROMFS filesystem */
+
+ message("Registering romdisk\n");
+ ret = romdisk_register(0, romfs_img, NSECTORS(romfs_img_len), SECTORSIZE);
+ if (ret < 0)
+ {
+ err("ERROR: romdisk_register failed: %d\n", ret);
+ nxflat_uninitialize();
+ exit(1);
+ }
+
+ /* Mount the file system */
+
+ message("Mounting ROMFS filesystem at target=%s with source=%s\n",
+ MOUNTPT, ROMFSDEV);
+
+ ret = mount(ROMFSDEV, MOUNTPT, "romfs", MS_RDONLY, NULL);
+ if (ret < 0)
+ {
+ err("ERROR: mount(%s,%s,romfs) failed: %s\n",
+ ROMFSDEV, MOUNTPT, errno);
+ nxflat_uninitialize();
+ }
+
+ /* Now excercise every progrm in the ROMFS file system */
+
+ for (i = 0; dirlist[i]; i++)
+ {
+ testheader(dirlist[i]);
+
+ memset(&bin, 0, sizeof(struct binary_s));
+ snprintf(path, 128, "%s/%s", MOUNTPT, dirlist[i]);
+
+ bin.filename = path;
+ bin.exports = exports;
+ bin.nexports = NEXPORTS;
+
+ ret = load_module(&bin);
+ if (ret < 0)
+ {
+ err("ERROR: Failed to load program '%s'\n", dirlist[i]);
+ exit(1);
+ }
+
+ ret = exec_module(&bin, 50);
+ if (ret < 0)
+ {
+ err("ERROR: Failed to execute program '%s'\n", dirlist[i]);
+ unload_module(&bin);
+ }
+
+ message("Wait a bit for test completion\n");
+ sleep(4);
+ }
+
+ message("End-of-Test.. Exit-ing\n");
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/Makefile b/apps/examples/nxflat/tests/Makefile
new file mode 100644
index 000000000..31f254218
--- /dev/null
+++ b/apps/examples/nxflat/tests/Makefile
@@ -0,0 +1,103 @@
+############################################################################
+# apps/examples/nxflat/tests/Makefile
+#
+# Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+
+# Most of these do no build yet
+#SUBDIRS = errno hello hello++ longjmp mutex pthread signal task struct
+SUBDIRS = errno hello mutex pthread task struct
+
+NXFLAT_DIR = $(APPDIR)/examples/nxflat
+TESTS_DIR = $(NXFLAT_DIR)/tests
+ROMFS_DIR = $(TESTS_DIR)/romfs
+ROMFS_IMG = $(TESTS_DIR)/romfs.img
+ROMFS_HDR = $(TESTS_DIR)/romfs.h
+ROMFS_DIRLIST = $(TESTS_DIR)/dirlist.h
+SYMTAB = $(TESTS_DIR)/symtab.h
+
+define DIR_template
+$(1)_$(2):
+ @$(MAKE) -C $(1) $(3) TOPDIR=$(TOPDIR) APPDIR=$(APPDIR) ROMFS_DIR=$(ROMFS_DIR) CROSSDEV=$(CROSSDEV)
+endef
+
+all: $(ROMFS_HDR) $(ROMFS_DIRLIST) $(SYMTAB)
+.PHONY: all build clean install populate
+
+$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),build, all)))
+$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),clean,clean)))
+$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),install,install)))
+
+# Build program(s) in each sud-directory
+
+build: $(foreach DIR, $(SUBDIRS), $(DIR)_build)
+
+# Install each program in the romfs directory
+
+install: $(foreach DIR, $(SUBDIRS), $(DIR)_install)
+
+# Create the romfs directory
+
+$(ROMFS_DIR):
+ @mkdir $(ROMFS_DIR)
+
+# Populate the romfs directory
+
+populate: $(ROMFS_DIR) build install
+
+# Create the romfs.img file from the populated romfs directory
+
+$(ROMFS_IMG): populate
+ @genromfs -f $@ -d $(ROMFS_DIR) -V "NXFLATTEST"
+
+# Create the romfs.h header file from the romfs.img file
+
+$(ROMFS_HDR) : $(ROMFS_IMG)
+ @(cd $(TESTS_DIR); xxd -i romfs.img | sed -e "s/^unsigned/static const unsigned/g" >$@)
+
+# Create the dirlist.h header file from the romfs directory
+
+$(ROMFS_DIRLIST) : populate
+ @$(TESTS_DIR)/mkdirlist.sh $(ROMFS_DIR) >$@
+
+# Create the exported symbol table list from the derived *-thunk.S files
+
+$(SYMTAB): build
+ @$(TESTS_DIR)/mksymtab.sh $(TESTS_DIR) >$@
+
+# Clean each subdirectory
+
+clean: $(foreach DIR, $(SUBDIRS), $(DIR)_clean)
+ @rm -f $(ROMFS_HDR) $(ROMFS_IMG) $(SYMTAB)
+ @rm -rf $(ROMFS_DIR)
+
+
diff --git a/apps/examples/nxflat/tests/errno/Makefile b/apps/examples/nxflat/tests/errno/Makefile
new file mode 100644
index 000000000..158768b85
--- /dev/null
+++ b/apps/examples/nxflat/tests/errno/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/nxflat/tests/hello/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = errno
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
diff --git a/apps/examples/nxflat/tests/errno/errno.c b/apps/examples/nxflat/tests/errno/errno.c
new file mode 100644
index 000000000..b06679165
--- /dev/null
+++ b/apps/examples/nxflat/tests/errno/errno.c
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * examples/nxflat/tests/errno/errno.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+static const char g_nonexistent[] = "aflav-sautga-ay";
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ FILE *test_stream;
+
+ /* Try using stdout and stderr explicitly. These are global variables
+ * exported from the base code.
+ */
+
+ fprintf(stdout, "Hello, World on stdout\n");
+ fprintf(stderr, "Hello, World on stderr\n");
+
+ /* Try opening a non-existent file using buffered IO. */
+
+ test_stream = fopen(g_nonexistent, "r");
+ if (test_stream)
+ {
+ fprintf(stderr, "Hmm... Delete \"%s\" and try this again\n",
+ g_nonexistent);
+ exit(1);
+ }
+
+ /* Now print the errno on stderr. Errno is also a global
+ * variable exported by the base code.
+ */
+
+ fprintf(stderr, "We failed to open \"%s!\" errno is %d\n",
+ g_nonexistent, errno);
+
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/hello++/Makefile b/apps/examples/nxflat/tests/hello++/Makefile
new file mode 100644
index 000000000..113520da5
--- /dev/null
+++ b/apps/examples/nxflat/tests/hello++/Makefile
@@ -0,0 +1,180 @@
+############################################################################
+# examples/nxflat/tests/hello/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN1 = hello++1
+BIN2 = hello++2
+BIN3 = hello++3
+#BIN4 = hello++4
+ALL_BIN = $(BIN1) $(BIN2) $(BIN3) $(BIN4)
+
+R1SRCS1 = $(BIN1).c
+R1OBJS1 = $(R1SRCS1:.c=.o)
+R2SRC1 = $(BIN1)-thunk.S
+R2OBJ1 = $(R2SRC1:.S=.o)
+
+R1SRCS2 = $(BIN2).c
+R1OBJS2 = $(R1SRCS2:.c=.o)
+R2SRC2 = $(BIN2)-thunk.S
+R2OBJ2 = $(R2SRC2:.S=.o)
+
+R1SRCS3 = $(BIN3).c
+R1OBJS3 = $(R1SRCS3:.c=.o)
+R2SRC3 = $(BIN3)-thunk.S
+R2OBJ3 = $(R2SRC3:.S=.o)
+
+#R1SRCS4 = $(BIN4).c
+#R1OBJS4 = $(R1SRCS4:.c=.o)
+#R2SRC4 = $(BIN4)-thunk.S
+#R2OBJ4 = $(R2SRC4:.S=.o)
+
+DERIVED = $(R2SRC1) $(R2SRC2) $(R2SRC3) $(R2SRC4)
+
+R1CXXOBJS = $(R1OBJS1) $(R1OBJS2) $(R1OBJS3) # $(R1OBJS4)
+R2AOBJS = $(R2OBJ1) $(R2OBJ2) $(R2OBJ3) # $(R2OBJ4)
+
+LIBSTDC_STUBS_DIR = $(TOPDIR)/libxx
+LIBSTDC_STUBS_LIB = $(LIBSTDC_STUBS_DIR)/liblibxx.a
+
+all: $(BIN1) $(BIN2) $(BIN3) # $(BIN4)
+
+$(R1CXXOBJS): %.o: %.cpp
+ @echo "CC: $<"
+ @$(CXX) -c $(CXXPICFLAGS) $< -o $@
+
+$(R2AOBJS): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+# This contains libstdc++ stubs to that you can build C++ code
+# without actually having libstdc++
+
+$(LIBSTDC_STUBS_LIB):
+ @$(MAKE) -C $(LIBSTDC_STUBS_DIR) TOPDIR=$(TOPDIR)
+
+# BIN1 and BIN2 link just like C code because they contain no
+# static constructors. BIN1 is equivalent to a C hello world;
+# BIN2 contains a class that implements hello world, but it is
+# not statically initialized.
+
+$(BIN1).r1: $(R1OBJS1)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC1): $(BIN1).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN1).r2: $(R2OBJ1)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS1) $(R2OBJ1)
+
+$(BIN1): $(BIN1).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+$(BIN2).r1: $(R1OBJS2) $(LIBSTDC_STUBS_LIB)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC2): $(BIN2).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN2).r2: $(R2OBJ2)
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS2) $(R2OBJ2)
+
+$(BIN2): $(BIN2).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+# BIN3 and BIN4 require that we include --cxx in the xflat-ld command.
+# This will instruct xflat-ld that we want it to put together the correct
+# startup files to handle the C++ static initializers.
+#
+# BIN3 is equivalent to BIN2 except that is uses static initializers
+
+$(BIN3).r1: $(R1OBJS3) $(LIBSTDC_STUBS_LIB)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC3): $(BIN3).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN3).r2: $(R2OBJ3)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS3) $(R2OBJ3)
+
+$(BIN3): $(BIN3).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+# BIN4 is similar to BIN3 except that it uses the streams code from libstdc++
+#
+# NOTE: libstdc++ is not available for XFLAT as of this writing
+#
+#$(BIN4).r1: $(R1OBJS4) $(LIBSTDC_STUBS_LIB)
+# @echo "LD: $<"
+# $(LD) $(NXFLATLDFLAGS1) -o $@ $^
+#
+#$(R2SRC4): $(BIN4).r1
+# @echo "MK: $<"
+# $(MKNXFLAT) -o $@ $^
+#
+#$(BIN4).r2: $(R2OBJ4)# @echo "LD: $<"
+# $(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS4) $(R2OBJ4)
+#
+#$(BIN4): $(BIN4).r2
+# @echo "LD: $<"
+# $(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(ALL_BIN) $(DERIVED) *.o *.r1 *.r2 *~ .*.swp core
+
+install: $(ALL_BIN)
+ @install -D $(BIN1) $(ROMFS_DIR)/$(BIN1)
+ @install -D $(BIN2) $(ROMFS_DIR)/$(BIN2)
+ @install -D $(BIN3) $(ROMFS_DIR)/$(BIN3)
+# @install -D $(BIN4) $(ROMFS_DIR)/$(BIN4)
+
+
+
+
+
+
+
diff --git a/apps/examples/nxflat/tests/hello++/hello++1.cpp b/apps/examples/nxflat/tests/hello++/hello++1.cpp
new file mode 100644
index 000000000..779f3307a
--- /dev/null
+++ b/apps/examples/nxflat/tests/hello++/hello++1.cpp
@@ -0,0 +1,60 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/nxflat/tests/hello++/hello++1.c
+//
+// Copyright (C) 2009 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+//
+// 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.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an trivial version of "Hello, World" program. It illustrates
+// that we can build C programs using the C++ compiler.
+//
+// - Building a C++ program to use the C library
+// - No class creation
+// - NO Streams
+// - NO Static constructor and destructors
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ printf("Hello, World!\n");
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/hello++/hello++2.cpp b/apps/examples/nxflat/tests/hello++/hello++2.cpp
new file mode 100644
index 000000000..87166f3ab
--- /dev/null
+++ b/apps/examples/nxflat/tests/hello++/hello++2.cpp
@@ -0,0 +1,123 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/nxflat/tests/hello++/hello++2.c
+//
+// Copyright (C) 2009 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+//
+// 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.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an another trivial version of "Hello, World" design. It illustrates
+//
+// - Building a C++ program to use the C library
+// - Basic class creation
+// - NO Streams
+// - NO Static constructor and destructors
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+
+/////////////////////////////////////////////////////////////////////////////
+// Classes
+/////////////////////////////////////////////////////////////////////////////
+
+class CThingSayer
+{
+ const char *szWhatToSay;
+public:
+ CThingSayer(void)
+ {
+ printf("CThingSayer::CThingSayer: I am!\n");
+ szWhatToSay = (const char*)NULL;
+ }
+
+ ~CThingSayer(void)
+ {
+ printf("CThingSayer::~CThingSayer: I cease to be\n");
+ if (szWhatToSay)
+ {
+ printf("CThingSayer::~CThingSayer: I will never say '%s' again\n",
+ szWhatToSay);
+ }
+ szWhatToSay = (const char*)NULL;
+ }
+
+ void Initialize(const char *czSayThis)
+ {
+ printf("CThingSayer::Initialize: When told, I will say '%s'\n",
+ czSayThis);
+ szWhatToSay = czSayThis;
+ }
+
+ void SayThing(void)
+ {
+ printf("CThingSayer::SayThing: I am now saying '%s'\n", szWhatToSay);
+ }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ CThingSayer *MyThingSayer;
+
+ printf("main: Started. Creating MyThingSayer\n");
+
+ // Create an instance of the CThingSayer class
+ // We should see the message from constructor, CThingSayer::CThingSayer(),
+
+ MyThingSayer = new CThingSayer;
+ printf("main: Created MyThingSayer=0x%08lx\n", (long)MyThingSayer);
+
+ // Tell MyThingSayer that "Hello, World!" is the string to be said
+
+ printf("main: Calling MyThingSayer->Initialize\n");;
+ MyThingSayer->Initialize("Hello, World!");
+
+ // Tell MyThingSayer to say the thing we told it to say
+
+ printf("main: Calling MyThingSayer->SayThing\n");;
+ MyThingSayer->SayThing();
+
+ // We should see the message from the destructor,
+ // CThingSayer::~CThingSayer(), AFTER we see the following
+
+ printf("main: Destroying MyThingSayer\n");
+ delete MyThingSayer;
+
+ printf("main: Returning\n");;
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/hello++/hello++3.cpp b/apps/examples/nxflat/tests/hello++/hello++3.cpp
new file mode 100644
index 000000000..ed7302fa6
--- /dev/null
+++ b/apps/examples/nxflat/tests/hello++/hello++3.cpp
@@ -0,0 +1,132 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/nxflat/tests/hello++/hello++3.c
+//
+// Copyright (C) 2009 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+//
+// 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.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an another trivial version of "Hello, World" design. It illustrates
+//
+// - Building a C++ program to use the C library and stdio
+// - Basic class creation with virtual methods.
+// - Static constructor and destructors (in main program only)
+// - NO Streams
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+
+/////////////////////////////////////////////////////////////////////////////
+// Classes
+/////////////////////////////////////////////////////////////////////////////
+
+class CThingSayer
+{
+ const char *szWhatToSay;
+public:
+ CThingSayer(void);
+ virtual ~CThingSayer(void);
+ virtual void Initialize(const char *czSayThis);
+ virtual void SayThing(void);
+};
+
+// A static instance of the CThingSayer class. This instance MUST
+// be constructed by the system BEFORE the program is started at
+// main() and must be destructed by the system AFTER the main()
+// returns to the system
+
+static CThingSayer MyThingSayer;
+
+// These are implementations of the methods of the CThingSayer class
+
+CThingSayer::CThingSayer(void)
+{
+ printf("CThingSayer::CThingSayer: I am!\n");
+ szWhatToSay = (const char*)NULL;
+}
+
+CThingSayer::~CThingSayer(void)
+{
+ printf("CThingSayer::~CThingSayer: I cease to be\n");
+ if (szWhatToSay)
+ {
+ printf("CThingSayer::~CThingSayer: I will never say '%s' again\n",
+ szWhatToSay);
+ }
+ szWhatToSay = (const char*)NULL;
+}
+
+void CThingSayer::Initialize(const char *czSayThis)
+{
+ printf("CThingSayer::Initialize: When told, I will say '%s'\n",
+ czSayThis);
+ szWhatToSay = czSayThis;
+}
+
+void CThingSayer::SayThing(void)
+{
+ printf("CThingSayer::SayThing: I am now saying '%s'\n", szWhatToSay);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ // We should see the message from constructor, CThingSayer::CThingSayer(),
+ // BEFORE we see the following messages. That is proof that the
+ // C++ static initializer is working
+
+ printf("main: Started. MyThingSayer should already exist\n");
+
+ // Tell MyThingSayer that "Hello, World!" is the string to be said
+
+ printf("main: Calling MyThingSayer.Initialize\n");;
+ MyThingSayer.Initialize("Hello, World!");
+
+ // Tell MyThingSayer to say the thing we told it to say
+
+ printf("main: Calling MyThingSayer.SayThing\n");;
+ MyThingSayer.SayThing();
+
+ // We are finished, return. We should see the message from the
+ // destructor, CThingSayer::~CThingSayer(), AFTER we see the following
+ // message. That is proof that the C++ static destructor logic
+ // is working
+
+ printf("main: Returning. MyThingSayer should be destroyed\n");;
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/hello++/hello++4.cpp b/apps/examples/nxflat/tests/hello++/hello++4.cpp
new file mode 100644
index 000000000..97d026093
--- /dev/null
+++ b/apps/examples/nxflat/tests/hello++/hello++4.cpp
@@ -0,0 +1,150 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/nxflat/tests/hello++/hello++4.c
+//
+// Copyright (C) 2009 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+//
+// 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.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an excessively complex version of "Hello, World" design to
+// illustrate some basic properties of C++:
+//
+// - Building a C++ program
+// - Streams / statically linked libstdc++
+// - Static constructor and destructors (in main program only)
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+#include <iostream>
+
+#ifndef NULL
+# define NULL ((void*)0L)
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// Classes
+/////////////////////////////////////////////////////////////////////////////
+
+using namespace std;
+
+// A hello world sayer class
+
+class CThingSayer
+{
+ const char *szWhatToSay;
+public:
+ CThingSayer(void);
+ virtual ~CThingSayer(void);
+ virtual void Initialize(const char *czSayThis);
+ virtual void SayThing(void);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Private Data
+/////////////////////////////////////////////////////////////////////////////
+
+// A static instance of the CThingSayer class. This instance MUST
+// be constructed by the system BEFORE the program is started at
+// main() and must be destructed by the system AFTER the main()
+// returns to the system
+
+static CThingSayer MyThingSayer;
+
+/////////////////////////////////////////////////////////////////////////////
+// Method Implementations
+/////////////////////////////////////////////////////////////////////////////
+
+// These are implementations of the methods of the CThingSayer class
+
+CThingSayer::CThingSayer(void)
+{
+ cout << "CThingSayer::CThingSayer: I am!" << endl;
+ szWhatToSay = (const char*)NULL;
+}
+
+CThingSayer::~CThingSayer(void)
+{
+ cout << "CThingSayer::~CThingSayer: I cease to be" << endl;
+ if (szWhatToSay)
+ {
+ cout << "CThingSayer::~CThingSayer: I will never say '"
+ << szWhatToSay << "' again" << endl;
+ }
+ szWhatToSay = (const char*)NULL;
+}
+
+void CThingSayer::Initialize(const char *czSayThis)
+{
+ cout << "CThingSayer::Initialize: When told, I will say '"
+ << czSayThis << "'" << endl;
+ szWhatToSay = czSayThis;
+}
+
+void CThingSayer::SayThing(void)
+{
+ cout << "CThingSayer::SayThing: I am now saying '"
+ << szWhatToSay << "'" << endl;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ // We should see the message from constructor, CThingSayer::CThingSayer(),
+ // BEFORE we see the following messages. That is proof that the
+ // C++ static initializer is working
+
+ cout << "main: Started" << endl;
+
+ // Tell MyThingSayer that "Hello, World!" is the string to be said
+
+ cout << "main: Calling MyThingSayer.Initialize" << endl;
+ MyThingSayer.Initialize("Hello, World!");
+
+ // Tell MyThingSayer to say the thing we told it to say
+
+ cout << "main: Calling MyThingSayer.SayThing" << endl;
+ MyThingSayer.SayThing();
+
+ // We are finished, return. We should see the message from the
+ // destructor, CThingSayer::~CThingSayer(), AFTER we see the following
+ // message. That is proof that the C++ static destructor logic
+ // is working
+
+ cout << "main: Returning" << endl;
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/hello/Makefile b/apps/examples/nxflat/tests/hello/Makefile
new file mode 100644
index 000000000..ccde7a98f
--- /dev/null
+++ b/apps/examples/nxflat/tests/hello/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/nxflat/tests/hello/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = hello
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
diff --git a/apps/examples/nxflat/tests/hello/hello.c b/apps/examples/nxflat/tests/hello/hello.c
new file mode 100644
index 000000000..028bdfe00
--- /dev/null
+++ b/apps/examples/nxflat/tests/hello/hello.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * examples/nxflat/tests/hello/hello.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ int i;
+
+ /* Mandatory "Hello, world!" */
+
+ puts("Getting ready to say \"Hello, world\"\n");
+ printf("Hello, world!\n");
+ puts("It has been said.\n");
+
+ /* Print arguments */
+
+ printf("argc\t= %d\n", argc);
+ printf("argv\t= 0x%p\n", argv);
+
+ for (i = 0; i < argc; i++)
+ {
+ printf("argv[%d]\t= ", i);
+ if (argv[i])
+ {
+ printf("(0x%p) \"%s\"\n", argv[i], argv[i]);
+ }
+ else
+ {
+ printf("NULL?\n");
+ }
+ }
+
+ printf("argv[%d]\t= 0x%p\n", argc, argv[argc]);
+ printf("Goodbye, world!\n");
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/longjmp/Makefile b/apps/examples/nxflat/tests/longjmp/Makefile
new file mode 100644
index 000000000..d0c93ebbd
--- /dev/null
+++ b/apps/examples/nxflat/tests/longjmp/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/nxflat/tests/longjmp/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = longjmp
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
diff --git a/apps/examples/nxflat/tests/longjmp/longjmp.c b/apps/examples/nxflat/tests/longjmp/longjmp.c
new file mode 100644
index 000000000..b5b317d99
--- /dev/null
+++ b/apps/examples/nxflat/tests/longjmp/longjmp.c
@@ -0,0 +1,128 @@
+/****************************************************************************
+ * examples/nxflat/tests/longjmp/longjmp.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <setjmp.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define MAIN_VAL 47
+#define FUNC_VAL 92
+#define LEAF_VAL 163
+
+#define FUNCTION_ARG MAIN_VAL
+#define LEAF_ARG (FUNCTION_ARG + FUNC_VAL)
+#define SETJMP_RETURN (LEAF_ARG + LEAF_VAL)
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static jmp_buf env;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static int leaf(int *some_arg)
+{
+ int some_local_variable = *some_arg + LEAF_VAL;
+
+ printf("leaf: received %d\n", *some_arg);
+
+ if (*some_arg != LEAF_ARG)
+ printf("leaf: ERROR: expected %d\n", LEAF_ARG);
+
+ printf("leaf: Calling longjmp() with %d\n", some_local_variable);
+
+ longjmp(env, some_local_variable);
+}
+
+static int function(int some_arg)
+{
+ int some_local_variable = some_arg + FUNC_VAL;
+ int retval;
+
+ printf("function: received %d\n", some_arg);
+
+ if (some_arg != FUNCTION_ARG)
+ printf("function: ERROR: expected %d\n", FUNCTION_ARG);
+
+ printf("function: Calling leaf() with %d\n", some_local_variable);
+
+ retval = leaf(&some_local_variable);
+
+ printf("function: ERROR -- leaf returned!\n");
+ return retval;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ int value;
+
+ printf("main: Calling setjmp\n");
+ value = setjmp(env);
+ printf("main: setjmp returned %d\n", value);
+
+ if (value == 0)
+ {
+ printf("main: Normal setjmp return\n");
+ printf("main: Calling function with %d\n", MAIN_VAL);
+ function(MAIN_VAL);
+ printf("main: ERROR -- function returned!\n");
+ return 1;
+ }
+ else if (value != SETJMP_RETURN)
+ {
+ printf("main: ERROR: Expected %d\n", SETJMP_RETURN);
+ return 1;
+ }
+ else
+ {
+ printf("main: SUCCESS: setjmp return from longjmp call\n");
+ return 0;
+ }
+}
+
diff --git a/apps/examples/nxflat/tests/mkdirlist.sh b/apps/examples/nxflat/tests/mkdirlist.sh
new file mode 100755
index 000000000..cc55ac0b5
--- /dev/null
+++ b/apps/examples/nxflat/tests/mkdirlist.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+usage="Usage: %0 <romfs-dir-path>"
+
+dir=$1
+if [ -z "$dir" ]; then
+ echo "ERROR: Missing <romfs-dir-path>"
+ echo ""
+ echo $usage
+ exit 1
+fi
+
+if [ ! -d "$dir" ]; then
+ echo "ERROR: Directory $dir does not exist"
+ echo ""
+ echo $usage
+ exit 1
+fi
+
+echo "#ifndef __EXAMPLES_NXFLAT_TESTS_DIRLIST_H"
+echo "#define __EXAMPLES_NXFLAT_TESTS_DIRLIST_H"
+echo ""
+echo "static const char *dirlist[] ="
+echo "{"
+
+for file in `ls $dir`; do
+ echo " \"$file\","
+done
+
+echo " NULL"
+echo "};"
+echo ""
+echo "#endif /* __EXAMPLES_NXFLAT_TESTS_DIRLIST_H */"
+
+
diff --git a/apps/examples/nxflat/tests/mksymtab.sh b/apps/examples/nxflat/tests/mksymtab.sh
new file mode 100755
index 000000000..611d3a87a
--- /dev/null
+++ b/apps/examples/nxflat/tests/mksymtab.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+usage="Usage: %0 <test-dir-path>"
+
+dir=$1
+if [ -z "$dir" ]; then
+ echo "ERROR: Missing <test-dir-path>"
+ echo ""
+ echo $usage
+ exit 1
+fi
+
+if [ ! -d "$dir" ]; then
+ echo "ERROR: Directory $dir does not exist"
+ echo ""
+ echo $usage
+ exit 1
+fi
+
+varlist=`find $dir -name "*-thunk.S"| xargs grep -h asciz | cut -f3 | sort | uniq`
+
+echo "#ifndef __EXAMPLES_NXFLAT_TESTS_SYMTAB_H"
+echo "#define __EXAMPLES_NXFLAT_TESTS_SYMTAB_H"
+echo ""
+echo "#include <nuttx/symtab.h>"
+echo ""
+echo "static const struct symtab_s exports[] = "
+echo "{"
+
+for string in $varlist; do
+ var=`echo $string | sed -e "s/\"//g"`
+ echo " {$string, $var},"
+done
+
+echo "};"
+echo "#define NEXPORTS (sizeof(exports)/sizeof(struct symtab_s))"
+echo ""
+echo "#endif /* __EXAMPLES_NXFLAT_TESTS_SYMTAB_H */"
+
diff --git a/apps/examples/nxflat/tests/mutex/Makefile b/apps/examples/nxflat/tests/mutex/Makefile
new file mode 100644
index 000000000..8c9fbb4a3
--- /dev/null
+++ b/apps/examples/nxflat/tests/mutex/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/nxflat/tests/mutex/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = mutex
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
diff --git a/apps/examples/nxflat/tests/mutex/mutex.c b/apps/examples/nxflat/tests/mutex/mutex.c
new file mode 100644
index 000000000..78a63306d
--- /dev/null
+++ b/apps/examples/nxflat/tests/mutex/mutex.c
@@ -0,0 +1,149 @@
+/****************************************************************************
+ * examples/nxflat/tests/mutex/mutex.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static pthread_mutex_t mut;
+static volatile int my_mutex = 0;
+static unsigned long nloops[2] = {0, 0};
+static unsigned long nerrors[2] = {0, 0};
+static volatile bool bendoftest;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/* NOTE: it is necessary for functions that are referred to by function pointers
+ * pointer to be declared with global scope (at least for ARM). Otherwise,
+ * a relocation type that is not supported by NXFLAT is generated by GCC.
+ */
+
+void thread_func(void *parameter)
+{
+ int my_id = (int)parameter;
+ int my_ndx = my_id - 1;
+ int i;
+
+ /* Loop 20 times. There is a 100 MS delay in the loop so this should
+ * take about 2 seconds. The main thread will stop this thread after
+ * 2 seconds by setting bendoftest in any event.
+ */
+
+ for (i = 0; i < 20 && !bendoftest; i++);
+ {
+ if ((pthread_mutex_lock(&mut)) != 0)
+ {
+ printf("ERROR thread %d: pthread_mutex_lock failed\n", my_id);
+ }
+
+ if (my_mutex == 1)
+ {
+ printf("ERROR thread=%d: "
+ "my_mutex should be zero, instead my_mutex=%d\n",
+ my_id, my_mutex);
+ nerrors[my_ndx]++;
+ }
+
+ my_mutex = 1;
+ usleep(100000);
+ my_mutex = 0;
+
+ if ((pthread_mutex_unlock(&mut)) != 0)
+ {
+ printf("ERROR thread %d: pthread_mutex_unlock failed\n", my_id);
+ }
+
+ nloops[my_ndx]++;
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ pthread_t thread1;
+ pthread_t thread2;
+
+ /* Initialize the mutex */
+
+ pthread_mutex_init(&mut, NULL);
+
+ /* Start two thread instances */
+
+ printf("Starting thread 1\n");
+ bendoftest = false;
+ if ((pthread_create(&thread1, NULL, (void*)thread_func, (void*)1)) != 0)
+ {
+ fprintf(stderr, "Error in thread#1 creation\n");
+ }
+
+ printf("Starting thread 2\n");
+ if ((pthread_create(&thread2, NULL, (void*)thread_func, (void*)2)) != 0)
+ {
+ fprintf(stderr, "Error in thread#2 creation\n");
+ }
+
+ /* Wait a bit for the threads to do their thing. */
+
+ sleep(2);
+
+ /* Then ask them politely to stop running */
+
+ printf("Stopping threads\n");
+ bendoftest = true;
+ pthread_join(thread1, NULL);
+ pthread_join(thread2, NULL);
+
+ printf("\tThread1\tThread2\n");
+ printf("Loops\t%ld\t%ld\n", nloops[0], nloops[1]);
+ printf("Errors\t%ld\t%ld\n", nerrors[0], nerrors[1]);
+
+ return 0;
+}
+
diff --git a/apps/examples/nxflat/tests/pthread/Makefile b/apps/examples/nxflat/tests/pthread/Makefile
new file mode 100644
index 000000000..27da42e7c
--- /dev/null
+++ b/apps/examples/nxflat/tests/pthread/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/nxflat/tests/pthread/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = pthread
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
diff --git a/apps/examples/nxflat/tests/pthread/pthread.c b/apps/examples/nxflat/tests/pthread/pthread.c
new file mode 100644
index 000000000..019ec453e
--- /dev/null
+++ b/apps/examples/nxflat/tests/pthread/pthread.c
@@ -0,0 +1,143 @@
+/****************************************************************************
+ * examples/nxflat/tests/pthread/pthread.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define CHILD_ARG ((void*)0x12345678)
+#define CHILD_RET ((void*)0x87654321)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+enum exit_values_e
+{
+ TESTRESULT_SUCCESS = 0,
+ TESTRESULT_PTHREAD_ATTR_INIT_FAIL,
+ TESTRESULT_PTHREAD_CREATE_FAIL,
+ TESTRESULT_PTHREAD_JOIN_FAIL,
+ TESTRESULT_CHILD_ARG_FAIL,
+ TESTRESULT_CHILD_RETVAL_FAIL,
+};
+
+/****************************************************************************
+ * External Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/* NOTE: it is necessary for functions that are referred to by function pointers
+ * pointer to be declared with global scope (at least for ARM). Otherwise,
+ * a relocation type that is not supported by NXFLAT is generated by GCC.
+ */
+
+void *child_start_routine(void *arg)
+{
+ printf("CHILD: started with arg=%d\n", (int)arg);
+
+ if (arg != CHILD_ARG)
+ {
+ printf("CHILD: expected arg=%d\n", (int)CHILD_ARG);
+ return (void*)TESTRESULT_CHILD_ARG_FAIL;
+ }
+ sleep(2);
+
+ printf("CHILD: returning %d\n", (int)CHILD_RET);
+ pthread_exit(CHILD_RET);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ pthread_attr_t attr;
+ pthread_t thread;
+ void *retval;
+ int status;
+
+ puts("PARENT: started\n");
+
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("PARENT: pthread_attr_init() returned %d\n", status);
+ exit(TESTRESULT_PTHREAD_ATTR_INIT_FAIL);
+ }
+
+ printf("PARENT: calling pthread_start with arg=%d\n", (int)CHILD_ARG);
+ status = pthread_create(&thread, &attr, child_start_routine, CHILD_ARG);
+ if (status != 0)
+ {
+ printf("PARENT: pthread_create() returned %d\n", status);
+ exit(TESTRESULT_PTHREAD_CREATE_FAIL);
+ }
+
+ status = pthread_join(thread, &retval);
+ if (status != 0)
+ {
+ printf("PARENT pthread_join() returned %d\n", status);
+
+ exit(TESTRESULT_PTHREAD_JOIN_FAIL);
+ }
+
+ printf("PARENT child exitted with %d\n", (int)retval);
+ if (retval != CHILD_RET)
+ {
+ printf("PARENT child thread did not exit with %d\n", (int)CHILD_RET);
+ exit(TESTRESULT_CHILD_RETVAL_FAIL);
+ }
+
+ puts("PARENT returning success\n");
+ return TESTRESULT_SUCCESS;
+}
diff --git a/apps/examples/nxflat/tests/signal/Makefile b/apps/examples/nxflat/tests/signal/Makefile
new file mode 100644
index 000000000..d967fbf09
--- /dev/null
+++ b/apps/examples/nxflat/tests/signal/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/nxflat/tests/signal/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = signal
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
diff --git a/apps/examples/nxflat/tests/signal/signal.c b/apps/examples/nxflat/tests/signal/signal.c
new file mode 100644
index 000000000..ff1c58305
--- /dev/null
+++ b/apps/examples/nxflat/tests/signal/signal.c
@@ -0,0 +1,308 @@
+/****************************************************************************
+ * examples/nxflat/tests/signal/signal.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define USEC_PER_MSEC 1000
+#define MSEC_PER_SEC 1000
+#define USEC_PER_SEC (USEC_PER_MSEC * MSEC_PER_SEC)
+#define SHORT_DELAY (USEC_PER_SEC / 3)
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static int sigusr1_rcvd = 0;
+static int sigusr2_rcvd = 0;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: sigusr1_sighandler
+ ****************************************************************************/
+
+/* NOTE: it is necessary for functions that are referred to by function pointers
+ * pointer to be declared with global scope (at least for ARM). Otherwise,
+ * a relocation type that is not supported by NXFLAT is generated by GCC.
+ */
+
+void sigusr1_sighandler(int signo)
+{
+ printf("sigusr1_sighandler: Received SIGUSR1, signo=%d\n", signo);
+ sigusr1_rcvd = 1;
+}
+
+/****************************************************************************
+ * Name: sigusr2_sigaction
+ ***************************************************************************/
+
+/* NOTE: it is necessary for functions that are referred to by function pointers
+ * pointer to be declared with global scope (at least for ARM). Otherwise,
+ * a relocation type that is not supported by NXFLAT is generated by GCC.
+ */
+
+#ifdef __USE_POSIX199309
+void sigusr2_sigaction(int signo, siginfo_t *siginfo, void *arg)
+{
+ printf("sigusr2_sigaction: Received SIGUSR2, signo=%d siginfo=%p arg=%p\n",
+ signo, siginfo, arg);
+
+#ifdef HAVE_SIGQUEUE
+ if (siginfo)
+ {
+ printf(" si_signo = %d\n", siginfo->si_signo);
+ printf(" si_errno = %d\n", siginfo->si_errno);
+ printf(" si_code = %d\n", siginfo->si_code);
+ printf(" si_pid = %d\n", siginfo->si_pid);
+ printf(" si_uid = %d\n", siginfo->si_uid);
+ printf(" si_status = %d\n", siginfo->si_status);
+ printf(" si_utime = %ld\n", (long)siginfo->si_utime);
+ printf(" si_stime = %ld\n", (long)siginfo->si_stime);
+ printf(" si_value = %d\n", siginfo->si_value.sival_int);
+ printf(" si_int = %d\n", siginfo->si_int);
+ printf(" si_ptr = %p\n", siginfo->si_ptr);
+ printf(" si_addr = %p\n", siginfo->si_addr);
+ printf(" si_band = %ld\n", siginfo->si_band);
+ printf(" si_fd = %d\n", siginfo->si_fd);
+ }
+#endif
+ sigusr2_rcvd = 1;
+}
+#else
+void sigusr2_sigaction(int signo)
+{
+ printf("sigusr2_sigaction: Received SIGUSR2, signo=%d\n", signo);
+ sigusr2_rcvd = 1;
+}
+
+#endif
+
+/****************************************************************************
+ * Name: sigusr2_sighandler
+ ****************************************************************************/
+
+static void sigusr2_sighandler(int signo)
+{
+ printf("sigusr2_sighandler: Received SIGUSR2, signo=%d\n", signo);
+ sigusr2_rcvd = 1;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: main
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ struct sigaction act;
+ struct sigaction oact;
+ void (*old_sigusr1_sighandler)(int signo);
+ void (*old_sigusr2_sighandler)(int signo);
+ pid_t mypid = getpid();
+#if defined(__USE_POSIX199309) && defined(HAVE_SIGQUEUE)
+ sigval_t sigval;
+#endif
+ int status;
+
+ printf("Setting up signal handlers from pid=%d\n", mypid);
+
+ /* Set up so that sigusr1_sighandler will respond to SIGUSR1 */
+
+ old_sigusr1_sighandler = signal(SIGUSR1, sigusr1_sighandler);
+ if (old_sigusr1_sighandler == SIG_ERR)
+ {
+ fprintf(stderr, "Failed to install SIGUSR1 handler, errno=%d\n",
+ errno);
+ exit(1);
+ }
+
+ printf("Old SIGUSR1 sighandler at %p\n", old_sigusr1_sighandler);
+ printf("New SIGUSR1 sighandler at %p\n", sigusr1_sighandler);
+
+ /* Set up so that sigusr2_sigaction will respond to SIGUSR2 */
+
+ memset(&act, 0, sizeof(struct sigaction));
+ act.sa_sigaction = sigusr2_sigaction;
+ act.sa_flags = SA_SIGINFO;
+
+ (void)sigemptyset(&act.sa_mask);
+
+ status = sigaction(SIGUSR2, &act, &oact);
+ if (status != 0)
+ {
+ fprintf(stderr, "Failed to install SIGUSR2 handler, errno=%d\n",
+ errno);
+ exit(2);
+ }
+
+ printf("Old SIGUSR2 sighandler at %p\n", oact.sa_handler);
+ printf("New SIGUSR2 sighandler at %p\n", sigusr2_sigaction);
+ printf("Raising SIGUSR1 from pid=%d\n", mypid);
+
+ fflush(stdout); usleep(SHORT_DELAY);
+
+ /* Send SIGUSR1 to ourselves via raise() */
+
+ status = raise(SIGUSR1);
+ if (status != 0)
+ {
+ fprintf(stderr, "Failed to raise SIGUSR1, errno=%d\n", errno);
+ exit(3);
+ }
+
+ usleep(SHORT_DELAY);
+ printf("SIGUSR1 raised from pid=%d\n", mypid);
+
+ /* Verify that we received SIGUSR1 */
+
+ if (sigusr1_rcvd == 0)
+ {
+ fprintf(stderr, "SIGUSR1 not received\n");
+ exit(4);
+ }
+ sigusr1_rcvd = 0;
+
+ /* Send SIGUSR2 to ourselves */
+
+ printf("Killing SIGUSR2 from pid=%d\n", mypid);
+ fflush(stdout); usleep(SHORT_DELAY);
+
+#if defined(__USE_POSIX199309) && defined(HAVE_SIGQUEUE)
+ /* Send SIGUSR2 to ourselves via sigqueue() */
+
+ sigval.sival_int = 87;
+ status = sigqueue(mypid, SIGUSR2, sigval);
+ if (status != 0)
+ {
+ fprintf(stderr, "Failed to queue SIGUSR2, errno=%d\n", errno);
+ exit(5);
+ }
+
+ usleep(SHORT_DELAY);
+ printf("SIGUSR2 queued from pid=%d, sigval=97\n", mypid);
+#else
+ /* Send SIGUSR2 to ourselves via kill() */
+
+ status = kill(mypid, SIGUSR2);
+ if (status != 0)
+ {
+ fprintf(stderr, "Failed to kill SIGUSR2, errno=%d\n", errno);
+ exit(5);
+ }
+
+ usleep(SHORT_DELAY);
+ printf("SIGUSR2 killed from pid=%d\n", mypid);
+#endif
+ /* Verify that SIGUSR2 was received */
+
+ if (sigusr2_rcvd == 0)
+ {
+ fprintf(stderr, "SIGUSR2 not received\n");
+ exit(6);
+ }
+ sigusr2_rcvd = 0;
+
+ /* Remove the sigusr2_sigaction handler and replace the SIGUSR2
+ * handler with sigusr2_sighandler.
+ */
+
+ printf("Resetting SIGUSR2 signal handler from pid=%d\n", mypid);
+
+ old_sigusr2_sighandler = signal(SIGUSR2, sigusr2_sighandler);
+ if (old_sigusr2_sighandler == SIG_ERR)
+ {
+ fprintf(stderr, "Failed to install SIGUSR2 handler, errno=%d\n",
+ errno);
+ exit(7);
+ }
+
+ printf("Old SIGUSR2 sighandler at %p\n", old_sigusr2_sighandler);
+ printf("New SIGUSR2 sighandler at %p\n", sigusr2_sighandler);
+
+ /* Verify that the handler that was removed was sigusr2_sigaction */
+
+ if ((void*)old_sigusr2_sighandler != (void*)sigusr2_sigaction)
+ {
+ fprintf(stderr,
+ "Old SIGUSR2 signhanlder (%p) is not sigusr2_sigation (%p)\n",
+ old_sigusr2_sighandler, sigusr2_sigaction);
+ exit(8);
+ }
+
+ /* Send SIGUSR2 to ourselves via kill() */
+
+ printf("Killing SIGUSR2 from pid=%d\n", mypid);
+ fflush(stdout); usleep(SHORT_DELAY);
+
+ status = kill(mypid, SIGUSR2);
+ if (status != 0)
+ {
+ fprintf(stderr, "Failed to kill SIGUSR2, errno=%d\n", errno);
+ exit(9);
+ }
+
+ usleep(SHORT_DELAY);
+ printf("SIGUSR2 killed from pid=%d\n", mypid);
+
+ /* Verify that SIGUSR2 was received */
+
+ if (sigusr2_rcvd == 0)
+ {
+ fprintf(stderr, "SIGUSR2 not received\n");
+ exit(10);
+ }
+ sigusr2_rcvd = 0;
+
+ return 0;
+}
diff --git a/apps/examples/nxflat/tests/struct/Makefile b/apps/examples/nxflat/tests/struct/Makefile
new file mode 100644
index 000000000..7a5f3fb82
--- /dev/null
+++ b/apps/examples/nxflat/tests/struct/Makefile
@@ -0,0 +1,80 @@
+############################################################################
+# examples/nxflat/tests/hello/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+CFLAGS += -I.
+
+BIN = struct
+
+R1SRCS = struct_main.c struct_dummy.c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
diff --git a/apps/examples/nxflat/tests/struct/struct.h b/apps/examples/nxflat/tests/struct/struct.h
new file mode 100644
index 000000000..0b1747d8c
--- /dev/null
+++ b/apps/examples/nxflat/tests/struct/struct.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+ * examples/nxflat/tests/struct/struct.h
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_NXFLAT_TESTS_STRUCT_STRUCT_H
+#define __EXAMPLES_NXFLAT_TESTS_STRUCT_STRUCT_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define DUMMY_SCALAR_VALUE1 42
+#define DUMMY_SCALAR_VALUE2 87
+#define DUMMY_SCALAR_VALUE3 117
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+typedef void (*dummy_t)(void);
+
+struct struct_dummy_s
+{
+ int n; /* This is a simple scalar value (DUMMY_SCALAR_VALUE3) */
+};
+
+struct struct_s
+{
+ int n; /* This is a simple scalar value (DUMMY_SCALAR_VALUE1) */
+ const int *pn; /* This is a pointer to a simple scalar value */
+ const struct struct_dummy_s *ps; /* This is a pointer to a structure */
+ dummy_t pf; /* This is a pointer to a function */
+};
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+extern int dummy_scalar; /* (DUMMY_SCALAR_VALUE2) */
+extern const struct struct_dummy_s dummy_struct;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+extern void dummyfunc(void);
+extern const struct struct_s *getstruct(void);
+
+#endif /* __EXAMPLES_NXFLAT_TESTS_STRUCT_STRUCT_H */
+
+
diff --git a/apps/examples/nxflat/tests/struct/struct_dummy.c b/apps/examples/nxflat/tests/struct/struct_dummy.c
new file mode 100644
index 000000000..7f0be6a1f
--- /dev/null
+++ b/apps/examples/nxflat/tests/struct/struct_dummy.c
@@ -0,0 +1,65 @@
+/****************************************************************************
+ * examples/nxflat/tests/struct/struct_dummy.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+
+#include "struct.h"
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+const struct struct_s dummy =
+{
+ DUMMY_SCALAR_VALUE1,
+ &dummy_scalar,
+ &dummy_struct,
+ (dummy_t)dummyfunc
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+const struct struct_s *getstruct(void)
+{
+ return &dummy;
+}
+
diff --git a/apps/examples/nxflat/tests/struct/struct_main.c b/apps/examples/nxflat/tests/struct/struct_main.c
new file mode 100644
index 000000000..d82cdd706
--- /dev/null
+++ b/apps/examples/nxflat/tests/struct/struct_main.c
@@ -0,0 +1,109 @@
+/****************************************************************************
+ * examples/nxflat/tests/struct/struct_main.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+
+#include "struct.h"
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+const struct struct_dummy_s dummy_struct =
+{
+ DUMMY_SCALAR_VALUE3
+};
+
+int dummy_scalar = DUMMY_SCALAR_VALUE2;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ const struct struct_s *mystruct = getstruct();
+
+ printf("Calling getstruct()\n");
+ mystruct = getstruct();
+ printf("getstruct returned %p\n", mystruct);
+ printf(" n = %d (vs %d) %s\n",
+ mystruct->n, DUMMY_SCALAR_VALUE1,
+ mystruct->n == DUMMY_SCALAR_VALUE1 ? "PASS" : "FAIL");
+
+ printf(" pn = %p (vs %p) %s\n",
+ mystruct->pn, &dummy_scalar,
+ mystruct->pn == &dummy_scalar ? "PASS" : "FAIL");
+ if (mystruct->pn == &dummy_scalar)
+ {
+ printf(" *pn = %d (vs %d) %s\n",
+ *mystruct->pn, DUMMY_SCALAR_VALUE2,
+ *mystruct->pn == DUMMY_SCALAR_VALUE2 ? "PASS" : "FAIL");
+ }
+
+ printf(" ps = %p (vs %p) %s\n",
+ mystruct->ps, &dummy_struct,
+ mystruct->ps == &dummy_struct ? "PASS" : "FAIL");
+ if (mystruct->ps == &dummy_struct)
+ {
+ printf(" ps->n = %d (vs %d) %s\n",
+ mystruct->ps->n, DUMMY_SCALAR_VALUE3,
+ mystruct->ps->n == DUMMY_SCALAR_VALUE3 ? "PASS" : "FAIL");
+ }
+
+ printf(" pf = %p (vs %p) %s\n",
+ mystruct->pf, dummyfunc,
+ mystruct->pf == dummyfunc ? "PASS" : "FAIL");
+ if (mystruct->pf == dummyfunc)
+ {
+ printf("Calling mystruct->pf()\n");
+ mystruct->pf();
+ }
+
+ printf("Exit-ing\n");
+ return 0;
+}
+
+void dummyfunc(void)
+{
+ printf("In dummyfunc() -- PASS\n");
+}
+
+
diff --git a/apps/examples/nxflat/tests/task/Makefile b/apps/examples/nxflat/tests/task/Makefile
new file mode 100644
index 000000000..0881d4717
--- /dev/null
+++ b/apps/examples/nxflat/tests/task/Makefile
@@ -0,0 +1,79 @@
+############################################################################
+# examples/nxflat/tests/task/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = task
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -D $(BIN) $(ROMFS_DIR)/$(BIN)
+
+
diff --git a/apps/examples/nxflat/tests/task/task.c b/apps/examples/nxflat/tests/task/task.c
new file mode 100644
index 000000000..63e8188ed
--- /dev/null
+++ b/apps/examples/nxflat/tests/task/task.c
@@ -0,0 +1,143 @@
+/****************************************************************************
+ * examples/nxflat/tests/task/parent.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sched.h>
+#include <semaphore.h>
+#include <errno.h>
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static char child_name[] = "child";
+static char child_arg[] = "Hello from your parent!";
+static sem_t g_sem;
+
+#if CONFIG_TASK_NAME_SIZE == 0
+static char no_name[] = "<noname>";
+#endif
+
+/****************************************************************************
+ * Privite Functions
+ ****************************************************************************/
+
+/* NOTE: it is necessary for functions that are referred to by function pointers
+ * pointer to be declared with global scope (at least for ARM). Otherwise,
+ * a relocation type that is not supported by NXFLAT is generated by GCC.
+ */
+
+ int child_task(int argc, char **argv)
+{
+ printf("Child: execv was successful!\n");
+ printf("Child: argc=%d\n", argc);
+
+ if (argc != 2)
+ {
+ printf("Child: expected argc to be 2\n");
+ printf("Child: Exit-ting with status=2\n");
+ exit(2);
+ }
+ printf("Child: argv[0]=\"%s\"\n", argv[0]);
+
+#if CONFIG_TASK_NAME_SIZE == 0
+ if (strcmp(argv[0], no_name) != 0)
+ {
+ printf("Child: expected argv[0] to be \"%s\"\n", no_name);
+ printf("Child: Exit-ting with status=3\n");
+ exit(3);
+ }
+#else
+ if (strncmp(argv[0], child_name, CONFIG_TASK_NAME_SIZE) != 0)
+ {
+ printf("Child: expected argv[0] to be \"%s\"\n", child_name);
+ printf("Child: Exit-ting with status=3\n");
+ exit(3);
+ }
+#endif
+
+ printf("Child: argv[1]=\"%s\"\n", argv[1]);
+
+ if (strcmp(argv[1], child_arg) != 0)
+ {
+ printf("Child: expected argv[1] to be \"%s\"\n", child_arg);
+ printf("Child: Exit-ting with status=4\n");
+ exit(4);
+ }
+
+ printf("Child: Exit-ting with status=0\n");
+ sem_post(&g_sem);
+ return 0;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char **argv)
+{
+ pid_t parent_pid = getpid();
+ char *child_argv[2];
+ pid_t child_pid;
+
+ printf("Parent: Started, pid=%d\n", parent_pid);
+
+ sem_init(&g_sem, 0, 0);
+
+ printf("Parent: Calling task_create()\n");
+
+ child_argv[0] = child_arg;
+ child_argv[1] = 0;
+ child_pid = task_create(child_name, 50, 512, child_task, (const char**)child_argv);
+ if (child_pid < 0)
+ {
+ printf("Parent: task_create failed: %d\n", errno);
+ }
+
+ printf("Parent: Waiting for child (pid=%d)\n", child_pid);
+ sem_wait(&g_sem);
+ printf("Parent: Exit-ing\n");
+ sem_destroy(&g_sem);
+ return 0;
+}
+
diff --git a/apps/examples/ostest/Makefile b/apps/examples/ostest/Makefile
new file mode 100644
index 000000000..0e50db434
--- /dev/null
+++ b/apps/examples/ostest/Makefile
@@ -0,0 +1,130 @@
+############################################################################
+# apps/examples/ostest/Makefile
+#
+# Copyright (C) 2007-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# NuttX OS Test
+
+ASRCS =
+CSRCS = main.c dev_null.c
+
+ifneq ($(CONFIG_DISABLE_PTHREAD),y)
+CSRCS += cancel.c cond.c mutex.c sem.c barrier.c
+ifneq ($(CONFIG_RR_INTERVAL),0)
+CSRCS += roundrobin.c
+endif # CONFIG_RR_INTERVAL
+ifeq ($(CONFIG_MUTEX_TYPES),y)
+CSRCS += rmutex.c
+endif # CONFIG_MUTEX_TYPES
+endif # CONFIG_DISABLE_PTHREAD
+
+ifneq ($(CONFIG_DISABLE_SIGNALS),y)
+CSRCS += sighand.c
+ifneq ($(CONFIG_DISABLE_PTHREAD),y)
+ifneq ($(CONFIG_DISABLE_CLOCK),y)
+CSRCS += timedwait.c
+endif # CONFIG_DISABLE_CLOCK
+endif # CONFIG_DISABLE_PTHREAD
+endif # CONFIG_DISABLE_SIGNALS
+
+ifneq ($(CONFIG_DISABLE_MQUEUE),y)
+ifneq ($(CONFIG_DISABLE_PTHREAD),y)
+CSRCS += mqueue.c
+ifneq ($(CONFIG_DISABLE_CLOCK),y)
+CSRCS += timedmqueue.c
+endif # CONFIG_DISABLE_CLOCK
+endif # CONFIG_DISABLE_PTHREAD
+endif # CONFIG_DISABLE_MQUEUE
+
+ifneq ($(CONFIG_DISABLE_POSIX_TIMERS),y)
+CSRCS += posixtimer.c
+endif
+
+ifneq ($(CONFIG_DISABLE_SIGNALS),y)
+ifneq ($(CONFIG_DISABLE_PTHREAD),y)
+ifeq ($(CONFIG_PRIORITY_INHERITANCE),y)
+CSRCS += prioinherit.c
+endif # CONFIG_PRIORITY_INHERITANCE
+endif # CONFIG_DISABLE_PTHREAD
+endif # CONFIG_DISABLE_SIGNALS
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/ostest/barrier.c b/apps/examples/ostest/barrier.c
new file mode 100644
index 000000000..c88e1bed1
--- /dev/null
+++ b/apps/examples/ostest/barrier.c
@@ -0,0 +1,200 @@
+/****************************************************************************
+ * examples/ostest/barrier.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include "ostest.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define HALF_SECOND 500000L
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static pthread_barrier_t barrier;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: barrier_func
+ ****************************************************************************/
+
+static void *barrier_func(void *parameter)
+{
+ int id = (int)parameter;
+ int status;
+
+ printf("barrier_func: Thread %d started\n", id);
+#ifndef CONFIG_DISABLE_SIGNALS
+ usleep(HALF_SECOND);
+#endif
+
+ /* Wait at the barrier until all threads are synchronized. */
+
+ printf("barrier_func: Thread %d calling pthread_barrier_wait()\n",
+ id);
+ status = pthread_barrier_wait(&barrier);
+ if (status == 0)
+ {
+ printf("barrier_func: Thread %d, back with "
+ "status=0 (I am not special)\n",
+ id, status);
+ }
+ else if (status == PTHREAD_BARRIER_SERIAL_THREAD)
+ {
+ printf("barrier_func: Thread %d, back with "
+ "status=PTHREAD_BARRIER_SERIAL_THREAD (I AM SPECIAL)\n",
+ id, status);
+ }
+ else
+ {
+ printf("barrier_func: ERROR thread %d could not get semaphore value\n",
+ id);
+ }
+
+#ifndef CONFIG_DISABLE_SIGNALS
+ usleep(HALF_SECOND);
+#endif
+ printf("barrier_func: Thread %d done\n", id);
+ return NULL;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: barrier_test
+ ****************************************************************************/
+
+void barrier_test(void)
+{
+ pthread_t barrier_thread[CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS];
+ pthread_addr_t result;
+ pthread_attr_t attr;
+ pthread_barrierattr_t barrierattr;
+ int status;
+ int i;
+
+ printf("barrier_test: Initializing barrier\n");
+
+ status = pthread_barrierattr_init(&barrierattr);
+ if (status != OK)
+ {
+ printf("barrier_test: pthread_barrierattr_init failed, status=%d\n",
+ status);
+ }
+
+ status = pthread_barrier_init(&barrier, &barrierattr,
+ CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS);
+ if (status != OK)
+ {
+ printf("barrier_test: pthread_barrierattr_init failed, status=%d\n",
+ status);
+ }
+
+ /* Create the barrier */
+
+ status = pthread_barrierattr_init(&barrierattr);
+
+ /* Start CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS thread instances */
+
+ status = pthread_attr_init(&attr);
+ if (status != OK)
+ {
+ printf("barrier_test: pthread_attr_init failed, status=%d\n",
+ status);
+ }
+
+ for (i = 0; i < CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS; i++)
+ {
+ status = pthread_create(&barrier_thread[i], &attr, barrier_func,
+ (pthread_addr_t)i);
+ if (status != 0)
+ {
+ printf("barrier_test: Error in thread %d create, status=%d\n",
+ i, status);
+ }
+ else
+ {
+ printf("barrier_test: Thread %d created\n", i);
+ }
+ }
+
+ /* Wait for all thread instances to complete */
+
+ for (i = 0; i < CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS; i++)
+ {
+ status = pthread_join(barrier_thread[i], &result);
+ if (status != 0)
+ {
+ printf("barrier_test: Error in thread %d join, status=%d\n",
+ i, status);
+ }
+ else
+ {
+ printf("barrier_test: Thread %d completed with result=%p\n",
+ i, result);
+ }
+ }
+
+ /* Destroy the barrier */
+
+ status = pthread_barrier_destroy(&barrier);
+ if (status != OK)
+ {
+ printf("barrier_test: pthread_barrier_destroy failed, status=%d\n",
+ status);
+ }
+
+ status = pthread_barrierattr_destroy(&barrierattr);
+ if (status != OK)
+ {
+ printf("barrier_test: pthread_barrierattr_destroy failed, status=%d\n",
+ status);
+ }
+}
diff --git a/apps/examples/ostest/cancel.c b/apps/examples/ostest/cancel.c
new file mode 100644
index 000000000..bf2d03615
--- /dev/null
+++ b/apps/examples/ostest/cancel.c
@@ -0,0 +1,333 @@
+/***********************************************************************
+ * examples/ostest/cancel.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <time.h>
+#include <pthread.h>
+#include <errno.h>
+#include "ostest.h"
+
+static pthread_mutex_t mutex;
+static pthread_cond_t cond;
+
+static void *thread_waiter(void *parameter)
+{
+ int status;
+
+ /* Take the mutex */
+
+ printf("thread_waiter: Taking mutex\n");
+ status = pthread_mutex_lock(&mutex);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR pthread_mutex_lock failed, status=%d\n", status);
+ }
+
+ printf("thread_waiter: Starting wait for condition\n");
+
+ /* Are we a non-cancelable thread? Yes, set the non-cancelable state */
+
+ if (!parameter)
+ {
+ printf("thread_waiter: Setting non-cancelable\n");
+ status = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR pthread_setcancelstate failed, status=%d\n", status);
+ }
+ }
+
+ /* The wait -- we will never awaken from this. */
+
+ status = pthread_cond_wait(&cond, &mutex);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR pthread_cond_wait failed, status=%d\n", status);
+ }
+
+ /* Release the mutex */
+
+ printf("thread_waiter: Releasing mutex\n");
+ status = pthread_mutex_unlock(&mutex);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR pthread_mutex_unlock failed, status=%d\n", status);
+ }
+
+ /* Set the cancelable state */
+
+ printf("thread_waiter: Setting cancelable\n");
+ status = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR pthread_setcancelstate failed, status=%d\n", status);
+ }
+
+ printf("thread_waiter: Exit with status 0x12345678\n");
+ pthread_exit((pthread_addr_t)0x12345678);
+ return NULL;
+}
+
+static void start_thread(pthread_t *waiter, int cancelable)
+{
+ pthread_attr_t attr;
+ int status;
+
+ /* Initialize the mutex */
+
+ printf("start_thread: Initializing mutex\n");
+ status = pthread_mutex_init(&mutex, NULL);
+ if (status != 0)
+ {
+ printf("start_thread: ERROR pthread_mutex_init failed, status=%d\n", status);
+ }
+
+ /* Initialize the condition variable */
+
+ printf("start_thread: Initializing cond\n");
+ status = pthread_cond_init(&cond, NULL);
+ if (status != 0)
+ {
+ printf("start_thread: ERROR pthread_cond_init failed, status=%d\n", status);
+ }
+
+ /* Set up attributes */
+
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("start_thread: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ status = pthread_attr_setstacksize(&attr, STACKSIZE);
+ if (status != 0)
+ {
+ printf("start_thread: pthread_attr_setstacksize failed, status=%d\n", status);
+ }
+
+ /* Start the waiter thread */
+
+ printf("start_thread: Starting thread\n");
+ status = pthread_create(waiter, &attr, thread_waiter, (pthread_addr_t)cancelable);
+ if (status != 0)
+ {
+ printf("start_thread: ERROR pthread_create failed, status=%d\n", status);
+ }
+
+ /* Make sure that the waiter thread gets a chance to run */
+
+ printf("start_thread: Yielding\n");
+ pthread_yield();
+}
+
+static void restart_thread(pthread_t *waiter, int cancelable)
+{
+ int status;
+
+ /* Destroy the condition variable */
+
+ printf("restart_thread: Destroying cond\n");
+ status = pthread_cond_destroy(&cond);
+ if (status != 0)
+ {
+ printf("restart_thread: ERROR pthread_cond_destroy failed, status=%d\n", status);
+ }
+
+ /* Destroy the mutex */
+
+ printf("restart_thread: Destroying mutex\n");
+ status = pthread_cond_destroy(&cond);
+ if (status != 0)
+ {
+ printf("restart_thread: ERROR pthread_mutex_destroy failed, status=%d\n", status);
+ }
+
+ /* Then restart the thread */
+
+ printf("restart_thread: Re-starting thread\n");
+ start_thread(waiter, cancelable);
+}
+
+void cancel_test(void)
+{
+ pthread_t waiter;
+ void *result;
+ int status;
+
+ /* Test 1: Normal Cancel *********************************************/
+ /* Start the waiter thread */
+
+ printf("cancel_test: Test 1: Normal Cancelation\n");
+ printf("cancel_test: Starting thread\n");
+ start_thread(&waiter, 1);
+
+ /* Then cancel it. It should be in the pthread_cond_wait now */
+
+ printf("cancel_test: Canceling thread\n");
+ status = pthread_cancel(waiter);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_cancel failed, status=%d\n", status);
+ }
+
+ /* Then join to the thread to pick up the result (if we don't do
+ * we will have a memory leak!)
+ */
+
+ printf("cancel_test: Joining\n");
+ status = pthread_join(waiter, &result);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_join failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("cancel_test: waiter exited with result=%p\n", result);
+ if (result != PTHREAD_CANCELED)
+ {
+ printf("cancel_test: ERROR expected result=%p\n", PTHREAD_CANCELED);
+ }
+ else
+ {
+ printf("cancel_test: PASS thread terminated with PTHREAD_CANCELED\n");
+ }
+ }
+
+ /* Test 2: Cancel Detached Thread ************************************/
+
+ printf("cancel_test: Test 2: Cancelation of detached thread\n");
+ printf("cancel_test: Re-starting thread\n");
+ restart_thread(&waiter, 1);
+
+ /* Detach the thread */
+
+ status = pthread_detach(waiter);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_detach, status=%d\n", status);
+ }
+
+ /* Then cancel it. It should be in the pthread_cond_wait now */
+
+ printf("cancel_test: Canceling thread\n");
+ status = pthread_cancel(waiter);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_cancel failed, status=%d\n", status);
+ }
+
+ /* Join should now fail */
+
+ printf("cancel_test: Joining\n");
+ status = pthread_join(waiter, &result);
+ if (status == 0)
+ {
+ printf("cancel_test: ERROR pthread_join succeeded\n");
+ }
+ else if (status != ESRCH)
+ {
+ printf("cancel_test: ERROR pthread_join failed but with wrong status=%d\n", status);
+ }
+ else
+ {
+ printf("cancel_test: PASS pthread_join failed with status=ESRCH\n");
+ }
+
+ /* Test 3: Non-cancelable threads ************************************/
+
+ printf("cancel_test: Test 3: Non-cancelable threads\n");
+ printf("cancel_test: Re-starting thread (non-cancelable)\n");
+ restart_thread(&waiter, 0);
+
+ /* Then cancel it. It should be in the pthread_cond_wait now. The
+ * behavior here is non-standard: when the thread is at a cancelation
+ * point, it should be cancelable, even when cancelation is disable.
+ *
+ * The cancelation should succeed, because the cancelation is pending.
+ */
+
+ printf("cancel_test: Canceling thread\n");
+ status = pthread_cancel(waiter);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_cancel failed, status=%d\n", status);
+ }
+
+ /* Signal the thread. It should wake up and restore the cancelable state.
+ * When the cancelable state is re-enabled, the thread should be canceled.
+ */
+
+ status = pthread_mutex_lock(&mutex);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_mutex_lock failed, status=%d\n", status);
+ }
+
+ status = pthread_cond_signal(&cond);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_cond_signal failed, status=%d\n", status);
+ }
+
+ status = pthread_mutex_unlock(&mutex);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_mutex_unlock failed, status=%d\n", status);
+ }
+
+ /* Then join to the thread to pick up the result (if we don't do
+ * we will have a memory leak!)
+ */
+
+ printf("cancel_test: Joining\n");
+ status = pthread_join(waiter, &result);
+ if (status != 0)
+ {
+ printf("cancel_test: ERROR pthread_join failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("cancel_test: waiter exited with result=%p\n", result);
+ if (result != PTHREAD_CANCELED)
+ {
+ printf("cancel_test: ERROR expected result=%p\n", PTHREAD_CANCELED);
+ }
+ else
+ {
+ printf("cancel_test: PASS thread terminated with PTHREAD_CANCELED\n");
+ }
+ }
+
+}
diff --git a/apps/examples/ostest/cond.c b/apps/examples/ostest/cond.c
new file mode 100644
index 000000000..11191b7d5
--- /dev/null
+++ b/apps/examples/ostest/cond.c
@@ -0,0 +1,294 @@
+/***********************************************************************
+ * cond.c
+ *
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <pthread.h>
+#include <unistd.h>
+#include "ostest.h"
+
+#ifndef NULL
+# define NULL (void*)0
+#endif
+
+static volatile enum { RUNNING, MUTEX_WAIT, COND_WAIT} waiter_state;
+
+static pthread_mutex_t mutex;
+static pthread_cond_t cond;
+static volatile int data_available = 0;
+static int waiter_nloops = 0;
+static int waiter_waits = 0;
+static int waiter_nerrors = 0;
+static int signaler_nloops = 0;
+static int signaler_already = 0;
+static int signaler_state = 0;
+static int signaler_nerrors = 0;
+
+static void *thread_waiter(void *parameter)
+{
+ int status;
+
+ printf("waiter_thread: Started\n");
+
+ for(;;)
+ {
+ /* Take the mutex */
+
+ waiter_state = MUTEX_WAIT;
+ status = pthread_mutex_lock(&mutex);
+ waiter_state = RUNNING;
+
+ if (status != 0)
+ {
+ printf("waiter_thread: ERROR pthread_mutex_lock failed, status=%d\n", status);
+ waiter_nerrors++;
+ }
+
+ /* Check if data is available -- if data is not available then
+ * wait for it
+ */
+
+ if (!data_available)
+ {
+ /* We are higher priority than the signaler thread so the
+ * only time that the signaler thread will have a chance to run is when
+ * we are waiting for the condition variable. In this case, pthread_cond_wait
+ * will automatically release the mutex for the signaler (then re-acquire
+ * the mutex before returning.
+ */
+
+ waiter_state = COND_WAIT;
+ status = pthread_cond_wait(&cond, &mutex);
+ waiter_state = RUNNING;
+
+ if (status != 0)
+ {
+ printf("waiter_thread: ERROR pthread_cond_wait failed, status=%d\n", status);
+ waiter_nerrors++;
+ }
+ waiter_waits++;
+ }
+
+ /* Now data should be available */
+
+ if (!data_available)
+ {
+ printf("waiter_thread: ERROR data not available after wait\n");
+ waiter_nerrors++;
+ }
+
+ /* Clear data available */
+
+ data_available = 0;
+
+ /* Release the mutex */
+
+ status = pthread_mutex_unlock(&mutex);
+ if (status != 0)
+ {
+ printf("waiter_thread: ERROR waiter: pthread_mutex_unlock failed, status=%d\n", status);
+ waiter_nerrors++;
+ }
+
+ waiter_nloops++;
+ }
+ return NULL;
+}
+
+static void *thread_signaler(void *parameter)
+{
+ int status;
+ int i;
+
+ printf("thread_signaler: Started\n");
+ for (i = 0; i < 32; i++)
+ {
+ /* Take the mutex. The waiter is higher priority and should
+ * run until it waits for the condition. So, at this point
+ * signaler should be waiting for the condition.
+ */
+
+ status = pthread_mutex_lock(&mutex);
+ if (status != 0)
+ {
+ printf("thread_signaler: ERROR pthread_mutex_lock failed, status=%d\n", status);
+ signaler_nerrors++;
+ }
+
+ /* Verify the state */
+
+ if (waiter_state != COND_WAIT)
+ {
+ printf("thread_signaler: ERROR waiter state = %d != COND_WAITING\n", waiter_state);
+ signaler_state++;
+ }
+
+ if (data_available)
+ {
+ printf("thread_signaler: ERROR data already available, waiter_state=%d\n", waiter_state);
+ signaler_already++;
+ }
+
+ /* Set data available and signal the waiter */
+
+ data_available = 1;
+ status = pthread_cond_signal(&cond);
+ if (status != 0)
+ {
+ printf("thread_signaler: ERROR pthread_cond_signal failed, status=%d\n", status);
+ signaler_nerrors++;
+ }
+
+ /* Release the mutex */
+
+ status = pthread_mutex_unlock(&mutex);
+ if (status != 0)
+ {
+ printf("thread_signaler: ERROR pthread_mutex_unlock failed, status=%d\n", status);
+ signaler_nerrors++;
+ }
+
+ signaler_nloops++;
+ }
+
+ printf("thread_signaler: Terminating\n");
+ pthread_exit(NULL);
+ return NULL; /* Non-reachable -- needed for some compilers */
+}
+
+void cond_test(void)
+{
+ pthread_t waiter;
+ pthread_t signaler;
+ pthread_attr_t attr;
+#ifdef SDCC
+ pthread_addr_t result;
+#endif
+ struct sched_param sparam;
+ int prio_min;
+ int prio_max;
+ int prio_mid;
+ int status;
+
+ /* Initialize the mutex */
+
+ printf("cond_test: Initializing mutex\n");
+ status = pthread_mutex_init(&mutex, NULL);
+ if (status != 0)
+ {
+ printf("cond_test: ERROR pthread_mutex_init failed, status=%d\n", status);
+ }
+
+ /* Initialize the condition variable */
+
+ printf("cond_test: Initializing cond\n");
+ status = pthread_cond_init(&cond, NULL);
+ if (status != 0)
+ {
+ printf("cond_test: ERROR pthread_condinit failed, status=%d\n", status);
+ }
+
+ /* Start the waiter thread at higher priority */
+
+ printf("cond_test: Starting waiter\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("cond_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ prio_min = sched_get_priority_min(SCHED_FIFO);
+ prio_max = sched_get_priority_max(SCHED_FIFO);
+ prio_mid = (prio_min + prio_max) / 2;
+
+ sparam.sched_priority = prio_mid;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("cond_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("cond_test: Set thread 1 priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&waiter, &attr, thread_waiter, NULL);
+ if (status != 0)
+ {
+ printf("cond_test: pthread_create failed, status=%d\n", status);
+ }
+
+ printf("cond_test: Starting signaler\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("cond_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ sparam.sched_priority = (prio_min + prio_mid) / 2;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("cond_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("cond_test: Set thread 2 priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&signaler, &attr, thread_signaler, NULL);
+ if (status != 0)
+ {
+ printf("cond_test: pthread_create failed, status=%d\n", status);
+ }
+
+ /* Wait for the threads to stop */
+
+#ifdef SDCC
+ pthread_join(signaler, &result);
+#else
+ pthread_join(signaler, NULL);
+#endif
+ printf("cond_test: signaler terminated, now cancel the waiter\n");
+ pthread_detach(waiter);
+ pthread_cancel(waiter);
+
+ printf("cond_test: \tWaiter\tSignaler\n");
+ printf("cond_test: Loops\t%d\t%d\n", waiter_nloops, signaler_nloops);
+ printf("cond_test: Errors\t%d\t%d\n", waiter_nerrors, signaler_nerrors);
+ printf("cond_test:\n");
+ printf("cond_test: %d times, waiter did not have to wait for data\n", waiter_nloops - waiter_waits);
+ printf("cond_test: %d times, data was already available when the signaler run\n", signaler_already);
+ printf("cond_test: %d times, the waiter was in an unexpected state when the signaler ran\n", signaler_state);
+}
diff --git a/apps/examples/ostest/dev_null.c b/apps/examples/ostest/dev_null.c
new file mode 100644
index 000000000..e8fc6cf3f
--- /dev/null
+++ b/apps/examples/ostest/dev_null.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * examples/ostest/dev_null.c
+ *
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <unistd.h>
+#include <fcntl.h>
+#include "ostest.h"
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#if CONFIG_NFILE_DESCRIPTORS > 0
+
+static FAR char buffer[1024];
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int dev_null(void)
+{
+ int nbytes;
+ int fd;
+
+ fd = open("/dev/null", O_RDWR);
+ if (fd < 0)
+ {
+ printf("dev_null: ERROR Failed to open /dev/null\n");
+ return -1;
+ }
+
+ nbytes = read(fd, buffer, 1024);
+ if (nbytes < 0)
+ {
+ printf("dev_null: ERROR Failed to read from /dev/null\n");
+ close(fd);
+ return -1;
+ }
+ printf("dev_null: Read %d bytes from /dev/null\n", nbytes);
+
+ nbytes = write(fd, buffer, 1024);
+ if (nbytes < 0)
+ {
+ printf("dev_null: ERROR Failed to write to /dev/null\n");
+ close(fd);
+ return -1;
+ }
+ printf("dev_null: Wrote %d bytes to /dev/null\n", nbytes);
+
+ close(fd);
+ return 0;
+}
+
+#endif /*CONFIG_NFILE_DESCRIPTORS */
diff --git a/apps/examples/ostest/main.c b/apps/examples/ostest/main.c
new file mode 100644
index 000000000..53be10764
--- /dev/null
+++ b/apps/examples/ostest/main.c
@@ -0,0 +1,523 @@
+/****************************************************************************
+ * examples/ostest/main.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sched.h>
+#include <nuttx/init.h>
+
+#include "ostest.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define PRIORITY 100
+#define NARGS 4
+#define HALF_SECOND_USEC 500000L
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char arg1[] = "Arg1";
+static const char arg2[] = "Arg2";
+static const char arg3[] = "Arg3";
+static const char arg4[] = "Arg4";
+
+#if CONFIG_NFILE_DESCRIPTORS > 0
+static const char write_data1[] = "stdio_test: write fd=1\n";
+static const char write_data2[] = "stdio_test: write fd=2\n";
+#endif
+
+#ifdef SDCC
+/* I am not yet certain why SDCC does not like the following
+ * initializer. It involves some issues with 2- vs 3-byte
+ * pointer types.
+ */
+
+static const char *g_argv[NARGS+1];
+#else
+static const char *g_argv[NARGS+1] = { arg1, arg2, arg3, arg4, NULL };
+#endif
+
+#ifndef CONFIG_DISABLE_SIGNALS
+static struct mallinfo g_mmbefore;
+static struct mallinfo g_mmprevious;
+static struct mallinfo g_mmafter;
+#endif
+
+#ifndef CONFIG_DISABLE_ENVIRON
+const char g_var1_name[] = "Variable1";
+const char g_var1_value[] = "GoodValue1";
+const char g_var2_name[] = "Variable2";
+const char g_var2_value[] = "GoodValue2";
+const char g_var3_name[] = "Variable3";
+const char g_var3_value[] = "GoodValue3";
+
+const char g_bad_value1[] = "BadValue1";
+const char g_bad_value2[] = "BadValue2";
+
+const char g_putenv_value[] = "Variable1=BadValue3";
+
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: show_memory_usage
+ ****************************************************************************/
+
+#ifndef CONFIG_DISABLE_SIGNALS
+static void show_memory_usage(struct mallinfo *mmbefore,
+ struct mallinfo *mmafter)
+{
+ printf("VARIABLE BEFORE AFTER\n");
+ printf("======== ======== ========\n");
+ printf("arena %8x %8x\n", mmbefore->arena, mmafter->arena);
+ printf("ordblks %8d %8d\n", mmbefore->ordblks, mmafter->ordblks);
+ printf("mxordblk %8x %8x\n", mmbefore->mxordblk, mmafter->mxordblk);
+ printf("uordblks %8x %8x\n", mmbefore->uordblks, mmafter->uordblks);
+ printf("fordblks %8x %8x\n", mmbefore->fordblks, mmafter->fordblks);
+}
+#else
+# define show_memory_usage(mm1, mm2)
+#endif
+
+/****************************************************************************
+ * Name: check_test_memory_usage
+ ****************************************************************************/
+
+#ifndef CONFIG_DISABLE_SIGNALS
+static void check_test_memory_usage(void)
+{
+ /* Wait a little bit to let any threads terminate */
+
+ usleep(HALF_SECOND_USEC);
+
+ /* Get the current memory usage */
+
+#ifdef CONFIG_CAN_PASS_STRUCTS
+ g_mmafter = mallinfo();
+#else
+ (void)mallinfo(&g_mmafter);
+#endif
+
+ /* Show the change from the previous time */
+
+ printf("\nEnd of test memory usage:\n");
+ show_memory_usage(&g_mmprevious, &g_mmafter);
+
+ /* Set up for the next test */
+
+#ifdef CONFIG_CAN_PASS_STRUCTS
+ g_mmprevious = g_mmafter;
+#else
+ memcpy(&g_mmprevious, &g_mmafter, sizeof(struct mallinfo));
+#endif
+
+ /* If so enabled, show the use of priority inheritance resources */
+
+ dump_nfreeholders("user_main:");
+}
+#else
+# define check_test_memory_usage()
+#endif
+
+/****************************************************************************
+ * Name: show_variable
+ ****************************************************************************/
+
+#ifndef CONFIG_DISABLE_ENVIRON
+static void show_variable(const char *var_name, const char *exptd_value, bool var_valid)
+{
+ char *actual_value = getenv(var_name);
+ if (actual_value)
+ {
+ if (var_valid)
+ {
+ if (strcmp(actual_value, exptd_value) == 0)
+ {
+ printf("show_variable: Variable=%s has value=%s\n", var_name, exptd_value);
+ }
+ else
+ {
+ printf("show_variable: ERROR Variable=%s has the wrong value\n", var_name);
+ printf("show_variable: found=%s expected=%s\n", actual_value, exptd_value);
+ }
+ }
+ else
+ {
+ printf("show_variable: ERROR Variable=%s has a value when it should not\n", var_name);
+ printf("show_variable: value=%s\n", actual_value);
+ }
+ }
+ else if (var_valid)
+ {
+ printf("show_variable: ERROR Variable=%s has no value\n", var_name);
+ printf("show_variable: Should have had value=%s\n", exptd_value);
+ }
+ else
+ {
+ printf("show_variable: Variable=%s has no value\n", var_name);
+ }
+}
+
+static void show_environment(bool var1_valid, bool var2_valid, bool var3_valid)
+{
+ show_variable(g_var1_name, g_var1_value, var1_valid);
+ show_variable(g_var2_name, g_var2_value, var2_valid);
+ show_variable(g_var3_name, g_var3_value, var3_valid);
+}
+#else
+# define show_environment()
+#endif
+
+/****************************************************************************
+ * Name: user_main
+ ****************************************************************************/
+
+static int user_main(int argc, char *argv[])
+{
+ int i;
+
+ /* Sample the memory usage now */
+
+#ifndef CONFIG_DISABLE_SIGNALS
+ usleep(HALF_SECOND_USEC);
+
+#ifdef CONFIG_CAN_PASS_STRUCTS
+ g_mmbefore = mallinfo();
+ g_mmprevious = g_mmbefore;
+#else
+ (void)mallinfo(&g_mmbefore);
+ memcpy(&g_mmprevious, &g_mmbefore, sizeof(struct mallinfo));
+#endif
+#endif
+
+ printf("\nuser_main: Begin argument test\n");
+ printf("user_main: Started with argc=%d\n", argc);
+
+ /* Verify passed arguments */
+
+ if (argc != NARGS + 1)
+ {
+ printf("user_main: Error expected argc=%d got argc=%d\n",
+ NARGS+1, argc);
+ }
+
+ for (i = 0; i <= NARGS; i++)
+ {
+ printf("user_main: argv[%d]=\"%s\"\n", i, argv[i]);
+ }
+
+ for (i = 1; i <= NARGS; i++)
+ {
+ if (strcmp(argv[i], g_argv[i-1]) != 0)
+ {
+ printf("user_main: ERROR argv[%d]: Expected \"%s\" found \"%s\"\n",
+ i, g_argv[i-1], argv[i]);
+ }
+ }
+ check_test_memory_usage();
+
+ /* Check environment variables */
+#ifndef CONFIG_DISABLE_ENVIRON
+ show_environment(true, true, true);
+
+ unsetenv(g_var1_name);
+ show_environment(false, true, true);
+ check_test_memory_usage();
+
+ clearenv();
+ show_environment(false, false, false);
+ check_test_memory_usage();
+#endif
+
+ /* Top of test loop */
+
+#if CONFIG_EXAMPLES_OSTEST_LOOPS > 1
+ for (i = 0; i < CONFIG_EXAMPLES_OSTEST_LOOPS; i++)
+#elif CONFIG_EXAMPLES_OSTEST_LOOPS == 0
+ for (;;)
+#endif
+ {
+#if CONFIG_NFILE_DESCRIPTORS > 0
+ /* Checkout /dev/null */
+
+ printf("\nuser_main: /dev/null test\n");
+ dev_null();
+ check_test_memory_usage();
+#endif
+
+#ifndef CONFIG_DISABLE_PTHREAD
+ /* Verify pthreads and pthread mutex */
+
+ printf("\nuser_main: mutex test\n");
+ mutex_test();
+ check_test_memory_usage();
+#endif
+
+#if !defined(CONFIG_DISABLE_PTHREAD) && defined(CONFIG_MUTEX_TYPES)
+ /* Verify recursive mutexes */
+
+ printf("\nuser_main: recursive mutex test\n");
+ recursive_mutex_test();
+ check_test_memory_usage();
+#endif
+
+#ifndef CONFIG_DISABLE_PTHREAD
+ /* Verify pthread cancellation */
+
+ printf("\nuser_main: cancel test\n");
+ cancel_test();
+ check_test_memory_usage();
+#endif
+
+#ifndef CONFIG_DISABLE_PTHREAD
+ /* Verify pthreads and semaphores */
+
+ printf("\nuser_main: semaphore test\n");
+ sem_test();
+ check_test_memory_usage();
+#endif
+
+#ifndef CONFIG_DISABLE_PTHREAD
+ /* Verify pthreads and condition variables */
+
+ printf("\nuser_main: condition variable test\n");
+#ifdef CONFIG_PRIORITY_INHERITANCE
+ printf("\n Skipping, Test logic incompatible with priority inheritance\n");
+#else
+ cond_test();
+ check_test_memory_usage();
+#endif
+#endif
+
+#if !defined(CONFIG_DISABLE_SIGNALS) && !defined(CONFIG_DISABLE_PTHREAD) && !defined(CONFIG_DISABLE_CLOCK)
+ /* Verify pthreads and condition variable timed waits */
+
+ printf("\nuser_main: timed wait test\n");
+ timedwait_test();
+ check_test_memory_usage();
+#endif
+
+#if !defined(CONFIG_DISABLE_MQUEUE) && !defined(CONFIG_DISABLE_PTHREAD)
+ /* Verify pthreads and message queues */
+
+ printf("\nuser_main: message queue test\n");
+ mqueue_test();
+ check_test_memory_usage();
+#endif
+
+#if !defined(CONFIG_DISABLE_MQUEUE) && !defined(CONFIG_DISABLE_PTHREAD) && !defined(CONFIG_DISABLE_CLOCK)
+ /* Verify pthreads and message queues */
+
+ printf("\nuser_main: timed message queue test\n");
+ timedmqueue_test();
+ check_test_memory_usage();
+#endif
+
+#ifndef CONFIG_DISABLE_SIGNALS
+ /* Verify signal handlers */
+
+ printf("\nuser_main: signal handler test\n");
+ sighand_test();
+ check_test_memory_usage();
+#endif
+
+#if !defined(CONFIG_DISABLE_POSIX_TIMERS) && !defined(CONFIG_DISABLE_SIGNALS)
+ /* Verify posix timers */
+
+ printf("\nuser_main: POSIX timer test\n");
+ timer_test();
+ check_test_memory_usage();
+#endif
+
+#if !defined(CONFIG_DISABLE_PTHREAD) && CONFIG_RR_INTERVAL > 0
+ /* Verify round robin scheduling */
+
+ printf("\nuser_main: round-robin scheduler test\n");
+ rr_test();
+ check_test_memory_usage();
+#endif
+
+#ifndef CONFIG_DISABLE_PTHREAD
+ /* Verify pthread barriers */
+
+ printf("\nuser_main: barrier test\n");
+ barrier_test();
+ check_test_memory_usage();
+#endif
+
+#if defined(CONFIG_PRIORITY_INHERITANCE) && !defined(CONFIG_DISABLE_SIGNALS) && !defined(CONFIG_DISABLE_PTHREAD)
+ /* Verify priority inheritance */
+
+ printf("\nuser_main: priority inheritance test\n");
+ priority_inheritance();
+ check_test_memory_usage();
+#endif /* CONFIG_PRIORITY_INHERITANCE && !CONFIG_DISABLE_SIGNALS && !CONFIG_DISABLE_PTHREAD */
+
+ /* Compare memory usage at time user_start started until
+ * user_main exits. These should not be identical, but should
+ * be similar enough that we can detect any serious OS memory
+ * leaks.
+ */
+
+#ifndef CONFIG_DISABLE_SIGNALS
+ usleep(HALF_SECOND_USEC);
+
+#ifdef CONFIG_CAN_PASS_STRUCTS
+ g_mmafter = mallinfo();
+#else
+ (void)mallinfo(&g_mmafter);
+#endif
+
+ printf("\nFinal memory usage:\n");
+ show_memory_usage(&g_mmbefore, &g_mmafter);
+#endif
+ }
+ printf("user_main: Exitting\n");
+ return 0;
+}
+
+/****************************************************************************
+ * Name: stdio_test
+ ****************************************************************************/
+
+static void stdio_test(void)
+{
+ /* Verify that we can communicate */
+
+#if CONFIG_NFILE_DESCRIPTORS > 0
+ write(1, write_data1, sizeof(write_data1)-1);
+#endif
+ printf("stdio_test: Standard I/O Check: printf\n");
+
+#if CONFIG_NFILE_DESCRIPTORS > 1
+ write(2, write_data2, sizeof(write_data2)-1);
+#endif
+#if CONFIG_NFILE_STREAMS > 0
+ fprintf(stderr, "stdio_test: Standard I/O Check: fprintf to stderr\n");
+#endif
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+ /* stub */
+}
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ int result;
+
+ /* Verify that stdio works first */
+
+ stdio_test();
+
+#ifdef SDCC
+ /* I am not yet certain why SDCC does not like the following initilizers.
+ * It involves some issues with 2- vs 3-byte pointer types.
+ */
+
+ g_argv[0] = arg1;
+ g_argv[1] = arg2;
+ g_argv[2] = arg3;
+ g_argv[3] = arg4;
+ g_argv[4] = NULL;
+#endif
+
+ /* Set up some environment variables */
+
+#ifndef CONFIG_DISABLE_ENVIRON
+ printf("user_start: putenv(%s)\n", g_putenv_value);
+ putenv(g_putenv_value); /* Varaible1=BadValue3 */
+ printf("user_start: setenv(%s, %s, TRUE)\n", g_var1_name, g_var1_value);
+ setenv(g_var1_name, g_var1_value, TRUE); /* Variable1=GoodValue1 */
+
+ printf("user_start: setenv(%s, %s, FALSE)\n", g_var2_name, g_bad_value1);
+ setenv(g_var2_name, g_bad_value1, FALSE); /* Variable2=BadValue1 */
+ printf("user_start: setenv(%s, %s, TRUE)\n", g_var2_name, g_var2_value);
+ setenv(g_var2_name, g_var2_value, TRUE); /* Variable2=GoodValue2 */
+
+ printf("user_start: setenv(%s, %s, FALSE)\n", g_var3_name, g_var3_name);
+ setenv(g_var3_name, g_var3_value, FALSE); /* Variable3=GoodValue3 */
+ printf("user_start: setenv(%s, %s, FALSE)\n", g_var3_name, g_var3_name);
+ setenv(g_var3_name, g_bad_value2, FALSE); /* Variable3=GoodValue3 */
+ show_environment(true, true, true);
+#endif
+
+ /* Verify that we can spawn a new task */
+
+#ifndef CONFIG_CUSTOM_STACK
+ result = task_create("ostest", PRIORITY, STACKSIZE, user_main, g_argv);
+#else
+ result = task_create("ostest", PRIORITY, user_main, g_argv);
+#endif
+ if (result == ERROR)
+ {
+ printf("user_start: ERROR Failed to start user_main\n");
+ }
+ else
+ {
+ printf("user_start: Started user_main at PID=%d\n", result);
+ }
+
+ printf("user_start: Exitting\n");
+ return 0;
+}
diff --git a/apps/examples/ostest/mqueue.c b/apps/examples/ostest/mqueue.c
new file mode 100644
index 000000000..e68cfc012
--- /dev/null
+++ b/apps/examples/ostest/mqueue.c
@@ -0,0 +1,394 @@
+/**************************************************************************
+ * mqueue.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <mqueue.h>
+#include <sched.h>
+#include <errno.h>
+
+#include "ostest.h"
+
+/**************************************************************************
+ * Private Definitions
+ **************************************************************************/
+
+#define TEST_MESSAGE "This is a test and only a test"
+#if defined(SDCC) || defined(__ZILOG__)
+ /* Cannot use strlen in array size */
+
+# define TEST_MSGLEN (31)
+#else
+ /* Message lenght is the size of the message plus the null terminator */
+
+# define TEST_MSGLEN (strlen(TEST_MESSAGE)+1)
+#endif
+
+#define TEST_SEND_NMSGS (10)
+#ifndef CONFIG_DISABLE_SIGNALS
+# define TEST_RECEIVE_NMSGS (11)
+#else
+# define TEST_RECEIVE_NMSGS (10)
+#endif
+
+#define HALF_SECOND_USEC_USEC 500000L
+
+/**************************************************************************
+ * Private Types
+ **************************************************************************/
+
+/**************************************************************************
+ * Private Function Prototypes
+ **************************************************************************/
+
+/**************************************************************************
+ * Global Variables
+ **************************************************************************/
+
+/**************************************************************************
+ * Private Variables
+ **************************************************************************/
+
+/**************************************************************************
+ * Private Functions
+ **************************************************************************/
+
+/**************************************************************************
+ * Public Functions
+ **************************************************************************/
+
+static void *sender_thread(void *arg)
+{
+ mqd_t mqfd;
+ char msg_buffer[TEST_MSGLEN];
+ struct mq_attr attr;
+ int status = 0;
+ int nerrors = 0;
+ int i;
+
+ printf("sender_thread: Starting\n");
+
+ /* Fill in attributes for message queue */
+
+ attr.mq_maxmsg = 20;
+ attr.mq_msgsize = TEST_MSGLEN;
+ attr.mq_flags = 0;
+
+ /* Set the flags for the open of the queue.
+ * Make it a blocking open on the queue, meaning it will block if
+ * this process tries to send to the queue and the queue is full.
+ *
+ * O_CREAT - the queue will get created if it does not already exist.
+ * O_WRONLY - we are only planning to write to the queue.
+ *
+ * Open the queue, and create it if the receiving process hasn't
+ * already created it.
+ */
+
+ mqfd = mq_open("testmq", O_WRONLY|O_CREAT, 0666, &attr);
+ if (mqfd < 0)
+ {
+ printf("sender_thread: ERROR mq_open failed\n");
+ pthread_exit((pthread_addr_t)1);
+ }
+
+ /* Fill in a test message buffer to send */
+
+ memcpy(msg_buffer, TEST_MESSAGE, TEST_MSGLEN);
+
+ /* Perform the send TEST_SEND_NMSGS times */
+
+ for (i = 0; i < TEST_SEND_NMSGS; i++)
+ {
+ status = mq_send(mqfd, msg_buffer, TEST_MSGLEN, 42);
+ if (status < 0)
+ {
+ printf("sender_thread: ERROR mq_send failure=%d on msg %d\n", status, i);
+ nerrors++;
+ }
+ else
+ {
+ printf("sender_thread: mq_send succeeded on msg %d\n", i);
+ }
+ }
+
+ /* Close the queue and return success */
+
+ if (mq_close(mqfd) < 0)
+ {
+ printf("sender_thread: ERROR mq_close failed\n");
+ }
+
+ printf("sender_thread: returning nerrors=%d\n", nerrors);
+ return (pthread_addr_t)nerrors;
+}
+
+static void *receiver_thread(void *arg)
+{
+ mqd_t mqfd;
+ char msg_buffer[TEST_MSGLEN];
+ struct mq_attr attr;
+ int nbytes;
+ int nerrors = 0;
+ int i;
+
+ printf("receiver_thread: Starting\n");
+
+ /* Fill in attributes for message queue */
+
+ attr.mq_maxmsg = 20;
+ attr.mq_msgsize = TEST_MSGLEN;
+ attr.mq_flags = 0;
+
+ /* Set the flags for the open of the queue.
+ * Make it a blocking open on the queue, meaning it will block if
+ * this task tries to read from the queue when the queue is empty
+ *
+ * O_CREAT - the queue will get created if it does not already exist.
+ * O_RDONLY - we are only planning to read from the queue.
+ *
+ * Open the queue, and create it if the sending process hasn't
+ * already created it.
+ */
+
+ mqfd = mq_open("testmq", O_RDONLY|O_CREAT, 0666, &attr);
+ if (mqfd < 0)
+ {
+ printf("receiver_thread: ERROR mq_open failed\n");
+ pthread_exit((pthread_addr_t)1);
+ }
+
+ /* Perform the receive TEST_RECEIVE_NMSGS times */
+
+ for (i = 0; i < TEST_RECEIVE_NMSGS; i++)
+ {
+ memset(msg_buffer, 0xaa, TEST_MSGLEN);
+ nbytes = mq_receive(mqfd, msg_buffer, TEST_MSGLEN, 0);
+ if (nbytes < 0)
+ {
+ /* mq_receive failed. If the error is because of EINTR then
+ * it is not a failure.
+ */
+
+ if (*get_errno_ptr() != EINTR)
+ {
+ printf("receiver_thread: ERROR mq_receive failure on msg %d, errno=%d\n", i, *get_errno_ptr());
+ nerrors++;
+ }
+ else
+ {
+ printf("receiver_thread: mq_receive interrupted!\n", i);
+ }
+ }
+ else if (nbytes != TEST_MSGLEN)
+ {
+ printf("receiver_thread: mq_receive return bad size %d on msg %d\n", nbytes, i);
+ nerrors++;
+ }
+ else if (memcmp(TEST_MESSAGE, msg_buffer, nbytes) != 0)
+ {
+ int j;
+
+ printf("receiver_thread: mq_receive returned corrupt message on msg %d\n", i);
+ printf("receiver_thread: i Expected Received\n");
+
+ for (j = 0; j < TEST_MSGLEN-1; j++)
+ {
+ if (isprint(msg_buffer[j]))
+ {
+ printf("receiver_thread: %2d %02x (%c) %02x (%c)\n",
+ j, TEST_MESSAGE[j], TEST_MESSAGE[j], msg_buffer[j], msg_buffer[j]);
+ }
+ else
+ {
+ printf("receiver_thread: %2d %02x (%c) %02x\n",
+ j, TEST_MESSAGE[j], TEST_MESSAGE[j], msg_buffer[j]);
+ }
+ }
+ printf("receiver_thread: %2d 00 %02x\n",
+ j, msg_buffer[j]);
+ }
+ else
+ {
+ printf("receiver_thread: mq_receive succeeded on msg %d\n", i);
+ }
+ }
+
+ /* Close the queue and return success */
+
+ if (mq_close(mqfd) < 0)
+ {
+ printf("receiver_thread: ERROR mq_close failed\n");
+ nerrors++;
+ }
+
+ /* Destroy the queue */
+
+ if (mq_unlink("testmq") < 0)
+ {
+ printf("receiver_thread: ERROR mq_close failed\n");
+ nerrors++;
+ }
+
+ printf("receiver_thread: returning nerrors=%d\n", nerrors);
+ pthread_exit((pthread_addr_t)nerrors);
+ return (pthread_addr_t)nerrors;
+}
+
+void mqueue_test(void)
+{
+ pthread_t sender;
+ pthread_t receiver;
+ void *result;
+ pthread_attr_t attr;
+ struct sched_param sparam;
+ int prio_min;
+ int prio_max;
+ int prio_mid;
+ int status;
+
+ /* Start the sending thread at higher priority */
+
+ printf("mqueue_test: Starting receiver\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("mqueue_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ status = pthread_attr_setstacksize(&attr, STACKSIZE);
+ if (status != 0)
+ {
+ printf("mqueue_test: pthread_attr_setstacksize failed, status=%d\n", status);
+ }
+
+ prio_min = sched_get_priority_min(SCHED_FIFO);
+ prio_max = sched_get_priority_max(SCHED_FIFO);
+ prio_mid = (prio_min + prio_max) / 2;
+
+ sparam.sched_priority = prio_mid;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("mqueue_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("mqueue_test: Set receiver priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&receiver, &attr, receiver_thread, NULL);
+ if (status != 0)
+ {
+ printf("mqueue_test: pthread_create failed, status=%d\n", status);
+ }
+
+ /* Start the sending thread at lower priority */
+
+ printf("mqueue_test: Starting sender\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("mqueue_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ status = pthread_attr_setstacksize(&attr, STACKSIZE);
+ if (status != 0)
+ {
+ printf("mqueue_test: pthread_attr_setstacksize failed, status=%d\n", status);
+ }
+
+ sparam.sched_priority = (prio_min + prio_mid) / 2;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("mqueue_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("mqueue_test: Set sender thread priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&sender, &attr, sender_thread, NULL);
+ if (status != 0)
+ {
+ printf("mqueue_test: pthread_create failed, status=%d\n", status);
+ }
+
+ printf("mqueue_test: Waiting for sender to complete\n");
+ pthread_join(sender, &result);
+ if (result != (void*)0)
+ {
+ printf("mqueue_test: ERROR sender thread exited with %d errors\n", (int)result);
+ }
+
+#ifndef CONFIG_DISABLE_SIGNALS
+ /* Wake up the receiver thread with a signal */
+
+ printf("mqueue_test: Killing receiver\n");
+ pthread_kill(receiver, 9);
+
+ /* Wait a bit to see if the thread exits on its own */
+
+ usleep(HALF_SECOND_USEC_USEC);
+#endif
+
+ /* Then cancel the thread and see if it did */
+
+ printf("mqueue_test: Canceling receiver\n");
+ status = pthread_cancel(receiver);
+ if (status == ESRCH)
+ {
+ printf("mqueue_test: receiver has already terminated\n");
+ }
+
+ pthread_join(receiver, &result);
+ if (result != (void*)0)
+ {
+ printf("mqueue_test: ERROR receiver thread exited with %d errors\n", (int)result);
+ }
+}
+
+
diff --git a/apps/examples/ostest/mutex.c b/apps/examples/ostest/mutex.c
new file mode 100644
index 000000000..752f833f2
--- /dev/null
+++ b/apps/examples/ostest/mutex.c
@@ -0,0 +1,142 @@
+/***********************************************************************
+ * mutex.c
+ *
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <pthread.h>
+#include "ostest.h"
+
+#ifndef NULL
+# define NULL (void*)0
+#endif
+
+#define NLOOPS 32
+
+static pthread_mutex_t mut;
+static volatile int my_mutex = 0;
+static unsigned long nloops[2] = {0, 0};
+static unsigned long nerrors[2] = {0, 0};
+
+static void *thread_func(void *parameter)
+{
+ int id = (int)parameter;
+ int ndx = id - 1;
+ int i;
+
+ for (nloops[ndx] = 0; nloops[ndx] < NLOOPS; nloops[ndx]++)
+ {
+ int status = pthread_mutex_lock(&mut);
+ if (status != 0)
+ {
+ printf("ERROR thread %d: pthread_mutex_lock failed, status=%d\n",
+ id, status);
+ }
+
+ if (my_mutex == 1)
+ {
+ printf("ERROR thread=%d: "
+ "my_mutex should be zero, instead my_mutex=%d\n",
+ id, my_mutex);
+ nerrors[ndx]++;
+ }
+
+ my_mutex = 1;
+ for (i = 0; i < 10; i++)
+ {
+ pthread_yield();
+ }
+ my_mutex = 0;
+
+ status = pthread_mutex_unlock(&mut);
+ if (status != 0)
+ {
+ printf("ERROR thread %d: pthread_mutex_unlock failed, status=%d\n",
+ id, status);
+ }
+ }
+ pthread_exit(NULL);
+ return NULL; /* Non-reachable -- needed for some compilers */
+}
+
+void mutex_test(void)
+{
+ pthread_t thread1, thread2;
+#ifdef SDCC
+ pthread_addr_t result1, result2;
+ pthread_attr_t attr;
+#endif
+ int status;
+
+ /* Initialize the mutex */
+
+ printf("Initializing mutex\n");
+ pthread_mutex_init(&mut, NULL);
+
+ /* Start two thread instances */
+
+ printf("Starting thread 1\n");
+#ifdef SDCC
+ (void)pthread_attr_init(&attr);
+ status = pthread_create(&thread1, &attr, thread_func, (pthread_addr_t)1);
+#else
+ status = pthread_create(&thread1, NULL, thread_func, (pthread_addr_t)1);
+#endif
+ if (status != 0)
+ {
+ printf("Error in thread#1 creation\n");
+ }
+
+ printf("Starting thread 2\n");
+#ifdef SDCC
+ status = pthread_create(&thread2, &attr, thread_func, (pthread_addr_t)2);
+#else
+ status = pthread_create(&thread2, NULL, thread_func, (pthread_addr_t)2);
+#endif
+ if (status != 0)
+ {
+ printf("Error in thread#2 creation\n");
+ }
+
+#ifdef SDCC
+ pthread_join(thread1, &result1);
+ pthread_join(thread2, &result2);
+#else
+ pthread_join(thread1, NULL);
+ pthread_join(thread2, NULL);
+#endif
+
+ printf("\t\tThread1\tThread2\n");
+ printf("\tLoops\t%ld\t%ld\n", nloops[0], nloops[1]);
+ printf("\tErrors\t%ld\t%ld\n", nerrors[0], nerrors[1]);
+}
diff --git a/apps/examples/ostest/ostest.h b/apps/examples/ostest/ostest.h
new file mode 100644
index 000000000..1cd705898
--- /dev/null
+++ b/apps/examples/ostest/ostest.h
@@ -0,0 +1,162 @@
+/****************************************************************************
+ * examples/ostest/ostest.h
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __OSTEST_H
+#define __OSTEST_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* The task_create task size can be specified in the defconfig file */
+
+#ifdef CONFIG_EXAMPLES_OSTEST_STACKSIZE
+# define STACKSIZE CONFIG_EXAMPLES_OSTEST_STACKSIZE
+#else
+# define STACKSIZE 8192
+#endif
+
+/* The number of times to execute the test can be specified in the defconfig
+ * file.
+ */
+
+#ifndef CONFIG_EXAMPLES_OSTEST_LOOPS
+# define CONFIG_EXAMPLES_OSTEST_LOOPS 1
+#endif
+
+/* This is the number of threads that are created in the barrier test.
+ * A smaller number should be selected on systems without sufficient memory
+ * to start so many threads.
+ */
+
+#ifndef CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS
+# define CONFIG_EXAMPLES_OSTEST_NBARRIER_THREADS 8
+#endif
+
+/* Priority inheritance */
+
+#if defined(CONFIG_DEBUG) && defined(CONFIG_PRIORITY_INHERITANCE) && defined(CONFIG_SEM_PHDEBUG)
+# define dump_nfreeholders(s) printf(s " nfreeholders: %d\n", sem_nfreeholders())
+#else
+# define dump_nfreeholders(s)
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/* dev_null.c ***************************************************************/
+
+extern int dev_null(void);
+
+/* mutex.c ******************************************************************/
+
+extern void mutex_test(void);
+
+/* rmutex.c ******************************************************************/
+
+extern void recursive_mutex_test(void);
+
+/* sem.c ********************************************************************/
+
+extern void sem_test(void);
+
+/* cond.c *******************************************************************/
+
+extern void cond_test(void);
+
+/* mqueue.c *****************************************************************/
+
+extern void mqueue_test(void);
+
+/* timedmqueue.c ************************************************************/
+
+extern void timedmqueue_test(void);
+
+/* cancel.c *****************************************************************/
+
+extern void cancel_test(void);
+
+/* timedwait.c **************************************************************/
+
+extern void timedwait_test(void);
+
+/* sighand.c ****************************************************************/
+
+extern void sighand_test(void);
+
+/* posixtimers.c ************************************************************/
+
+extern void timer_test(void);
+
+/* roundrobin.c *************************************************************/
+
+extern void rr_test(void);
+
+/* barrier.c ****************************************************************/
+
+extern void barrier_test(void);
+
+/* prioinherit.c ************************************************************/
+
+extern void priority_inheritance(void);
+
+/* APIs exported (conditionally) by the OS specifically for testing of
+ * priority inheritance
+ */
+
+#if defined(CONFIG_DEBUG) && defined(CONFIG_PRIORITY_INHERITANCE) && defined(CONFIG_SEM_PHDEBUG)
+extern void sem_enumholders(FAR sem_t *sem);
+extern int sem_nfreeholders(void);
+#else
+# define sem_enumholders(sem)
+# define sem_nfreeholders()
+#endif
+
+#endif /* __OSTEST_H */
diff --git a/apps/examples/ostest/posixtimer.c b/apps/examples/ostest/posixtimer.c
new file mode 100644
index 000000000..457b4c1a2
--- /dev/null
+++ b/apps/examples/ostest/posixtimer.c
@@ -0,0 +1,268 @@
+/***********************************************************************
+ * examples/ostest/posixtimer.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <unistd.h>
+#include <semaphore.h>
+#include <signal.h>
+#include <sched.h>
+#include <errno.h>
+#include "ostest.h"
+
+/**************************************************************************
+ * Private Definitions
+ **************************************************************************/
+
+#ifndef NULL
+# define NULL (void*)0
+#endif
+
+#define MY_TIMER_SIGNAL 17
+#define SIGVALUE_INT 42
+
+#if CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0
+# define FFLUSH() fflush(stdout)
+#else
+# define FFLUSH()
+#endif
+
+/**************************************************************************
+ * Private Data
+ **************************************************************************/
+
+static sem_t sem;
+static int g_nsigreceived = 0;
+
+/**************************************************************************
+ * Private Functions
+ **************************************************************************/
+
+static void timer_expiration(int signo, siginfo_t *info, void *ucontext)
+{
+ sigset_t oldset;
+ sigset_t allsigs;
+ int status;
+
+ printf("timer_expiration: Received signal %d\n" , signo);
+
+ g_nsigreceived++;
+
+ /* Check signo */
+
+ if (signo != MY_TIMER_SIGNAL)
+ {
+ printf("timer_expiration: ERROR expected signo=%d\n" , MY_TIMER_SIGNAL);
+ }
+
+ /* Check siginfo */
+
+ if (info->si_value.sival_int != SIGVALUE_INT)
+ {
+ printf("timer_expiration: ERROR sival_int=%d expected %d\n",
+ info->si_value.sival_int, SIGVALUE_INT);
+ }
+ else
+ {
+ printf("timer_expiration: sival_int=%d\n" , info->si_value.sival_int);
+ }
+
+ if (info->si_signo != MY_TIMER_SIGNAL)
+ {
+ printf("timer_expiration: ERROR expected si_signo=%d, got=%d\n",
+ MY_TIMER_SIGNAL, info->si_signo);
+ }
+
+ if (info->si_code == SI_TIMER)
+ {
+ printf("timer_expiration: si_code=%d (SI_TIMER)\n" , info->si_code);
+ }
+ else
+ {
+ printf("timer_expiration: ERROR si_code=%d, expected SI_TIMER=%d\n",
+ info->si_code, SI_TIMER);
+ }
+
+ /* Check ucontext_t */
+
+ printf("timer_expiration: ucontext=%p\n" , ucontext);
+
+ /* Check sigprocmask */
+
+ (void)sigfillset(&allsigs);
+ status = sigprocmask(SIG_SETMASK, NULL, &oldset);
+ if (status != OK)
+ {
+ printf("timer_expiration: ERROR sigprocmask failed, status=%d\n",
+ status);
+ }
+
+ if (oldset != allsigs)
+ {
+ printf("timer_expiration: ERROR sigprocmask=%x expected=%x\n",
+ oldset, allsigs);
+ }
+
+}
+
+/**************************************************************************
+ * Public Functions
+ **************************************************************************/
+
+void timer_test(void)
+{
+ sigset_t sigset;
+ struct sigaction act;
+ struct sigaction oact;
+ struct sigevent notify;
+ struct itimerspec timer;
+ timer_t timerid;
+ int status;
+ int i;
+
+ printf("timer_test: Initializing semaphore to 0\n" );
+ sem_init(&sem, 0, 0);
+
+ /* Start waiter thread */
+
+ printf("timer_test: Unmasking signal %d\n" , MY_TIMER_SIGNAL);
+
+ (void)sigemptyset(&sigset);
+ (void)sigaddset(&sigset, MY_TIMER_SIGNAL);
+ status = sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+ if (status != OK)
+ {
+ printf("timer_test: ERROR sigprocmask failed, status=%d\n",
+ status);
+ }
+
+ printf("timer_test: Registering signal handler\n" );
+ act.sa_sigaction = timer_expiration;
+ act.sa_flags = SA_SIGINFO;
+
+ (void)sigfillset(&act.sa_mask);
+ (void)sigdelset(&act.sa_mask, MY_TIMER_SIGNAL);
+
+ status = sigaction(MY_TIMER_SIGNAL, &act, &oact);
+ if (status != OK)
+ {
+ printf("timer_test: ERROR sigaction failed, status=%d\n" , status);
+ }
+
+#ifndef SDCC
+ printf("timer_test: oact.sigaction=%p oact.sa_flags=%x oact.sa_mask=%x\n",
+ oact.sa_sigaction, oact.sa_flags, oact.sa_mask);
+#endif
+
+ /* Create the POSIX timer */
+
+ printf("timer_test: Creating timer\n" );
+
+ notify.sigev_notify = SIGEV_SIGNAL;
+ notify.sigev_signo = MY_TIMER_SIGNAL;
+ notify.sigev_value.sival_int = SIGVALUE_INT;
+
+ status = timer_create(CLOCK_REALTIME, &notify, &timerid);
+ if (status != OK)
+ {
+ printf("timer_test: timer_create failed, errno=%d\n", errno);
+ goto errorout;
+ }
+
+ /* Start the POSIX timer */
+
+ printf("timer_test: Starting timer\n" );
+
+ timer.it_value.tv_sec = 2;
+ timer.it_value.tv_nsec = 0;
+ timer.it_interval.tv_sec = 2;
+ timer.it_interval.tv_nsec = 0;
+
+ status = timer_settime(timerid, 0, &timer, NULL);
+ if (status != OK)
+ {
+ printf("timer_test: timer_settime failed, errno=%d\n", errno);
+ goto errorout;
+ }
+
+ /* Take the semaphore */
+
+ for (i = 0; i < 5; i++)
+ {
+ printf("timer_test: Waiting on semaphore\n" );
+ FFLUSH();
+ status = sem_wait(&sem);
+ if (status != 0)
+ {
+ int error = errno;
+ if (error == EINTR)
+ {
+ printf("timer_test: sem_wait() successfully interrupted by signal\n" );
+ }
+ else
+ {
+ printf("timer_test: ERROR sem_wait failed, errno=%d\n" , error);
+ }
+ }
+ else
+ {
+ printf("timer_test: ERROR awakened with no error!\n" );
+ }
+ printf("timer_test: g_nsigreceived=%d\n", g_nsigreceived);
+ }
+
+errorout:
+ sem_destroy(&sem);
+
+ /* Then delete the timer */
+
+ printf("timer_test: Deleting timer\n" );
+ status = timer_delete(timerid);
+ if (status != OK)
+ {
+ printf("timer_test: timer_create failed, errno=%d\n", errno);
+ }
+
+ /* Detach the signal handler */
+
+ act.sa_sigaction = SIG_DFL;
+ status = sigaction(MY_TIMER_SIGNAL, &act, &oact);
+
+ printf("timer_test: done\n" );
+ FFLUSH();
+}
diff --git a/apps/examples/ostest/prioinherit.c b/apps/examples/ostest/prioinherit.c
new file mode 100644
index 000000000..5d59c1297
--- /dev/null
+++ b/apps/examples/ostest/prioinherit.c
@@ -0,0 +1,541 @@
+/****************************************************************************
+ * examples/ostest/prioinherit.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <unistd.h>
+#include <semaphore.h>
+#include <pthread.h>
+#include <errno.h>
+
+#ifdef CONFIG_ARCH_SIM
+# include <nuttx/arch.h>
+#endif
+
+#include "ostest.h"
+
+#if defined(CONFIG_PRIORITY_INHERITANCE) && !defined(CONFIG_DISABLE_SIGNALS) && !defined(CONFIG_DISABLE_PTHREAD)
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_SEM_PREALLOCHOLDERS
+# define CONFIG_SEM_PREALLOCHOLDERS 0
+#endif
+#define NLOWPRI_THREADS (CONFIG_SEM_PREALLOCHOLDERS+1)
+
+#ifndef CONFIG_SEM_NNESTPRIO
+# define CONFIG_SEM_NNESTPRIO 0
+#endif
+#define NHIGHPRI_THREADS (CONFIG_SEM_NNESTPRIO+1)
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+enum thstate_e
+{
+ NOTSTARTED = 0,
+ RUNNING,
+ WAITING,
+ DONE
+};
+
+static sem_t g_sem;
+static volatile enum thstate_e g_middlestate;
+static volatile enum thstate_e g_highstate[NHIGHPRI_THREADS];
+static volatile enum thstate_e g_lowstate[NLOWPRI_THREADS];
+static int g_highpri;
+static int g_medpri;
+static int g_lowpri;
+
+/****************************************************************************
+ * Name: nhighpri_waiting
+ ****************************************************************************/
+
+static int nhighpri_waiting(void)
+{
+ int n = 0;
+ int i;
+
+ for (i = 0; i < NHIGHPRI_THREADS; i++)
+ {
+ if (g_highstate[i] == WAITING)
+ {
+ n++;
+ }
+ }
+ return n;
+}
+
+/****************************************************************************
+ * Name: nhighpri_running
+ ****************************************************************************/
+
+static int nhighpri_running(void)
+{
+ int n = 0;
+ int i;
+
+ for (i = 0; i < NHIGHPRI_THREADS; i++)
+ {
+ if (g_highstate[i] != DONE)
+ {
+ n++;
+ }
+ }
+ return n;
+}
+
+/****************************************************************************
+ * Name: highpri_thread
+ ****************************************************************************/
+
+static void *highpri_thread(void *parameter)
+{
+ int threadno = (int)parameter;
+ int ret;
+
+ g_highstate[threadno-1] = RUNNING;
+
+ printf("highpri_thread-%d: Started\n", threadno);
+ fflush(stdout);
+ sleep(1);
+
+ printf("highpri_thread-%d: Calling sem_wait()\n", threadno);
+ g_highstate[threadno-1] = WAITING;
+ ret = sem_wait(&g_sem);
+ g_highstate[threadno-1] = DONE;
+
+ if (ret != 0)
+ {
+ printf("highpri_thread-%d: sem_take failed: %d\n", threadno, ret);
+ }
+ else if (g_middlestate == RUNNING)
+ {
+ printf("highpri_thread-%d: SUCCESS midpri_thread is still running!\n", threadno);
+ }
+ else
+ {
+ printf("highpri_thread-%d: ERROR -- midpri_thread has already exited!\n", threadno);
+ }
+
+ sem_post(&g_sem);
+ printf("highpri_thread-%d: Okay... I'm done!\n", threadno);
+ fflush(stdout);
+ return NULL;
+}
+
+/****************************************************************************
+ * Name: hog_cpu
+ ****************************************************************************/
+
+static inline void hog_cpu(void)
+{
+#ifdef CONFIG_ARCH_SIM
+ /* The simulator doesn't have any mechanism to do asynchronous pre-emption
+ * (basically because it doesn't have any interupts/asynchronous events).
+ * The simulator does "fake" a timer interrupt in up_idle() -- the idle
+ * thread that only executes when nothing else is running. In the simulator,
+ * we cannot suspend the middle priority task, or we wouldn't have the
+ * test that we want. So, we have no option but to pump the fake clock
+ * here by calling up_idle(). Sigh!
+ */
+
+ up_idle();
+#else
+ /* On real platforms with a real timer interrupt, we really can hog the
+ * CPU. When the sleep() goes off in priority_inheritance(), it will
+ * wake up and start the high priority thread.
+ */
+
+ volatile int i;
+ for (i = 0; i < INT_MAX; i++);
+#endif
+}
+
+/****************************************************************************
+ * Name: medpri_thread
+ ****************************************************************************/
+
+static void *medpri_thread(void *parameter)
+{
+ printf("medpri_thread: Started ... I won't let go of the CPU!\n");
+ g_middlestate = RUNNING;
+ fflush(stdout);
+
+ /* The following loop will completely block lowpri_thread from running.
+ * UNLESS priority inheritance is working. In that case, its priority
+ * will be boosted.
+ */
+
+ while (nhighpri_running() > 0)
+ {
+ hog_cpu();
+ }
+
+ printf("medpri_thread: Okay... I'm done!\n");
+ fflush(stdout);
+ g_middlestate = DONE;
+ return NULL;
+}
+
+/****************************************************************************
+ * Name: lowpri_thread
+ ****************************************************************************/
+
+static void *lowpri_thread(void *parameter)
+{
+ void *retval = (void*)-1;
+ struct sched_param sparam;
+ int threadno = (int)parameter;
+ int expected;
+ int count;
+ int policy;
+ int ret;
+ int nwaiting;
+ int i;
+
+ g_lowstate[threadno-1] = RUNNING;
+ printf("lowpri_thread-%d: Started\n", threadno);
+
+ ret = pthread_getschedparam(pthread_self(), &policy, &sparam);
+ if (ret != 0)
+ {
+ printf("lowpri_thread-%d: ERROR pthread_getschedparam failed: %d\n", threadno, ret);
+ }
+ else
+ {
+ printf("lowpri_thread-%d: initial priority: %d\n", threadno, sparam.sched_priority);
+ if (sparam.sched_priority != g_lowpri)
+ {
+ printf(" ERROR should have been %d\n", g_lowpri);
+ }
+ }
+
+ g_lowstate[threadno-1] = WAITING;
+ ret = sem_wait(&g_sem);
+ if (ret != 0)
+ {
+ printf("lowpri_thread-%d: sem_take failed: %d\n", threadno, ret);
+ }
+ else
+ {
+ /* Hang on to the thread until the middle priority thread runs */
+
+ while (g_middlestate == NOTSTARTED && nhighpri_waiting() < NHIGHPRI_THREADS)
+ {
+ printf("lowpri_thread-%d: Waiting for the midle pri task to run\n", threadno);
+ printf(" g_middlestate: %d\n", (int)g_middlestate);
+ for (i = 0; i < NHIGHPRI_THREADS; i++)
+ {
+ printf(" g_highstate[%d]: %d\n", i, (int)g_highstate[i]);
+ }
+ printf(" I still have a count on the semaphore\n");
+ sem_enumholders(&g_sem);
+ fflush(stdout);
+ sleep(1);
+ }
+
+ /* Account for all of the semaphore counts. At any given time if there are 'n'
+ * running hight prioity tasks, then the semaphore count should be '-n'
+ */
+
+ sched_lock(); /* Needs to be atomic */
+ ret = sem_getvalue(&g_sem, &count);
+ nwaiting = nhighpri_waiting();
+ sched_unlock();
+
+ if (ret < 0)
+ {
+ printf("lowpri_thread-%d: ERROR sem_getvalue failed: %d\n", threadno, errno);
+ }
+ printf("lowpri_thread-%d: Sem count: %d, No. highpri thread: %d\n", threadno, count, nwaiting);
+
+ /* The middle priority task is running, let go of the semaphore */
+
+ if (g_middlestate == RUNNING && nwaiting == -count)
+ {
+ /* Good.. the middle priority task is still running and the counts are okay. */
+
+ retval = NULL;
+ }
+ else
+ {
+ /* If the sem count is positive, then there all of the higher priority threads
+ * should have already completed.
+ */
+
+ printf("lowpri_thread-%d: %s the middle priority task has already exitted!\n",
+ threadno, count >= 0 ? "SUCCESS" : "ERROR" );
+ printf(" g_middlestate: %d sem count=%d\n", (int)g_middlestate, count);
+ for (i = 0; i < NHIGHPRI_THREADS; i++)
+ {
+ printf(" g_highstate[%d]: %d\n", i, (int)g_highstate[i]);
+ }
+ }
+ }
+
+ ret = pthread_getschedparam(pthread_self(), &policy, &sparam);
+ sem_enumholders(&g_sem);
+ sem_post(&g_sem);
+ if (ret != 0)
+ {
+ printf("lowpri_thread-%d: ERROR pthread_getschedparam failed: %d\n", threadno, ret);
+ }
+ else
+ {
+ if (nwaiting > 0)
+ {
+ expected = g_highpri;
+ }
+ else
+ {
+ expected = g_lowpri;
+ }
+
+ printf("lowpri_thread-%d: %s priority before sem_post: %d\n",
+ threadno,
+ sparam.sched_priority != expected ? "ERROR" : "SUCCESS",
+ sparam.sched_priority);
+
+ if (sparam.sched_priority != expected)
+ {
+ printf(" ERROR should have been %d\n", expected);
+ }
+ }
+
+ ret = pthread_getschedparam(pthread_self(), &policy, &sparam);
+ if (ret != 0)
+ {
+ printf("lowpri_thread-%d: ERROR pthread_getschedparam failed: %d\n", threadno, ret);
+ }
+ else
+ {
+ printf("lowpri_thread-%d: %s final priority: %d\n",
+ threadno,
+ sparam.sched_priority != g_lowpri ? "ERROR" : "SUCCESS",
+ sparam.sched_priority);
+
+ if (sparam.sched_priority != g_lowpri)
+ {
+ printf(" ERROR should have been %d\n", g_lowpri);
+ }
+ }
+ sem_enumholders(&g_sem);
+
+ printf("lowpri_thread-%d: Okay... I'm done!\n", threadno);
+ fflush(stdout);
+ g_lowstate[threadno-1] = DONE;
+ return retval;
+}
+#endif /* CONFIG_PRIORITY_INHERITANCE && !CONFIG_DISABLE_SIGNALS && !CONFIG_DISABLE_PTHREAD */
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: priority_inheritance
+ ****************************************************************************/
+
+void priority_inheritance(void)
+{
+#if defined(CONFIG_PRIORITY_INHERITANCE) && !defined(CONFIG_DISABLE_SIGNALS) && !defined(CONFIG_DISABLE_PTHREAD)
+ pthread_t lowpri[NLOWPRI_THREADS];
+ pthread_t medpri;
+ pthread_t highpri[NHIGHPRI_THREADS];
+ pthread_addr_t result;
+ pthread_attr_t attr;
+ struct sched_param sparam;
+ int my_pri;
+ int status;
+ int i;
+
+ printf("priority_inheritance: Started\n");
+
+ g_middlestate = NOTSTARTED;
+ for (i = 0; i < NHIGHPRI_THREADS; i++) g_highstate[i] = NOTSTARTED;
+ for (i = 0; i < NLOWPRI_THREADS; i++) g_lowstate[i] = NOTSTARTED;
+
+ status = sched_getparam (getpid(), &sparam);
+ if (status != 0)
+ {
+ printf("priority_inheritance: sched_getparam failed\n");
+ sparam.sched_priority = PTHREAD_DEFAULT_PRIORITY;
+ }
+ my_pri = sparam.sched_priority;
+
+ g_highpri = sched_get_priority_max(SCHED_FIFO);
+ g_lowpri = sched_get_priority_min(SCHED_FIFO);
+ g_medpri = my_pri - 1;
+
+ sem_init(&g_sem, 0, NLOWPRI_THREADS);
+ dump_nfreeholders("priority_inheritance:");
+
+ /* Start the low priority threads */
+
+ for (i = 0; i < NLOWPRI_THREADS; i++)
+ {
+ int threadno = i+1;
+ printf("priority_inheritance: Starting lowpri_thread-%d (of %d) at %d\n",
+ threadno, NLOWPRI_THREADS, g_lowpri);
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("priority_inheritance: pthread_attr_init failed, status=%d\n", status);
+ }
+ sparam.sched_priority = g_lowpri;
+ status = pthread_attr_setschedparam(&attr,& sparam);
+ if (status != OK)
+ {
+ printf("priority_inheritance: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("priority_inheritance: Set lowpri_thread-%d priority to %d\n",
+ threadno, sparam.sched_priority);
+ }
+
+ status = pthread_create(&lowpri[i], &attr, lowpri_thread, (void*)threadno);
+ if (status != 0)
+ {
+ printf("priority_inheritance: pthread_create failed, status=%d\n", status);
+ }
+ }
+ printf("priority_inheritance: Waiting...\n");
+ sleep(2);
+ dump_nfreeholders("priority_inheritance:");
+
+ /* Start the medium priority thread */
+
+ printf("priority_inheritance: Starting medpri_thread at %d\n", g_medpri);
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("priority_inheritance: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ sparam.sched_priority = g_medpri;
+ status = pthread_attr_setschedparam(&attr,& sparam);
+ if (status != OK)
+ {
+ printf("priority_inheritance: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("priority_inheritance: Set medpri_thread priority to %d\n", sparam.sched_priority);
+ }
+ fflush(stdout);
+
+ status = pthread_create(&medpri, &attr, medpri_thread, NULL);
+ if (status != 0)
+ {
+ printf("priority_inheritance: pthread_create failed, status=%d\n", status);
+ }
+ printf("priority_inheritance: Waiting...\n");
+ sleep(1);
+ dump_nfreeholders("priority_inheritance:");
+
+ /* Start the high priority threads */
+
+ for (i = 0; i < NHIGHPRI_THREADS; i++)
+ {
+ int threadno = i+1;
+ printf("priority_inheritance: Starting highpri_thread-%d (of %d) at %d\n",
+ threadno, NHIGHPRI_THREADS, g_highpri);
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("priority_inheritance: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ sparam.sched_priority = g_highpri - i;
+ status = pthread_attr_setschedparam(&attr,& sparam);
+ if (status != OK)
+ {
+ printf("priority_inheritance: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("priority_inheritance: Set highpri_thread-%d priority to %d\n",
+ threadno, sparam.sched_priority);
+ }
+ fflush(stdout);
+
+ status = pthread_create(&highpri[i], &attr, highpri_thread, (void*)threadno);
+ if (status != 0)
+ {
+ printf("priority_inheritance: pthread_create failed, status=%d\n", status);
+ }
+ }
+ dump_nfreeholders("priority_inheritance:");
+ fflush(stdout);
+
+ /* Wait for all thread instances to complete */
+
+ for (i = 0; i < NHIGHPRI_THREADS; i++)
+ {
+ printf("priority_inheritance: Waiting for highpri_thread-%d to complete\n", i+1);
+ fflush(stdout);
+ (void)pthread_join(highpri[i], &result);
+ dump_nfreeholders("priority_inheritance:");
+ }
+ printf("priority_inheritance: Waiting for medpri_thread to complete\n");
+ fflush(stdout);
+ (void)pthread_join(medpri, &result);
+ dump_nfreeholders("priority_inheritance:");
+ for (i = 0; i < NLOWPRI_THREADS; i++)
+ {
+ printf("priority_inheritance: Waiting for lowpri_thread-%d to complete\n", i+1);
+ fflush(stdout);
+ (void)pthread_join(lowpri[i], &result);
+ dump_nfreeholders("priority_inheritance:");
+ }
+
+ printf("priority_inheritance: Finished\n");
+ sem_destroy(&g_sem);
+ dump_nfreeholders("priority_inheritance:");
+ fflush(stdout);
+#endif /* CONFIG_PRIORITY_INHERITANCE && !CONFIG_DISABLE_SIGNALS && !CONFIG_DISABLE_PTHREAD */
+}
diff --git a/apps/examples/ostest/rmutex.c b/apps/examples/ostest/rmutex.c
new file mode 100644
index 000000000..44eb4bb3b
--- /dev/null
+++ b/apps/examples/ostest/rmutex.c
@@ -0,0 +1,166 @@
+/***********************************************************************
+ * rmutex.c
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <pthread.h>
+#include "ostest.h"
+
+#ifndef NULL
+# define NULL (void*)0
+#endif
+
+#define NTHREADS 3
+#define NLOOPS 3
+#define NRECURSIONS 3
+
+static pthread_mutex_t mut;
+
+static void thread_inner(int id, int level)
+{
+ int status;
+ if (level < NRECURSIONS)
+ {
+ /* Take the mutex */
+
+ printf("thread_inner[%d, %d]: Locking\n", id, level);
+ status = pthread_mutex_lock(&mut);
+ if (status != 0)
+ {
+ printf("thread_inner[%d, %d]: ERROR pthread_mutex_lock failed: %d\n",
+ id, level, status);
+ }
+ printf("thread_inner[%d, %d]: Locked\n", id, level);
+
+ /* Give the other threads a chance */
+
+ pthread_yield();
+ thread_inner(id, level+1);
+ pthread_yield();
+
+ /* Unlock the mutex */
+
+ printf("thread_inner[%d, %d]: Unlocking\n", id, level);
+ status = pthread_mutex_unlock(&mut);
+ if (status != 0)
+ {
+ printf("thread_inner[%d, %d]: ERROR pthread_mutex_unlock failed: %d\n",
+ id, level, status);
+ }
+ printf("thread_inner[%d, %d]: Unlocked\n", id, level);
+ pthread_yield();
+ }
+}
+
+static void *thread_outer(void *parameter)
+{
+ int i;
+ printf("thread_outer[%d]: Started\n", (int)parameter);
+ for (i = 0; i < NLOOPS; i++)
+ {
+ printf("thread_outer[%d]: Loop %d\n", (int)parameter, i);
+ thread_inner((int)parameter, 0);
+ }
+ printf("thread_outer[%d]: Exitting\n", (int)parameter);
+ pthread_exit(NULL);
+ return NULL; /* Non-reachable -- needed for some compilers */
+}
+
+void recursive_mutex_test(void)
+{
+ pthread_t thread[NTHREADS];
+#ifdef SDCC
+ pthread_addr_t result[NTHREADS];
+ pthread_attr_t attr;
+#endif
+ pthread_mutexattr_t mattr;
+ int type;
+ int status;
+ int i;
+
+ /* Initialize the mutex attributes */
+
+ pthread_mutexattr_init(&mattr);
+ status = pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
+ if (status != 0)
+ {
+ printf("recursive_mutex_test: ERROR pthread_mutexattr_settype failed, status=%d\n", status);
+ }
+
+ status = pthread_mutexattr_gettype(&mattr, &type);
+ if (status != 0)
+ {
+ printf("recursive_mutex_test: ERROR pthread_mutexattr_gettype failed, status=%d\n", status);
+ }
+ if (type != PTHREAD_MUTEX_RECURSIVE)
+ {
+ printf("recursive_mutex_test: ERROR pthread_mutexattr_gettype return type=%d\n", type);
+ }
+
+ /* Initialize the mutex */
+
+ printf("recursive_mutex_test: Initializing mutex\n");
+ pthread_mutex_init(&mut, &mattr);
+
+ /* Start the threads -- all at the same, default priority */
+
+ for (i = 0; i < NTHREADS; i++)
+ {
+ printf("recursive_mutex_test: Starting thread %d\n", i+1);
+#ifdef SDCC
+ (void)pthread_attr_init(&attr);
+ status = pthread_create(&thread[i], &attr, thread_outer, (pthread_addr_t)i+1);
+#else
+ status = pthread_create(&thread[i], NULL, thread_outer, (pthread_addr_t)i+1);
+#endif
+ if (status != 0)
+ {
+ printf("recursive_mutex_test: ERRROR thread#%d creation: %d\n", i+1, status);
+ }
+ }
+
+ /* Wait for all; of the threads to complete */
+
+ for (i = 0; i < NTHREADS; i++)
+ {
+ printf("recursive_mutex_test: Waiting for thread %d\n", i+1);
+#ifdef SDCC
+ pthread_join(thread[i], &result1);
+#else
+ pthread_join(thread[i], NULL);
+#endif
+ }
+
+ printf("recursive_mutex_test: Complete\n");
+}
diff --git a/apps/examples/ostest/roundrobin.c b/apps/examples/ostest/roundrobin.c
new file mode 100644
index 000000000..061d51f3d
--- /dev/null
+++ b/apps/examples/ostest/roundrobin.c
@@ -0,0 +1,232 @@
+/********************************************************************************
+ * examples/ostest/roundrobin.c
+ *
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 "ostest.h"
+
+#if CONFIG_RR_INTERVAL > 0
+
+/********************************************************************************
+ * Definitions
+ ********************************************************************************/
+
+/* This number may need to be tuned for different processor speeds. Since these
+ * arrays must be large to very correct SCHED_RR behavior, this test may require
+ * too much memory on many targets.
+ */
+
+/* #define CONFIG_NINTEGERS 32768 Takes forever on 60Mhz ARM7 */
+
+#define CONFIG_NINTEGERS 2048
+
+/********************************************************************************
+ * Private Data
+ ********************************************************************************/
+
+static int prime1[CONFIG_NINTEGERS];
+static int prime2[CONFIG_NINTEGERS];
+
+/********************************************************************************
+ * Private Functions
+ ********************************************************************************/
+
+/********************************************************************************
+ * Name: dosieve
+ *
+ * Description
+ * This implements a "sieve of aristophanes" algorithm for finding prime number.
+ * Credit for this belongs to someone, but I am not sure who anymore. Anyway,
+ * the only purpose here is that we need some algorithm that takes a long period
+ * of time to execute.
+ *
+ ********************************************************************************/
+
+static void dosieve(int *prime)
+{
+ int a,d;
+ int i;
+ int j;
+
+ a = 2;
+ d = a;
+
+ for (i = 0; i < CONFIG_NINTEGERS; i++)
+ {
+ prime[i] = i+2;
+ }
+
+ for (i = 1; i < 10; i++)
+ {
+ for (j = 0; j < CONFIG_NINTEGERS; j++)
+ {
+ d = a + d;
+ if (d < CONFIG_NINTEGERS)
+ {
+ prime[d]=0;
+ }
+ }
+ a++;
+ d = a;
+ i++;
+ }
+
+#if 0 /* We don't really care what the numbers are */
+ for (i = 0, j= 0; i < CONFIG_NINTEGERS; i++)
+ {
+ if (prime[i] != 0)
+ {
+ printf(" Prime %d: %d\n", j, prime[i]);
+ j++;
+ }
+ }
+#endif
+}
+
+/********************************************************************************
+ * Name: sieve1
+ ********************************************************************************/
+
+static void *sieve1(void *parameter)
+{
+ int i;
+
+ printf("sieve1 started\n");
+
+ for (i = 0; i < 1000; i++)
+ {
+ dosieve(prime1);
+ }
+
+ printf("sieve1 finished\n");
+
+ pthread_exit(NULL);
+ return NULL; /* To keep some compilers happy */
+}
+
+/********************************************************************************
+ * Name: sieve2
+ ********************************************************************************/
+
+static void *sieve2(void *parameter)
+{
+ int i;
+
+ printf("sieve2 started\n");
+
+ for (i = 0; i < 1000; i++)
+ {
+ dosieve(prime2);
+ }
+
+ printf("sieve2 finished\n");
+
+ pthread_exit(NULL);
+ return NULL; /* To keep some compilers happy */
+}
+
+/********************************************************************************
+ * Public Functions
+ ********************************************************************************/
+
+/********************************************************************************
+ * Name: rr_test
+ ********************************************************************************/
+
+void rr_test(void)
+{
+ pthread_t sieve1_thread;
+ pthread_t sieve2_thread;
+ struct sched_param sparam;
+ pthread_attr_t attr;
+ pthread_addr_t result;
+ int status;
+
+ printf("rr_test: Starting sieve1 thread \n");
+ status = pthread_attr_init(&attr);
+ if (status != OK)
+ {
+ printf("rr_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ sparam.sched_priority = sched_get_priority_min(SCHED_FIFO);
+ status = pthread_attr_setschedparam(&attr, &sparam);
+ if (status != OK)
+ {
+ printf("rr_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("rr_test: Set thread priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_attr_setschedpolicy(&attr, SCHED_RR);
+ if (status != OK)
+ {
+ printf("rr_test: pthread_attr_setschedpolicy failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("rr_test: Set thread policty to SCHED_RR\n");
+ }
+
+ status = pthread_create(&sieve1_thread, &attr, sieve1, NULL);
+ if (status != 0)
+ {
+ printf("rr_test: Error in thread 1 creation, status=%d\n", status);
+ }
+
+ printf("rr_test: Starting sieve1 thread \n");
+
+ status = pthread_create(&sieve2_thread, &attr, sieve2, NULL);
+ if (status != 0)
+ {
+ printf("rr_test: Error in thread 2 creation, status=%d\n", status);
+ }
+
+ printf("rr_test: Waiting for sieves to complete -- this should take awhile\n");
+ printf("rr_test: If RR scheduling is working, they should start and complete at\n");
+ printf("rr_test: about the same time\n");
+
+ pthread_join(sieve2_thread, &result);
+ pthread_join(sieve1_thread, &result);
+ printf("rr_test: Done\n");
+}
+
+#endif /* CONFIG_RR_INTERVAL */
diff --git a/apps/examples/ostest/sem.c b/apps/examples/ostest/sem.c
new file mode 100644
index 000000000..850cf8040
--- /dev/null
+++ b/apps/examples/ostest/sem.c
@@ -0,0 +1,246 @@
+/***********************************************************************
+ * sem.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <sched.h>
+#include "ostest.h"
+
+#ifndef NULL
+# define NULL (void*)0
+#endif
+
+static sem_t sem;
+
+static void *waiter_func(void *parameter)
+{
+ int id = (int)parameter;
+ int status;
+ int value;
+
+ printf("waiter_func: Thread %d Started\n", id);
+
+ /* Take the semaphore */
+
+ status = sem_getvalue(&sem, &value);
+ if (status < 0)
+ {
+ printf("waiter_func: ERROR thread %d could not get semaphore value\n", id);
+ }
+ else
+ {
+ printf("waiter_func: Thread %d initial semaphore value = %d\n", id, value);
+ }
+
+ printf("waiter_func: Thread %d waiting on semaphore\n", id);
+ status = sem_wait(&sem);
+ if (status != 0)
+ {
+ printf("waiter_func: ERROR thread %d sem_wait failed\n", id);
+ }
+ printf("waiter_func: Thread %d awakened\n", id);
+
+ status = sem_getvalue(&sem, &value);
+ if (status < 0)
+ {
+ printf("waiter_func: ERROR thread %d could not get semaphore value\n", id);
+ }
+ else
+ {
+ printf("waiter_func: Thread %d new semaphore value = %d\n", id, value);
+ }
+
+ printf("waiter_func: Thread %d done\n", id);
+ return NULL;
+}
+
+static void *poster_func(void *parameter)
+{
+ int id = (int)parameter;
+ int status;
+ int value;
+
+ printf("poster_func: Thread %d started\n", id);
+
+ /* Take the semaphore */
+
+ do
+ {
+ status = sem_getvalue(&sem, &value);
+ if (status < 0)
+ {
+ printf("poster_func: ERROR thread %d could not get semaphore value\n", id);
+ }
+ else
+ {
+ printf("poster_func: Thread %d semaphore value = %d\n", id, value);
+ }
+
+ if (value < 0)
+ {
+ printf("poster_func: Thread %d posting semaphore\n", id);
+ status = sem_post(&sem);
+ if (status != 0)
+ {
+ printf("poster_func: ERROR thread %d sem_wait failed\n", id);
+ }
+
+ pthread_yield();
+
+ status = sem_getvalue(&sem, &value);
+ if (status < 0)
+ {
+ printf("poster_func: ERROR thread %d could not get semaphore value\n", id);
+ }
+ else
+ {
+ printf("poster_func: Thread %d new semaphore value = %d\n", id, value);
+ }
+ }
+ }
+ while (value < 0);
+
+ printf("poster_func: Thread %d done\n", id);
+ return NULL;
+
+}
+
+void sem_test(void)
+{
+ pthread_t waiter_thread1;
+ pthread_t waiter_thread2;
+ pthread_t poster_thread;
+#ifdef SDCC
+ pthread_addr_t result;
+#endif
+ struct sched_param sparam;
+ int prio_min;
+ int prio_max;
+ int prio_mid;
+ pthread_attr_t attr;
+ int status;
+
+ printf("sem_test: Initializing semaphore to 0\n");
+ sem_init(&sem, 0, 0);
+
+ /* Start two waiter thread instances */
+
+ printf("sem_test: Starting waiter thread 1\n");
+ status = pthread_attr_init(&attr);
+ if (status != OK)
+ {
+ printf("sem_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ prio_min = sched_get_priority_min(SCHED_FIFO);
+ prio_max = sched_get_priority_max(SCHED_FIFO);
+ prio_mid = (prio_min + prio_max) / 2;
+
+ sparam.sched_priority = (prio_mid + prio_max) / 2;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("sem_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("sem_test: Set thread 1 priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&waiter_thread1, &attr, waiter_func, (pthread_addr_t)1);
+ if (status != 0)
+ {
+ printf("sem_test: Error in thread 1 creation, status=%d\n", status);
+ }
+
+ printf("sem_test: Starting waiter thread 2\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("sem_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ sparam.sched_priority = prio_mid;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("sem_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("sem_test: Set thread 2 priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&waiter_thread2, &attr, waiter_func, (pthread_addr_t)2);
+ if (status != 0)
+ {
+ printf("sem_test: Error in thread 2 creation, status=%d\n", status);
+ }
+
+ printf("sem_test: Starting poster thread 3\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("sem_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ sparam.sched_priority = (prio_min + prio_mid) / 2;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("sem_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("sem_test: Set thread 3 priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&poster_thread, &attr, poster_func, (pthread_addr_t)3);
+ if (status != 0)
+ {
+ printf("sem_test: Error in thread 3 creation, status=%d\n", status);
+ }
+
+#ifdef SDCC
+ pthread_join(waiter_thread1, &result);
+ pthread_join(waiter_thread2, &result);
+ pthread_join(poster_thread, &result);
+#else
+ pthread_join(waiter_thread1, NULL);
+ pthread_join(waiter_thread2, NULL);
+ pthread_join(poster_thread, NULL);
+#endif
+}
diff --git a/apps/examples/ostest/sighand.c b/apps/examples/ostest/sighand.c
new file mode 100644
index 000000000..46650be1c
--- /dev/null
+++ b/apps/examples/ostest/sighand.c
@@ -0,0 +1,279 @@
+/***********************************************************************
+ * examples/ostest/sighand.c
+ *
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/types.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <semaphore.h>
+#include <signal.h>
+#include <sched.h>
+#include <errno.h>
+#include "ostest.h"
+
+#ifndef NULL
+# define NULL (void*)0
+#endif
+
+#define WAKEUP_SIGNAL 17
+#define SIGVALUE_INT 42
+
+static sem_t sem;
+static bool sigreceived = false;
+static bool threadexited = false;
+
+static void wakeup_action(int signo, siginfo_t *info, void *ucontext)
+{
+ sigset_t oldset;
+ sigset_t allsigs;
+ int status;
+
+ printf("wakeup_action: Received signal %d\n" , signo);
+
+ sigreceived = true;
+
+ /* Check signo */
+
+ if (signo != WAKEUP_SIGNAL)
+ {
+ printf("wakeup_action: ERROR expected signo=%d\n" , WAKEUP_SIGNAL);
+ }
+
+ /* Check siginfo */
+
+ if (info->si_value.sival_int != SIGVALUE_INT)
+ {
+ printf("wakeup_action: ERROR sival_int=%d expected %d\n",
+ info->si_value.sival_int, SIGVALUE_INT);
+ }
+ else
+ {
+ printf("wakeup_action: sival_int=%d\n" , info->si_value.sival_int);
+ }
+
+ if (info->si_signo != WAKEUP_SIGNAL)
+ {
+ printf("wakeup_action: ERROR expected si_signo=%d, got=%d\n",
+ WAKEUP_SIGNAL, info->si_signo);
+ }
+
+ printf("wakeup_action: si_code=%d\n" , info->si_code);
+
+ /* Check ucontext_t */
+
+ printf("wakeup_action: ucontext=%p\n" , ucontext);
+
+ /* Check sigprocmask */
+
+ (void)sigfillset(&allsigs);
+ status = sigprocmask(SIG_SETMASK, NULL, &oldset);
+ if (status != OK)
+ {
+ printf("wakeup_action: ERROR sigprocmask failed, status=%d\n",
+ status);
+ }
+
+ if (oldset != allsigs)
+ {
+ printf("wakeup_action: ERROR sigprocmask=%x expected=%x\n",
+ oldset, allsigs);
+ }
+}
+
+static int waiter_main(int argc, char *argv[])
+{
+ sigset_t sigset;
+ struct sigaction act;
+ struct sigaction oact;
+ int status;
+
+ printf("waiter_main: Waiter started\n" );
+
+ printf("waiter_main: Unmasking signal %d\n" , WAKEUP_SIGNAL);
+ (void)sigemptyset(&sigset);
+ (void)sigaddset(&sigset, WAKEUP_SIGNAL);
+ status = sigprocmask(SIG_UNBLOCK, &sigset, NULL);
+ if (status != OK)
+ {
+ printf("waiter_main: ERROR sigprocmask failed, status=%d\n",
+ status);
+ }
+
+ printf("waiter_main: Registering signal handler\n" );
+ act.sa_sigaction = wakeup_action;
+ act.sa_flags = SA_SIGINFO;
+
+ (void)sigfillset(&act.sa_mask);
+ (void)sigdelset(&act.sa_mask, WAKEUP_SIGNAL);
+
+ status = sigaction(WAKEUP_SIGNAL, &act, &oact);
+ if (status != OK)
+ {
+ printf("waiter_main: ERROR sigaction failed, status=%d\n" , status);
+ }
+
+#ifndef SDCC
+ printf("waiter_main: oact.sigaction=%p oact.sa_flags=%x oact.sa_mask=%x\n",
+ oact.sa_sigaction, oact.sa_flags, oact.sa_mask);
+#endif
+
+ /* Take the semaphore */
+
+ printf("waiter_main: Waiting on semaphore\n" );
+
+#if CONFIG_NFILE_STREAMS > 0
+ fflush(stdout);
+#endif
+
+ status = sem_wait(&sem);
+ if (status != 0)
+ {
+ int error = *get_errno_ptr();
+ if (error == EINTR)
+ {
+ printf("waiter_main: sem_wait() successfully interrupted by signal\n" );
+ }
+ else
+ {
+ printf("waiter_main: ERROR sem_wait failed, errno=%d\n" , error);
+ }
+ }
+ else
+ {
+ printf("waiter_main: ERROR awakened with no error!\n" );
+ }
+
+ /* Detach the signal handler */
+
+ act.sa_sigaction = SIG_DFL;
+ status = sigaction(WAKEUP_SIGNAL, &act, &oact);
+
+ printf("waiter_main: done\n" );
+
+#if CONFIG_NFILE_STREAMS > 0
+ fflush(stdout);
+#endif
+
+ threadexited = true;
+ return 0;
+}
+
+void sighand_test(void)
+{
+ struct sched_param param;
+ union sigval sigvalue;
+ pid_t waiterpid;
+ int policy;
+ int status;
+
+ printf("sighand_test: Initializing semaphore to 0\n" );
+ sem_init(&sem, 0, 0);
+
+ /* Start waiter thread */
+
+ printf("sighand_test: Starting waiter task\n" );
+ status = sched_getparam (0, &param);
+ if (status != OK)
+ {
+ printf("sighand_test: ERROR sched_getparam() failed\n" );
+ param.sched_priority = PTHREAD_DEFAULT_PRIORITY;
+ }
+
+ policy = sched_getscheduler(0);
+ if (policy == ERROR)
+ {
+ printf("sighand_test: ERROR sched_getscheduler() failed\n" );
+ policy = SCHED_FIFO;
+ }
+
+ waiterpid = task_create("waiter", param.sched_priority,
+ PTHREAD_STACK_DEFAULT, waiter_main, NULL);
+ if (waiterpid == ERROR)
+ {
+ printf("sighand_test: ERROR failed to start waiter_main\n" );
+ }
+ else
+ {
+ printf("sighand_test: Started waiter_main pid=%d\n", waiterpid);
+ }
+
+ /* Wait a bit */
+
+#if CONFIG_NFILE_STREAMS > 0
+ fflush(stdout);
+#endif
+ sleep(2);
+
+ /* Then signal the waiter thread. */
+
+ printf("sighand_test: Signaling pid=%d with signo=%d sigvalue=%d\n",
+ waiterpid, WAKEUP_SIGNAL, SIGVALUE_INT);
+
+ sigvalue.sival_int = SIGVALUE_INT;
+#ifdef CONFIG_CAN_PASS_STRUCTS
+ status = sigqueue(waiterpid, WAKEUP_SIGNAL, sigvalue);
+#else
+ status = sigqueue(waiterpid, WAKEUP_SIGNAL, sigvalue.sival_ptr);
+#endif
+ if (status != OK)
+ {
+ printf("sighand_test: ERROR sigqueue failed\n" );
+ task_delete(waiterpid);
+ }
+
+ /* Wait a bit */
+
+#if CONFIG_NFILE_STREAMS > 0
+ fflush(stdout);
+#endif
+ sleep(2);
+
+ /* Then check the result */
+
+ if (!threadexited)
+ {
+ printf("sighand_test: ERROR waiter task did not exit\n" );
+ }
+
+ if (!sigreceived)
+ {
+ printf("sighand_test: ERROR signal handler did not run\n" );
+ }
+
+ printf("sighand_test: done\n" );
+#if CONFIG_NFILE_STREAMS > 0
+ fflush(stdout);
+#endif
+}
diff --git a/apps/examples/ostest/timedmqueue.c b/apps/examples/ostest/timedmqueue.c
new file mode 100644
index 000000000..9c14ec414
--- /dev/null
+++ b/apps/examples/ostest/timedmqueue.c
@@ -0,0 +1,393 @@
+/**************************************************************************
+ * examples/ostest/mqueue.c
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <mqueue.h>
+#include <sched.h>
+#include <errno.h>
+
+#include "ostest.h"
+
+/**************************************************************************
+ * Private Definitions
+ **************************************************************************/
+
+#define TEST_MESSAGE "This is a test and only a test"
+#if defined(SDCC) || defined(__ZILOG__)
+ /* Cannot use strlen in array size */
+
+# define TEST_MSGLEN (31)
+#else
+ /* Message lenght is the size of the message plus the null terminator */
+
+# define TEST_MSGLEN (strlen(TEST_MESSAGE)+1)
+#endif
+
+#define TEST_SEND_NMSGS (10)
+#define TEST_RECEIVE_NMSGS (10)
+
+#if CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0
+# define FFLUSH() fflush(stdout)
+#else
+# define FFLUSH()
+#endif
+
+/**************************************************************************
+ * Private Types
+ **************************************************************************/
+
+/**************************************************************************
+ * Private Function Prototypes
+ **************************************************************************/
+
+/**************************************************************************
+ * Global Variables
+ **************************************************************************/
+
+/**************************************************************************
+ * Private Variables
+ **************************************************************************/
+
+/**************************************************************************
+ * Private Functions
+ **************************************************************************/
+
+/**************************************************************************
+ * Public Functions
+ **************************************************************************/
+
+static void *sender_thread(void *arg)
+{
+ mqd_t mqfd;
+ char msg_buffer[TEST_MSGLEN];
+ struct mq_attr attr;
+ int status = 0;
+ int nerrors = 0;
+ int i;
+
+ printf("sender_thread: Starting\n");
+
+ /* Fill in attributes for message queue */
+
+ attr.mq_maxmsg = TEST_SEND_NMSGS-1;
+ attr.mq_msgsize = TEST_MSGLEN;
+ attr.mq_flags = 0;
+
+ /* Set the flags for the open of the queue.
+ * Make it a blocking open on the queue, meaning it will block if
+ * this process tries to send to the queue and the queue is full.
+ *
+ * O_CREAT - the queue will get created if it does not already exist.
+ * O_WRONLY - we are only planning to write to the queue.
+ *
+ * Open the queue, and create it if the receiving process hasn't
+ * already created it.
+ */
+
+ mqfd = mq_open("testmq", O_WRONLY|O_CREAT, 0666, &attr);
+ if (mqfd < 0)
+ {
+ printf("sender_thread: ERROR mq_open failed\n");
+ pthread_exit((pthread_addr_t)1);
+ }
+
+ /* Fill in a test message buffer to send */
+
+ memcpy(msg_buffer, TEST_MESSAGE, TEST_MSGLEN);
+
+ /* Perform the send TEST_SEND_NMSGS times */
+
+ for (i = 0; i < TEST_SEND_NMSGS; i++)
+ {
+ struct timespec time;
+ status = clock_gettime(CLOCK_REALTIME, &time);
+ if (status != 0)
+ {
+ printf("sender_thread: ERROR clock_gettime failed\n");
+ }
+ time.tv_sec += 5;
+
+ /* The first TEST_SEND_NMSGS-1 send should succeed. The last
+ * one should fail with errno == ETIMEDOUT
+ */
+
+ status = mq_timedsend(mqfd, msg_buffer, TEST_MSGLEN, 42, &time);
+ if (status < 0)
+ {
+ if (i == TEST_SEND_NMSGS-1 && *get_errno_ptr() == ETIMEDOUT)
+ {
+ printf("sender_thread: mq_timedsend %d timed out as expected\n", i);
+ }
+ else
+ {
+ printf("sender_thread: ERROR mq_timedsend failure=%d on msg %d\n", *get_errno_ptr(), i);
+ nerrors++;
+ }
+ }
+ else
+ {
+ if (i == TEST_SEND_NMSGS-1)
+ {
+ printf("sender_thread: ERROR mq_timedsend of msg %d succeeded\n", i);
+ nerrors++;
+ }
+ else
+ {
+ printf("sender_thread: mq_timedsend succeeded on msg %d\n", i);
+ }
+ }
+ }
+
+ /* Close the queue and return success */
+
+ if (mq_close(mqfd) < 0)
+ {
+ printf("sender_thread: ERROR mq_close failed\n");
+ }
+
+ printf("sender_thread: returning nerrors=%d\n", nerrors);
+ FFLUSH();
+ return (pthread_addr_t)nerrors;
+}
+
+static void *receiver_thread(void *arg)
+{
+ mqd_t mqfd;
+ char msg_buffer[TEST_MSGLEN];
+ struct mq_attr attr;
+ int nbytes;
+ int nerrors = 0;
+ int i;
+
+ printf("receiver_thread: Starting\n");
+
+ /* Fill in attributes for message queue */
+
+ attr.mq_maxmsg = TEST_SEND_NMSGS-1;
+ attr.mq_msgsize = TEST_MSGLEN;
+ attr.mq_flags = 0;
+
+ /* Set the flags for the open of the queue.
+ * Make it a blocking open on the queue, meaning it will block if
+ * this process tries to* send to the queue and the queue is full.
+ *
+ * O_CREAT - the queue will get created if it does not already exist.
+ * O_RDONLY - we are only planning to write to the queue.
+ *
+ * Open the queue, and create it if the sending process hasn't
+ * already created it.
+ */
+
+ mqfd = mq_open("testmq", O_RDONLY|O_CREAT, 0666, &attr);
+ if (mqfd < 0)
+ {
+ printf("receiver_thread: ERROR mq_open failed\n");
+ pthread_exit((pthread_addr_t)1);
+ }
+
+ /* Perform the receive TEST_RECEIVE_NMSGS times */
+
+ for (i = 0; i < TEST_RECEIVE_NMSGS; i++)
+ {
+ struct timespec time;
+ int status = clock_gettime(CLOCK_REALTIME, &time);
+ if (status != 0)
+ {
+ printf("sender_thread: ERROR clock_gettime failed\n");
+ }
+ time.tv_sec += 5;
+
+ /* The first TEST_SEND_NMSGS-1 send should succeed. The last
+ * one should fail with errno == ETIMEDOUT
+ */
+
+ memset(msg_buffer, 0xaa, TEST_MSGLEN);
+ nbytes = mq_timedreceive(mqfd, msg_buffer, TEST_MSGLEN, 0, &time);
+ if (nbytes < 0)
+ {
+ if (i == TEST_SEND_NMSGS-1 && *get_errno_ptr() == ETIMEDOUT)
+ {
+ printf("receiver_thread: Receive %d timed out as expected\n", i);
+ }
+ else
+ {
+ printf("receiver_thread: ERROR mq_timedreceive failure=%d on msg %d\n", *get_errno_ptr(), i);
+ nerrors++;
+ }
+ }
+ else if (nbytes != TEST_MSGLEN)
+ {
+ printf("receiver_thread: mq_timedreceive return bad size %d on msg %d\n", nbytes, i);
+ nerrors++;
+ }
+ else if (memcmp(TEST_MESSAGE, msg_buffer, nbytes) != 0)
+ {
+ int j;
+
+ printf("receiver_thread: mq_timedreceive returned corrupt message on msg %d\n", i);
+ printf("receiver_thread: i Expected Received\n");
+
+ for (j = 0; j < TEST_MSGLEN-1; j++)
+ {
+ if (isprint(msg_buffer[j]))
+ {
+ printf("receiver_thread: %2d %02x (%c) %02x (%c)\n",
+ j, TEST_MESSAGE[j], TEST_MESSAGE[j], msg_buffer[j], msg_buffer[j]);
+ }
+ else
+ {
+ printf("receiver_thread: %2d %02x (%c) %02x\n",
+ j, TEST_MESSAGE[j], TEST_MESSAGE[j], msg_buffer[j]);
+ }
+ }
+ printf("receiver_thread: %2d 00 %02x\n",
+ j, msg_buffer[j]);
+ }
+ else if (i == TEST_SEND_NMSGS-1)
+ {
+ printf("receiver_thread: ERROR mq_timedreceive of msg %d succeeded\n", i);
+ nerrors++;
+ }
+ else
+ {
+ printf("receiver_thread: mq_timedreceive succeeded on msg %d\n", i);
+ }
+ }
+
+ /* Close the queue and return success */
+
+ if (mq_close(mqfd) < 0)
+ {
+ printf("receiver_thread: ERROR mq_close failed\n");
+ nerrors++;
+ }
+
+ /* Destroy the queue */
+
+ if (mq_unlink("testmq") < 0)
+ {
+ printf("receiver_thread: ERROR mq_close failed\n");
+ nerrors++;
+ }
+
+ printf("receiver_thread: returning nerrors=%d\n", nerrors);
+ FFLUSH();
+ pthread_exit((pthread_addr_t)nerrors);
+ return (pthread_addr_t)nerrors;
+}
+
+void timedmqueue_test(void)
+{
+ pthread_t sender;
+ pthread_t receiver;
+ void *result;
+ pthread_attr_t attr;
+ int status;
+
+ /* Start the sending thread at the default priority */
+
+ printf("timedmqueue_test: Starting sender\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("timedmqueue_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ status = pthread_attr_setstacksize(&attr, STACKSIZE);
+ if (status != 0)
+ {
+ printf("timedmqueue_test: pthread_attr_setstacksize failed, status=%d\n", status);
+ }
+
+ status = pthread_create(&sender, &attr, sender_thread, NULL);
+ if (status != 0)
+ {
+ printf("timedmqueue_test: pthread_create failed, status=%d\n", status);
+ }
+
+ /* Wait for the sending thread to complete */
+
+ printf("timedmqueue_test: Waiting for sender to complete\n");
+ pthread_join(sender, &result);
+ if (result != (void*)0)
+ {
+ printf("timedmqueue_test: ERROR sender thread exited with %d errors\n", (int)result);
+ }
+
+ /* Start the receiving thread at the default priority */
+
+ printf("timedmqueue_test: Starting receiver\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("timedmqueue_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ status = pthread_attr_setstacksize(&attr, STACKSIZE);
+ if (status != 0)
+ {
+ printf("timedmqueue_test: pthread_attr_setstacksize failed, status=%d\n", status);
+ }
+
+ status = pthread_create(&receiver, &attr, receiver_thread, NULL);
+ if (status != 0)
+ {
+ printf("timedmqueue_test: pthread_create failed, status=%d\n", status);
+ }
+
+ /* Wait for the receiving thread to complete */
+
+ printf("timedmqueue_test: Waiting for receiver to complete\n");
+ pthread_join(receiver, &result);
+ if (result != (void*)0)
+ {
+ printf("timedmqueue_test: ERROR receiver thread exited with %d errors\n", (int)result);
+ }
+
+ printf("timedmqueue_test: Test complete\n");
+}
+
+
diff --git a/apps/examples/ostest/timedwait.c b/apps/examples/ostest/timedwait.c
new file mode 100644
index 000000000..51622bad8
--- /dev/null
+++ b/apps/examples/ostest/timedwait.c
@@ -0,0 +1,201 @@
+/***********************************************************************
+ * examples/ostest/timedwait.c
+ *
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <time.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "ostest.h"
+
+/**************************************************************************
+ * Private Definitions
+ **************************************************************************/
+
+#if CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0
+# define FFLUSH() fflush(stdout)
+#else
+# define FFLUSH()
+#endif
+
+/**************************************************************************
+ * Private Data
+ **************************************************************************/
+
+static pthread_mutex_t mutex;
+static pthread_cond_t cond;
+
+/**************************************************************************
+ * Private Functions
+ **************************************************************************/
+
+static void *thread_waiter(void *parameter)
+{
+ struct timespec time;
+ int status;
+
+ /* Take the mutex */
+
+ printf("thread_waiter: Taking mutex\n");
+ status = pthread_mutex_lock(&mutex);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR pthread_mutex_lock failed, status=%d\n", status);
+ }
+
+ printf("thread_waiter: Starting 5 second wait for condition\n");
+
+ status = clock_gettime(CLOCK_REALTIME, &time);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR clock_gettime failed\n");
+ }
+ time.tv_sec += 5;
+
+ /* The wait -- no-one is ever going to awaken us */
+
+ status = pthread_cond_timedwait(&cond, &mutex, &time);
+ if (status != 0)
+ {
+ if (status == ETIMEDOUT)
+ {
+ printf("thread_waiter: pthread_cond_timedwait timed out\n");
+ }
+ else
+ {
+ printf("thread_waiter: ERROR pthread_cond_timedwait failed, status=%d\n", status);
+ }
+ }
+ else
+ {
+ printf("thread_waiter: ERROR pthread_cond_timedwait returned without timeout, status=%d\n", status);
+ }
+
+ /* Release the mutex */
+
+ printf("thread_waiter: Releasing mutex\n");
+ status = pthread_mutex_unlock(&mutex);
+ if (status != 0)
+ {
+ printf("thread_waiter: ERROR pthread_mutex_unlock failed, status=%d\n", status);
+ }
+
+ printf("thread_waiter: Exit with status 0x12345678\n");
+ pthread_exit((pthread_addr_t)0x12345678);
+ return NULL;
+}
+
+/**************************************************************************
+ * Public Definitions
+ **************************************************************************/
+
+void timedwait_test(void)
+{
+ pthread_t waiter;
+ pthread_attr_t attr;
+ struct sched_param sparam;
+ void *result;
+ int prio_max;
+ int status;
+
+ /* Initialize the mutex */
+
+ printf("thread_waiter: Initializing mutex\n");
+ status = pthread_mutex_init(&mutex, NULL);
+ if (status != 0)
+ {
+ printf("timedwait_test: ERROR pthread_mutex_init failed, status=%d\n", status);
+ }
+
+ /* Initialize the condition variable */
+
+ printf("timedwait_test: Initializing cond\n");
+ status = pthread_cond_init(&cond, NULL);
+ if (status != 0)
+ {
+ printf("timedwait_test: ERROR pthread_condinit failed, status=%d\n", status);
+ }
+
+ /* Start the waiter thread at higher priority */
+
+ printf("timedwait_test: Starting waiter\n");
+ status = pthread_attr_init(&attr);
+ if (status != 0)
+ {
+ printf("timedwait_test: pthread_attr_init failed, status=%d\n", status);
+ }
+
+ prio_max = sched_get_priority_max(SCHED_FIFO);
+ status = sched_getparam (getpid(), &sparam);
+ if (status != 0)
+ {
+ printf("timedwait_test: sched_getparam failed\n");
+ sparam.sched_priority = PTHREAD_DEFAULT_PRIORITY;
+ }
+
+ sparam.sched_priority = (prio_max + sparam.sched_priority) / 2;
+ status = pthread_attr_setschedparam(&attr,&sparam);
+ if (status != OK)
+ {
+ printf("timedwait_test: pthread_attr_setschedparam failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("timedwait_test: Set thread 2 priority to %d\n", sparam.sched_priority);
+ }
+
+ status = pthread_create(&waiter, &attr, thread_waiter, NULL);
+ if (status != 0)
+ {
+ printf("timedwait_test: pthread_create failed, status=%d\n", status);
+ }
+
+ printf("timedwait_test: Joining\n");
+ FFLUSH();
+ status = pthread_join(waiter, &result);
+ if (status != 0)
+ {
+ printf("timedwait_test: ERROR pthread_join failed, status=%d\n", status);
+ }
+ else
+ {
+ printf("timedwait_test: waiter exited with result=%p\n", result);
+ }
+}
diff --git a/apps/examples/pashello/Makefile b/apps/examples/pashello/Makefile
new file mode 100644
index 000000000..501ac2d19
--- /dev/null
+++ b/apps/examples/pashello/Makefile
@@ -0,0 +1,97 @@
+############################################################################
+# apps/examples/pashello/Makefile
+#
+# Copyright (C) 2008-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Pascal Add-On Example
+
+ifeq ($(WINTOOL),y)
+INCDIROPT = -w
+endif
+
+CFLAGS += ${shell $(TOPDIR)/tools/incdir.sh $(INCDIROPT) "$(CC)" $(TOPDIR)/pcode/include }
+CFLAGS += ${shell $(TOPDIR)/tools/incdir.sh $(INCDIROPT) "$(CC)" $(TOPDIR)/pcode/insn/include}
+
+ASRCS =
+CSRCS = pashello.c device.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/pashello/README.txt b/apps/examples/pashello/README.txt
new file mode 100644
index 000000000..b976f18cf
--- /dev/null
+++ b/apps/examples/pashello/README.txt
@@ -0,0 +1,34 @@
+README
+^^^^^^
+
+hello.pas
+
+ This is a sample "Hello, World!" Pascal Program
+
+hello.pex
+
+ This is the compiled, linked P-Code executable that results
+ when hello.pas is compiled.
+
+hello.h
+
+ This file defines an initialized C array holds a copy of
+ hello.pex. This file as created by:
+
+ xxd -i hello.pex >hello.h
+
+mkhello.sh
+
+ This is a scripts that can be used to rebuild both hello.pex
+ and hello.h.
+
+device.c
+
+ The hello.pex file must be provided to the interpreter as a file
+ in the file system. Normally this would be done using real storage
+ medium. In this example, we will use device.c:
+
+ device.c implements a simple device driver. Reads from this device
+ will access the in-memory copy of hello.pex This device driver is
+ registered as /dev/pashello in the psuedo filesystem.
+
diff --git a/apps/examples/pashello/device.c b/apps/examples/pashello/device.c
new file mode 100644
index 000000000..5f0038ad7
--- /dev/null
+++ b/apps/examples/pashello/device.c
@@ -0,0 +1,110 @@
+/****************************************************************************
+ * examples/pashello/device.c
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Compilation Switches
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <string.h>
+#include <errno.h>
+#include <nuttx/fs.h>
+
+#include "hello.h"
+#include "pashello.h"
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static ssize_t hello_read(struct file *, char *, size_t);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct file_operations hello_fops =
+{
+ 0, /* open */
+ 0, /* close */
+ hello_read, /* read */
+ 0, /* write */
+ 0, /* seek */
+ 0, /* ioctl */
+#ifndef CONFIG_DISABLE_POLL
+ 0 /* poll */
+#endif
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static ssize_t hello_read(struct file *filep, char *buffer, size_t len)
+{
+ off_t offset = filep->f_pos; /* Start read position */
+ ssize_t nread = 0; /* Bytes read -- assume EOF */
+
+ /* Make sure that the offset is within the .pex file */
+
+ if (offset < hello_pex_len)
+ {
+ /* Make sure the read does not extend beyond the .pex file */
+
+ nread = len;
+ if (nread + offset > hello_pex_len)
+ {
+ nread = hello_pex_len - offset;
+ }
+ memcpy(buffer, &hello_pex[offset], nread);
+ filep->f_pos += nread;
+ }
+ return nread;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void hello_register(void)
+{
+ (void)register_driver("/dev/hello", &hello_fops, 0444, NULL);
+}
diff --git a/apps/examples/pashello/hello.h b/apps/examples/pashello/hello.h
new file mode 100644
index 000000000..818e5e4a5
--- /dev/null
+++ b/apps/examples/pashello/hello.h
@@ -0,0 +1,23 @@
+unsigned char hello_pex[] = {
+ 0x50, 0x4f, 0x46, 0x46, 0x01, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x05,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
+ 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x11, 0x01, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d,
+ 0x00, 0x00, 0x00, 0x0f, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x04,
+ 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0,
+ 0x00, 0x00, 0x00, 0x38, 0xb1, 0x00, 0x00, 0x74, 0x0e, 0xf9, 0x00, 0x00,
+ 0x25, 0xb5, 0xff, 0xfc, 0xf9, 0x00, 0x00, 0x20, 0x3f, 0x48, 0x65, 0x6c,
+ 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x21, 0x21, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x48, 0x45, 0x4c,
+ 0x4c, 0x4f, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x70, 0x61, 0x73,
+ 0x00, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x2e, 0x72, 0x6f, 0x64, 0x61,
+ 0x74, 0x61, 0x00, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x74, 0x61, 0x62, 0x00,
+ 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x6f, 0x00, 0x2e, 0x73, 0x74, 0x72,
+ 0x74, 0x61, 0x62, 0x00
+};
+unsigned int hello_pex_len = 232;
diff --git a/apps/examples/pashello/hello.pas b/apps/examples/pashello/hello.pas
new file mode 100644
index 000000000..fe137f1b6
--- /dev/null
+++ b/apps/examples/pashello/hello.pas
@@ -0,0 +1,5 @@
+program hello(output);
+begin
+ writeln('Hello world!!!');
+end.
+
diff --git a/apps/examples/pashello/hello.pex b/apps/examples/pashello/hello.pex
new file mode 100644
index 000000000..c23610598
--- /dev/null
+++ b/apps/examples/pashello/hello.pex
Binary files differ
diff --git a/apps/examples/pashello/mkhello.sh b/apps/examples/pashello/mkhello.sh
new file mode 100755
index 000000000..716a7e96d
--- /dev/null
+++ b/apps/examples/pashello/mkhello.sh
@@ -0,0 +1,141 @@
+#!/bin/bash
+############################################################################
+# examples/pashello/mkhello.sh
+#
+# Copyright (C) 2008 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+#set -x
+
+BINDIR=$1
+WD=`pwd`
+
+PASCAL=${BINDIR}/pascal
+POPT=${BINDIR}/popt
+PLINK=${BINDIR}/plink
+PRUN=${BINDIR}/prun
+
+PASFILENAME=hello.pas
+OUFILE=hello.h
+STRSTKSZ=1024
+
+function sanity_check ()
+{
+ if [ ! -f "${WD}/${PASFILENAME}" ]; then
+ echo "ERROR: Source ${PASFILENAME} does not exist in this directory"
+ exit 1
+ fi
+ if [ -z "${BINDIR}" ]; then
+ echo "ERROR: Path to the pascal bin/ directory not provided"
+ exit 1
+ fi
+ if [ ! -d "${BINDIR}" ]; then
+ echo "ERROR: Tool ${BINDIR} does not exist"
+ exit 1
+ fi
+ if [ ! -x "${PASCAL}" ]; then
+ echo "ERROR: Executable ${PASCAL} does not exist"
+ exit 1
+ fi
+ if [ ! -x "${POPT}" ]; then
+ echo "ERROR: Executable ${POPT} does not exist"
+ exit 1
+ fi
+ if [ ! -x "${PLINK}" ]; then
+ echo "ERROR: Executable ${PLINK} does not exist"
+ exit 1
+ fi
+ if [ ! -x "${PRUN}" ]; then
+ echo "ERROR: Executable ${PRUN} does not exist"
+ exit 1
+ fi
+}
+
+function compile_hello ()
+{
+ PASOPTS=
+ ${PASCAL} ${PASOPTS} ${PASFILENAME} 2>&1 || rm -f hello.o1
+ if [ -f hello.err ] ; then
+ cat hello.err | grep Line
+ fi
+ if [ ! -f hello.o1 ] ; then
+ echo "Compilation failed"
+ else
+ POPTOPTS=
+ ${POPT} ${POPTOPTS} hello.o1 2>&1
+ ${PLINK} hello.o hello.pex 2>&1
+ fi
+}
+
+function test_program ()
+{
+ if [ "${CONFIG_REGM}" == "y" ]; then
+ echo "Don't know how to run REGM programs yet"
+ else
+ echo "Using string stack size = ${STRSTKSZ}"
+ PRUNOPTS="-t ${STRSTKSZ}"
+
+ if [ ! -f hello.pex ]; then
+ echo "No p-code executable"
+ else
+ if [ -f hello.inp ] ; then
+ ${PRUN} ${PRUNOPTS} hello.pex 2>&1 <hello.inp
+ else
+ ${PRUN} ${PRUNOPTS} hello.pex 2>&1
+ fi
+ fi
+ fi
+}
+
+function test_hello ()
+{
+ echo "Using string stack size = ${STRSTKSZ}"
+ PRUNOPTS="-t ${STRSTKSZ}"
+
+ if [ ! -f hello.pex ]; then
+ echo "No p-code executable"
+ exit 1
+ else
+ ${PRUN} ${PRUNOPTS} hello.pex
+ fi
+}
+
+function make_include ()
+{
+ xxd -i hello.pex >hello.h
+}
+
+sanity_check
+compile_hello
+rm *.o *.o1 *.lst *.err
+test_hello
+make_include
+
diff --git a/apps/examples/pashello/pashello.c b/apps/examples/pashello/pashello.c
new file mode 100644
index 000000000..8bdefe702
--- /dev/null
+++ b/apps/examples/pashello/pashello.c
@@ -0,0 +1,143 @@
+/****************************************************************************
+ * examples/pashello/pashello.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <debug.h>
+
+#include "pexec.h"
+#include "pedefs.h"
+#include "pashello.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_PASHELLO_VARSTACKSIZE
+# define CONFIG_PASHELLO_VARSTACKSIZE 1024
+#endif
+
+#ifndef CONFIG_PASHELLO_STRSTACKSIZE
+# define CONFIG_PASHELLO_STRSTACKSIZE 128
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: prun
+ *
+ * Description:
+ * This function executes the P-Code program until a stopping condition
+ * is encountered.
+ *
+ ****************************************************************************/
+
+static void prun(FAR struct pexec_s *st)
+{
+ int errcode;
+
+ for (;;)
+ {
+ /* Execute the instruction; Check for exceptional conditions */
+
+ errcode = pexec(st);
+ if (errcode != eNOERROR) break;
+ }
+
+ if (errcode != eEXIT)
+ {
+ printf("Runtime error 0x%02x -- Execution Stopped\n", errcode);
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, FAR char *argv[])
+{
+ FAR struct pexec_s *st;
+
+ /* Register the /dev/hello driver */
+
+ hello_register();
+
+ /* Load the POFF file */
+
+ st = pload("/dev/hello", CONFIG_PASHELLO_VARSTACKSIZE, CONFIG_PASHELLO_STRSTACKSIZE);
+ if (!st)
+ {
+ fprintf(stderr, "user_start: ERROR: Could not load /dev/hello\n");
+ exit(1);
+ }
+ printf("user_start: /dev/hello Loaded\n");
+ printf("user_start: Interpreter started:\n");
+
+ /* And start program execution */
+
+ prun(st);
+
+ /* Clean up resources used by the interpreter */
+
+ printf("user_start: Interpreter terminated");
+ pexec_release(st);
+ return 0;
+}
diff --git a/apps/examples/pashello/pashello.h b/apps/examples/pashello/pashello.h
new file mode 100644
index 000000000..ad206261e
--- /dev/null
+++ b/apps/examples/pashello/pashello.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * examples/pashello/pashello.h
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_PASHELLO_H
+#define __EXAMPLES_PASHELLO_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+/* Defined in device.c */
+
+extern void hello_register(void);
+
+#endif /* __EXAMPLES_PASHELLO_H */
diff --git a/apps/examples/pipe/Makefile b/apps/examples/pipe/Makefile
new file mode 100644
index 000000000..886409f62
--- /dev/null
+++ b/apps/examples/pipe/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/examples/pipe/Makefile
+#
+# Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Pipe Example
+
+ASRCS =
+CSRCS = pipe_main.c transfer_test.c interlock_test.c redirect_test.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
diff --git a/apps/examples/pipe/interlock_test.c b/apps/examples/pipe/interlock_test.c
new file mode 100644
index 000000000..e049a65f6
--- /dev/null
+++ b/apps/examples/pipe/interlock_test.c
@@ -0,0 +1,224 @@
+/****************************************************************************
+ * examples/pipe/interlock_test.c
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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/stat.h>
+
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "pipe.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: null_writer
+ ****************************************************************************/
+
+static void *null_writer(pthread_addr_t pvarg)
+{
+ int fd;
+
+ /* Wait a bit */
+
+ printf("null_writer: started -- sleeping\n");
+ sleep(5);
+
+ /* Then open the FIFO for write access */
+
+ printf("null_writer: Opening FIFO for write access\n");
+ fd = open(FIFO_PATH2, O_WRONLY);
+ if (fd < 0)
+ {
+ fprintf(stderr, "null_writer: Failed to open FIFO %s for writing, errno=%d\n",
+ FIFO_PATH2, errno);
+ return (void*)1;
+ }
+
+ /* Wait a bit more */
+
+ printf("null_writer: Opened %s for writing -- sleeping\n", FIFO_PATH2);
+ sleep(5);
+
+ /* Then close the FIFO */
+
+ printf("null_writer: Closing %s\n", FIFO_PATH2);
+ if (close(fd) != 0)
+ {
+ fprintf(stderr, "null_writer: close failed: %d\n", errno);
+ }
+ sleep(5);
+
+ printf("null_writer: Returning success\n");
+ return (void*)0;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: interlock_test
+ ****************************************************************************/
+
+int interlock_test(void)
+{
+ pthread_t writerid;
+ void *value;
+ char data[16];
+ ssize_t nbytes;
+ int fd;
+ int ret;
+
+ /* Create a FIFO */
+
+ ret = mkfifo(FIFO_PATH2, 0666);
+ if (ret < 0)
+ {
+ fprintf(stderr, "interlock_test: mkfifo failed with errno=%d\n", errno);
+ return 1;
+ }
+
+ /* Start the null_writer_thread */
+
+ printf("interlock_test: Starting null_writer thread\n");
+ ret = pthread_create(&writerid, NULL, null_writer, (pthread_addr_t)NULL);
+ if (ret != 0)
+ {
+ fprintf(stderr, "interlock_test: Failed to create null_writer thread, error=%d\n", ret);
+ ret = 2;
+ goto errout_with_fifo;
+ }
+
+ /* Open one end of the FIFO for reading. This open call should block until the
+ * null_writer thread opens the other end of the FIFO for writing.
+ */
+
+ printf("interlock_test: Opening FIFO for read access\n");
+ fd = open(FIFO_PATH2, O_RDONLY);
+ if (fd < 0)
+ {
+ fprintf(stderr, "interlock_test: Failed to open FIFO %s for reading, errno=%d\n",
+ FIFO_PATH2, errno);
+ ret = 3;
+ goto errout_with_thread;
+ }
+
+ /* Attempt to read one byte from the FIFO. This should return end-of-file because
+ * the null_writer closes the FIFO without writing anything.
+ */
+
+ printf("interlock_test: Reading from %s\n", FIFO_PATH2);
+ nbytes = read(fd, data, 16);
+ if (nbytes < 0 )
+ {
+ fprintf(stderr, "interlock_test: read failed, errno=%d\n", errno);
+ ret = 4;
+ goto errout_with_file;
+ }
+ else if (ret != 0)
+ {
+ fprintf(stderr, "interlock_test: Read %d bytes of data -- aborting: %d\n", nbytes);
+ ret = 5;
+ goto errout_with_file;
+ }
+
+ /* Close the file */
+
+ printf("interlock_test: Closing %s\n", FIFO_PATH2);
+ if (close(fd) != 0)
+ {
+ fprintf(stderr, "interlock_test: close failed: %d\n", errno);
+ }
+
+ /* Wait for null_writer thread to complete */
+
+ printf("interlock_test: Waiting for null_writer thread\n");
+ ret = pthread_join(writerid, &value);
+ if (ret != 0)
+ {
+ fprintf(stderr, "interlock_test: pthread_join failed, error=%d\n", ret);
+ ret = 6;
+ goto errout_with_fifo;
+ }
+ else
+ {
+ printf("interlock_test: writer returned %d\n", (int)value);
+ if (value != (void*)0)
+ {
+ ret = 7;
+ goto errout_with_fifo;
+ }
+ }
+
+ /* unlink(FIFO_PATH2); */
+ printf("interlock_test: Returning success\n");
+ return 0;
+
+errout_with_file:
+ if (close(fd) != 0)
+ {
+ fprintf(stderr, "interlock_test: close failed: %d\n", errno);
+ }
+errout_with_thread:
+ pthread_detach(writerid);
+ pthread_cancel(writerid);
+errout_with_fifo:
+ /* unlink(FIFO_PATH2); */
+ printf("interlock_test: Returning %d\n", ret);
+ return ret;
+}
diff --git a/apps/examples/pipe/pipe.h b/apps/examples/pipe/pipe.h
new file mode 100644
index 000000000..2c18fd868
--- /dev/null
+++ b/apps/examples/pipe/pipe.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+ * examples/pipe/pipe.h
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_PIPE_PIPE_H
+#define __EXAMPLES_PIPE_PIPE_H
+
+/****************************************************************************
+ * Compilation Switches
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define FIFO_PATH1 "/tmp/testfifo-1"
+#define FIFO_PATH2 "/tmp/testfifo-2"
+
+#ifndef CONFIG_EXAMPLES_PIPE_STACKSIZE
+# define CONFIG_EXAMPLES_PIPE_STACKSIZE 1024
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+extern int transfer_test(int fdin, int fdout);
+extern int interlock_test(void);
+extern int redirection_test(void);
+
+#endif /* __EXAMPLES_PIPE_PIPE_H */
diff --git a/apps/examples/pipe/pipe_main.c b/apps/examples/pipe/pipe_main.c
new file mode 100644
index 000000000..97e728eb7
--- /dev/null
+++ b/apps/examples/pipe/pipe_main.c
@@ -0,0 +1,197 @@
+/****************************************************************************
+ * examples/pipe/pipe_main.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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/stat.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sched.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "pipe.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ int filedes[2];
+ int ret;
+
+ /* Test FIFO logic */
+
+ printf("\nuser_start: Performing FIFO test\n");
+ ret = mkfifo(FIFO_PATH1, 0666);
+ if (ret < 0)
+ {
+ fprintf(stderr, "user_start: mkfifo failed with errno=%d\n", errno);
+ return 1;
+ }
+
+ /* Open one end of the FIFO for reading and the other end for writing. NOTE:
+ * the following might not work on most FIFO implementations because the attempt
+ * to open just one end of the FIFO for writing might block. The NuttX FIFOs block
+ * only on open for read-only (see interlock_test()).
+ */
+
+ filedes[1] = open(FIFO_PATH1, O_WRONLY);
+ if (filedes[1] < 0)
+ {
+ fprintf(stderr, "user_start: Failed to open FIFO %s for writing, errno=%d\n",
+ FIFO_PATH1, errno);
+ return 2;
+ }
+
+ filedes[0] = open(FIFO_PATH1, O_RDONLY);
+ if (filedes[0] < 0)
+ {
+ fprintf(stderr, "user_start: Failed to open FIFO %s for reading, errno=%d\n",
+ FIFO_PATH1, errno);
+ if (close(filedes[1]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+ return 3;
+ }
+
+ /* Then perform the test using those file descriptors */
+
+ ret = transfer_test(filedes[0], filedes[1]);
+ if (close(filedes[0]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+ if (close(filedes[1]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+ /* unlink(FIFO_PATH1); fails */
+
+ if (ret != 0)
+ {
+ fprintf(stderr, "user_start: FIFO test FAILED (%d)\n", ret);
+ return 4;
+ }
+ printf("user_start: FIFO test PASSED\n");
+
+ /* Test PIPE logic */
+
+ printf("\nuser_start: Performing pipe test\n");
+ ret = pipe(filedes);
+ if (ret < 0)
+ {
+ fprintf(stderr, "user_start: pipe failed with errno=%d\n", errno);
+ return 5;
+ }
+
+ /* Then perform the test using those file descriptors */
+
+ ret = transfer_test(filedes[0], filedes[1]);
+ if (close(filedes[0]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+ if (close(filedes[1]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+
+ if (ret != 0)
+ {
+ fprintf(stderr, "user_start: PIPE test FAILED (%d)\n", ret);
+ return 6;
+ }
+ printf("user_start: PIPE test PASSED\n");
+
+ /* Perform the FIFO interlock test */
+
+ printf("\nuser_start: Performing pipe interlock test\n");
+ ret = interlock_test();
+ if (ret != 0)
+ {
+ fprintf(stderr, "user_start: FIFO interlock test FAILED (%d)\n", ret);
+ return 7;
+ }
+ printf("user_start: PIPE interlock test PASSED\n");
+
+ /* Perform the pipe redirection test */
+
+ printf("\nuser_start: Performing redirection test\n");
+ ret = redirection_test();
+ if (ret != 0)
+ {
+ fprintf(stderr, "user_start: FIFO redirection test FAILED (%d)\n", ret);
+ return 7;
+ }
+ printf("user_start: PIPE redirection test PASSED\n");
+
+ fflush(stdout);
+ return 0;
+}
diff --git a/apps/examples/pipe/redirect_test.c b/apps/examples/pipe/redirect_test.c
new file mode 100644
index 000000000..45e86c356
--- /dev/null
+++ b/apps/examples/pipe/redirect_test.c
@@ -0,0 +1,326 @@
+/****************************************************************************
+ * examples/pipe/redirect_test.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <semaphore.h>
+#include <errno.h>
+
+#include "pipe.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define READ_SIZE 37
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static sem_t g_rddone;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: redirect_reader
+ ****************************************************************************/
+
+static int redirect_reader(int argc, char *argv[])
+{
+ char buffer[READ_SIZE];
+ int fdin;
+ int fdout;
+ int ret;
+ int nbytes = 0;
+
+ printf("redirect_reader: started with fdin=%s\n", argv[1]);
+
+ /* Convert the fdin to binary */
+
+ fdin = atoi(argv[1]);
+ fdout = atoi(argv[2]);
+
+ /* Close fdout -- we don't need it */
+
+ ret = close(fdout);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_reader: failed to close fdout=%d\n", fdout);
+ return 1;
+ }
+
+ /* Re-direct the fdin to stdin */
+
+ ret = dup2(fdin, 0);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_reader: dup2 failed: %d\n", errno);
+ close(fdin);
+ return 2;
+ }
+
+ /* Close the original file descriptor */
+
+ ret = close(fdin);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_reader: failed to close fdin=%d\n", fdin);
+ return 3;
+ }
+
+ /* Then read from stdin until we hit the end of file */
+
+ fflush(stdout);
+ for (;;)
+ {
+ /* Read from stdin */
+
+ ret = read(0, buffer, READ_SIZE);
+ if (ret < 0 )
+ {
+ fprintf(stderr, "redirect_reader: read failed, errno=%d\n", errno);
+ return 4;
+ }
+ else if (ret == 0)
+ {
+ break;
+ }
+ nbytes += ret;
+
+ /* Echo to stdout */
+
+ ret = write(1, buffer, ret);
+ if (ret < 0)
+ {
+ fprintf(stderr, "redirect_reader: read failed, errno=%d\n", errno);
+ return 5;
+ }
+ }
+
+ printf("redirect_reader: %d bytes read\n", nbytes);
+ ret = close(0);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_reader: failed to close fd=0\n");
+ return 6;
+ }
+
+ sem_post(&g_rddone);
+ printf("redirect_reader: Returning success\n");
+ return 0;
+}
+
+/****************************************************************************
+ * Name: redirect_writer
+ ****************************************************************************/
+
+static int redirect_writer(int argc, char *argv[])
+{
+ int fdin;
+ int fdout;
+ int nbytes = 0;
+ int ret;
+
+ fprintf(stderr, "redirect_writer: started with fdout=%s\n", argv[2]);
+
+ /* Convert the fdout to binary */
+
+ fdin = atoi(argv[1]);
+ fdout = atoi(argv[2]);
+
+ /* Close fdin -- we don't need it */
+
+ ret = close(fdin);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_reader: failed to close fdin=%d\n", fdin);
+ return 1;
+ }
+
+ /* Re-direct the fdout to stdout */
+
+ ret = dup2(fdout, 1);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_writer: dup2 failed: %d\n", errno);
+ return 2;
+ }
+
+ /* Close the original file descriptor */
+
+ ret = close(fdout);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_reader: failed to close fdout=%d\n", fdout);
+ return 3;
+ }
+
+ /* Then write a bunch of stuff to stdout */
+
+ fflush(stderr);
+ nbytes += printf("\nFour score and seven years ago our fathers brought forth on this continent a new nation,\n");
+ nbytes += printf("conceived in Liberty, and dedicated to the proposition that all men are created equal.\n");
+ nbytes += printf("\nNow we are engaged in a great civil war, testing whether that nation, or any nation, so\n");
+ nbytes += printf("conceived and so dedicated, can long endure. We are met on a great battle-field of that war.\n");
+ nbytes += printf("We have come to dedicate a portion of that field, as a final resting place for those who here\n");
+ nbytes += printf("gave their lives that that nation might live. It is altogether fitting and proper that we\n");
+ nbytes += printf("should do this.\n");
+ nbytes += printf("\nBut, in a larger sense, we can not dedicate - we can not consecrate - we can not hallow - this ground.\n");
+ nbytes += printf("The brave men, living and dead, who struggled here, have consecrated it, far above our poor power\n");
+ nbytes += printf("to add or detract. The world will little note, nor long remember what we say here, but it can\n");
+ nbytes += printf("never forget what they did here. It is for us the living, rather, to be dedicated here to the\n");
+ nbytes += printf("unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to\n");
+ nbytes += printf("be here dedicated to the great task remaining before us - that from these honored dead we take\n");
+ nbytes += printf("increased devotion to that cause for which they gave the last full measure of devotion - that we\n");
+ nbytes += printf("here highly resolve that these dead shall not have died in vain - that this nation, under God,\n");
+ nbytes += printf("shall have a new birth of freedom - and that government of the people, by the people, for the\n");
+ nbytes += printf("people, shall not perish from the earth.\n\n");
+ fflush(stdout);
+
+ fprintf(stderr, "redirect_writer: %d bytes written\n", nbytes);
+
+ ret = close(1);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirect_writer: failed to close fd=1\n");
+ return 4;
+ }
+
+ fprintf(stderr, "redirect_writer: Returning success\n");
+ return 0;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: redirection_test
+ ****************************************************************************/
+
+int redirection_test(void)
+{
+ const char *argv[3];
+ char buffer1[8];
+ char buffer2[8];
+ int readerid;
+ int writerid;
+ int filedes[2];
+ int ret;
+
+ sem_init(&g_rddone, 0, 0);
+
+ /* Create the pipe */
+
+ ret = pipe(filedes);
+ if (ret < 0)
+ {
+ fprintf(stderr, "redirection_test: pipe failed with errno=%d\n", errno);
+ return 5;
+ }
+
+ sprintf(buffer1, "%d", filedes[0]);
+ argv[0] = buffer1;
+ sprintf(buffer2, "%d", filedes[1]);
+ argv[1] = buffer2;
+ argv[2] = NULL;
+
+ /* Start redirect_reader thread */
+
+ printf("redirection_test: Starting redirect_reader task with fd=%d\n", filedes[0]);
+ readerid = task_create("redirect_reader", 50, CONFIG_EXAMPLES_PIPE_STACKSIZE, redirect_reader, argv);
+ if (readerid < 0)
+ {
+ fprintf(stderr, "redirection_test: Failed to create redirect_writer task: %d\n", errno);
+ return 1;
+ }
+
+ /* Start redirect_writer task */
+
+ printf("redirection_test: Starting redirect_writer task with fd=%d\n", filedes[1]);
+ writerid = task_create("redirect_writer", 50, CONFIG_EXAMPLES_PIPE_STACKSIZE, redirect_writer, argv);
+ if (writerid < 0)
+ {
+ fprintf(stderr, "redirection_test: Failed to create redirect_writer task: %d\n", errno);
+ ret = task_delete(readerid);
+ if (ret != 0)
+ {
+ fprintf(stderr, "redirection_test: Failed to delete redirect_reader task %d\n", errno);
+ }
+ return 2;
+ }
+
+ /* We should be able to close the pipe file descriptors now. */
+
+ if (close(filedes[0]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+ if (close(filedes[1]) != 0)
+ {
+ fprintf(stderr, "user_start: close failed: %d\n", errno);
+ }
+
+ if (ret != 0)
+ {
+ fprintf(stderr, "user_start: PIPE test FAILED (%d)\n", ret);
+ return 6;
+ }
+
+ /* Wait for redirect_writer thread to complete */
+
+ printf("redirection_test: Waiting...\n");
+ fflush(stdout);
+ sem_wait(&g_rddone);
+
+ printf("redirection_test: returning %d\n", ret);
+ return ret;
+}
+
diff --git a/apps/examples/pipe/transfer_test.c b/apps/examples/pipe/transfer_test.c
new file mode 100644
index 000000000..cb8cad04a
--- /dev/null
+++ b/apps/examples/pipe/transfer_test.c
@@ -0,0 +1,242 @@
+/****************************************************************************
+ * examples/pipe/transfer_test.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <unistd.h>
+#include <errno.h>
+
+#include "pipe.h"
+
+/****************************************************************************
+ * Pre-proecessor Definitions
+ ****************************************************************************/
+
+#define MAX_BYTE 13
+
+#define WRITE_SIZE MAX_BYTE
+#define NWRITES 1400
+#define NWRITE_BYTES (NWRITES * WRITE_SIZE)
+
+#define READ_SIZE (2*MAX_BYTE)
+#define NREADS (NWRITES / 2)
+#define NREAD_BYTES NWRITE_BYTES
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: transfer_reader
+ ****************************************************************************/
+
+static void *transfer_reader(pthread_addr_t pvarg)
+{
+ char buffer[READ_SIZE];
+ int fd = (int)pvarg;
+ int ret;
+ int nbytes;
+ int value;
+ int ndx;
+
+ printf("transfer_reader: started\n");
+ for (nbytes = 0, value = 0; nbytes < NREAD_BYTES;)
+ {
+ ret = read(fd, buffer, READ_SIZE);
+ if (ret < 0 )
+ {
+ fprintf(stderr, "transfer_reader: read failed, errno=%d\n", errno);
+ return (void*)1;
+ }
+ else if (ret == 0)
+ {
+ if (nbytes < NREAD_BYTES)
+ {
+ fprintf(stderr, "transfer_reader: Too few bytes read -- aborting: %d\n", nbytes);
+ return (void*)2;
+ }
+ break;
+ }
+ for (ndx = 0; ndx < ret; ndx++)
+ {
+ if (value >= WRITE_SIZE)
+ {
+ value = 0;
+ }
+ if (buffer[ndx] != value)
+ {
+ fprintf(stderr, "transfer_reader: Byte %d, expected %d, found %d\n",
+ nbytes + ndx, value, buffer[ndx]);
+ return (void*)3;
+ }
+ value++;
+ }
+ nbytes += ret;
+ if (nbytes > NREAD_BYTES)
+ {
+ fprintf(stderr, "transfer_reader: Too many bytes read -- aborting: %d\n", nbytes);
+ return (void*)4;
+ }
+ }
+ printf("transfer_reader: %d bytes read\n", nbytes);
+ return (void*)0;
+}
+
+/****************************************************************************
+ * Name: transfer_writer
+ ****************************************************************************/
+
+static void *transfer_writer(pthread_addr_t pvarg)
+{
+ char buffer[WRITE_SIZE];
+ int fd = (int)pvarg;
+ int ret;
+ int i;
+
+ printf("transfer_writer: started\n");
+ for (i = 0; i < WRITE_SIZE; i++)
+ {
+ buffer[i] = i;
+ }
+
+ for (i = 0; i < NWRITES; i++)
+ {
+ ret = write(fd, buffer, WRITE_SIZE);
+ if (ret < 0 )
+ {
+ fprintf(stderr, "transfer_writer: write failed, errno=%d\n", errno);
+ return (void*)1;
+ }
+ else if (ret != WRITE_SIZE)
+ {
+ fprintf(stderr, "transfer_writer: Unexpected write size=%d\n", ret);
+ return (void*)2;
+ }
+ }
+ printf("transfer_writer: %d bytes written\n", NWRITE_BYTES);
+ return (void*)0;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: transfer_test
+ ****************************************************************************/
+
+int transfer_test(int fdin, int fdout)
+{
+ pthread_t readerid;
+ pthread_t writerid;
+ void *value;
+ int tmp;
+ int ret;
+
+ /* Start transfer_reader thread */
+
+ printf("transfer_test: Starting transfer_reader thread\n");
+ ret = pthread_create(&readerid, NULL, transfer_reader, (pthread_addr_t)fdin);
+ if (ret != 0)
+ {
+ fprintf(stderr, "transfer_test: Failed to create transfer_reader thread, error=%d\n", ret);
+ return 1;
+ }
+
+ /* Start transfer_writer thread */
+
+ printf("transfer_test: Starting transfer_writer thread\n");
+ ret = pthread_create(&writerid, NULL, transfer_writer, (pthread_addr_t)fdout);
+ if (ret != 0)
+ {
+ fprintf(stderr, "transfer_test: Failed to create transfer_writer thread, error=%d\n", ret);
+ pthread_detach(readerid);
+ ret = pthread_cancel(readerid);
+ if (ret != 0)
+ {
+ fprintf(stderr, "transfer_test: Failed to cancel transfer_reader thread, error=%d\n", ret);
+ }
+ return 2;
+ }
+
+ /* Wait for transfer_writer thread to complete */
+
+ printf("transfer_test: Waiting for transfer_writer thread\n");
+ ret = pthread_join(writerid, &value);
+ if (ret != 0)
+ {
+ fprintf(stderr, "transfer_test: pthread_join failed, error=%d\n", ret);
+ }
+ else
+ {
+ ret = (int)value;
+ printf("transfer_test: transfer_writer returned %d\n", ret);
+ }
+
+ /* Wait for transfer_reader thread to complete */
+
+ printf("transfer_test: Waiting for transfer_reader thread\n");
+ tmp = pthread_join(readerid, &value);
+ if (tmp != 0)
+ {
+ fprintf(stderr, "transfer_test: pthread_join failed, error=%d\n", ret);
+ }
+ else
+ {
+ tmp = (int)value;
+ printf("transfer_test: transfer_reader returned %d\n", tmp);
+ }
+
+ if (ret == 0)
+ {
+ ret = tmp;
+ }
+ printf("transfer_test: returning %d\n", ret);
+ return ret;
+}
+
diff --git a/apps/examples/poll/Makefile b/apps/examples/poll/Makefile
new file mode 100644
index 000000000..0bfc97ec1
--- /dev/null
+++ b/apps/examples/poll/Makefile
@@ -0,0 +1,90 @@
+############################################################################
+# apps/examples/poll/Makefile
+#
+# Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Device Driver poll()/select() Example
+
+ASRCS =
+CSRCS = poll_main.c poll_listener.c select_listener.c net_listener.c net_reader.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend host
+
+-include Make.dep
diff --git a/apps/examples/poll/Makefile.host b/apps/examples/poll/Makefile.host
new file mode 100644
index 000000000..9d9daee27
--- /dev/null
+++ b/apps/examples/poll/Makefile.host
@@ -0,0 +1,54 @@
+############################################################################
+# apps/examples/poll/Makefile.host
+#
+# Copyright (C) 2008, 2009, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+
+# TOPDIR must be defined on the make command line
+
+include $(TOPDIR)/.config
+include $(TOPDIR)/Make.defs
+
+SRC = host.c
+BIN = host
+
+DEFINES = -DTARGETIP=\"$(TARGETIP)\"
+
+all: $(BIN)
+
+$(BIN): $(SRC)
+ $(HOSTCC) $(HOSTCFLAGS) $(DEFINES) $^ -o $@
+
+clean:
+ @rm -f $(BIN) *~ .*.swp *.o
+ $(call CLEAN)
+
diff --git a/apps/examples/poll/host.c b/apps/examples/poll/host.c
new file mode 100644
index 000000000..47f2c3e53
--- /dev/null
+++ b/apps/examples/poll/host.c
@@ -0,0 +1,166 @@
+/****************************************************************************
+ * examples/poll/host.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/socket.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <string.h>
+#include <errno.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define pthread_addr_t void *
+#include "poll_internal.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef TARGETIP
+# error TARGETIP not defined
+#endif
+
+#define IOBUFFER_SIZE 80
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * main
+ ****************************************************************************/
+
+int main(int argc, char **argv, char **envp)
+{
+ struct sockaddr_in myaddr;
+ char outbuf[IOBUFFER_SIZE];
+ char inbuf[IOBUFFER_SIZE];
+ int sockfd;
+ int len;
+ int nbytessent;
+ int nbytesrecvd;
+ int i;
+
+ /* Create a new TCP socket */
+
+ sockfd = socket(PF_INET, SOCK_STREAM, 0);
+ if (sockfd < 0)
+ {
+ message("client socket failure %d\n", errno);
+ goto errout_with_outbufs;
+ }
+
+ /* Connect the socket to the server */
+
+ myaddr.sin_family = AF_INET;
+ myaddr.sin_port = htons(LISTENER_PORT);
+ myaddr.sin_addr.s_addr = inet_addr(TARGETIP);
+
+ message("client: Connecting to %s...\n", TARGETIP);
+ if (connect( sockfd, (struct sockaddr*)&myaddr, sizeof(struct sockaddr_in)) < 0)
+ {
+ message("client: connect failure: %d\n", errno);
+ goto errout_with_socket;
+ }
+ message("client: Connected\n");
+
+ /* Then send and receive messages */
+
+ for (i = 0; ; i++)
+ {
+ sprintf(outbuf, "Remote message %d", i);
+ len = strlen(outbuf);
+
+ message("client: Sending '%s' (%d bytes)\n", outbuf, len);
+ nbytessent = send(sockfd, outbuf, len, 0);
+ message("client: Sent %d bytes\n", nbytessent);
+
+ if (nbytessent < 0)
+ {
+ message("client: send failed: %d\n", errno);
+ goto errout_with_socket;
+ }
+ else if (nbytessent != len)
+ {
+ message("client: Bad send length: %d Expected: %d\n", nbytessent, len);
+ goto errout_with_socket;
+ }
+
+ message("client: Receiving...\n");
+ nbytesrecvd = recv(sockfd, inbuf, IOBUFFER_SIZE, 0);
+
+ if (nbytesrecvd < 0)
+ {
+ message("client: recv failed: %d\n", errno);
+ goto errout_with_socket;
+ }
+
+ inbuf[nbytesrecvd] = '\0';
+ message("client: Received '%s' (%d bytes)\n", inbuf, nbytesrecvd);
+
+ if (nbytesrecvd != len)
+ {
+ message("client: Bad recv length: %d Expected: %d\n", nbytesrecvd, len);
+ goto errout_with_socket;
+ }
+ else if (memcmp(inbuf, outbuf, len) != 0)
+ {
+ message("client: Received outbuf does not match sent outbuf\n");
+ goto errout_with_socket;
+ }
+
+ message("client: Sleeping\n");
+ sleep(8);
+ }
+
+ close(sockfd);
+ return 0;
+
+errout_with_socket:
+ close(sockfd);
+errout_with_outbufs:
+ exit(1);
+}
diff --git a/apps/examples/poll/net_listener.c b/apps/examples/poll/net_listener.c
new file mode 100644
index 000000000..4d425c608
--- /dev/null
+++ b/apps/examples/poll/net_listener.c
@@ -0,0 +1,428 @@
+/****************************************************************************
+ * examples/poll/net_listener.c
+ *
+ * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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/stat.h>
+#include <sys/select.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <net/if.h>
+#include <apps/netutils/uiplib.h>
+
+#include "poll_internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define IOBUFFER_SIZE 80
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct net_listener_s
+{
+ struct sockaddr_in addr;
+ fd_set master;
+ fd_set working;
+ char buffer[IOBUFFER_SIZE];
+ int listensd;
+ int mxsd;
+};
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: net_closeclient
+ ****************************************************************************/
+
+static bool net_closeclient(struct net_listener_s *nls, int sd)
+{
+ message("net_listener: Closing host side connection sd=%d\n", sd);
+ close(sd);
+ FD_CLR(sd, &nls->master);
+
+ /* If we just closed the max SD, then search downward for the next biggest SD. */
+
+ while (FD_ISSET(nls->mxsd, &nls->master) == false)
+ {
+ nls->mxsd -= 1;
+ }
+ return true;
+}
+
+/****************************************************************************
+ * Name: net_incomingdata
+ ****************************************************************************/
+
+static inline bool net_incomingdata(struct net_listener_s *nls, int sd)
+{
+ char *ptr;
+ int nbytes;
+ int ret;
+
+ /* Read data from the socket */
+
+#ifdef FIONBIO
+ for (;;)
+#endif
+ {
+ message("net_listener: Read data from sd=%d\n", sd);
+ ret = recv(sd, nls->buffer, IOBUFFER_SIZE, 0);
+ if (ret < 0)
+ {
+ if (errno != EINTR)
+ {
+ message("net_listener: recv failed sd=%d: %d\n", sd, errno);
+ if (errno != EAGAIN)
+ {
+ net_closeclient(nls, sd);
+ return false;
+ }
+ }
+ }
+ else if (ret == 0)
+ {
+ message("net_listener: Client connection lost sd=%d\n", sd);
+ net_closeclient(nls, sd);
+ return false;
+ }
+ else
+ {
+ nls->buffer[ret]='\0';
+ message("poll_listener: Read '%s' (%d bytes)\n", nls->buffer, ret);
+
+ /* Echo the data back to the client */
+
+ for (nbytes = ret, ptr = nls->buffer; nbytes > 0; )
+ {
+ ret = send(sd, ptr, nbytes, 0);
+ if (ret < 0)
+ {
+ if (errno != EINTR)
+ {
+ message("net_listener: Send failed sd=%d: \n", sd, errno);
+ net_closeclient(nls, sd);
+ return false;
+ }
+ }
+ else
+ {
+ nbytes -= ret;
+ ptr += ret;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/****************************************************************************
+ * Name: net_connection
+ ****************************************************************************/
+
+static inline bool net_connection(struct net_listener_s *nls)
+{
+ int sd;
+
+ /* Loop until all connections have been processed */
+
+#ifdef FIONBIO
+ for (;;)
+#endif
+ {
+ message("net_listener: Accepting new connection on sd=%d\n", nls->listensd);
+
+ sd = accept(nls->listensd, NULL, NULL);
+ if (sd < 0)
+ {
+ message("net_listener: accept failed: %d\n", errno);
+
+ if (errno != EINTR)
+ {
+ return false;
+ }
+ }
+ else
+ {
+ /* Add the new connection to the master set */
+
+ message("net_listener: Connection accepted for sd=%d\n", sd);
+
+ FD_SET(sd, &nls->master);
+ if (sd > nls->mxsd)
+ {
+ nls->mxsd = sd;
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+/****************************************************************************
+ * Name: net_mksocket
+ ****************************************************************************/
+
+static inline bool net_mksocket(struct net_listener_s *nls)
+{
+ int value;
+ int ret;
+
+ /* Create a listening socket */
+
+ message("net_listener: Initializing listener socket\n");
+ nls->listensd = socket(AF_INET, SOCK_STREAM, 0);
+ if (nls->listensd < 0)
+ {
+ message("net_listener: socket failed: %d\n", errno);
+ return false;
+ }
+
+ /* Configure the socket */
+
+ value = 1;
+ ret = setsockopt(nls->listensd, SOL_SOCKET, SO_REUSEADDR, (char*)&value, sizeof(int));
+ if (ret < 0)
+ {
+ message("net_listener: setsockopt failed: %d\n", errno);
+ close(nls->listensd);
+ return false;
+ }
+
+ /* Set the socket to non-blocking */
+
+#ifdef FIONBIO
+ ret = ioctl(nls->listensd, FIONBIO, (char *)&value);
+ if (ret < 0)
+ {
+ message("net_listener: ioctl failed: %d\n", errno);
+ close(nls->listensd);
+ return false;
+ }
+#endif
+
+ /* Bind the socket */
+
+ memset(&nls->addr, 0, sizeof(struct sockaddr_in));
+ nls->addr.sin_family = AF_INET;
+ nls->addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ nls->addr.sin_port = htons(LISTENER_PORT);
+ ret = bind(nls->listensd, (struct sockaddr *)&nls->addr, sizeof(struct sockaddr_in));
+ if (ret < 0)
+ {
+ message("net_listener: bind failed: %d\n", errno);
+ close(nls->listensd);
+ return false;
+ }
+
+ /* Mark the socket as a listener */
+
+ ret = listen(nls->listensd, 32);
+ if (ret < 0)
+ {
+ message("net_listener: bind failed: %d\n", errno);
+ close(nls->listensd);
+ return false;
+ }
+
+ return true;
+}
+
+/****************************************************************************
+ * Name: net_configure
+ ****************************************************************************/
+
+static void net_configure(void)
+{
+ struct in_addr addr;
+#if defined(CONFIG_EXAMPLE_POLL_NOMAC)
+ uint8_t mac[IFHWADDRLEN];
+#endif
+
+ /* Configure uIP */
+ /* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_POLL_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_POLL_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_POLL_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_POLL_NETMASK);
+ uip_setnetmask("eth0", &addr);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: net_listener
+ ****************************************************************************/
+
+void *net_listener(pthread_addr_t pvarg)
+{
+ struct net_listener_s nls;
+ struct timeval timeout;
+ int nsds;
+ int ret;
+ int i;
+
+ /* Configure uIP */
+
+ net_configure();
+
+ /* Set up a listening socket */
+
+ memset(&nls, 0, sizeof(struct net_listener_s));
+ if (!net_mksocket(&nls))
+ {
+ return (void*)1;
+ }
+
+ /* Initialize the 'master' file descriptor set */
+
+ FD_ZERO(&nls.master);
+ nls.mxsd = nls.listensd;
+ FD_SET(nls.listensd, &nls.master);
+
+ /* Set up a 3 second timeout */
+
+ timeout.tv_sec = NET_LISTENER_DELAY;
+ timeout.tv_usec = 0;
+
+ /* Loop waiting for incoming connections or for incoming data
+ * on any of the connect sockets.
+ */
+
+ for (;;)
+ {
+ /* Wait on select */
+
+ message("net_listener: Calling select(), listener sd=%d\n", nls.listensd);
+ memcpy(&nls.working, &nls.master, sizeof(fd_set));
+ ret = select(nls.mxsd + 1, (FAR fd_set*)&nls.working, (FAR fd_set*)NULL, (FAR fd_set*)NULL, &timeout);
+ if (ret < 0)
+ {
+ message("net_listener: select failed: %d\n", errno);
+ break;
+ }
+
+ /* Check for timeout */
+
+ if (ret == 0)
+ {
+ message("net_listener: Timeout\n");
+ continue;
+ }
+
+ /* Find which descriptors caused the wakeup */
+
+ nsds = ret;
+ for (i = 0; i <= nls.mxsd && nsds > 0; i++)
+ {
+ /* Is this descriptor ready? */
+
+ if (FD_ISSET(i, &nls.working))
+ {
+ /* Yes, is it our listener? */
+
+ message("net_listener: Activity on sd=%d\n", i);
+
+ nsds--;
+ if (i == nls.listensd)
+ {
+ (void)net_connection(&nls);
+ }
+ else
+ {
+ net_incomingdata(&nls, i);
+ }
+ }
+ }
+ }
+
+ /* Cleanup */
+
+#if 0 /* Don't get here */
+ for (i = 0; i <= nls.mxsd; +i++)
+ {
+ if (FD_ISSET(i, &nls.master))
+ {
+ close(i);
+ }
+ }
+#endif
+ return NULL; /* Keeps some compilers from complaining */
+}
diff --git a/apps/examples/poll/net_reader.c b/apps/examples/poll/net_reader.c
new file mode 100644
index 000000000..b0cf94316
--- /dev/null
+++ b/apps/examples/poll/net_reader.c
@@ -0,0 +1,317 @@
+/****************************************************************************
+ * examples/poll/net_reader.c
+ *
+ * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/select.h>
+#include <sys/socket.h>
+
+#include <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <net/if.h>
+#include <apps/netutils/uiplib.h>
+
+#include "poll_internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#define IOBUFFER_SIZE 80
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: net_configure
+ ****************************************************************************/
+
+static void net_configure(void)
+{
+ struct in_addr addr;
+#if defined(CONFIG_EXAMPLE_POLL_NOMAC)
+ uint8_t mac[IFHWADDRLEN];
+#endif
+
+ /* Configure uIP */
+ /* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_POLL_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_POLL_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_POLL_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_POLL_NETMASK);
+ uip_setnetmask("eth0", &addr);
+}
+
+/****************************************************************************
+ * Name: net_receive
+ ****************************************************************************/
+
+static void net_receive(int sd)
+{
+ struct timeval timeout;
+ char buffer[IOBUFFER_SIZE];
+ char *ptr;
+ fd_set readset;
+ int nbytes;
+ int ret;
+
+ /* Set up the timeout */
+
+ timeout.tv_sec = NET_LISTENER_DELAY;
+ timeout.tv_usec = 0;
+
+ /* Loop while we have the connection */
+
+ for (;;)
+ {
+ /* Wait for incoming message */
+
+ do
+ {
+ FD_ZERO(&readset);
+ FD_SET(sd, &readset);
+ ret = select(sd + 1, (FAR fd_set*)&readset, (FAR fd_set*)NULL, (FAR fd_set*)NULL, &timeout);
+ }
+ while (ret < 0 && errno == EINTR);
+
+ /* Something has happened */
+
+ if (ret < 0)
+ {
+ message("net_reader: select failed: %d\n", errno);
+ return;
+ }
+ else if (ret == 0)
+ {
+ message("net_reader: Timeout\n");
+ }
+ else
+ {
+ message("net_reader: Read data from sd=%d\n", sd);
+ memset(buffer, '?', IOBUFFER_SIZE); /* Just to make sure we really receive something */
+ ret = recv(sd, buffer, IOBUFFER_SIZE, 0);
+ if (ret < 0)
+ {
+ if (errno != EINTR)
+ {
+ message("net_reader: recv failed sd=%d: %d\n", sd, errno);
+ if (errno != EAGAIN)
+ {
+ return;
+ }
+ }
+ }
+ else if (ret == 0)
+ {
+ message("net_reader: Client connection lost sd=%d\n", sd);
+ return;
+ }
+ else
+ {
+ buffer[ret]='\0';
+ message("net_reader: Read '%s' (%d bytes)\n", buffer, ret);
+
+ /* Echo the data back to the client */
+
+ for (nbytes = ret, ptr = buffer; nbytes > 0; )
+ {
+ ret = send(sd, ptr, nbytes, 0);
+ if (ret < 0)
+ {
+ if (errno != EINTR)
+ {
+ message("net_reader: Send failed sd=%d: %d\n", sd, errno);
+ return;
+ }
+ }
+ else
+ {
+ nbytes -= ret;
+ ptr += ret;
+ }
+ }
+ }
+ }
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: net_reader
+ ****************************************************************************/
+
+void *net_reader(pthread_addr_t pvarg)
+{
+ struct sockaddr_in addr;
+#ifdef POLL_HAVE_SOLINGER
+ struct linger ling;
+#endif
+ int listensd;
+ int acceptsd;
+ socklen_t addrlen;
+ int optval;
+
+ /* Configure uIP */
+
+ net_configure();
+
+ /* Create a new TCP socket */
+
+ listensd = socket(PF_INET, SOCK_STREAM, 0);
+ if (listensd < 0)
+ {
+ message("net_reader: socket failure: %d\n", errno);
+ goto errout;
+ }
+
+ /* Set socket to reuse address */
+
+ optval = 1;
+ if (setsockopt(listensd, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, sizeof(int)) < 0)
+ {
+ message("net_reader: setsockopt SO_REUSEADDR failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ /* Bind the socket to a local address */
+
+ addr.sin_family = AF_INET;
+ addr.sin_port = HTONS(LISTENER_PORT);
+ addr.sin_addr.s_addr = INADDR_ANY;
+
+ if (bind(listensd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0)
+ {
+ message("net_reader: bind failure: %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ /* Listen for connections on the bound TCP socket */
+
+ if (listen(listensd, 5) < 0)
+ {
+ message("net_reader: listen failure %d\n", errno);
+ goto errout_with_listensd;
+ }
+
+ /* Connection loop */
+
+ for (;;)
+ {
+ /* Accept only one connection */
+
+ message("net_reader: Accepting new connections on port %d\n", LISTENER_PORT);
+ addrlen = sizeof(struct sockaddr_in);
+ acceptsd = accept(listensd, (struct sockaddr*)&addr, &addrlen);
+ if (acceptsd < 0)
+ {
+ message("net_reader: accept failure: %d\n", errno);
+ continue;
+ }
+ message("net_reader: Connection accepted on sd=%d\n", acceptsd);
+
+ /* Configure to "linger" until all data is sent when the socket is closed */
+
+#ifdef POLL_HAVE_SOLINGER
+ ling.l_onoff = 1;
+ ling.l_linger = 30; /* timeout is seconds */
+ if (setsockopt(acceptsd, SOL_SOCKET, SO_LINGER, &ling, sizeof(struct linger)) < 0)
+ {
+ message("net_reader: setsockopt SO_LINGER failure: %d\n", errno);
+ goto errout_with_acceptsd;
+ }
+#endif
+
+ /* Handle incoming messsages on the connection. */
+
+ net_receive(acceptsd);
+
+ message("net_reader: Closing sd=%d\n", acceptsd);
+ close(acceptsd);
+ }
+
+#ifdef POLL_HAVE_SOLINGER
+errout_with_acceptsd:
+ close(acceptsd);
+#endif
+errout_with_listensd:
+ close(listensd);
+errout:
+ return NULL;
+}
diff --git a/apps/examples/poll/poll_internal.h b/apps/examples/poll/poll_internal.h
new file mode 100644
index 000000000..cbf42ac56
--- /dev/null
+++ b/apps/examples/poll/poll_internal.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+ * examples/poll/poll_internal.h
+ *
+ * Copyright (C) 2008, 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_PIPE_PIPE_H
+#define __EXAMPLES_PIPE_PIPE_H
+
+/****************************************************************************
+ * Compilation Switches
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <pthread.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_DISABLE_POLL
+# error "The polling API is disabled"
+#endif
+
+/* Here are all of the configuration settings that must be met to have TCP/IP
+ * poll/select support. This kind of looks like overkill.
+ *
+ * CONFIG_NET - Network support must be enabled
+ * CONFIG_NSOCKET_DESCRIPTORS - Socket descriptors must be allocated
+ * CONFIG_NET_TCP - Only support on TCP (because read-ahead
+ * ibuffering s not yet support for UDP)
+ * CONFIG_NET_NTCP_READAHEAD_BUFFERS - TCP/IP read-ahead buffering must be enabled
+ */
+
+#if defined(CONFIG_NET) && CONFIG_NSOCKET_DESCRIPTORS > 0 && \
+ defined(CONFIG_NET_TCP) && CONFIG_NET_NTCP_READAHEAD_BUFFERS > 0
+# define HAVE_NETPOLL 1
+#else
+# undef HAVE_NETPOLL
+#endif
+
+/* If debug is enabled, then use lib_rawprintf so that OS debug output and
+ * the test output are synchronized.
+ *
+ * These macros will differ depending upon if the toolchain supports
+ * macros with a variable number of arguments or not.
+ */
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(...) lib_rawprintf(__VA_ARGS__)
+# define msgflush()
+# else
+# define message(...) printf(__VA_ARGS__)
+# define msgflush() fflush(stdout)
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message lib_rawprintf
+# define msgflush()
+# else
+# define message printf
+# define msgflush() fflush(stdout)
+# endif
+#endif
+
+#define FIFO_PATH1 "/dev/fifo0"
+#define FIFO_PATH2 "/dev/fifo1"
+
+#define POLL_LISTENER_DELAY 2000 /* 2 seconds */
+#define SELECT_LISTENER_DELAY 4 /* 4 seconds */
+#define NET_LISTENER_DELAY 3 /* 3 seconds */
+#define WRITER_DELAY 6 /* 6 seconds */
+
+#define LISTENER_PORT 5471
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+extern void *poll_listener(pthread_addr_t pvarg);
+extern void *select_listener(pthread_addr_t pvarg);
+
+#ifdef HAVE_NETPOLL
+extern void *net_listener(pthread_addr_t pvarg);
+extern void *net_reader(pthread_addr_t pvarg);
+#endif
+#endif /* __EXAMPLES_PIPE_PIPE_H */
diff --git a/apps/examples/poll/poll_listener.c b/apps/examples/poll/poll_listener.c
new file mode 100644
index 000000000..816647e34
--- /dev/null
+++ b/apps/examples/poll/poll_listener.c
@@ -0,0 +1,262 @@
+/****************************************************************************
+ * examples/poll/poll_listener.c
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <poll.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+
+#include "poll_internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_DEV_CONSOLE) && !defined(CONFIG_DEV_LOWCONSOLE)
+# define HAVE_CONSOLE
+# define NPOLLFDS 2
+# define CONSNDX 0
+# define FIFONDX 1
+#else
+# undef HAVE_CONSOLE
+# define NPOLLFDS 1
+# define FIFONDX 0
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: poll_listener
+ ****************************************************************************/
+
+void *poll_listener(pthread_addr_t pvarg)
+{
+ struct pollfd fds[NPOLLFDS];
+ char buffer[64];
+ ssize_t nbytes;
+ bool timeout;
+ bool pollin;
+ int nevents;
+ int fd;
+ int ret;
+ int i;
+
+ /* Open the FIFO for non-blocking read */
+
+ message("poll_listener: Opening %s for non-blocking read\n", FIFO_PATH1);
+ fd = open(FIFO_PATH1, O_RDONLY|O_NONBLOCK);
+ if (fd < 0)
+ {
+ message("poll_listener: ERROR Failed to open FIFO %s: %d\n",
+ FIFO_PATH1, errno);
+ (void)close(fd);
+ return (void*)-1;
+ }
+
+ /* Loop forever */
+
+ for (;;)
+ {
+ message("poll_listener: Calling poll()\n");
+
+ memset(fds, 0, sizeof(struct pollfd)*NPOLLFDS);
+#ifdef HAVE_CONSOLE
+ fds[CONSNDX].fd = 0;
+ fds[CONSNDX].events = POLLIN;
+ fds[CONSNDX].revents = 0;
+#endif
+ fds[FIFONDX].fd = fd;
+ fds[FIFONDX].events = POLLIN;
+ fds[FIFONDX].revents = 0;
+
+ timeout = false;
+ pollin = false;
+
+ ret = poll(fds, NPOLLFDS, POLL_LISTENER_DELAY);
+
+ message("\npoll_listener: poll returned: %d\n", ret);
+ if (ret < 0)
+ {
+ message("poll_listener: ERROR poll failed: %d\n", errno);
+ }
+ else if (ret == 0)
+ {
+ message("poll_listener: Timeout\n");
+ timeout = true;
+ }
+ else if (ret > NPOLLFDS)
+ {
+ message("poll_listener: ERROR poll reported: %d\n");
+ }
+ else
+ {
+ pollin = true;
+ }
+
+ nevents = 0;
+ for (i = 0; i < NPOLLFDS; i++)
+ {
+ message("poll_listener: FIFO revents[%d]=%02x\n", i, fds[i].revents);
+ if (timeout)
+ {
+ if (fds[i].revents != 0)
+ {
+ message("poll_listener: ERROR? expected revents=00, received revents[%d]=%02x\n",
+ fds[i].revents, i);
+ }
+ }
+ else if (pollin)
+ {
+ if (fds[i].revents == POLLIN)
+ {
+ nevents++;
+ }
+ else if (fds[i].revents != 0)
+ {
+ message("poll_listener: ERROR unexpected revents[i]=%02x\n",
+ i, fds[i].revents);
+ }
+ }
+ }
+
+ if (pollin && nevents != ret)
+ {
+ message("poll_listener: ERROR found %d events, poll reported %d\n", nevents, ret);
+ }
+
+ /* In any event, read until the pipe/serial is empty */
+
+ for (i = 0; i < NPOLLFDS; i++)
+ {
+ do
+ {
+#ifdef HAVE_CONSOLE
+ /* Hack to work around the fact that the console driver on the
+ * simulator is always non-blocking.
+ */
+
+ if (i == CONSNDX)
+ {
+ if ((fds[CONSNDX].revents & POLLIN) != 0)
+ {
+ buffer[0] = getchar();
+ nbytes = 1;
+ }
+ else
+ {
+ nbytes = 0;
+ }
+ }
+ else
+#endif
+ {
+ /* The pipe works differently, it returns whatever data
+ * it has available without blocking.
+ */
+
+ nbytes = read(fds[i].fd, buffer, 63);
+ }
+
+ if (nbytes <= 0)
+ {
+ if (nbytes == 0 || errno == EAGAIN)
+ {
+ if ((fds[i].revents & POLLIN) != 0)
+ {
+ message("poll_listener: ERROR no read data[%d]\n", i);
+ }
+ }
+ else if (errno != EINTR)
+ {
+ message("poll_listener: read[%d] failed: %d\n", i, errno);
+ }
+ nbytes = 0;
+ }
+ else
+ {
+ if (timeout)
+ {
+ message("poll_listener: ERROR? Poll timeout, but data read[%d]\n", i);
+ message(" (might just be a race condition)\n");
+ }
+
+ buffer[nbytes] = '\0';
+ message("poll_listener: Read[%d] '%s' (%d bytes)\n", i, buffer, nbytes);
+ }
+
+ /* Suppress error report if no read data on the next time through */
+
+ fds[i].revents = 0;
+ }
+ while (nbytes > 0);
+ }
+
+ /* Make sure that everything is displayed */
+
+ msgflush();
+ }
+
+ /* Won't get here */
+
+ (void)close(fd);
+ return NULL;
+}
diff --git a/apps/examples/poll/poll_main.c b/apps/examples/poll/poll_main.c
new file mode 100644
index 000000000..d66e7f269
--- /dev/null
+++ b/apps/examples/poll/poll_main.c
@@ -0,0 +1,229 @@
+/****************************************************************************
+ * examples/poll/poll_main.c
+ *
+ * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <errno.h>
+#include <debug.h>
+
+#include "poll_internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ char buffer[64];
+ ssize_t nbytes;
+ pthread_t tid1;
+ pthread_t tid2;
+#ifdef HAVE_NETPOLL
+ pthread_t tid3;
+#endif
+ int count;
+ int fd1 = -1;
+ int fd2 = -1;
+ int ret;
+ int exitcode = 0;
+
+ /* Open FIFOs */
+
+ message("\nuser_start: Creating FIFO %s\n", FIFO_PATH1);
+ ret = mkfifo(FIFO_PATH1, 0666);
+ if (ret < 0)
+ {
+ message("user_start: mkfifo failed: %d\n", errno);
+ exitcode = 1;
+ goto errout;
+ }
+
+ message("\nuser_start: Creating FIFO %s\n", FIFO_PATH2);
+ ret = mkfifo(FIFO_PATH2, 0666);
+ if (ret < 0)
+ {
+ message("user_start: mkfifo failed: %d\n", errno);
+ exitcode = 2;
+ goto errout;
+ }
+
+ /* Open the FIFOs for blocking, write */
+
+ fd1 = open(FIFO_PATH1, O_WRONLY);
+ if (fd1 < 0)
+ {
+ message("user_start: Failed to open FIFO %s for writing, errno=%d\n",
+ FIFO_PATH1, errno);
+ exitcode = 3;
+ goto errout;
+ }
+
+ fd2 = open(FIFO_PATH2, O_WRONLY);
+ if (fd2 < 0)
+ {
+ message("user_start: Failed to open FIFO %s for writing, errno=%d\n",
+ FIFO_PATH2, errno);
+ exitcode = 4;
+ goto errout;
+ }
+
+ /* Start the listeners */
+
+ message("user_start: Starting poll_listener thread\n");
+
+ ret = pthread_create(&tid1, NULL, poll_listener, NULL);
+ if (ret != 0)
+ {
+ message("user_start: Failed to create poll_listener thread: %d\n", ret);
+ exitcode = 5;
+ goto errout;
+ }
+
+ message("user_start: Starting select_listener thread\n");
+
+ ret = pthread_create(&tid2, NULL, select_listener, NULL);
+ if (ret != 0)
+ {
+ message("user_start: Failed to create select_listener thread: %d\n", ret);
+ exitcode = 6;
+ goto errout;
+ }
+
+#ifdef HAVE_NETPOLL
+#ifdef CONFIG_NET_TCPBACKLOG
+ message("user_start: Starting net_listener thread\n");
+
+ ret = pthread_create(&tid3, NULL, net_listener, NULL);
+#else
+ message("user_start: Starting net_reader thread\n");
+
+ ret = pthread_create(&tid3, NULL, net_reader, NULL);
+#endif
+ if (ret != 0)
+ {
+ message("user_start: Failed to create net_listener thread: %d\n", ret);
+ }
+#endif
+
+ /* Loop forever */
+
+ for (count = 0; ; count++)
+ {
+ /* Send a message to the listener... this should wake the listener
+ * from the poll.
+ */
+
+ sprintf(buffer, "Message %d", count);
+ nbytes = write(fd1, buffer, strlen(buffer));
+ if (nbytes < 0)
+ {
+ message("user_start: Write to fd1 failed: %d\n", errno);
+ exitcode = 7;
+ goto errout;
+ }
+
+ nbytes = write(fd2, buffer, strlen(buffer));
+ if (nbytes < 0)
+ {
+ message("user_start: Write fd2 failed: %d\n", errno);
+ exitcode = 8;
+ goto errout;
+ }
+
+ message("\nuser_start: Sent '%s' (%d bytes)\n", buffer, nbytes);
+ msgflush();
+
+ /* Wait awhile. This delay should be long enough that the
+ * listener will timeout.
+ */
+
+ sleep(WRITER_DELAY);
+ }
+
+errout:
+ if (fd1 >= 0)
+ {
+ close(fd1);
+ }
+
+ if (fd2 >= 0)
+ {
+ close(fd2);
+ }
+
+ fflush(stdout);
+ return exitcode;
+}
diff --git a/apps/examples/poll/select_listener.c b/apps/examples/poll/select_listener.c
new file mode 100644
index 000000000..80039ada3
--- /dev/null
+++ b/apps/examples/poll/select_listener.c
@@ -0,0 +1,193 @@
+/****************************************************************************
+ * examples/poll/select_listener.c
+ *
+ * Copyright (C) 2008, 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/select.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+
+#include "poll_internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: select_listener
+ ****************************************************************************/
+
+void *select_listener(pthread_addr_t pvarg)
+{
+ fd_set rfds;
+ struct timeval tv;
+ char buffer[64];
+ ssize_t nbytes;
+ bool timeout;
+ bool ready;
+ int fd;
+ int ret;
+
+ /* Open the FIFO for non-blocking read */
+
+ message("select_listener: Opening %s for non-blocking read\n", FIFO_PATH2);
+ fd = open(FIFO_PATH2, O_RDONLY|O_NONBLOCK);
+ if (fd < 0)
+ {
+ message("select_listener: ERROR Failed to open FIFO %s: %d\n",
+ FIFO_PATH2, errno);
+ (void)close(fd);
+ return (void*)-1;
+ }
+
+ /* Loop forever */
+
+ for (;;)
+ {
+ message("select_listener: Calling select()\n");
+
+ FD_ZERO(&rfds);
+ FD_SET(fd, &rfds);
+
+ tv.tv_sec = SELECT_LISTENER_DELAY;
+ tv.tv_usec = 0;
+
+ timeout = false;
+ ready = false;
+
+ ret = select(fd+1, (FAR fd_set*)&rfds, (FAR fd_set*)NULL, (FAR fd_set*)NULL, &tv);
+ message("\nselect_listener: select returned: %d\n", ret);
+
+ if (ret < 0)
+ {
+ message("select_listener: ERROR select failed: %d\n");
+ }
+ else if (ret == 0)
+ {
+ message("select_listener: Timeout\n");
+ timeout = true;
+ }
+ else
+ {
+ if (ret != 1)
+ {
+ message("select_listener: ERROR poll reported: %d\n");
+ }
+ else
+ {
+ ready = true;
+ }
+
+ if (!FD_ISSET(fd, rfds))
+ {
+ message("select_listener: ERROR fd=%d not in fd_set\n");
+ }
+ }
+
+ /* In any event, read until the pipe is empty */
+
+ do
+ {
+ nbytes = read(fd, buffer, 63);
+ if (nbytes <= 0)
+ {
+ if (nbytes == 0 || errno == EAGAIN)
+ {
+ if (ready)
+ {
+ message("select_listener: ERROR no read data\n");
+ }
+ }
+ else if (errno != EINTR)
+ {
+ message("select_listener: read failed: %d\n", errno);
+ }
+ nbytes = 0;
+ }
+ else
+ {
+ if (timeout)
+ {
+ message("select_listener: ERROR? Poll timeout, but data read\n");
+ message(" (might just be a race condition)\n");
+ }
+
+ buffer[nbytes] = '\0';
+ message("select_listener: Read '%s' (%d bytes)\n", buffer, nbytes);
+ }
+
+ timeout = false;
+ ready = false;
+ }
+ while (nbytes > 0);
+
+ /* Make sure that everything is displayed */
+
+ msgflush();
+ }
+
+ /* Won't get here */
+
+ (void)close(fd);
+ return NULL;
+}
diff --git a/apps/examples/romfs/Makefile b/apps/examples/romfs/Makefile
new file mode 100644
index 000000000..70b5e869c
--- /dev/null
+++ b/apps/examples/romfs/Makefile
@@ -0,0 +1,107 @@
+############################################################################
+# apps/examples/romfs/Makefile
+#
+# Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# ROMFS File System Example
+
+ASRCS =
+CSRCS = romfs_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: checkgenromfs .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+checkgenromfs:
+ @genromfs -h 1>/dev/null 2>&1 || { \
+ echo "Host executable genromfs not available in PATH"; \
+ echo "You may need to download in from http://romfs.sourceforge.net/"; \
+ exit 1; \
+ }
+
+testdir : testdir.tar.gz
+ @tar zxf $< || { echo "tar zxf $< failed" ; exit 1 ; }
+
+testdir.img : checkgenromfs testdir
+ @genromfs -f $@ -d testdir -V "ROMFS_Test" || { echo "genromfs failed" ; exit 1 ; }
+
+romfs_testdir.h : testdir.img
+ @xxd -i $< >$@ || { echo "xxd of $< failed" ; exit 1 ; }
+
+$(BIN): romfs_testdir.h $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend testdir.img
+
+-include Make.dep
+
diff --git a/apps/examples/romfs/romfs_main.c b/apps/examples/romfs/romfs_main.c
new file mode 100644
index 000000000..2e231a31c
--- /dev/null
+++ b/apps/examples/romfs/romfs_main.c
@@ -0,0 +1,506 @@
+/****************************************************************************
+ * examples/romfs/romfs_main.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/* Mount the ROMFS image, Verifty that it contains the
+ * following:
+ *
+ * testdir
+ * |---------- [drwxr-xr-x 4096] adir
+ * | |------ [-rw-r--r-- 21] anotherfile.txt
+ * | |------ [drwxr-xr-x 4096] subdir
+ * | | `-- [-rw-r--r-- 21] subdirfile.txt
+ * | `------ [-rw-r--r-- 25] yafile.txt
+ * |---------- [-rw-r--r-- 15] afile.txt
+ * |---------- [-rw-r--r-- 21] hfile
+ * `---------- [lrwxrwxrwx 11] ldir -> adir/subdir
+ *
+ * testdir/ldir is a soft-link and should not be detectable.
+ * hfile is a hardlink to subdirfile and should be identical
+ */
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <errno.h>
+
+#include <nuttx/ramdisk.h>
+
+#include "romfs_testdir.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Configuration settings */
+
+#ifndef CONFIG_EXAMPLES_ROMFS_RAMDEVNO
+# define CONFIG_EXAMPLES_ROMFS_RAMDEVNO 1
+#endif
+
+#ifndef CONFIG_EXAMPLES_ROMFS_SECTORSIZE
+# define CONFIG_EXAMPLES_ROMFS_SECTORSIZE 64
+#endif
+
+#ifndef CONFIG_EXAMPLES_ROMFS_MOUNTPOINT
+# define CONFIG_EXAMPLES_ROMFS_MOUNTPOINT "/usr/local/share"
+#endif
+
+#ifdef CONFIG_DISABLE_MOUNTPOINT
+# error "Mountpoint support is disabled"
+#endif
+
+#if CONFIG_NFILE_DESCRIPTORS < 4
+# error "Not enough file descriptors"
+#endif
+
+#ifndef CONFIG_FS_ROMFS
+# error "ROMFS support not enabled"
+#endif
+
+#define NSECTORS(b) (((b)+CONFIG_EXAMPLES_ROMFS_SECTORSIZE-1)/CONFIG_EXAMPLES_ROMFS_SECTORSIZE)
+#define STR_RAMDEVNO(m) #m
+#define MKMOUNT_DEVNAME(m) "/dev/ram" STR_RAMDEVNO(m)
+#define MOUNT_DEVNAME MKMOUNT_DEVNAME(CONFIG_EXAMPLES_ROMFS_RAMDEVNO)
+
+#define SCRATCHBUFFER_SIZE 1024
+
+/* Test directory stuff */
+
+#define WRITABLE_MODE (S_IWOTH|S_IWGRP|S_IWUSR)
+#define READABLE_MODE (S_IROTH|S_IRGRP|S_IRUSR)
+#define EXECUTABLE_MODE (S_IXOTH|S_IXGRP|S_IXUSR)
+
+#define DIRECTORY_MODE (S_IFDIR|READABLE_MODE|EXECUTABLE_MODE)
+#define FILE_MODE (S_IFREG|READABLE_MODE)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct node_s
+{
+ struct node_s *peer; /* Next node in this directory */
+ bool directory; /* True: directory */
+ bool found; /* True: found and verified */
+ const char *name; /* Node name */
+ mode_t mode; /* Expected permissions */
+ size_t size; /* Expected size */
+ union
+ {
+ const char *filecontent; /* Context of text file */
+ struct node_s *child; /* Subdirectory start */
+ } u;
+};
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char g_afilecontent[] = "This is a file\n";
+static const char g_anotherfilecontent[] = "This is another file\n";
+static const char g_yafilecontent[] = "This is yet another file\n";
+static const char g_subdirfilecontent[] = "File in subdirectory\n";
+
+#define g_hfilecontent g_subdirfilecontent
+
+static struct node_s g_adir;
+static struct node_s g_afile;
+static struct node_s g_hfile;
+
+static struct node_s g_anotherfile;
+static struct node_s g_subdir;
+static struct node_s g_yafile;
+
+static struct node_s g_subdirfile;
+
+static int g_nerrors = 0;
+
+static char g_scratchbuffer[SCRATCHBUFFER_SIZE];
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name:
+ ****************************************************************************/
+
+static void connectem(void)
+{
+ g_adir.peer = &g_afile;
+ g_adir.directory = true;
+ g_adir.found = false;
+ g_adir.name = "adir";
+ g_adir.mode = DIRECTORY_MODE;
+ g_adir.size = 0;
+ g_adir.u.child = &g_anotherfile;
+
+ g_afile.peer = &g_hfile;
+ g_afile.directory = false;
+ g_afile.found = false;
+ g_afile.name = "afile.txt";
+ g_afile.mode = FILE_MODE;
+ g_afile.size = strlen(g_afilecontent);
+ g_afile.u.filecontent = g_afilecontent;
+
+ g_hfile.peer = NULL;
+ g_hfile.directory = false; /* Actually a hard link */
+ g_hfile.found = false;
+ g_hfile.name = "hfile";
+ g_hfile.mode = FILE_MODE;
+ g_hfile.size = strlen(g_hfilecontent);
+ g_hfile.u.filecontent = g_hfilecontent;
+
+ g_anotherfile.peer = &g_yafile;
+ g_anotherfile.directory = false;
+ g_anotherfile.found = false;
+ g_anotherfile.name = "anotherfile.txt";
+ g_anotherfile.mode = FILE_MODE;
+ g_anotherfile.size = strlen(g_anotherfilecontent);
+ g_anotherfile.u.filecontent = g_anotherfilecontent;
+
+ g_yafile.peer = &g_subdir;
+ g_yafile.directory = false;
+ g_yafile.found = false;
+ g_yafile.name = "yafile.txt";
+ g_yafile.mode = FILE_MODE;
+ g_yafile.size = strlen(g_yafilecontent);
+ g_yafile.u.filecontent = g_yafilecontent;
+
+ g_subdir.peer = NULL;
+ g_subdir.directory = true;
+ g_subdir.found = false;
+ g_subdir.name = "subdir";
+ g_subdir.mode = DIRECTORY_MODE;
+ g_subdir.size = 0;
+ g_subdir.u.child = &g_subdirfile;
+
+ g_subdirfile.peer = NULL;
+ g_subdirfile.directory = false;
+ g_subdirfile.found = false;
+ g_subdirfile.name = "subdirfile.txt";
+ g_subdirfile.mode = FILE_MODE;
+ g_subdirfile.size = strlen(g_subdirfilecontent);
+ g_subdirfile.u.filecontent = g_subdirfilecontent;
+}
+
+/****************************************************************************
+ * Name: findindirectory
+ ****************************************************************************/
+
+static struct node_s *findindirectory(struct node_s *entry, const char *name)
+{
+ for (; entry; entry = entry->peer)
+ {
+ if (!entry->found && strcmp(entry->name, name) == 0)
+ {
+ entry->found = true;
+ return entry;
+ }
+ }
+ return NULL;
+}
+
+/****************************************************************************
+ * Name: checkattributes
+ ****************************************************************************/
+
+static void checkattributes(const char *path, mode_t mode, size_t size)
+{
+ struct stat buf;
+ int ret;
+
+ ret = stat(path, &buf);
+ if (ret != 0)
+ {
+ printf(" -- ERROR: Failed to stat %s: %d\n", path, errno);
+ g_nerrors++;
+ return;
+ }
+
+ if (mode != buf.st_mode)
+ {
+ printf(" -- ERROR: Expected mode %08x, got %08x\n", mode, buf.st_mode);
+ g_nerrors++;
+ }
+
+ if (size != buf.st_size)
+ {
+ printf(" -- ERROR: Expected size %d, got %d\n", mode, buf.st_size);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: checkfile
+ ****************************************************************************/
+
+static void checkfile(const char *path, struct node_s *node)
+{
+ ssize_t nbytesread;
+ char *filedata;
+ int fd;
+
+ /* Open the file */
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ {
+ printf(" -- ERROR: Failed to open %s: %d\n", path, errno);
+ g_nerrors++;
+ return;
+ }
+
+ /* Read and verify the file contents */
+
+ nbytesread = read(fd, g_scratchbuffer, SCRATCHBUFFER_SIZE);
+ if (nbytesread < 0)
+ {
+ printf(" -- ERROR: Failed to read from %s: %d\n", path, errno);
+ g_nerrors++;
+ }
+ else if (nbytesread != node->size)
+ {
+ printf(" -- ERROR: Read %d bytes, expected %d\n", nbytesread, node->size);
+ g_nerrors++;
+ }
+ else if (memcmp(g_scratchbuffer, node->u.filecontent, node->size) != 0)
+ {
+ g_scratchbuffer[nbytesread] = '\0';
+ printf(" -- ERROR: File content read does not match expectation:\n");
+ printf(" -- Read: [%s]\n", g_scratchbuffer);
+ printf(" -- Expected: [%s]\n", node->u.filecontent);
+ g_nerrors++;
+ }
+
+ /* Memory map and verify the file contents */
+
+ filedata = (char*)mmap(NULL, node->size, PROT_READ, MAP_SHARED|MAP_FILE, fd, 0);
+ if (!filedata || filedata == (char*)MAP_FAILED)
+ {
+ printf(" -- ERROR: mmap of %s failed: %d\n", path, errno);
+ g_nerrors++;
+ }
+ else
+ {
+ if (memcmp(filedata, node->u.filecontent, node->size) != 0)
+ {
+ memcpy(g_scratchbuffer, filedata, node->size);
+ g_scratchbuffer[node->size] = '\0';
+ printf(" -- ERROR: Mapped file content read does not match expectation:\n");
+ printf(" -- Memory: [%s]\n", filedata);
+ printf(" -- Expected: [%s]\n", node->u.filecontent);
+ g_nerrors++;
+ }
+ munmap(filedata, node->size);
+ }
+
+ /* Close the file */
+
+ if (close(fd) != OK)
+ {
+ printf(" -- ERROR: Failed to close %s: %d\n", path, errno);
+ g_nerrors++;
+ }
+}
+
+/****************************************************************************
+ * Name: readdirectories
+ ****************************************************************************/
+
+static void readdirectories(const char *path, struct node_s *entry)
+{
+ DIR *dirp;
+ struct node_s *node;
+ struct dirent *direntry;
+ char *fullpath;
+
+ printf("Traversing directory: %s\n", path);
+ dirp = opendir(path);
+ if (!dirp)
+ {
+ printf(" ERROR opendir(\"%s\") failed: %d\n", path, errno);
+ g_nerrors++;
+ return;
+ }
+
+ for (direntry = readdir(dirp); direntry; direntry = readdir(dirp))
+ {
+ if (strcmp(direntry->d_name, ".") == 0 || strcmp(direntry->d_name, "..") == 0)
+ {
+ printf(" Skipping %s\n", direntry->d_name);
+ continue;
+ }
+
+ node = findindirectory(entry, direntry->d_name);
+ if (!node)
+ {
+ printf(" ERROR: No node found for %s\n", direntry->d_name);
+ g_nerrors++;
+ continue;
+ }
+
+ /* Get the full path to the entry */
+
+ sprintf(g_scratchbuffer, "%s/%s", path, direntry->d_name);
+ fullpath = strdup(g_scratchbuffer);
+
+ if (DIRENT_ISDIRECTORY(direntry->d_type))
+ {
+ printf(" DIRECTORY: %s/\n", fullpath);
+ if (!node->directory)
+ {
+ printf(" -- ERROR: Expected type directory\n");
+ g_nerrors++;
+ }
+ else
+ {
+ checkattributes(fullpath, node->mode, 0);
+ readdirectories(fullpath, node->u.child);
+ printf("Continuing directory: %s\n", path);
+ }
+ }
+ else
+ {
+ printf(" FILE: %s/\n", fullpath);
+ if (node->directory)
+ {
+ printf(" -- ERROR: Expected type file\n");
+ g_nerrors++;
+ }
+ else
+ {
+ checkattributes(fullpath, node->mode, node->size);
+ checkfile(fullpath, node);
+ }
+ }
+ free(fullpath);
+ }
+
+ closedir(dirp);
+}
+
+/****************************************************************************
+ * Name: checkdirectories
+ ****************************************************************************/
+
+static void checkdirectories(struct node_s *entry)
+{
+ for (; entry; entry = entry->peer)
+ {
+ if (!entry->found )
+ {
+ printf("ERROR: %s never found\n", entry->name);
+ g_nerrors++;
+ }
+
+ if (entry->directory)
+ {
+ checkdirectories(entry->u.child);
+ }
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ int ret;
+
+ /* Create a RAM disk for the test */
+
+ ret = romdisk_register(CONFIG_EXAMPLES_ROMFS_RAMDEVNO, testdir_img,
+ NSECTORS(testdir_img_len), CONFIG_EXAMPLES_ROMFS_SECTORSIZE);
+ if (ret < 0)
+ {
+ printf("ERROR: Failed to create RAM disk\n");
+ return 1;
+ }
+
+ /* Mount the test file system */
+
+ printf("Mounting ROMFS filesystem at target=%s with source=%s\n",
+ CONFIG_EXAMPLES_ROMFS_MOUNTPOINT, MOUNT_DEVNAME);
+
+ ret = mount(MOUNT_DEVNAME, CONFIG_EXAMPLES_ROMFS_MOUNTPOINT, "romfs", MS_RDONLY, NULL);
+ if (ret < 0)
+ {
+ printf("ERROR: Mount failed: %d\n", errno);
+ return 1;
+ }
+
+ /* Perform the test */
+
+ connectem();
+ readdirectories(CONFIG_EXAMPLES_ROMFS_MOUNTPOINT, &g_adir);
+ checkdirectories(&g_adir);
+
+ if (g_nerrors)
+ {
+ printf("Finished with %d errors\n", g_nerrors);
+ return g_nerrors;
+ }
+
+ printf("PASSED\n");
+ return 0;
+}
diff --git a/apps/examples/romfs/romfs_testdir.h b/apps/examples/romfs/romfs_testdir.h
new file mode 100644
index 000000000..53f93105c
--- /dev/null
+++ b/apps/examples/romfs/romfs_testdir.h
@@ -0,0 +1,89 @@
+unsigned char testdir_img[] = {
+ 0x2d, 0x72, 0x6f, 0x6d, 0x31, 0x66, 0x73, 0x2d, 0x00, 0x00, 0x02, 0x60,
+ 0x27, 0x43, 0x4a, 0x8a, 0x52, 0x4f, 0x4d, 0x46, 0x53, 0x5f, 0x54, 0x65,
+ 0x73, 0x74, 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, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
+ 0x93, 0x9b, 0x95, 0xf0, 0x6c, 0x64, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x64, 0x69, 0x72,
+ 0x2f, 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x19, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00,
+ 0x9e, 0x9b, 0x93, 0xc5, 0x61, 0x64, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x58, 0x47, 0x43, 0xf1,
+ 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x2e,
+ 0x74, 0x78, 0x74, 0x00, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+ 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65,
+ 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19,
+ 0xa1, 0xc5, 0x69, 0xd8, 0x79, 0x61, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x74,
+ 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x68, 0x69, 0x73,
+ 0x20, 0x69, 0x73, 0x20, 0x79, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x6f, 0x74,
+ 0x68, 0x65, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x00, 0x90,
+ 0x00, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xfe, 0x20, 0x2e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x70, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0xd1, 0xd1, 0xfe, 0x70, 0x2e, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
+ 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x18, 0x9c, 0x03,
+ 0x73, 0x75, 0x62, 0x64, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x15, 0x3e, 0x3f, 0x06, 0xd8, 0x73, 0x75, 0x62, 0x64,
+ 0x69, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x00,
+ 0x46, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x0a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0,
+ 0x00, 0x00, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xfc, 0xa0,
+ 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90,
+ 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xff, 0x70, 0x2e, 0x2e, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x32, 0x99, 0x92, 0xd4, 0x68, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc5, 0x6b, 0x22, 0x0b,
+ 0x61, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x74, 0x78, 0x74, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+ 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 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 testdir_img_len = 1024;
diff --git a/apps/examples/romfs/testdir.tar.gz b/apps/examples/romfs/testdir.tar.gz
new file mode 100644
index 000000000..cd0e9c518
--- /dev/null
+++ b/apps/examples/romfs/testdir.tar.gz
Binary files differ
diff --git a/apps/examples/romfs/testdir.txt b/apps/examples/romfs/testdir.txt
new file mode 100644
index 000000000..e321d6ded
--- /dev/null
+++ b/apps/examples/romfs/testdir.txt
@@ -0,0 +1,105 @@
+VOLUME HEADER: Name=ROMFS_Test
+0000000: 2d72 6f6d 3166 732d 0000 0260 2743 4a8a -rom1fs-...`'CJ.
+0000010: 524f 4d46 535f 5465 7374 0000 0000 0000 ROMFS_Test......
+
+FILE HEADER 1: Name=.
+0000020: 0000 0049 0000 0020 0000 0000 d1ff ff97 ...I... ........
+0000030: 2e00 0000 0000 0000 0000 0000 0000 0000 ................
+
+FILE HEADER 2: Name=..
+0000040: 0000 0060 0000 0020 0000 0000 d1d1 ff80 ...`... ........
+0000050: 2e2e 0000 0000 0000 0000 0000 0000 0000 ................
+
+FILE HEADER 3: Name=ldir
+0000060: 0000 0093 0000 0000 0000 000b 939b 95f0 ................
+0000070: 6c64 6972 0000 0000 0000 0000 0000 0000 ldir............
+
+ FILE CONTENT:
+ 0000080: 6164 6972 2f73 7562 6469 7200 0000 0000 adir/subdir.....
+
+FILE HEADER 4: Name=adir
+0000090: 0000 0219 0000 00b0 0000 0000 9e9b 93c5 ................
+00000a0: 6164 6972 0000 0000 0000 0000 0000 0000 adir............
+
+ FILE HEADER 4.1: Name=anotherfile.txt
+ 00000b0: 0000 00f2 0000 0000 0000 0015 5847 43f1 ............XGC.
+ 00000c0: 616e 6f74 6865 7266 696c 652e 7478 7400 anotherfile.txt.
+
+ FILE CONTENT:
+ 00000d0: 5468 6973 2069 7320 616e 6f74 6865 7220 This is another
+ 00000e0: 6669 6c65 0a00 0000 0000 0000 0000 0000 file............
+
+ FILE HEADER 4.2: Name=yafile.txt
+ 00000f0: 0000 0132 0000 0000 0000 0019 a1c5 69d8 ...2..........i.
+ 0000100: 7961 6669 6c65 2e74 7874 0000 0000 0000 yafile.txt......
+
+ FILE CONTENT:
+ 0000110: 5468 6973 2069 7320 7965 7420 616e 6f74 This is yet anot
+ 0000120: 6865 7220 6669 6c65 0a00 0000 0000 0000 her file........
+
+ FILE HEADER 4.3: Name=.
+ 0000130: 0000 0150 0000 0090 0000 0000 d1ff fe20 ...P...........
+ 0000140: 2e00 0000 0000 0000 0000 0000 0000 0000 ................
+
+ FILE HEADER 4.4: Name=..
+ 0000150: 0000 0170 0000 0020 0000 0000 d1d1 fe70 ...p... .......p
+ 0000160: 2e2e 0000 0000 0000 0000 0000 0000 0000 ................
+
+ FILE HEADER 4.5: Name=subdir
+ 0000170: 0000 0009 0000 0190 0000 0000 2318 9c03 ............#...
+ 0000180: 7375 6264 6972 0000 0000 0000 0000 0000 subdir..........
+
+ FILE HEADER 4.5.1: Name=subdirfile.txt
+ 0000190: 0000 01d2 0000 0000 0000 0015 3e3f 06d8 ............>?..
+ 00001a0: 7375 6264 6972 6669 6c65 2e74 7874 0000 subdirfile.txt..
+
+ FILE CONTENT:
+ 00001b0: 4669 6c65 2069 6e20 7375 6264 6972 6563 File in subdirec
+ 00001c0: 746f 7279 0a00 0000 0000 0000 0000 0000 tory............
+
+ FILE HEADER 4.5.2: Name=.
+ 00001d0: 0000 01f0 0000 0170 0000 0000 d1ff fca0 .......p........
+ 00001e0: 2e00 0000 0000 0000 0000 0000 0000 0000 ................
+
+ FILE HEADER 4.5.3: Name=..
+ 00001f0: 0000 0000 0000 0090 0000 0000 d1d1 ff70 ...............p
+ 0000200: 2e2e 0000 0000 0000 0000 0000 0000 0000 ................
+
+FILE HEADER 5: Name=hfile
+0000210: 0000 0230 0000 0190 0000 0000 3299 92d4 ...0........2...
+0000220: 6866 696c 6500 0000 0000 0000 0000 0000 hfile...........
+
+FILE HEADER 6: Name=afile.txt
+0000230: 0000 0002 0000 0000 0000 000f c56b 220b .............k".
+0000240: 6166 696c 652e 7478 7400 0000 0000 0000 afile.txt.......
+
+ FILE CONTENT:
+ 0000250: 5468 6973 2069 7320 6120 6669 6c65 0a00 This is a file..
+
+PADDING
+0000260: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000270: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000280: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000290: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00002a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00002b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00002c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00002d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00002e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00002f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000300: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000310: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000320: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000330: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000340: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000350: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000360: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000370: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000380: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+0000390: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00003a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00003b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00003c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00003d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00003e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
+00003f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
diff --git a/apps/examples/sendmail/Makefile b/apps/examples/sendmail/Makefile
new file mode 100644
index 000000000..def179856
--- /dev/null
+++ b/apps/examples/sendmail/Makefile
@@ -0,0 +1,92 @@
+############################################################################
+# apps/examples/sendmail/Makefile
+#
+# Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Sendmail SMTP Example
+
+ASRCS =
+CSRCS = target.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+ @make -f Makefile.host clean TOPDIR=$(TOPDIR) APPDIR=$(APPDIR)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/sendmail/Makefile.host b/apps/examples/sendmail/Makefile.host
new file mode 100644
index 000000000..3b99432e3
--- /dev/null
+++ b/apps/examples/sendmail/Makefile.host
@@ -0,0 +1,77 @@
+############################################################################
+# apps/examples/sendmail/Makefile.host
+#
+# Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+
+# TOPDIR must be defined on the make command line
+
+-include $(TOPDIR)/Make.defs
+
+OBJS = host.o1 smtp.o1
+BIN = sendmail
+
+HOSTCFLAGS += -DCONFIG_WEBCLIENT_HOST=1
+HOSTCFLAGS += -I. -include hostdefs.h -Iinclude
+VPATH = $(TOPDIR)/netutils/smtp:.
+
+all: $(BIN)
+.PHONY: clean context clean_context distclean
+
+$(OBJS): %.o1: %.c
+ $(HOSTCC) -c $(HOSTCFLAGS) $< -o $@
+
+include:
+ @mkdir include
+
+include/net: include
+ @ln -s $(TOPDIR)/include/net include/net
+
+include/nuttx:
+ @mkdir -p include/nuttx
+
+include/queue.h: include
+ @cp -a $(TOPDIR)/include/queue.h include/.
+
+include/nuttx/config.h: include/nuttx
+ @touch include/nuttx/config.h
+
+headers: include/nuttx/config.h include/queue.h include/net
+
+$(BIN): headers $(OBJS)
+ $(HOSTCC) $(HOSTLDFLAGS) $(OBJS) -o $@
+
+clean:
+ @rm -f $(BIN).* *.o1 *~
+ @rm -rf include
+
+
diff --git a/apps/examples/sendmail/host.c b/apps/examples/sendmail/host.c
new file mode 100644
index 000000000..67a541b0c
--- /dev/null
+++ b/apps/examples/sendmail/host.c
@@ -0,0 +1,103 @@
+/****************************************************************************
+ * examples/sendmail/host.c
+ *
+ * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <apps/netutils/smtp.h>
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char g_host_name[] = "localhost";
+static const char g_sender[] = "nuttx-testing@example.com";
+static const char g_subject[] = "Testing SMTP from NuttX";
+static const char g_msg_body[] = "Test message sent by NuttX\r\n";
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: show_usage
+ ****************************************************************************/
+
+static void show_usage(const char *progname, int exitcode)
+{
+ fprintf(stderr, "USAGE: %s <recipient>\n", progname);
+ exit(exitcode);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+/****************************************************************************
+ * Name: main
+ ****************************************************************************/
+
+int main(int argc, char **argv, char **envp)
+{
+ struct in_addr addr;
+ void *handle;
+
+ if (argc != 2)
+ {
+ show_usage(argv[0], 1);
+ }
+
+ printf("sendmail: To: %s\n", argv[1]);
+ printf("sendmail: From: %s\n", g_sender);
+ printf("sendmail: Subject: %s\n", g_subject);
+ printf("sendmail: Body: %s\n", g_msg_body);
+
+ uip_ipaddr(addr.s_addr, 127, 0, 0, 1);
+ handle = smtp_open();
+ if (handle)
+ {
+ smtp_configure(handle, g_host_name, &addr.s_addr);
+ smtp_send(handle, argv[1], NULL, g_sender, g_subject,
+ g_msg_body, strlen(g_msg_body));
+ smtp_close(handle);
+ }
+ return 0;
+}
diff --git a/apps/examples/sendmail/hostdefs.h b/apps/examples/sendmail/hostdefs.h
new file mode 100755
index 000000000..da072d560
--- /dev/null
+++ b/apps/examples/sendmail/hostdefs.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * examples/wget/hostdefs.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __HOSTDEFS_H
+#define __HOSTDEFS_H
+
+/****************************************************************************
+ * Included Files
+ *****************************************************************************/
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+/****************************************************************************
+ * Preprocessor Defintiions
+ *****************************************************************************/
+
+#define HTONS(a) htons(a)
+#define HTONL(a) htonl(a)
+#define CONFIG_CPP_HAVE_WARNING 1
+#define CONFIG_HAVE_GETHOSTBYNAME 1
+#define FAR
+
+#define ndbg(...) printf(__VA_ARGS__)
+#define nvdbg(...) printf(__VA_ARGS__)
+
+#define ERROR (-1)
+#define OK (0)
+
+/****************************************************************************
+ * Type Definitions
+ *****************************************************************************/
+
+typedef void *(*pthread_startroutine_t)(void *);
+
+#endif /* __HOSTDEFS_H */
diff --git a/apps/examples/sendmail/target.c b/apps/examples/sendmail/target.c
new file mode 100644
index 000000000..d8643106b
--- /dev/null
+++ b/apps/examples/sendmail/target.c
@@ -0,0 +1,169 @@
+/****************************************************************************
+ * examples/sendmail/target.c
+ *
+ * Copyright (C) 2009. 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <net/if.h>
+#include <apps/netutils/uiplib.h>
+#include <apps/netutils/smtp.h>
+
+/****************************************************************************
+ * Pre-processor Defintitions
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLE_SENDMAIL_RECIPIENT
+# error "You must provice CONFIG_EXAMPLE_SENDMAIL_RECIPIENT"
+#endif
+
+#ifndef CONFIG_EXAMPLE_SENDMAIL_IPADDR
+# error "You must provice CONFIG_EXAMPLE_SENDMAIL_IPADDR"
+#endif
+
+#ifndef CONFIG_EXAMPLE_SENDMAIL_DRIPADDR
+# error "You must provice CONFIG_EXAMPLE_SENDMAIL_DRIPADDR"
+#endif
+
+#ifndef CONFIG_EXAMPLE_SENDMAIL_NETMASK
+# error "You must provice CONFIG_EXAMPLE_SENDMAIL_NETMASK"
+#endif
+
+#ifndef CONFIG_EXAMPLE_SENDMAIL_SENDER
+# define CONFIG_EXAMPLE_SENDMAIL_SENDER "nuttx-testing@example.com"
+#endif
+
+#ifndef CONFIG_EXAMPLE_SENDMAIL_SUBJECT
+# define CONFIG_EXAMPLE_SENDMAIL_SUBJECT "Testing SMTP from NuttX"
+#endif
+
+#ifndef CONFIG_EXAMPLE_SENDMAIL_BODY
+# define CONFIG_EXAMPLE_SENDMAIL_BODY "Test message sent by NuttX"
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char g_host_name[] = "localhost";
+static const char g_recipient[] = CONFIG_EXAMPLE_SENDMAIL_RECIPIENT;
+static const char g_sender[] = CONFIG_EXAMPLE_SENDMAIL_SENDER;
+static const char g_subject[] = CONFIG_EXAMPLE_SENDMAIL_SUBJECT;
+static const char g_msg_body[] = CONFIG_EXAMPLE_SENDMAIL_BODY "\r\n";
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+#if defined(CONFIG_EXAMPLE_SENDMAIL_NOMAC)
+ uint8_t mac[IFHWADDRLEN];
+#endif
+ void *handle;
+
+ printf("sendmail: To: %s\n", g_recipient);
+ printf("sendmail: From: %s\n", g_sender);
+ printf("sendmail: Subject: %s\n", g_subject);
+ printf("sendmail: Body: %s\n", g_msg_body);
+
+/* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_SENDMAIL_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_SENDMAIL_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_SENDMAIL_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_SENDMAIL_NETMASK);
+ uip_setnetmask("eth0", &addr);
+
+ /* Then send the mail */
+
+ uip_ipaddr(addr.s_addr, 127, 0, 0, 1);
+ handle = smtp_open();
+ if (handle)
+ {
+ smtp_configure(handle, g_host_name, &addr.s_addr);
+ smtp_send(handle, g_recipient, NULL, g_sender, g_subject,
+ g_msg_body, strlen(g_msg_body));
+ smtp_close(handle);
+ }
+ return 0;
+}
diff --git a/apps/examples/serloop/Makefile b/apps/examples/serloop/Makefile
new file mode 100644
index 000000000..99b1aab67
--- /dev/null
+++ b/apps/examples/serloop/Makefile
@@ -0,0 +1,91 @@
+############################################################################
+# apps/examples/serloop/Makefile
+#
+# Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# Mindlessly simple console loopack test
+
+ASRCS =
+CSRCS = main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/serloop/main.c b/apps/examples/serloop/main.c
new file mode 100644
index 000000000..a9bdbe7ea
--- /dev/null
+++ b/apps/examples/serloop/main.c
@@ -0,0 +1,113 @@
+/****************************************************************************
+ * examples/serloop/main.c
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+#ifdef CONFIG_EXAMPLES_SERLOOP_BUFIO
+ int ch;
+
+ for (;;)
+ {
+ ch = getchar();
+ if (ch < 1)
+ {
+ ch = '!';
+ }
+ else if ((ch < 0x20 || ch > 0x7e) && ch != '\n')
+ {
+ ch = '.';
+ }
+ putchar(ch);
+ }
+#else
+ uint8_t ch;
+ int ret;
+
+ for (;;)
+ {
+ ret = read(0, &ch, 1);
+ if (ret < 1)
+ {
+ ch = '!';
+ }
+ else if ((ch < 0x20 || ch > 0x7e) && ch != '\n')
+ {
+ ch = '.';
+ }
+ ret = write(1, &ch, 1);
+ }
+#endif
+ return 0;
+}
+
diff --git a/apps/examples/thttpd/Makefile b/apps/examples/thttpd/Makefile
new file mode 100644
index 000000000..acc49d9ac
--- /dev/null
+++ b/apps/examples/thttpd/Makefile
@@ -0,0 +1,95 @@
+############################################################################
+# apps/examples/thttpd/Makefile
+#
+# Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# THTTPD Web Server Example
+
+ASRCS =
+CSRCS = main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built headers clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+headers:
+ @$(MAKE) -C content TOPDIR=$(TOPDIR) APPDIR=$(APPDIR) CROSSDEV=$(CROSSDEV)
+
+$(BIN): headers $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ @make -C content clean TOPDIR=$(TOPDIR) APPDIR=$(APPDIR) CROSSDEV=$(CROSSDEV)
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/thttpd/content/Makefile b/apps/examples/thttpd/content/Makefile
new file mode 100644
index 000000000..1a3462c23
--- /dev/null
+++ b/apps/examples/thttpd/content/Makefile
@@ -0,0 +1,104 @@
+############################################################################
+# apps/examples/thttpd/content/Makefile
+#
+# Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+
+SUBDIRS = hello tasks netstat
+INSTALL_FILES = index.html style.css
+
+THTTPD_DIR = $(APPDIR)/examples/thttpd
+CONTENT_DIR = $(THTTPD_DIR)/content
+ROMFS_DIR = $(CONTENT_DIR)/romfs
+ROMFS_IMG = $(CONTENT_DIR)/romfs.img
+ROMFS_HDR = $(CONTENT_DIR)/romfs.h
+ROMFSCGI_DIR = $(ROMFS_DIR)/cgi-bin
+SYMTAB = $(CONTENT_DIR)/symtab.h
+
+define DIR_template
+$(1)_$(2):
+ @$(MAKE) -C $(1) $(3) TOPDIR=$(TOPDIR) APPDIR=$(APPDIR) CROSSDEV=$(CROSSDEV) CGI_DIR=$(ROMFSCGI_DIR)
+endef
+
+all: $(ROMFS_HDR) $(SYMTAB)
+.PHONY: all build clean install populate
+
+$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),build, all)))
+$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),clean,clean)))
+$(foreach DIR, $(SUBDIRS), $(eval $(call DIR_template,$(DIR),install,install)))
+
+# Build program(s) in each sud-directory
+
+build: $(foreach DIR, $(SUBDIRS), $(DIR)_build)
+
+# Install each program in the romfs directory
+
+install: $(foreach DIR, $(SUBDIRS), $(DIR)_install)
+ @( for file in $(INSTALL_FILES); do\
+ install -m 0644 -D $${file} $(ROMFS_DIR)/$${file}; \
+ done; )
+
+# Create the romfs directory
+
+$(ROMFS_DIR):
+ @mkdir -p $(ROMFS_DIR)
+
+$(ROMFSCGI_DIR): $(ROMFS_DIR)
+ @mkdir -p $(ROMFSCGI_DIR)
+
+# Populate the romfs directory
+
+populate: $(ROMFSCGI_DIR) build install
+
+# Create the romfs.img file from the populated romfs directory
+
+$(ROMFS_IMG): populate
+ @genromfs -f $@ -d $(ROMFS_DIR) -V "THTTPDTEST"
+
+# Create the romfs.h header file from the romfs.img file
+
+$(ROMFS_HDR) : $(ROMFS_IMG)
+ @(cd $(CONTENT_DIR); xxd -i romfs.img | sed -e "s/^unsigned/static const unsigned/g" >$@)
+
+# Create the exported symbol table list from the derived *-thunk.S files
+
+$(SYMTAB): build
+ @$(CONTENT_DIR)/mksymtab.sh $(CONTENT_DIR) >$@
+
+# Clean each subdirectory
+
+clean: $(foreach DIR, $(SUBDIRS), $(DIR)_clean)
+ @rm -f $(ROMFS_HDR) $(ROMFS_IMG) $(SYMTAB)
+ @rm -rf $(ROMFS_DIR)
+ @rm -f *~ .*.swp
+
+
diff --git a/apps/examples/thttpd/content/hello/Makefile b/apps/examples/thttpd/content/hello/Makefile
new file mode 100644
index 000000000..e980f1c34
--- /dev/null
+++ b/apps/examples/thttpd/content/hello/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/thttpd/content/hello/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = hello
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -m 0755 -D $(BIN) $(CGI_DIR)/$(BIN)
+
diff --git a/apps/examples/thttpd/content/hello/hello.c b/apps/examples/thttpd/content/hello/hello.c
new file mode 100644
index 000000000..40f31a454
--- /dev/null
+++ b/apps/examples/thttpd/content/hello/hello.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * examples/thttpd/content/hello/hello.c
+ * Manatory "Hello, World!" Example
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdlib.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char *argv[])
+{
+ fprintf(stderr, "Hello requested from: %s\n", getenv("REMOTE_ADDR"));
+
+ puts(
+ "Content-type: text/html\r\n"
+ "Status: 200/html\r\n"
+ "\r\n"
+ "<html>\r\n"
+ "<head>\r\n"
+ "<title>Hello!</title>\r\n"
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\">\r\n"
+ "</head>\r\n"
+ "<body bgcolor=\"#fffeec\" text=\"black\">\r\n"
+ "<div class=\"menu\">\r\n"
+ "<div class=\"menubox\"><a href=\"/index.html\">Front page</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"hello\">Say Hello</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"tasks\">Tasks</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"netstat\">Network status</a></div>\r\n"
+ "<br>\r\n"
+ "</div>\r\n"
+ "<div class=\"contentblock\">\r\n");
+ printf(
+ "<h2>Hello, World!</h2><p>Requested by: %s</p>\r\n",
+ getenv("REMOTE_ADDR"));
+ puts(
+ "</body>\r\n"
+ "</html>\r\n");
+ return 0;
+}
diff --git a/apps/examples/thttpd/content/index.html b/apps/examples/thttpd/content/index.html
new file mode 100644
index 000000000..1fba1fbf6
--- /dev/null
+++ b/apps/examples/thttpd/content/index.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <title>NuttX examples/thttpd</title>
+ <link rel="stylesheet" type="text/css" href="style.css">
+ </head>
+ <body bgcolor="#fffeec" text="black">
+
+ <div class="menu">
+ <div class="menubox"><a href="index.html">Front page</a></div>
+ <div class="menubox"><a href="cgi-bin/hello">Say Hello</a></div>
+ <div class="menubox"><a href="cgi-bin/tasks">Tasks</a></div>
+ <div class="menubox"><a href="cgi-bin/netstat">Network status</a></div>
+ <br>
+ </div>
+
+ <div class="contentblock">
+ <p>
+ These web pages are served by a port of <a href="http://acme.com/software/thttpd/">THTTPD</a>
+ running on top of <a href="http://www.nuttx.org">NuttX</a>.
+ NuttX includes a port of the <a href="http://www.sics.se/~adam/uip/">uIP</a> embedded TCP/IP stack.
+ </p>
+ <p>
+ Click on the links above to exercise THTTPD's CGI capability under NuttX.
+ Clicking the links will execute the CGI program from an
+ <a href="http://nuttx.sourceforge.net/NuttXNxFlat.html">NXFLAT</a> program residing
+ in a ROMFS file system.
+ </p>
+ </body>
+</html>
diff --git a/apps/examples/thttpd/content/mksymtab.sh b/apps/examples/thttpd/content/mksymtab.sh
new file mode 100755
index 000000000..611d3a87a
--- /dev/null
+++ b/apps/examples/thttpd/content/mksymtab.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+usage="Usage: %0 <test-dir-path>"
+
+dir=$1
+if [ -z "$dir" ]; then
+ echo "ERROR: Missing <test-dir-path>"
+ echo ""
+ echo $usage
+ exit 1
+fi
+
+if [ ! -d "$dir" ]; then
+ echo "ERROR: Directory $dir does not exist"
+ echo ""
+ echo $usage
+ exit 1
+fi
+
+varlist=`find $dir -name "*-thunk.S"| xargs grep -h asciz | cut -f3 | sort | uniq`
+
+echo "#ifndef __EXAMPLES_NXFLAT_TESTS_SYMTAB_H"
+echo "#define __EXAMPLES_NXFLAT_TESTS_SYMTAB_H"
+echo ""
+echo "#include <nuttx/symtab.h>"
+echo ""
+echo "static const struct symtab_s exports[] = "
+echo "{"
+
+for string in $varlist; do
+ var=`echo $string | sed -e "s/\"//g"`
+ echo " {$string, $var},"
+done
+
+echo "};"
+echo "#define NEXPORTS (sizeof(exports)/sizeof(struct symtab_s))"
+echo ""
+echo "#endif /* __EXAMPLES_NXFLAT_TESTS_SYMTAB_H */"
+
diff --git a/apps/examples/thttpd/content/netstat/Makefile b/apps/examples/thttpd/content/netstat/Makefile
new file mode 100644
index 000000000..b12cbabc8
--- /dev/null
+++ b/apps/examples/thttpd/content/netstat/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/thttpd/content/netstat/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = netstat
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -m 0755 -D $(BIN) $(CGI_DIR)/$(BIN)
+
diff --git a/apps/examples/thttpd/content/netstat/netstat.c b/apps/examples/thttpd/content/netstat/netstat.c
new file mode 100755
index 000000000..634146274
--- /dev/null
+++ b/apps/examples/thttpd/content/netstat/netstat.c
@@ -0,0 +1,134 @@
+/****************************************************************************
+ * examples/thttpd/netstat/netstat.c
+ *
+ * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <netinet/ether.h>
+#include <net/uip/uipopt.h>
+#include <net/uip/uip-arch.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/* NOTEs:
+ *
+ * 1. One limitation in the use of NXFLAT is that functions that are
+ * referenced as a pointer-to-a-function must have global scope. Otherwise
+ * ARM GCC will generate some bad logic.
+ * 2. In general, when called back, there is no guarantee to that PIC registers
+ * will be valid and, unless you take special precautions, it could be
+ * dangerous to reference global variables in the callback function.
+ */
+
+/* static */ int netdev_callback(FAR struct uip_driver_s *dev, void *arg)
+{
+ struct in_addr addr;
+
+ printf(" <dt>%s\r\n", dev->d_ifname);
+#ifdef CONFIG_NET_ETHERNET
+ printf(" <dd>HWaddr: %s<br>\r\n", ether_ntoa(&dev->d_mac));
+#endif
+ addr.s_addr = dev->d_ipaddr;
+ printf(" IPaddr: %s<br>\r\n", inet_ntoa(addr));
+ addr.s_addr = dev->d_draddr;
+ printf(" DRaddr: %s<br>\r\n", inet_ntoa(addr));
+ addr.s_addr = dev->d_netmask;
+ printf(" Mask: %s\r\n", inet_ntoa(addr));
+ return OK;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char *argv[])
+{
+ puts(
+ "Content-type: text/html\r\n"
+ "Status: 200/html\r\n"
+ "\r\n"
+ "<html>\r\n"
+ "<head>\r\n"
+ "<title>Network Status</title>\r\n"
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\">\r\n"
+ "</head>\r\n"
+ "<body bgcolor=\"#fffeec\" text=\"black\">\r\n"
+ "<div class=\"menu\">\r\n"
+ "<div class=\"menubox\"><a href=\"/index.html\">Front page</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"hello\">Say Hello</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"tasks\">Tasks</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"netstat\">Network status</a></div>\r\n"
+ "<br>\r\n"
+ "</div>\r\n"
+ "<div class=\"contentblock\">\r\n"
+ "<dl>\r\n");
+
+ netdev_foreach(netdev_callback, NULL);
+
+ puts(
+ "</dl>\r\n"
+ "</body>\r\n"
+ "</html>\r\n");
+ return 0;
+}
diff --git a/apps/examples/thttpd/content/style.css b/apps/examples/thttpd/content/style.css
new file mode 100644
index 000000000..bfb0997a8
--- /dev/null
+++ b/apps/examples/thttpd/content/style.css
@@ -0,0 +1,80 @@
+h1
+{
+ text-align: center;
+ font-size:14pt;
+ font-family:arial,helvetica;
+ font-weight:bold;
+ padding:10px;
+}
+
+body
+{
+ background-color: #fffeec;
+ color:black;
+ font-size:8pt;
+ font-family:arial,helvetica;
+}
+
+.menu
+{
+ margin: 4px;
+ width:60%;
+ padding:2px;
+ border: solid 1px;
+ background-color: #fffcd2;
+ text-align:left;
+ font-size:9pt;
+ font-family:arial,helvetica;
+}
+
+div.menubox
+{
+ width: 25%;
+ border: 0;
+ float: left;
+ text-align: center;
+}
+
+.contentblock
+{
+ margin: 4px;
+ width:60%;
+ padding:2px;
+ border: 1px dotted;
+ background-color: white;
+ font-size:8pt;
+ font-family:arial,helvetica;
+}
+
+p.intro
+{
+ margin-left:20px;
+ margin-right:20px;
+ font-size:10pt;
+ font-family:arial,helvetica;
+}
+
+p.clink
+{
+ font-size:12pt;
+ font-family:courier,monospace;
+ text-align:center;
+}
+
+p.clink9
+{
+ font-size:9pt;
+ font-family:courier,monospace;
+ text-align:center;
+}
+
+p
+{
+ padding-left:10px;
+}
+
+p.right
+{
+ text-align:right;
+}
+
diff --git a/apps/examples/thttpd/content/tasks/Makefile b/apps/examples/thttpd/content/tasks/Makefile
new file mode 100755
index 000000000..2666e0b69
--- /dev/null
+++ b/apps/examples/thttpd/content/tasks/Makefile
@@ -0,0 +1,78 @@
+############################################################################
+# examples/thttpd/content/tasks/Makefile
+#
+# Copyright (C) 2009 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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 # Current configuration
+-include $(TOPDIR)/Make.defs # Basic make info
+
+BIN = tasks
+
+R1SRCS = $(BIN).c
+R1OBJS = $(R1SRCS:.c=.o)
+
+R2SRC = $(BIN)-thunk.S
+R2OBJ = $(R2SRC:.S=.o)
+
+all: $(BIN)
+
+$(R1OBJS): %.o: %.c
+ @echo "CC: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(R2OBJ): %.o: %.S
+ @echo "AS: $<"
+ @$(CC) -c $(CPICFLAGS) $< -o $@
+
+$(BIN).r1: $(R1OBJS)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS1) -o $@ $^
+
+$(R2SRC): $(BIN).r1
+ @echo "MK: $<"
+ @$(MKNXFLAT) -o $@ $^
+
+$(BIN).r2: $(R2OBJ)
+ @echo "LD: $<"
+ @$(LD) $(NXFLATLDFLAGS2) -o $@ $(R1OBJS) $(R2OBJ)
+
+$(BIN): $(BIN).r2
+ @echo "LD: $<"
+ @$(LDNXFLAT) $(LDNXFLATFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(BIN) $(R2SRC) *.o *.r1 *.r2 *~ .*.swp core
+
+install:
+ @install -m 0755 -D $(BIN) $(CGI_DIR)/$(BIN)
+
diff --git a/apps/examples/thttpd/content/tasks/tasks.c b/apps/examples/thttpd/content/tasks/tasks.c
new file mode 100755
index 000000000..13ba5cbb6
--- /dev/null
+++ b/apps/examples/thttpd/content/tasks/tasks.c
@@ -0,0 +1,168 @@
+/****************************************************************************
+ * examples/thttpd/tasks/tasks.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char *g_statenames[] =
+{
+ "INVALID ",
+ "PENDING ",
+ "READY ",
+ "RUNNING ",
+ "INACTIVE",
+ "WAITSEM ",
+#ifndef CONFIG_DISABLE_MQUEUE
+ "WAITSIG ",
+#endif
+#ifndef CONFIG_DISABLE_MQUEUE
+ "MQNEMPTY",
+ "MQNFULL "
+#endif
+};
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/* NOTEs:
+ *
+ * 1. One limitation in the use of NXFLAT is that functions that are
+ * referenced as a pointer-to-a-function must have global scope. Otherwise
+ * ARM GCC will generate some bad logic.
+ * 2. In general, when called back, there is no guarantee to that PIC registers
+ * will be valid and, unless you take special precautions, it could be
+ * dangerous to reference global variables in the callback function.
+ */
+
+/* static */ void show_task(FAR _TCB *tcb, FAR void *arg)
+{
+ int i;
+
+ /* Show task status */
+
+ printf("%5d %3d %4s %7s%c%c %8s ",
+ tcb->pid, tcb->sched_priority,
+ tcb->flags & TCB_FLAG_ROUND_ROBIN ? "RR " : "FIFO",
+ tcb->flags & TCB_FLAG_PTHREAD ? "PTHREAD" : "TASK ",
+ tcb->flags & TCB_FLAG_NONCANCELABLE ? 'N' : ' ',
+ tcb->flags & TCB_FLAG_CANCEL_PENDING ? 'P' : ' ',
+ g_statenames[tcb->task_state]);
+
+ /* Show task name and arguments */
+
+ printf("%s(", tcb->argv[0]);
+
+ /* Special case 1st argument (no comma) */
+
+ if (tcb->argv[1])
+ {
+ printf("%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++)
+ {
+ printf(", %p", tcb->argv[i]);
+ }
+#endif
+ printf(")\n");
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int main(int argc, char *argv[])
+{
+ puts(
+ "Content-type: text/html\r\n"
+ "Status: 200/html\r\n"
+ "\r\n"
+ "<html>\r\n"
+ "<head>\r\n"
+ "<title>NuttX Tasks</title>\r\n"
+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\">\r\n"
+ "</head>\r\n"
+ "<body bgcolor=\"#fffeec\" text=\"black\">\r\n"
+ "<div class=\"menu\">\r\n"
+ "<div class=\"menubox\"><a href=\"/index.html\">Front page</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"hello\">Say Hello</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"tasks\">Tasks</a></div>\r\n"
+ "<div class=\"menubox\"><a href=\"netstat\">Network status</a></div>\r\n"
+ "<br>\r\n"
+ "</div>\r\n"
+ "<div class=\"contentblock\">\r\n"
+ "<pre>\r\n"
+ "PID PRI SCHD TYPE NP STATE NAME\r\n");
+
+ sched_foreach(show_task, NULL);
+
+ puts(
+ "</pre>\r\n"
+ "</body>\r\n"
+ "</html>\r\n");
+ return 0;
+}
diff --git a/apps/examples/thttpd/main.c b/apps/examples/thttpd/main.c
new file mode 100644
index 000000000..e2fdda4f4
--- /dev/null
+++ b/apps/examples/thttpd/main.c
@@ -0,0 +1,280 @@
+/****************************************************************************
+ * examples/thttpd/main.c
+ *
+ * Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/ioctl.h>
+#include <sys/mount.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <net/if.h>
+#include <netinet/ether.h>
+
+#include <net/uip/uip-arp.h>
+#include <apps/netutils/uiplib.h>
+#include <apps/netutils/thttpd.h>
+
+#include <nuttx/ramdisk.h>
+#include <nuttx/binfmt.h>
+#include <nuttx/nxflat.h>
+#ifdef CONFIG_NET_SLIP
+# include <nuttx/net.h>
+#endif
+
+#include "content/romfs.h"
+#include "content/symtab.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Check configuration. This is not all of the configuration settings that
+ * are required -- only the more obvious.
+ */
+
+#if CONFIG_NFILE_DESCRIPTORS < 1
+# error "You must provide file descriptors via CONFIG_NFILE_DESCRIPTORS in your configuration file"
+#endif
+
+#ifndef CONFIG_NXFLAT
+# error "You must select CONFIG_NXFLAT in your configuration file"
+#endif
+
+#ifndef CONFIG_FS_ROMFS
+# error "You must select CONFIG_FS_ROMFS in your configuration file"
+#endif
+
+#ifdef CONFIG_DISABLE_MOUNTPOINT
+# error "You must not disable mountpoints via CONFIG_DISABLE_MOUNTPOINT in your configuration file"
+#endif
+
+#ifdef CONFIG_BINFMT_DISABLE
+# error "You must not disable loadable modules via CONFIG_BINFMT_DISABLE in your configuration file"
+#endif
+
+/* SLIP-specific configuration */
+
+#ifdef CONFIG_NET_SLIP
+
+ /* No MAC address operations */
+
+# undef CONFIG_EXAMPLE_THTTPD_NOMAC
+
+ /* TTY device to use */
+
+# ifndef CONFIG_NET_SLIPTTY
+# define CONFIG_NET_SLIPTTY "/dev/ttyS1"
+# endif
+
+# define SLIP_DEVNO 0
+# define NET_DEVNAME "sl0"
+#else
+
+ /* Otherwise, use the standard ethernet device name */
+
+# define NET_DEVNAME "eth0"
+#endif
+
+/* Describe the ROMFS file system */
+
+#define SECTORSIZE 512
+#define NSECTORS(b) (((b)+SECTORSIZE-1)/SECTORSIZE)
+#define ROMFSDEV "/dev/ram0"
+#define MOUNTPT CONFIG_THTTPD_PATH
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(...) lib_lowprintf(__VA_ARGS__)
+# define msgflush()
+# else
+# define message(...) printf(__VA_ARGS__)
+# define msgflush() fflush(stdout)
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message lib_lowprintf
+# define msgflush()
+# else
+# define message printf
+# define msgflush() fflush(stdout)
+# endif
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* These values must be provided by the user before the THTTPD task daemon
+ * is started:
+ *
+ * g_thttpdsymtab: A symbol table describing all of the symbols exported
+ * from the base system. These symbols are used to bind address references
+ * in CGI programs to NuttX.
+ * g_nsymbols: The number of symbols in g_thttpdsymtab[].
+ */
+
+FAR const struct symtab_s *g_thttpdsymtab;
+int g_thttpdnsymbols;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+#ifdef CONFIG_EXAMPLE_THTTPD_NOMAC
+ uint8_t mac[IFHWADDRLEN];
+#endif
+ char *thttpd_argv = "thttpd";
+ int ret;
+
+ /* Configure SLIP */
+
+#ifdef CONFIG_NET_SLIP
+ ret = slip_initialize(SLIP_DEVNO, CONFIG_NET_SLIPTTY);
+ if (ret < 0)
+ {
+ message("ERROR: SLIP initialization failed: %d\n", ret);
+ exit(1);
+ }
+#endif
+
+/* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_THTTPD_NOMAC
+ message("Assigning MAC\n");
+
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr(NET_DEVNAME, mac);
+#endif
+
+ /* Set up our host address */
+
+ message("Setup network addresses\n");
+ addr.s_addr = HTONL(CONFIG_THTTPD_IPADDR);
+ uip_sethostaddr(NET_DEVNAME, &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_THTTPD_DRIPADDR);
+ uip_setdraddr(NET_DEVNAME, &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_THTTPD_NETMASK);
+ uip_setnetmask(NET_DEVNAME, &addr);
+
+ /* Initialize the NXFLAT binary loader */
+
+ message("Initializing the NXFLAT binary loader\n");
+ ret = nxflat_initialize();
+ if (ret < 0)
+ {
+ message("ERROR: Initialization of the NXFLAT loader failed: %d\n", ret);
+ exit(2);
+ }
+
+ /* Create a ROM disk for the ROMFS filesystem */
+
+ message("Registering romdisk\n");
+ ret = romdisk_register(0, (uint8_t*)romfs_img, NSECTORS(romfs_img_len), SECTORSIZE);
+ if (ret < 0)
+ {
+ message("ERROR: romdisk_register failed: %d\n", ret);
+ nxflat_uninitialize();
+ exit(1);
+ }
+
+ /* Mount the file system */
+
+ message("Mounting ROMFS filesystem at target=%s with source=%s\n",
+ MOUNTPT, ROMFSDEV);
+
+ ret = mount(ROMFSDEV, MOUNTPT, "romfs", MS_RDONLY, NULL);
+ if (ret < 0)
+ {
+ message("ERROR: mount(%s,%s,romfs) failed: %s\n",
+ ROMFSDEV, MOUNTPT, errno);
+ nxflat_uninitialize();
+ }
+
+ /* Start THTTPD. At present, symbol table info is passed via global variables */
+
+ g_thttpdsymtab = exports;
+ g_thttpdnsymbols = NEXPORTS;
+
+ message("Starting THTTPD\n");
+ msgflush();
+ thttpd_main(1, &thttpd_argv);
+ message("THTTPD terminated\n");
+ msgflush();
+ return 0;
+}
diff --git a/apps/examples/udp/Makefile b/apps/examples/udp/Makefile
new file mode 100644
index 000000000..e0789eda8
--- /dev/null
+++ b/apps/examples/udp/Makefile
@@ -0,0 +1,119 @@
+############################################################################
+# apps/examples/udp/Makefile
+#
+# Copyright (C) 2007-2008, 2010 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# UDP Test
+
+TARG_ASRCS =
+
+TARG_CSRCS = target.c
+ifeq ($(CONFIG_EXAMPLE_UDP_SERVER),y)
+TARG_CSRCS += udp-server.c
+else
+TARG_CSRCS += udp-client.c
+endif
+
+TARG_AOBJS = $(TARG_ASRCS:.S=$(OBJEXT))
+TARG_COBJS = $(TARG_CSRCS:.c=$(OBJEXT))
+
+TARG_SRCS = $(TARG_ASRCS) $(TARG_CSRCS)
+TARG_OBJS = $(TARG_AOBJS) $(TARG_COBJS)
+
+TARG_BIN = ../../libapps$(LIBEXT)
+
+HOSTCFLAGS += -DCONFIG_EXAMPLE_UDP_HOST=1
+ifeq ($(CONFIG_EXAMPLE_UDP_SERVER),y)
+HOSTCFLAGS += -DCONFIG_EXAMPLE_UDP_SERVER=1 \
+ -DCONFIG_EXAMPLE_UDP_SERVERIP="$(CONFIG_EXAMPLE_UDP_SERVERIP)"
+endif
+
+HOST_SRCS = host.c
+ifeq ($(CONFIG_EXAMPLE_UDP_SERVER),y)
+HOST_SRCS += udp-client.c
+else
+HOST_SRCS += udp-server.c
+endif
+
+HOST_OBJS = $(HOST_SRCS:.c=.o)
+HOST_BIN = host
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(TARG_AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(TARG_COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(TARG_BIN): $(TARG_OBJS) $(HOST_BIN)
+ @( for obj in $(TARG_OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+$(HOST_OBJS): %.o: %.c
+ $(HOSTCC) -c $(HOSTCFLAGS) $< -o $@
+
+$(HOST_BIN): $(HOST_OBJS)
+ $(HOSTCC) $(HOSTLDFLAGS) $(HOST_OBJS) -o $@
+
+.built: $(TARG_BIN) $(HOST_BIN)
+
+.depend: Makefile $(TARG_SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(TARG_SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(TARG_BIN) $(HOST_BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/udp/host.c b/apps/examples/udp/host.c
new file mode 100644
index 000000000..34fd96765
--- /dev/null
+++ b/apps/examples/udp/host.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * examples/udp/host.c
+ *
+ * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 "udp-internal.h"
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * main
+ ****************************************************************************/
+
+int main(int argc, char **argv, char **envp)
+{
+#ifdef CONFIG_EXAMPLE_UDP_SERVER
+ send_client();
+#else
+ recv_server();
+#endif
+
+ return 0;
+}
diff --git a/apps/examples/udp/target.c b/apps/examples/udp/target.c
new file mode 100644
index 000000000..5e31fdb36
--- /dev/null
+++ b/apps/examples/udp/target.c
@@ -0,0 +1,104 @@
+/****************************************************************************
+ * examples/udp/nettest.c
+ *
+ * Copyright (C) 2007, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <debug.h>
+
+#include <net/uip/uip.h>
+#include <apps/netutils/uiplib.h>
+
+#include "udp-internal.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does
+ * not support weak functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_UDP_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_UDP_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_UDP_NETMASK);
+ uip_setnetmask("eth0", &addr);
+
+#ifdef CONFIG_EXAMPLE_UDP_SERVER
+ recv_server();
+#else
+ send_client();
+#endif
+
+ return 0;
+}
diff --git a/apps/examples/udp/udp-client.c b/apps/examples/udp/udp-client.c
new file mode 100644
index 000000000..545a3a6c3
--- /dev/null
+++ b/apps/examples/udp/udp-client.c
@@ -0,0 +1,133 @@
+/****************************************************************************
+ * examples/udp/udp-client.c
+ *
+ * Copyright (C) 2007 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include "udp-internal.h"
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static inline void fill_buffer(unsigned char *buf, int offset)
+{
+ int ch;
+ int j;
+
+ buf[0] = offset;
+ for (ch = 0x20, j = offset + 1; ch < 0x7f; ch++, j++)
+ {
+ if (j >= SENDSIZE)
+ {
+ j = 1;
+ }
+ buf[j] = ch;
+ }
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void send_client(void)
+{
+ struct sockaddr_in server;
+ unsigned char outbuf[SENDSIZE];
+ int sockfd;
+ int nbytes;
+ int offset;
+
+ /* Create a new TCP socket */
+
+ sockfd = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sockfd < 0)
+ {
+ message("client socket failure %d\n", errno);
+ exit(1);
+ }
+
+ /* Then send and receive 256 messages */
+
+ for (offset = 0; offset < 256; offset++)
+ {
+ /* Set up the output buffer */
+
+ fill_buffer(outbuf, offset);
+
+ /* Send the message */
+
+ server.sin_family = AF_INET;
+ server.sin_port = HTONS(PORTNO);
+ server.sin_addr.s_addr = HTONL(CONFIG_EXAMPLE_UDP_SERVERIP);
+
+ message("client: %d. Sending %d bytes\n", offset, SENDSIZE);
+ nbytes = sendto(sockfd, outbuf, SENDSIZE, 0,
+ (struct sockaddr*)&server, sizeof(struct sockaddr_in));
+ message("client: %d. Sent %d bytes\n", offset, nbytes);
+
+ if (nbytes < 0)
+ {
+ message("client: %d. sendto failed: %d\n", offset, errno);
+ close(sockfd);
+ exit(-1);
+ }
+ else if (nbytes != SENDSIZE)
+ {
+ message("client: %d. Bad send length: %d Expected: %d\n",
+ offset, nbytes, SENDSIZE);
+ close(sockfd);
+ exit(-1);
+ }
+
+ /* Now, sleep a bit. No packets should be dropped due to overrunning
+ * the server.
+ */
+
+ sleep(2);
+ }
+ close(sockfd);
+}
diff --git a/apps/examples/udp/udp-internal.h b/apps/examples/udp/udp-internal.h
new file mode 100644
index 000000000..94fe1e482
--- /dev/null
+++ b/apps/examples/udp/udp-internal.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+ * examples/udp/udp-internal.h
+ *
+ * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_UIP_INTERNAL_H
+#define __EXAMPLES_UIP_INTERNAL_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLE_UDP_HOST
+#else
+# include <debug.h>
+#endif
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLE_UDP_HOST
+ /* HTONS/L macros are unique to uIP */
+
+# define HTONS(a) htons(a)
+# define HTONL(a) htonl(a)
+
+ /* Used printf for debug output */
+
+# define message(...) printf(__VA_ARGS__)
+
+ /* Have SO_LINGER */
+
+#else
+
+ /* If debug is enabled, use the synchronous lib_lowprintf so that the
+ * program output does not get disassociated in the debug output.
+ */
+
+# ifdef CONFIG_DEBUG
+# define message(...) lib_lowprintf(__VA_ARGS__)
+# else
+# define message(...) printf(__VA_ARGS__)
+# endif
+
+#endif
+
+#define PORTNO 5471
+
+#define ASCIISIZE (0x7f - 0x20)
+#define SENDSIZE (ASCIISIZE+1)
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+extern void send_client(void);
+extern void recv_server(void);
+
+#endif /* __EXAMPLES_UIP_INTERNAL_H */
diff --git a/apps/examples/udp/udp-server.c b/apps/examples/udp/udp-server.c
new file mode 100644
index 000000000..495a71320
--- /dev/null
+++ b/apps/examples/udp/udp-server.c
@@ -0,0 +1,173 @@
+/****************************************************************************
+ * examples/udp/udp-server.c
+ *
+ * Copyright (C) 2007, 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <sys/socket.h>
+#include <netinet/in.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "udp-internal.h"
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+static inline int check_buffer(unsigned char *buf)
+{
+ int ret = 1;
+ int offset;
+ int ch;
+ int j;
+
+ offset = buf[0];
+ for (ch = 0x20, j = offset + 1; ch < 0x7f; ch++, j++)
+ {
+ if (j >= SENDSIZE)
+ {
+ j = 1;
+ }
+ if (buf[j] != ch)
+ {
+ message("server: Buffer content error for offset=%d, index=%d\n", offset, j);
+ ret = 0;
+ }
+ }
+ return ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void recv_server(void)
+{
+ struct sockaddr_in server;
+ struct sockaddr_in client;
+ in_addr_t tmpaddr;
+ unsigned char inbuf[1024];
+ int sockfd;
+ int nbytes;
+ int optval;
+ int offset;
+ socklen_t addrlen;
+
+ /* Create a new UDP socket */
+
+ sockfd = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sockfd < 0)
+ {
+ message("server: socket failure: %d\n", errno);
+ exit(1);
+ }
+
+ /* Set socket to reuse address */
+
+ optval = 1;
+ if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&optval, sizeof(int)) < 0)
+ {
+ message("server: setsockopt SO_REUSEADDR failure: %d\n", errno);
+ exit(1);
+ }
+
+ /* Bind the socket to a local address */
+
+ server.sin_family = AF_INET;
+ server.sin_port = HTONS(PORTNO);
+ server.sin_addr.s_addr = HTONL(INADDR_ANY);
+
+ if (bind(sockfd, (struct sockaddr*)&server, sizeof(struct sockaddr_in)) < 0)
+ {
+ message("server: bind failure: %d\n", errno);
+ exit(1);
+ }
+
+ /* Then receive up to 256 packets of data */
+
+ for (offset = 0; offset < 256; offset++)
+ {
+ message("server: %d. Receiving up 1024 bytes\n", offset);
+ addrlen = sizeof(struct sockaddr_in);
+ nbytes = recvfrom(sockfd, inbuf, 1024, 0,
+ (struct sockaddr*)&client, &addrlen);
+
+ tmpaddr = ntohl(client.sin_addr.s_addr);
+ message("server: %d. Received %d bytes from %d.%d.%d.%d:%d\n",
+ offset, nbytes,
+ tmpaddr >> 24, (tmpaddr >> 16) & 0xff,
+ (tmpaddr >> 8) & 0xff, tmpaddr & 0xff,
+ ntohs(client.sin_port));
+
+ if (nbytes < 0)
+ {
+ message("server: %d. recv failed: %d\n", offset, errno);
+ close(sockfd);
+ exit(-1);
+ }
+
+ if (nbytes != SENDSIZE)
+ {
+ message("server: %d. recv size incorrect: %d vs %d\n", offset, nbytes, SENDSIZE);
+ close(sockfd);
+ exit(-1);
+ }
+
+ if (offset < inbuf[0])
+ {
+ message("server: %d. %d packets lost, resetting offset\n", offset, inbuf[0] - offset);
+ offset = inbuf[0];
+ }
+ else if (offset > inbuf[0])
+ {
+ message("server: %d. Bad offset in buffer: %d\n", offset, inbuf[0]);
+ close(sockfd);
+ exit(-1);
+ }
+
+ if (!check_buffer(inbuf))
+ {
+ message("server: %d. Bad buffer contents\n", offset);
+ close(sockfd);
+ exit(-1);
+ }
+ }
+ close(sockfd);
+}
diff --git a/apps/examples/uip/Makefile b/apps/examples/uip/Makefile
new file mode 100644
index 000000000..2dd209df3
--- /dev/null
+++ b/apps/examples/uip/Makefile
@@ -0,0 +1,91 @@
+############################################################################
+# apps/examples/uip/Makefile
+#
+# Copyright (C) 2007-2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# uIP very tiny web server example
+
+ASRCS =
+CSRCS = main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/uip/main.c b/apps/examples/uip/main.c
new file mode 100644
index 000000000..21a01998b
--- /dev/null
+++ b/apps/examples/uip/main.c
@@ -0,0 +1,220 @@
+/****************************************************************************
+ * examples/uip/main.c
+ *
+ * Copyright (C) 2007, 2009-2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Based on uIP which also has a BSD style license:
+ *
+ * Copyright (c) 2001, 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Adam Dunkels.
+ * 4. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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/ioctl.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <debug.h>
+
+#include <net/if.h>
+#include <net/uip/uip.h>
+#include <net/uip/uip-arp.h>
+
+#include <apps/netutils/uiplib.h>
+
+#ifdef CONFIG_EXAMPLE_UIP_DHCPC
+#include <arpa/inet.h>
+#endif
+
+/* Here we include the header file for the application(s) we use in
+ * our project as defined in the config/<board-name>/defconfig file
+ */
+
+/* DHCPC may be used in conjunction with any other feature (or not) */
+
+#ifdef CONFIG_EXAMPLE_UIP_DHCPC
+# include <apps/netutils/resolv.h>
+# include <apps/netutils/dhcpc.h>
+#endif
+
+/* Include uIP webserver definitions */
+
+#include <apps/netutils/httpd.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(...) lib_lowprintf(__VA_ARGS__)
+# else
+# define message(...) printf(__VA_ARGS__)
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message lib_lowprintf
+# else
+# define message (void)
+# endif
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does
+ * not support weak functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+#if defined(CONFIG_EXAMPLE_UIP_DHCPC) || defined(CONFIG_EXAMPLE_UIP_NOMAC)
+ uint8_t mac[IFHWADDRLEN];
+#endif
+#ifdef CONFIG_EXAMPLE_UIP_DHCPC
+ void *handle;
+#endif
+
+/* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_UIP_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+#ifdef CONFIG_EXAMPLE_UIP_DHCPC
+ addr.s_addr = 0;
+#else
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_UIP_IPADDR);
+#endif
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_UIP_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_UIP_NETMASK);
+ uip_setnetmask("eth0", &addr);
+
+#ifdef CONFIG_EXAMPLE_UIP_DHCPC
+ /* Set up the resolver */
+
+ resolv_init();
+
+ /* 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: there is no logic here for renewing the address in this
+ * example. The address should be renewed in ds.lease_time/2 seconds.
+ */
+
+ printf("Getting IP address\n");
+ 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);
+ printf("IP: %s\n", inet_ntoa(ds.ipaddr));
+ }
+#endif
+
+#ifdef CONFIG_NET_TCP
+ printf("Starting webserver\n");
+ httpd_init();
+ httpd_listen();
+#endif
+
+ while(1)
+ {
+ sleep(3);
+ printf("main: Still running\n");
+#if CONFIG_NFILE_DESCRIPTORS > 0
+ fflush(stdout);
+#endif
+ }
+ return 0;
+}
diff --git a/apps/examples/usbserial/Makefile b/apps/examples/usbserial/Makefile
new file mode 100644
index 000000000..61fba5244
--- /dev/null
+++ b/apps/examples/usbserial/Makefile
@@ -0,0 +1,92 @@
+############################################################################
+# apps/examples/usbserial/Makefile
+#
+# Copyright (C) 2008, 2010-2010 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# USB serial device example
+
+ASRCS =
+CSRCS = main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+ @(MAKE) -f Makefile.host clean TOPDIR=$(TOPDIR) APPDIR=$(APPDIR)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/usbserial/Makefile.host b/apps/examples/usbserial/Makefile.host
new file mode 100644
index 000000000..eeac5334c
--- /dev/null
+++ b/apps/examples/usbserial/Makefile.host
@@ -0,0 +1,66 @@
+############################################################################
+# apps/examples/usbserial/Makefile.host
+#
+# Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+
+# TOPDIR must be defined on the make command line
+
+-include $(TOPDIR)/.config
+-include $(TOPDIR)/Make.defs
+
+SRC = host.c
+BIN = host
+
+DEFINES =
+ifeq ($(CONFIG_EXAMPLES_USBSERIAL_INONLY),y)
+DEFINES += -DCONFIG_EXAMPLES_USBSERIAL_INONLY=1
+endif
+ifeq ($(CONFIG_EXAMPLES_USBSERIAL_OUTONLY),y)
+DEFINES += -DCONFIG_EXAMPLES_USBSERIAL_OUTONLY=1
+endif
+ifeq ($(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL),y)
+DEFINES += -DCONFIG_EXAMPLES_USBSERIAL_ONLYSMALL=1
+endif
+ifeq ($(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG),y)
+DEFINES += -DCONFIG_EXAMPLES_USBSERIAL_ONLYBIG=1
+endif
+
+all: $(BIN)$(EXEEXT)
+
+$(BIN)$(EXEEXT): $(SRC)
+ $(HOSTCC) $(HOSTCFLAGS) $(DEFINES) $^ -o $@
+
+clean:
+ @rm -f $(BIN) *~ .*.swp *.o
+ $(call CLEAN)
+
diff --git a/apps/examples/usbserial/host.c b/apps/examples/usbserial/host.c
new file mode 100644
index 000000000..751b7530c
--- /dev/null
+++ b/apps/examples/usbserial/host.c
@@ -0,0 +1,293 @@
+/****************************************************************************
+ * examples/usbserial/host.c
+ *
+ * Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <errno.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_EXAMPLES_USBSERIAL_INONLY) && defined(CONFIG_EXAMPLES_USBSERIAL_OUTONLY)
+# error "Cannot define both CONFIG_EXAMPLES_USBSERIAL_INONLY and _OUTONLY"
+#endif
+#if defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL) && defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG)
+# error "Cannot define both CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL and _ONLYBIG"
+#endif
+
+#if !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG) && !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL)
+# ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+# define COUNTER_NEEDED 1
+# endif
+#endif
+
+#define DEFAULT_TTYDEV "/dev/ttyUSB0"
+#define BUFFER_SIZE 1024
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char *g_ttydev = DEFAULT_TTYDEV;
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_ONLYBIG
+static const char g_shortmsg[] = "Sure... You betcha!!\n";
+#endif
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL
+static const char g_longmsg[] =
+ "I am proud to come to this city as the guest of your distinguished Mayor, "
+ "who has symbolized throughout the world the fighting spirit of West Berlin. "
+ "And I am proud to visit the Federal Republic with your distinguished Chancellor "
+ "who for so many years has committed Germany to democracy and freedom and "
+ "progress, and to come here in the company of my fellow American, General Clay, "
+ "who has been in this city during its great moments of crisis and will come "
+ "again if ever needed.\n"
+ "Two thousand years ago the proudest boast was \"civis Romanus sum.\" Today, "
+ "in the world of freedom, the proudest boast is \"Ich bin ein Berliner.\"\r\""
+ "I appreciate my interpreter translating my German!\n"
+ "There are many people in the world who really don't understand, or say they "
+ "don't, what is the great issue between the free world and the Communist world. "
+ "Let them come to Berlin. There are some who say that communism is the wave of "
+ "the future. Let them come to Berlin. And there are some who say in Europe and "
+ "elsewhere we can work with the Communists. Let them come to Berlin. And there "
+ "are even a few who say that it is true that communism is an evil system, but it "
+ "permits us to make economic progress. Lass' sie nach Berlin kommen. Let them "
+ "come to Berlin.\n"
+ "Freedom has many difficulties and democracy is not perfect, but we have never "
+ "had to put a wall up to keep our people in, to prevent them from leaving us. I "
+ "want to say, on behalf of my countrymen, who live many miles away on the other "
+ "side of the Atlantic, who are far distant from you, that they take the greatest "
+ "pride that they have been able to share with you, even from a distance, the "
+ "story of the last 18 years. I know of no town, no city, that has been besieged "
+ "for 18 years that still lives with the vitality and the force, and the hope and "
+ "the determination of the city of West Berlin. While the wall is the most obvious "
+ "and vivid demonstration of the failures of the Communist system, for all the "
+ "world to see, we take no satisfaction in it, for it is, as your Mayor has said, "
+ "an offense not only against history but an offense against humanity, separating "
+ "families, dividing husbands and wives and brothers and sisters, and dividing a "
+ "people who wish to be joined together.\n"
+ "What is true of this city is true of Germany--real, lasting peace in Europe can "
+ "never be assured as long as one German out of four is denied the elementary "
+ "right of free men, and that is to make a free choice. In 18 years of peace and "
+ "good faith, this generation of Germans has earned the right to be free, "
+ "including the right to unite their families and their nation in lasting peace, "
+ "with good will to all people. You live in a defended island of freedom, but "
+ "your life is part of the main. So let me ask you as I close, to lift your eyes "
+ "beyond the dangers of today, to the hopes of tomorrow, beyond the freedom merely "
+ "of this city of Berlin, or your country of Germany, to the advance of freedom "
+ "everywhere, beyond the wall to the day of peace with justice, beyond yourselves "
+ "and ourselves to all mankind.\n"
+ "Freedom is indivisible, and when one man is enslaved, all are not free. When all "
+ "are free, then we can look forward to that day when this city will be joined as "
+ "one and this country and this great Continent of Europe in a peaceful and hopeful "
+ "globe. When that day finally comes, as it will, the people of West Berlin can take "
+ "sober satisfaction in the fact that they were in the front lines for almost two "
+ "decades.\n"
+ "All free men, wherever they may live, are citizens of Berlin, and, therefore, "
+ "as a free man, I take pride in the words \"Ich bin ein Berliner.\"\n"
+ "President John F. Kennedy - June 26, 1963\n";
+#endif
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+static char g_iobuffer[BUFFER_SIZE];
+#endif
+
+/****************************************************************************
+ * show_usage
+ ****************************************************************************/
+
+static void show_usage(const char *progname, int exitcode)
+{
+ fprintf(stderr, "USAGE: %s [<ttydev>]\n", progname);
+ exit(exitcode);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * main
+ ****************************************************************************/
+
+int main(int argc, char **argv, char **envp)
+{
+ struct termios tty;
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ ssize_t nbytes;
+#endif
+#ifdef COUNTER_NEEDED
+ int count = 0;
+#endif
+ int fd;
+ int ret;
+
+ /* Handle input parameters */
+
+ if (argc > 1)
+ {
+ if (argc > 2)
+ {
+ fprintf(stderr, "Too many arguments on command line\n");
+ show_usage(argv[0], 1);
+ }
+ g_ttydev = argv[1];
+ }
+
+ /* Open the USB serial device for blocking read/write */
+
+ do
+ {
+ printf("main: Opening USB serial driver\n");
+ fd = open(g_ttydev, O_RDWR);
+ if (fd < 0)
+ {
+ printf("main: ERROR: Failed to open %s: %s\n", g_ttydev, strerror(errno));
+ printf("main: Assume not connected. Wait and try again.\n");
+ printf("main: (Control-C to terminate).\n");
+ sleep(5);
+ }
+ }
+ while (fd < 0);
+ printf("main: Successfully opened the serial driver\n");
+
+ /* Configure the serial port in raw mode (at least turn off echo) */
+
+ ret = tcgetattr(fd, &tty);
+ if (ret < 0)
+ {
+ printf("main: ERROR: Failed to get termios for %s: %s\n", g_ttydev, strerror(errno));
+ close(fd);
+ return 1;
+ }
+
+ tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
+ tty.c_oflag &= ~OPOST;
+ tty.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+ tty.c_cflag &= ~(CSIZE|PARENB);
+ tty.c_cflag |= CS8;
+
+ ret = tcsetattr(fd, TCSANOW, &tty);
+ if (ret < 0)
+ {
+ printf("main: ERROR: Failed to set termios for %s: %s\n", g_ttydev, strerror(errno));
+ close(fd);
+ return 1;
+ }
+
+ /* Wait for and/or send messages -- forever */
+
+ for (;;)
+ {
+ /* Test IN messages (device-to-host) */
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ printf("main: Reading from the serial driver\n");
+ printf("main: ... (Control-C to terminate) ...\n");
+ nbytes = read(fd, g_iobuffer, BUFFER_SIZE-1);
+ if (nbytes < 0)
+ {
+ printf("main: ERROR: Failed to read from %s: %s\n", g_ttydev, strerror(errno));
+ close(fd);
+ return 2;
+ }
+ else if (nbytes == 0)
+ {
+ printf("main: End-of-file encountered\n");
+ break;
+ }
+
+ g_iobuffer[nbytes] = '\0';
+ printf("main: Received %d bytes:\n", nbytes);
+ printf(" \"%s\"\n", g_iobuffer);
+#else
+ printf("main: Waiting...\n");
+ sleep(5);
+#endif /* CONFIG_EXAMPLES_USBSERIAL_OUTONLY */
+
+ /* Test OUT messages (host-to-device) */
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+#if !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL) && !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG)
+ count++;
+ if (count < 5)
+ {
+ printf("main: Sending %d bytes..\n", sizeof(g_shortmsg));
+ nbytes = write(fd, g_shortmsg, sizeof(g_shortmsg));
+ }
+ else
+ {
+ printf("main: Sending %d bytes..\n", sizeof(g_longmsg));
+ nbytes = write(fd, g_longmsg, sizeof(g_longmsg));
+ count = 0;
+ }
+#elif !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL)
+ printf("main: Sending %d bytes..\n", sizeof(g_longmsg));
+ nbytes = write(fd, g_longmsg, sizeof(g_longmsg));
+#else /* !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG) */
+ printf("main: Sending %d bytes..\n", sizeof(g_shortmsg));
+ nbytes = write(fd, g_shortmsg, sizeof(g_shortmsg));
+#endif
+
+ /* Test if write was successful */
+
+ if (nbytes < 0)
+ {
+ printf("main: ERROR: Failed to write to %s: %s\n", g_ttydev, strerror(errno));
+ close(fd);
+ return 2;
+ }
+ printf("main: %d bytes sent\n", nbytes);
+#endif /* CONFIG_EXAMPLES_USBSERIAL_INONLY */
+ }
+
+ close(fd);
+ return 0;
+}
+
diff --git a/apps/examples/usbserial/main.c b/apps/examples/usbserial/main.c
new file mode 100644
index 000000000..17aef1c79
--- /dev/null
+++ b/apps/examples/usbserial/main.c
@@ -0,0 +1,466 @@
+/****************************************************************************
+ * examples/usbserial/main.c
+ *
+ * Copyright (C) 2008, 2010 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/usb/usbdev.h>
+#include <nuttx/usb/usbdev_trace.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_EXAMPLES_USBSERIAL_INONLY) && defined(CONFIG_EXAMPLES_USBSERIAL_OUTONLY)
+# error "Cannot define both CONFIG_EXAMPLES_USBSERIAL_INONLY and _OUTONLY"
+#endif
+#if defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL) && defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG)
+# error "Cannot define both CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL and _ONLYBIG"
+#endif
+
+#if !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG) && !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL)
+# ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+# define COUNTER_NEEDED 1
+# endif
+#endif
+#ifdef CONFIG_EXAMPLES_USBSERIAL_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_EXAMPLES_USBSERIAL_TRACECLASS
+# define TRACE_CLASS_BITS (TRACE_CLASS_BIT|TRACE_CLASSAPI_BIT|TRACE_CLASSSTATE_BIT)
+#else
+# define TRACE_CLASS_BITS (0)
+#endif
+
+#ifdef CONFIG_EXAMPLES_USBSERIAL_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_EXAMPLES_USBSERIAL_TRACECONTROLLER
+# define TRACE_CONTROLLER_BITS (TRACE_EP_BIT|TRACE_DEV_BIT)
+#else
+# define TRACE_CONTROLLER_BITS (0)
+#endif
+
+#ifdef CONFIG_EXAMPLES_USBSERIAL_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)
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(...) lib_lowprintf(__VA_ARGS__)
+# define trmessage lib_lowprintf
+# else
+# define message(...) printf(__VA_ARGS__)
+# define trmessage printf
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message lib_lowprintf
+# define trmessage lib_lowprintf
+# else
+# define message printf
+# define trmessage printf
+# endif
+#endif
+
+#define IOBUFFER_SIZE 256
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_ONLYBIG
+static const char g_shortmsg[] = "Hello, World!!\n";
+#endif
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL
+static const char g_longmsg[] =
+ "The Spanish Armada a Speech by Queen Elizabeth I of England\n"
+ "Addressed to the English army at Tilbury Fort - 1588\n"
+ "My loving people, we have been persuaded by some, that are careful of our "
+ "safety, to take heed how we commit ourselves to armed multitudes, for fear "
+ "of treachery; but I assure you, I do not desire to live to distrust my "
+ "faithful and loving people.\n"
+ "Let tyrants fear; I have always so behaved myself that, under God, I have "
+ "placed my chiefest strength and safeguard in the loyal hearts and good will "
+ "of my subjects. And therefore I am come amongst you at this time, not as for "
+ "my recreation or sport, but being resolved, in the midst and heat of the "
+ "battle, to live or die amongst you all; to lay down, for my God, and for "
+ "my kingdom, and for my people, my honour and my blood, even the dust.\n"
+ "I know I have but the body of a weak and feeble woman; but I have the heart "
+ "of a king, and of a king of England, too; and think foul scorn that Parma "
+ "or Spain, or any prince of Europe, should dare to invade the borders of my "
+ "realms: to which, rather than any dishonour should grow by me, I myself will "
+ "take up arms; I myself will be your general, judge, and rewarder of every "
+ "one of your virtues in the field.\n"
+ "I know already, by your forwardness, that you have deserved rewards and "
+ "crowns; and we do assure you, on the word of a prince, they shall be duly "
+ "paid you. In the mean my lieutenant general shall be in my stead, than whom "
+ "never prince commanded a more noble and worthy subject; not doubting by "
+ "your obedience to my general, by your concord in the camp, and by your "
+ "valour in the field, we shall shortly have a famous victory over the enemies "
+ "of my God, of my kingdom, and of my people.\n";
+#endif
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+static char g_iobuffer[IOBUFFER_SIZE];
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+#ifdef CONFIG_USBDEV_TRACE
+static int trace_callback(struct usbtrace_s *trace, void *arg)
+{
+ usbtrace_trprintf((trprintf_t)trmessage, trace->event, trace->value);
+ return 0;
+}
+
+static void dumptrace(void)
+{
+ (void)usbtrace_enumerate(trace_callback, NULL);
+}
+#else
+# define dumptrace()
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+ int infd;
+#endif
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ int outfd;
+#endif
+#ifdef COUNTER_NEEDED
+ int count = 0;
+#endif
+ ssize_t nbytes;
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+ int i, j, k;
+#endif
+ int ret;
+
+ /* Initialize the USB serial driver */
+
+ message("user_start: Registering USB serial driver\n");
+ ret = usbdev_serialinitialize(0);
+ if (ret < 0)
+ {
+ message("user_start: ERROR: Failed to create the USB serial device: %d\n", -ret);
+ return 1;
+ }
+ message("user_start: Successfully registered the serial driver\n");
+
+#if CONFIG_USBDEV_TRACE && CONFIG_USBDEV_TRACE_INITIALIDSET != 0
+ /* If USB tracing is enabled and tracing of initial USB events is specified,
+ * then dump all collected trace data to stdout
+ */
+
+ sleep(5);
+ dumptrace();
+#endif
+
+ /* Then, in any event, configure trace data collection as configured */
+
+ usbtrace_enable(TRACE_BITSET);
+
+ /* Open the USB serial device for writing (blocking) */
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ do
+ {
+ message("user_start: Opening USB serial driver\n");
+ outfd = open("/dev/ttyUSB0", O_WRONLY);
+ if (outfd < 0)
+ {
+ int errcode = errno;
+ message("user_start: ERROR: Failed to open /dev/ttyUSB0 for writing: %d\n", errcode);
+
+ /* ENOTCONN means that the USB device is not yet connected */
+
+ if (errcode == ENOTCONN)
+ {
+ message("user_start: Not connected. Wait and try again.\n");
+ sleep(5);
+ }
+ else
+ {
+ /* Give up on other errors */
+
+ message("user_start: Aborting\n");
+ return 2;
+ }
+ }
+
+ /* If USB tracing is enabled, then dump all collected trace data to stdout */
+
+ dumptrace();
+ }
+ while (outfd < 0);
+#endif
+
+ /* Open the USB serial device for reading (non-blocking) */
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ infd = open("/dev/ttyUSB0", O_RDONLY|O_NONBLOCK);
+ if (infd < 0)
+ {
+ message("user_start: ERROR: Failed to open /dev/ttyUSB0 for reading: %d\n", errno);
+ close(outfd);
+ return 3;
+ }
+#else
+ do
+ {
+ infd = open("/dev/ttyUSB0", O_RDONLY|O_NONBLOCK);
+ if (infd < 0)
+ {
+ int errcode = errno;
+ message("user_start: ERROR: Failed to open /dev/ttyUSB0 for reading: %d\n", errno);
+
+ /* ENOTCONN means that the USB device is not yet connected */
+
+ if (errcode == ENOTCONN)
+ {
+ message("user_start: Not connected. Wait and try again.\n");
+ sleep(5);
+ }
+ else
+ {
+ /* Give up on other errors */
+
+ message("user_start: Aborting\n");
+ return 3;
+ }
+ }
+
+ /* If USB tracing is enabled, then dump all collected trace data to stdout */
+
+ dumptrace();
+ }
+ while (infd < 0);
+#endif
+#endif
+
+ message("user_start: Successfully opened the serial driver\n");
+
+ /* Send messages and get responses -- forever */
+
+ for (;;)
+ {
+ /* Test IN (device-to-host) messages */
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+#if !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG) && !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL)
+ if (count < 8)
+ {
+ message("user_start: Saying hello\n");
+ nbytes = write(outfd, g_shortmsg, sizeof(g_shortmsg));
+ count++;
+ }
+ else
+ {
+ message("user_start: Reciting QEI's speech of 1588\n");
+ nbytes = write(outfd, g_longmsg, sizeof(g_longmsg));
+ count = 0;
+ }
+#elif !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYSMALL)
+ message("user_start: Reciting QEI's speech of 1588\n");
+ nbytes = write(outfd, g_longmsg, sizeof(g_longmsg));
+#else /* !defined(CONFIG_EXAMPLES_USBSERIAL_ONLYBIG) */
+ message("user_start: Saying hello\n");
+ nbytes = write(outfd, g_shortmsg, sizeof(g_shortmsg));
+#endif
+
+ /* Test if the write was successful */
+
+ if (nbytes < 0)
+ {
+ message("user_start: ERROR: write failed: %d\n", errno);
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+ close(infd);
+#endif
+ close(outfd);
+ return 4;
+ }
+ message("user_start: %d bytes sent\n", nbytes);
+#endif /* CONFIG_EXAMPLES_USBSERIAL_OUTONLY */
+
+ /* Test OUT (host-to-device) messages */
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+ /* Poll for incoming messages */
+
+ message("user_start: Polling for OUT messages\n");
+ for (i = 0; i < 5; i++)
+ {
+ memset(g_iobuffer, 'X', IOBUFFER_SIZE);
+ nbytes = read(infd, g_iobuffer, IOBUFFER_SIZE);
+ if (nbytes < 0)
+ {
+ int errorcode = errno;
+ if (errorcode != EAGAIN)
+ {
+ message("user_start: ERROR: read failed: %d\n", errno);
+ close(infd);
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ close(outfd);
+#endif
+ return 6;
+ }
+ }
+ else
+ {
+ message("user_start: Received %d bytes:\n", nbytes);
+ if (nbytes > 0)
+ {
+ for (j = 0; j < nbytes; j += 16)
+ {
+ message("user_start: %03x: ", j);
+ for (k = 0; k < 16; k++)
+ {
+ if (k == 8)
+ {
+ message(" ");
+ }
+ if (j+k < nbytes)
+ {
+ message("%02x", g_iobuffer[j+k]);
+ }
+ else
+ {
+ message(" ");
+ }
+ }
+ message(" ");
+ for (k = 0; k < 16; k++)
+ {
+ if (k == 8)
+ {
+ message(" ");
+ }
+ if (j+k < nbytes)
+ {
+ if (g_iobuffer[j+k] >= 0x20 && g_iobuffer[j+k] < 0x7f)
+ {
+ message("%c", g_iobuffer[j+k]);
+ }
+ else
+ {
+ message(".");
+ }
+ }
+ else
+ {
+ message(" ");
+ }
+ }
+ message("\n");
+ }
+ }
+ }
+ sleep(1);
+ }
+#else /* CONFIG_EXAMPLES_USBSERIAL_INONLY */
+ message("user_start: Waiting\n");
+ sleep(5);
+#endif /* CONFIG_EXAMPLES_USBSERIAL_INONLY */
+
+ /* If USB tracing is enabled, then dump all collected trace data to stdout */
+
+ dumptrace();
+ }
+
+ /* Won't get here, but if we did this what we would have to do */
+
+#ifndef CONFIG_EXAMPLES_USBSERIAL_INONLY
+ close(infd);
+#endif
+#ifndef CONFIG_EXAMPLES_USBSERIAL_OUTONLY
+ close(outfd);
+#endif
+ return 0;
+}
+
diff --git a/apps/examples/usbstorage/Makefile b/apps/examples/usbstorage/Makefile
new file mode 100644
index 000000000..7f777dfec
--- /dev/null
+++ b/apps/examples/usbstorage/Makefile
@@ -0,0 +1,91 @@
+############################################################################
+# apps/examples/usbstorage/Makefile
+#
+# Copyright (C) 2008, 2010-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# USB device mass storage example
+
+ASRCS =
+CSRCS = usbstrg_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/usbstorage/usbstrg.h b/apps/examples/usbstorage/usbstrg.h
new file mode 100644
index 000000000..4b50dfe77
--- /dev/null
+++ b/apps/examples/usbstorage/usbstrg.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+ * examples/usbstorage/usbstrg.h
+ *
+ * Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __EXAMPLES_USBSTORAGE_USBSTRG_H
+#define __EXAMPLES_USBSTORAGE_USBSTRG_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+/****************************************************************************
+ * Pre-Processor Definitions
+ ****************************************************************************/
+
+/* Configuration ************************************************************/
+
+#ifndef CONFIG_EXAMPLES_USBSTRG_NLUNS
+# define CONFIG_EXAMPLES_USBSTRG_NLUNS 1
+#endif
+
+#ifndef CONFIG_EXAMPLES_USBSTRG_DEVMINOR1
+# define CONFIG_EXAMPLES_USBSTRG_DEVMINOR1 0
+#endif
+
+#ifndef CONFIG_EXAMPLES_USBSTRG_DEVPATH1
+# define CONFIG_EXAMPLES_USBSTRG_DEVPATH1 "/dev/mmcsd0"
+#endif
+
+#if CONFIG_EXAMPLES_USBSTRG_NLUNS > 1
+# ifndef CONFIG_EXAMPLES_USBSTRG_DEVMINOR2
+# error "CONFIG_EXAMPLES_USBSTRG_DEVMINOR2 for LUN=2"
+# endif
+# ifndef CONFIG_EXAMPLES_USBSTRG_DEVPATH2
+# error "CONFIG_EXAMPLES_USBSTRG_DEVPATH2 for LUN=2"
+# endif
+# if CONFIG_EXAMPLES_USBSTRG_NLUNS > 2
+# ifndef CONFIG_EXAMPLES_USBSTRG_DEVMINOR3
+# error "CONFIG_EXAMPLES_USBSTRG_DEVMINOR2 for LUN=3"
+# endif
+# ifndef CONFIG_EXAMPLES_USBSTRG_DEVPATH2
+# error "CONFIG_EXAMPLES_USBSTRG_DEVPATH2 for LUN=3"
+# endif
+# if CONFIG_EXAMPLES_USBSTRG_NLUNS > 3
+# error "CONFIG_EXAMPLES_USBSTRG_NLUNS must be {1,2,3}"
+# endif
+# endif
+#endif
+
+/* Debug ********************************************************************/
+
+#ifdef CONFIG_CPP_HAVE_VARARGS
+# ifdef CONFIG_DEBUG
+# define message(...) lib_lowprintf(__VA_ARGS__)
+# define msgflush()
+# else
+# define message(...) printf(__VA_ARGS__)
+# define msgflush() fflush(stdout)
+# endif
+#else
+# ifdef CONFIG_DEBUG
+# define message lib_lowprintf
+# define msgflush()
+# else
+# define message printf
+# define msgflush() fflush(stdout)
+# endif
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: usbstrg_archinitialize
+ *
+ * Description:
+ * Perform architecture specific initialization. This function must
+ * configure the block device to export via USB. This function must be
+ * provided by architecture-specific logic in order to use this example.
+ *
+ ****************************************************************************/
+
+extern int usbstrg_archinitialize(void);
+
+#endif /* __EXAMPLES_USBSTORAGE_USBSTRG_H */
diff --git a/apps/examples/usbstorage/usbstrg_main.c b/apps/examples/usbstorage/usbstrg_main.c
new file mode 100644
index 000000000..47d79fbb4
--- /dev/null
+++ b/apps/examples/usbstorage/usbstrg_main.c
@@ -0,0 +1,404 @@
+/****************************************************************************
+ * examples/usbstorage/usbstrg_main.c
+ *
+ * Copyright (C) 2008-2010 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <unistd.h>
+#include <debug.h>
+
+#include <nuttx/usb/usbdev.h>
+#include <nuttx/usb/usbdev_trace.h>
+
+#include "usbstrg.h"
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_EXAMPLES_USBSTRG_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_EXAMPLES_USBSTRG_TRACECLASS
+# define TRACE_CLASS_BITS (TRACE_CLASS_BIT|TRACE_CLASSAPI_BIT|TRACE_CLASSSTATE_BIT)
+#else
+# define TRACE_CLASS_BITS (0)
+#endif
+
+#ifdef CONFIG_EXAMPLES_USBSTRG_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_EXAMPLES_USBSTRG_TRACECONTROLLER
+# define TRACE_CONTROLLER_BITS (TRACE_EP_BIT|TRACE_DEV_BIT)
+#else
+# define TRACE_CONTROLLER_BITS (0)
+#endif
+
+#ifdef CONFIG_EXAMPLES_USBSTRG_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)
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: usbstrg_enumerate
+ ****************************************************************************/
+
+#ifdef CONFIG_USBDEV_TRACE
+static int usbstrg_enumerate(struct usbtrace_s *trace, void *arg)
+{
+ switch (trace->event)
+ {
+ case TRACE_DEVINIT:
+ message("USB controller initialization: %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVUNINIT:
+ message("USB controller un-initialization: %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVREGISTER:
+ message("usbdev_register(): %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVUNREGISTER:
+ message("usbdev_unregister(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPCONFIGURE:
+ message("Endpoint configure(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPDISABLE:
+ message("Endpoint disable(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPALLOCREQ:
+ message("Endpoint allocreq(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPFREEREQ:
+ message("Endpoint freereq(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPALLOCBUFFER:
+ message("Endpoint allocbuffer(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPFREEBUFFER:
+ message("Endpoint freebuffer(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPSUBMIT:
+ message("Endpoint submit(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPCANCEL:
+ message("Endpoint cancel(): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPSTALL:
+ message("Endpoint stall(true): %04x\n", trace->value);
+ break;
+
+ case TRACE_EPRESUME:
+ message("Endpoint stall(false): %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVALLOCEP:
+ message("Device allocep(): %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVFREEEP:
+ message("Device freeep(): %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVGETFRAME:
+ message("Device getframe(): %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVWAKEUP:
+ message("Device wakeup(): %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVSELFPOWERED:
+ message("Device selfpowered(): %04x\n", trace->value);
+ break;
+
+ case TRACE_DEVPULLUP:
+ message("Device pullup(): %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSBIND:
+ message("Class bind(): %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSUNBIND:
+ message("Class unbind(): %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSDISCONNECT:
+ message("Class disconnect(): %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSSETUP:
+ message("Class setup(): %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSSUSPEND:
+ message("Class suspend(): %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSRESUME:
+ message("Class resume(): %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSRDCOMPLETE:
+ message("Class RD request complete: %04x\n", trace->value);
+ break;
+
+ case TRACE_CLASSWRCOMPLETE:
+ message("Class WR request complete: %04x\n", trace->value);
+ break;
+
+ default:
+ switch (TRACE_ID(trace->event))
+ {
+ case TRACE_CLASSAPI_ID: /* Other class driver system API calls */
+ message("Class API call %d: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_CLASSSTATE_ID: /* Track class driver state changes */
+ message("Class state %d: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_INTENTRY_ID: /* Interrupt handler entry */
+ message("Interrrupt %d entry: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_INTDECODE_ID: /* Decoded interrupt trace->event */
+ message("Interrrupt decode %d: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_INTEXIT_ID: /* Interrupt handler exit */
+ message("Interrrupt %d exit: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_OUTREQQUEUED_ID: /* Request queued for OUT endpoint */
+ message("EP%d OUT request queued: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_INREQQUEUED_ID: /* Request queued for IN endpoint */
+ message("EP%d IN request queued: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_READ_ID: /* Read (OUT) action */
+ message("EP%d OUT read: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_WRITE_ID: /* Write (IN) action */
+ message("EP%d IN write: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_COMPLETE_ID: /* Request completed */
+ message("EP%d request complete: %04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_DEVERROR_ID: /* USB controller driver error event */
+ message("Controller error: %02x:%04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ case TRACE_CLSERROR_ID: /* USB class driver error event */
+ message("Class error: %02x:%04x\n", TRACE_DATA(trace->event), trace->value);
+ break;
+
+ default:
+ message("Unrecognized event: %02x:%02x:%04x\n",
+ TRACE_ID(trace->event) >> 8, TRACE_DATA(trace->event), trace->value);
+ break;
+ }
+ }
+ return OK;
+}
+#endif
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ void *handle;
+ int ret;
+
+ /* Initialize USB trace output IDs */
+
+ usbtrace_enable(TRACE_BITSET);
+
+ /* Register block drivers (architecture-specific) */
+
+ message("user_start: Creating block drivers\n");
+ ret = usbstrg_archinitialize();
+ if (ret < 0)
+ {
+ message("user_start: usbstrg_archinitialize failed: %d\n", -ret);
+ return 1;
+ }
+
+ /* Then exports the LUN(s) */
+
+ message("user_start: Configuring with NLUNS=%d\n", CONFIG_EXAMPLES_USBSTRG_NLUNS);
+ ret = usbstrg_configure(CONFIG_EXAMPLES_USBSTRG_NLUNS, &handle);
+ if (ret < 0)
+ {
+ message("user_start: usbstrg_configure failed: %d\n", -ret);
+ usbstrg_uninitialize(handle);
+ return 2;
+ }
+ message("user_start: handle=%p\n", handle);
+
+ message("user_start: Bind LUN=0 to %s\n", CONFIG_EXAMPLES_USBSTRG_DEVPATH1);
+ ret = usbstrg_bindlun(handle, CONFIG_EXAMPLES_USBSTRG_DEVPATH1, 0, 0, 0, false);
+ if (ret < 0)
+ {
+ message("user_start: usbstrg_bindlun failed for LUN 1 using %s: %d\n",
+ CONFIG_EXAMPLES_USBSTRG_DEVPATH1, -ret);
+ usbstrg_uninitialize(handle);
+ return 2;
+ }
+
+#if CONFIG_EXAMPLES_USBSTRG_NLUNS > 1
+
+ message("user_start: Bind LUN=1 to %s\n", CONFIG_EXAMPLES_USBSTRG_DEVPATH2);
+ ret = usbstrg_bindlun(handle, CONFIG_EXAMPLES_USBSTRG_DEVPATH2, 1, 0, 0, false);
+ if (ret < 0)
+ {
+ message("user_start: usbstrg_bindlun failed for LUN 2 using %s: %d\n",
+ CONFIG_EXAMPLES_USBSTRG_DEVPATH2, -ret);
+ usbstrg_uninitialize(handle);
+ return 3;
+ }
+
+#if CONFIG_EXAMPLES_USBSTRG_NLUNS > 2
+
+ message("user_start: Bind LUN=2 to %s\n", CONFIG_EXAMPLES_USBSTRG_DEVPATH3);
+ ret = usbstrg_bindlun(handle, CONFIG_EXAMPLES_USBSTRG_DEVPATH3, 2, 0, 0, false);
+ if (ret < 0)
+ {
+ message("user_start: usbstrg_bindlun failed for LUN 3 using %s: %d\n",
+ CONFIG_EXAMPLES_USBSTRG_DEVPATH3, -ret);
+ usbstrg_uninitialize(handle);
+ return 4;
+ }
+
+#endif
+#endif
+
+ ret = usbstrg_exportluns(handle);
+ if (ret < 0)
+ {
+ message("user_start: usbstrg_exportluns failed: %d\n", -ret);
+ usbstrg_uninitialize(handle);
+ return 5;
+ }
+
+ /* Now just hang around and monitor the USB storage activity */
+
+#ifndef CONFIG_DISABLE_SIGNALS
+ for (;;)
+ {
+ msgflush();
+ sleep(5);
+
+#ifdef CONFIG_USBDEV_TRACE
+ message("\nuser_start: USB TRACE DATA:\n");
+ ret = usbtrace_enumerate(usbstrg_enumerate, NULL);
+ if (ret < 0)
+ {
+ message("user_start: usbtrace_enumerate failed: %d\n", -ret);
+ usbstrg_uninitialize(handle);
+ return 6;
+ }
+#else
+ message("user_start: Still alive\n");
+#endif
+ }
+#else
+ message("user_start: Exiting\n");
+ #endif
+}
+
diff --git a/apps/examples/wget/Makefile b/apps/examples/wget/Makefile
new file mode 100644
index 000000000..e39d5f68a
--- /dev/null
+++ b/apps/examples/wget/Makefile
@@ -0,0 +1,92 @@
+############################################################################
+# apps/examples/wget/Makefile
+#
+# Copyright (C) 2009-2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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
+
+# wget webclient example
+
+ASRCS =
+CSRCS = target.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+ @make -f Makefile.host clean TOPDIR=$(TOPDIR) APPDIR=$(APPDIR)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/wget/Makefile.host b/apps/examples/wget/Makefile.host
new file mode 100644
index 000000000..fd891afec
--- /dev/null
+++ b/apps/examples/wget/Makefile.host
@@ -0,0 +1,77 @@
+############################################################################
+# apps/examples/wget/Makefile.host
+#
+# Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+#
+# 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.
+#
+############################################################################
+
+WD = ${shell pwd}
+TOPDIR = $(WD)/../..
+-include $(TOPDIR)/Make.defs
+
+OBJS = host.o1 webclient.o1 uip_parsehttpurl.o1
+BIN = wget
+
+HOSTCFLAGS += -DCONFIG_WEBCLIENT_HOST=1
+HOSTCFLAGS += -I. -include hostdefs.h
+VPATH = $(TOPDIR)/netutils/webclient:$(TOPDIR)/netutils/uiplib:.
+
+all: $(BIN)
+.PHONY: clean context clean_context distclean
+
+$(OBJS): %.o1: %.c
+ $(HOSTCC) -c $(HOSTCFLAGS) $< -o $@
+
+apps/netutils:
+ @mkdir -p apps/netutils
+
+apps/netutils/webclient.h: apps/netutils $(TOPDIR)/include/apps/netutils/webclient.h
+ @cp -a $(TOPDIR)/include/apps/netutils/webclient.h apps/netutils/.
+
+apps/netutils/uiplib.h: apps/netutils $(TOPDIR)/include/apps/netutils/uiplib.h
+ @cp -a $(TOPDIR)/include/apps/netutils/uiplib.h apps/netutils/.
+
+nuttx:
+ @mkdir nuttx
+
+nuttx/config.h: nuttx
+ @touch nuttx/config.h
+
+headers: apps/netutils/webclient.h apps/netutils/uiplib.h nuttx/config.h
+
+$(BIN): headers $(OBJS)
+ $(HOSTCC) $(HOSTLDFLAGS) $(OBJS) -o $@
+
+clean:
+ @rm -f $(BIN).* *.o1 *~
+ @rm -rf net nuttx
+
+
diff --git a/apps/examples/wget/host.c b/apps/examples/wget/host.c
new file mode 100644
index 000000000..a7b416db5
--- /dev/null
+++ b/apps/examples/wget/host.c
@@ -0,0 +1,100 @@
+/****************************************************************************
+ * examples/wget/host.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <apps/netutils/webclient.h>
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: callback
+ ****************************************************************************/
+
+static void callback(FAR char **buffer, int offset, int datend,
+ FAR int *buflen, FAR void *arg)
+{
+ (void)write(1, &((*buffer)[offset]), datend - offset);
+}
+
+/****************************************************************************
+ * Name: show_usage
+ ****************************************************************************/
+
+static void show_usage(const char *progname, int exitcode)
+{
+ fprintf(stderr, "USAGE: %s <url>\n", progname);
+ exit(exitcode);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+/****************************************************************************
+ * Name: main
+ ****************************************************************************/
+
+int main(int argc, char **argv, char **envp)
+{
+ char buffer[1024];
+ int ret;
+
+ if (argc != 2)
+ {
+ show_usage(argv[0], 1);
+ }
+
+ printf("WGET: Getting %s\n", argv[1]);
+ ret = wget(argv[1], buffer, 1024, callback, NULL);
+ if (ret < 0)
+ {
+ fprintf(stderr, "WGET: wget failed: %s\n", strerror(errno));
+ }
+ return 0;
+}
diff --git a/apps/examples/wget/hostdefs.h b/apps/examples/wget/hostdefs.h
new file mode 100755
index 000000000..da072d560
--- /dev/null
+++ b/apps/examples/wget/hostdefs.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * examples/wget/hostdefs.c
+ *
+ * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 __HOSTDEFS_H
+#define __HOSTDEFS_H
+
+/****************************************************************************
+ * Included Files
+ *****************************************************************************/
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+/****************************************************************************
+ * Preprocessor Defintiions
+ *****************************************************************************/
+
+#define HTONS(a) htons(a)
+#define HTONL(a) htonl(a)
+#define CONFIG_CPP_HAVE_WARNING 1
+#define CONFIG_HAVE_GETHOSTBYNAME 1
+#define FAR
+
+#define ndbg(...) printf(__VA_ARGS__)
+#define nvdbg(...) printf(__VA_ARGS__)
+
+#define ERROR (-1)
+#define OK (0)
+
+/****************************************************************************
+ * Type Definitions
+ *****************************************************************************/
+
+typedef void *(*pthread_startroutine_t)(void *);
+
+#endif /* __HOSTDEFS_H */
diff --git a/apps/examples/wget/target.c b/apps/examples/wget/target.c
new file mode 100644
index 000000000..b378e9944
--- /dev/null
+++ b/apps/examples/wget/target.c
@@ -0,0 +1,162 @@
+/****************************************************************************
+ * examples/wget/target.c
+ *
+ * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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 <unistd.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+
+#include <net/uip/uip.h>
+
+#include <apps/netutils/uiplib.h>
+#include <apps/netutils/resolv.h>
+#include <apps/netutils/webclient.h>
+
+/****************************************************************************
+ * Preprocessor Definitions
+ ****************************************************************************/
+
+/* Configuation Checks ******************************************************/
+/* BEWARE:
+ * There are other configuration settings needed in netutitls/wget/wgetc.s,
+ * but there are default values for those so we cannot check them here.
+ */
+
+#ifndef CONFIG_EXAMPLE_WGET_IPADDR
+# error "You must define CONFIG_EXAMPLE_WGET_IPADDR"
+#endif
+
+#ifndef CONFIG_EXAMPLE_WGET_DRIPADDR
+# error "You must define CONFIG_EXAMPLE_WGET_DRIPADDR"
+#endif
+
+#ifndef CONFIG_EXAMPLE_WGET_NETMASK
+# error "You must define CONFIG_EXAMPLE_WGET_NETMASK"
+#endif
+
+#ifndef CONFIG_NET
+# error "You must define CONFIG_NET"
+#endif
+
+#ifndef CONFIG_NET_TCP
+# error "You must define CONFIG_NET_TCP"
+#endif
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static char g_iobuffer[512];
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+/****************************************************************************
+ * Name: callback
+ ****************************************************************************/
+
+static void callback(FAR char **buffer, int offset, int datend,
+ FAR int *buflen, FAR void *arg)
+{
+ (void)write(1, &((*buffer)[offset]), datend - offset);
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+/****************************************************************************
+ * user_initialize
+ ****************************************************************************/
+
+#ifndef CONFIG_HAVE_WEAKFUNCTIONS
+void user_initialize(void)
+{
+ /* Stub that must be provided only if the toolchain does not support weak
+ * functions.
+ */
+}
+#endif
+
+/****************************************************************************
+ * user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ struct in_addr addr;
+#if defined(CONFIG_EXAMPLE_WGET_NOMAC)
+ uint8_t mac[IFHWADDRLEN];
+#endif
+
+/* Many embedded network interfaces must have a software assigned MAC */
+
+#ifdef CONFIG_EXAMPLE_WGET_NOMAC
+ mac[0] = 0x00;
+ mac[1] = 0xe0;
+ mac[2] = 0xb0;
+ mac[3] = 0x0b;
+ mac[4] = 0xba;
+ mac[5] = 0xbe;
+ uip_setmacaddr("eth0", mac);
+#endif
+
+ /* Set up our host address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_WGET_IPADDR);
+ uip_sethostaddr("eth0", &addr);
+
+ /* Set up the default router address */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_WGET_DRIPADDR);
+ uip_setdraddr("eth0", &addr);
+
+ /* Setup the subnet mask */
+
+ addr.s_addr = HTONL(CONFIG_EXAMPLE_WGET_NETMASK);
+ uip_setnetmask("eth0", &addr);
+
+ /* Then start the server */
+
+ wget(CONFIG_EXAMPLE_WGET_URL, g_iobuffer, 512, callback, NULL);
+ return 0;
+}
diff --git a/apps/examples/wlan/Makefile b/apps/examples/wlan/Makefile
new file mode 100755
index 000000000..53f871543
--- /dev/null
+++ b/apps/examples/wlan/Makefile
@@ -0,0 +1,92 @@
+############################################################################
+# apps/examples/wlan/Makefile
+#
+# Copyright (C) 2011 Gregory Nutt. All rights reserved.
+# Authors: Gregory Nutt <spudmonkey@racsa.co.cr>
+# Rafael Noronha <rafael@pdsolucoes.com.br>
+#
+# 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
+
+# WLAN Test
+
+ASRCS =
+CSRCS = wlan_main.c
+
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
+
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
+
+BIN = ../../libapps$(LIBEXT)
+
+ROOTDEPPATH = --dep-path .
+
+# Common build
+
+VPATH =
+
+all: .built
+.PHONY: .built clean depend disclean
+
+$(AOBJS): %$(OBJEXT): %.S
+ $(call ASSEMBLE, $<, $@)
+
+$(COBJS): %$(OBJEXT): %.c
+ $(call COMPILE, $<, $@)
+
+$(BIN): $(OBJS)
+ @( for obj in $(OBJS) ; do \
+ $(call ARCHIVE, $@, $${obj}); \
+ done ; )
+ @touch .built
+
+.built: $(BIN)
+
+.depend: Makefile $(SRCS)
+ @$(MKDEP) $(ROOTDEPPATH) $(CC) -- $(CFLAGS) -- $(SRCS) >Make.dep
+ @touch $@
+
+# Register application
+depend: .depend
+
+clean:
+ @rm -f $(BIN) *.o *~ .*.swp .built
+ $(call CLEAN)
+
+distclean: clean
+ @rm -f Make.dep .depend
+
+-include Make.dep
+
diff --git a/apps/examples/wlan/wlan_main.c b/apps/examples/wlan/wlan_main.c
new file mode 100755
index 000000000..9bfb78fa7
--- /dev/null
+++ b/apps/examples/wlan/wlan_main.c
@@ -0,0 +1,240 @@
+/****************************************************************************
+ * examples/wlan/wlan_main.c
+ *
+ * Copyright (C) 2011 Gregory Nutt. All rights reserved.
+ * Authors: Gregory Nutt <spudmonkey@racsa.co.cr>
+ * Rafael Noronha <rafael@pdsolucoes.com.br>
+ *
+ * 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 <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <errno.h>
+
+#include <nuttx/usb/usbhost.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+/* Configuration ************************************************************/
+
+/* Sanity checking */
+
+#ifndef CONFIG_USBHOST
+# error "CONFIG_USBHOST is not defined"
+#endif
+
+#ifdef CONFIG_USBHOST_BULK_DISABLE
+# error "Bulk endpoints are disabled (CONFIG_USBHOST_BULK_DISABLE)"
+#endif
+
+#ifndef CONFIG_NFILE_DESCRIPTORS
+# error "CONFIG_NFILE_DESCRIPTORS > 0 needed"
+#endif
+
+/* Provide some default values for other configuration settings */
+
+#ifndef CONFIG_EXAMPLES_WLAN_DEFPRIO
+# define CONFIG_EXAMPLES_WLAN_DEFPRIO 50
+#endif
+
+#ifndef CONFIG_EXAMPLES_WLAN_STACKSIZE
+# define CONFIG_EXAMPLES_WLAN_STACKSIZE 1024
+#endif
+
+#ifndef CONFIG_EXAMPLES_WLAN_DEVNAME
+# define CONFIG_EXAMPLES_WLAN_DEVNAME "/dev/wlana"
+#endif
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static struct usbhost_driver_s *g_drvr;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: wlan_waiter
+ *
+ * Description:
+ * Wait for USB devices to be connected.
+ *
+ ****************************************************************************/
+
+static int wlan_waiter(int argc, char *argv[])
+{
+ bool connected = false;
+ int ret;
+
+ printf("wlan_waiter: Running\n");
+ for (;;)
+ {
+ /* Wait for the device to change state */
+
+ ret = DRVR_WAIT(g_drvr, connected);
+ DEBUGASSERT(ret == OK);
+
+ connected = !connected;
+ printf("wlan_waiter: %s\n", connected ? "connected" : "disconnected");
+
+ /* Did we just become connected? */
+
+ if (connected)
+ {
+ /* Yes.. enumerate the newly connected device */
+
+ (void)DRVR_ENUMERATE(g_drvr);
+ }
+ }
+
+ /* Keep the compiler from complaining */
+
+ return 0;
+}
+
+/****************************************************************************
+ * Name: user_initialize
+ ****************************************************************************/
+
+void user_initialize(void)
+{
+}
+
+/****************************************************************************
+ * Name: user_start
+ ****************************************************************************/
+
+int user_start(int argc, char *argv[])
+{
+ char buffer[256];
+ pid_t pid;
+ ssize_t nbytes;
+ int fd;
+ int ret;
+
+ /* First, register all of the USB host Wireless LAN drivers */
+
+ printf("user_start: Register drivers\n");
+ ret = usbhost_wlaninit();
+ if (ret != OK)
+ {
+ printf("user_start: Failed to register the WLAN driver\n");
+ }
+
+ /* Then get an instance of the USB host interface */
+
+ printf("user_start: Initialize USB host WLAN driver\n");
+ g_drvr = usbhost_initialize(0);
+ if (g_drvr)
+ {
+ /* Start a thread to handle device connection. */
+
+ printf("user_start: Start wlan_waiter\n");
+
+#ifndef CONFIG_CUSTOM_STACK
+ pid = task_create("usbhost", CONFIG_EXAMPLES_WLAN_DEFPRIO,
+ CONFIG_EXAMPLES_WLAN_STACKSIZE,
+ (main_t)wlan_waiter, (const char **)NULL);
+#else
+ pid = task_create("usbhost", CONFIG_EXAMPLES_WLAN_DEFPRIO,
+ (main_t)wlan_waiter, (const char **)NULL);
+#endif
+
+ /* Now just sleep. Eventually logic here will open the WLAN device and
+ * perform the device test.
+ */
+
+ for (;;)
+ {
+ /* Open the WLAN device. Loop until the device is successfully
+ * opened.
+ */
+
+ do
+ {
+ printf("Opening device %s\n", CONFIG_EXAMPLES_WLAN_DEVNAME);
+ fd = open(CONFIG_EXAMPLES_WLAN_DEVNAME, O_RDONLY);
+ if (fd < 0)
+ {
+ printf("Failed: %d\n", errno);
+ fflush(stdout);
+ sleep(3);
+ }
+ }
+ while (fd < 0);
+
+ printf("Device %s opened\n", CONFIG_EXAMPLES_WLAN_DEVNAME);
+ fflush(stdout);
+
+ /* Loop until there is a read failure */
+
+ do
+ {
+ /* Read a buffer of data */
+
+ nbytes = read(fd, buffer, 256);
+ if (nbytes > 0)
+ {
+ /* On success, echo the buffer to stdout */
+
+ (void)write(1, buffer, nbytes);
+ }
+ }
+ while (nbytes >= 0);
+
+ printf("Closing device %s: %d\n", CONFIG_EXAMPLES_WLAN_DEVNAME, (int)nbytes);
+ fflush(stdout);
+ close(fd);
+ }
+ }
+ return 0;
+}
diff --git a/apps/netutils/Makefile b/apps/netutils/Makefile
index 3c3f11c43..cf33cf0f9 100644
--- a/apps/netutils/Makefile
+++ b/apps/netutils/Makefile
@@ -46,17 +46,20 @@ all: nothing
nothing:
-define DOMAKE
- @(MAKE) -C $1 $2 TOPDIR="$(TOPDIR) APPDIR=$(APPDIR)"
-endef
-
depend:
- $(foreach DIR, $(SUBDIRS), $(eval $(call DOMAKE,$(DIR),depend)))
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir depend TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
clean:
- $(foreach DIR, $(SUBDIRS), $(eval $(call DOMAKE,$(DIR),clean)))
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir clean TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
distclean: clean
- $(foreach DIR, $(SUBDIRS), $(eval $(call DOMAKE,$(DIR),distclean)))
+ @for dir in $(SUBDIRS) ; do \
+ $(MAKE) -C $$dir distclean TOPDIR="$(TOPDIR)" APPDIR=$(APPDIR); \
+ done
-include Make.dep
+
diff --git a/apps/nshlib/Makefile b/apps/nshlib/Makefile
index f5410dc4b..943fc8713 100644
--- a/apps/nshlib/Makefile
+++ b/apps/nshlib/Makefile
@@ -40,7 +40,7 @@ include $(APPDIR)/Make.defs
# NSH Library
ASRCS =
-CSRCS = nsh_main.c nsh_fscmds.c nsh_ddcmd.c nsh_proccmds.c nsh_mmcmds.c \
+CSRCS = nsh_parse.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)
diff --git a/apps/nshlib/nsh_main.c b/apps/nshlib/nsh_parse.c
index 9b23e6b79..bf34df676 100644
--- a/apps/nshlib/nsh_main.c
+++ b/apps/nshlib/nsh_parse.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/nshlib/nsh_main.c
+ * apps/nshlib/nsh_parse.c
*
* Copyright (C) 2007-2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
diff --git a/apps/nshlib/nsh_romfsetc.c b/apps/nshlib/nsh_romfsetc.c
index 184709111..d97e6591a 100644
--- a/apps/nshlib/nsh_romfsetc.c
+++ b/apps/nshlib/nsh_romfsetc.c
@@ -113,7 +113,7 @@ int nsh_romfsetc(void)
ret = mount(MOUNT_DEVNAME, CONFIG_NSH_ROMFSMOUNTPT, "romfs", MS_RDONLY, NULL);
if (ret < 0)
{
- dbg("nsh: mount(%s,%s,romfs) failed: %s\n",
+ dbg("nsh: mount(%s,%s,romfs) failed: %d\n",
MOUNT_DEVNAME, CONFIG_NSH_ROMFSMOUNTPT, errno);
return ERROR;
}
diff --git a/apps/nshlib/nsh_serial.c b/apps/nshlib/nsh_serial.c
index 609ce3f49..f48339bdf 100644
--- a/apps/nshlib/nsh_serial.c
+++ b/apps/nshlib/nsh_serial.c
@@ -408,7 +408,7 @@ static void nsh_consoleexit(FAR struct nsh_vtbl_s *vtbl)
****************************************************************************/
/****************************************************************************
- * Name: nsh_main
+ * Name: nsh_consolemain
****************************************************************************/
int nsh_consolemain(int argc, char *argv[])