diff --git a/Documentation/README.html b/Documentation/README.html
index 1c13c8abdd8..fd9400b6b6a 100644
--- a/Documentation/README.html
+++ b/Documentation/README.html
@@ -345,6 +345,7 @@ nuttx/
|- lib/
| `- README.txt
|- libc/
+ | |- zoneinfo/README.txt
| `- README.txt
|- libnx/
| `- README.txt
@@ -402,8 +403,7 @@ apps/
|- nxplayer/README.txt
|- symtab/README.txt
|- usbmsc/README.txt
- |- zmodem/README.txt
- `- zoneinfo/README.txt
+ `- zmodem/README.txt
diff --git a/README.txt b/README.txt
index b3cb19a407d..d04a5e4e7cc 100644
--- a/README.txt
+++ b/README.txt
@@ -1524,6 +1524,8 @@ nuttx/
|- lib/
| `- README.txt
|- libc/
+ | |- zoneinfo
+ | | `- README.txt
| `- README.txt
|- libnx/
| `- README.txt
@@ -1590,9 +1592,7 @@ apps/
| | `- README.txt
| |- usbmsc
| | `- README.txt
- | |- zmodem
- | | `- README.txt
- | `- zoneinfo
+ | `- zmodem
| `- README.txt
`- README.txt
diff --git a/ReleaseNotes b/ReleaseNotes
index c760fca7372..b5c3fbe3214 100644
--- a/ReleaseNotes
+++ b/ReleaseNotes
@@ -8991,7 +8991,7 @@ Additional new features and extended functionality:
* Applications: apps/system:
- - apps/system/zoneinfo: Add logic to build a ROMFS file system
+ - nuttx/zoneinfo: Add logic to build a ROMFS file system
containing the timezone data.
* Applications: apps/nshlib:
diff --git a/configs/sim/src/Makefile b/configs/sim/src/Makefile
index 9f45e7e93bf..1ab3f04975f 100644
--- a/configs/sim/src/Makefile
+++ b/configs/sim/src/Makefile
@@ -48,12 +48,12 @@ endif
ifeq ($(CONFIG_BOARD_INITIALIZE),y)
CSRCS += sim_bringup.c
-ifeq ($(CONFIG_SYSTEM_ZONEINFO_ROMFS),y)
+ifeq ($(CONFIG_LIB_ZONEINFO_ROMFS),y)
CSRCS += sim_zoneinfo.c
endif
else ifeq ($(CONFIG_LIB_BOARDCTL),y)
CSRCS += sim_bringup.c
-ifeq ($(CONFIG_SYSTEM_ZONEINFO_ROMFS),y)
+ifeq ($(CONFIG_LIB_ZONEINFO_ROMFS),y)
CSRCS += sim_zoneinfo.c
endif
endif
diff --git a/configs/sim/src/sim.h b/configs/sim/src/sim.h
index 355d085022e..0e1f27937d3 100644
--- a/configs/sim/src/sim.h
+++ b/configs/sim/src/sim.h
@@ -73,7 +73,7 @@ int sim_bringup(void);
* Name: sim_zoneinfo
*
* Description:
- * Mount the TZ database. The apps/system/zoneinfo directory contains
+ * Mount the TZ database. The nuttx/zoneinfo directory contains
* logic to create a version of the TZ/Olson database.
* This database is required if localtime() support is selected via
* CONFIG_LIBC_LOCALTIME. This logic in that directory does the following:
@@ -107,7 +107,7 @@ int sim_bringup(void);
*
****************************************************************************/
-#ifdef CONFIG_SYSTEM_ZONEINFO_ROMFS
+#ifdef CONFIG_LIB_ZONEINFO_ROMFS
int sim_zoneinfo(int minor);
#endif
diff --git a/configs/sim/src/sim_bringup.c b/configs/sim/src/sim_bringup.c
index d65d99edb3b..86790206dd3 100644
--- a/configs/sim/src/sim_bringup.c
+++ b/configs/sim/src/sim_bringup.c
@@ -71,7 +71,7 @@ int sim_bringup(void)
int ret;
#endif
-#ifdef CONFIG_SYSTEM_ZONEINFO_ROMFS
+#ifdef CONFIG_LIB_ZONEINFO_ROMFS
/* Mount the TZ database */
(void)sim_zoneinfo(3);
diff --git a/configs/sim/src/sim_zoneinfo.c b/configs/sim/src/sim_zoneinfo.c
index 1e3840917c3..dbb85025e79 100644
--- a/configs/sim/src/sim_zoneinfo.c
+++ b/configs/sim/src/sim_zoneinfo.c
@@ -1,7 +1,7 @@
/****************************************************************************
* config/sim/src/sim_zoneinfo.c
*
- * Copyright (C) 2015 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2015-2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt
*
* Redistribution and use in source and binary forms, with or without
@@ -45,9 +45,9 @@
#include
#include
-#include
+#include
-#ifdef CONFIG_SYSTEM_ZONEINFO_ROMFS
+#ifdef CONFIG_LIB_ZONEINFO_ROMFS
/****************************************************************************
* Pre-processor Definitions
@@ -80,7 +80,7 @@
* Name: sim_zoneinfo
*
* Description:
- * Mount the TZ database. The apps/system/zoneinfo directory contains
+ * Mount the TZ database. The nuttx/zoneinfo directory contains
* logic to create a version of the TZ/Olson database.
* This database is required if localtime() support is selected via
* CONFIG_LIBC_LOCALTIME. This logic in that directory does the following:
@@ -149,5 +149,5 @@ int sim_zoneinfo(int minor)
return OK;
}
-#endif /* CONFIG_SYSTEM_ZONEINFO_ROMFS */
+#endif /* CONFIG_LIB_ZONEINFO_ROMFS */
diff --git a/include/nuttx/zoneinfo.h b/include/nuttx/zoneinfo.h
new file mode 100644
index 00000000000..67f4214e0b3
--- /dev/null
+++ b/include/nuttx/zoneinfo.h
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * include/nuttx/zoneinfo.h
+ *
+ * Copyright (C) 2016 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt
+ *
+ * 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 __INCLUDE_NUTTX_ZONEINFO_H
+#define __INCLUDE_NUTTX_ZONEINFO_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include
+
+#ifdef CONFIG_LIB_ZONEINFO_ROMFS
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/* If the TZ database is built as a ROMFS file system, then these variables
+ * provide (1) the address of the array in FLASH/ROM that contains the
+ * ROMFS file system image, and (2) the size of the ROMFS file system image
+ * in bytes. This is sufficient information to permit external logic to
+ * mount the ROMF file system.
+ */
+
+EXTERN unsigned char romfs_zoneinfo_img[];
+EXTERN unsigned int romfs_zoneinfo_img_len;
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CONFIG_LIB_ZONEINFO_ROMFS */
+#endif /* __INCLUDE_NUTTX_ZONEINFO_H */
diff --git a/libc/Kconfig b/libc/Kconfig
index cd72a0e7cdf..b78dcdd35e3 100644
--- a/libc/Kconfig
+++ b/libc/Kconfig
@@ -288,7 +288,7 @@ config LIBC_LOCALTIME
environment variable TZ must be set to the name of that timezone file
when tzset() is called.
- See https://www.iana.org/time-zones . See also apps/system/zoneinfo
+ See https://www.iana.org/time-zones . See also nuttx/zoneinfo
which provides a framework for incorporating the TZ database into a
NuttX build.
@@ -884,3 +884,21 @@ config LIB_HEX2BIN
---help---
Build in support for conversions from Intel Hex format to binary.
This selection enables the interfaces of include/hex2bin.h.
+
+config LIB_ZONEINFO
+ bool "TZ database"
+ default n
+ depends on LIBC_LOCALTIME
+ ---help---
+ Build the TZ/Olson database.
+
+if LIB_ZONEINFO
+
+config LIB_ZONEINFO_ROMFS
+ bool "Build ROMFS filesystem"
+ default n
+ depends on FS_ROMFS
+ ---help---
+ Build a mountable ROMFS filesystem containing the TZ database
+
+endif # LIB_ZONEINFO
diff --git a/libc/zoneinfo/.gitignore b/libc/zoneinfo/.gitignore
new file mode 100644
index 00000000000..40e6770972b
--- /dev/null
+++ b/libc/zoneinfo/.gitignore
@@ -0,0 +1,2 @@
+/romfs_zoneinfo.h
+
diff --git a/libc/zoneinfo/Make.defs b/libc/zoneinfo/Make.defs
new file mode 100644
index 00000000000..5e0e32b29b6
--- /dev/null
+++ b/libc/zoneinfo/Make.defs
@@ -0,0 +1,47 @@
+############################################################################
+# nuttx/zoneinfo/Make.defs
+#
+# Copyright (C) 2016 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+
+ifeq ($(CONFIG_LIB_ZONEINFO_ROMFS),y)
+
+# Add the zoneinifo sources to the build
+
+CSRCS += tzromfs.c
+
+# Add the zoneinfo directory to the build
+
+DEPPATH += --dep-path zoneinfo
+VPATH += :zoneinfo
+
+endif
diff --git a/libc/zoneinfo/README.txt b/libc/zoneinfo/README.txt
new file mode 100644
index 00000000000..7aea826ea8b
--- /dev/null
+++ b/libc/zoneinfo/README.txt
@@ -0,0 +1,180 @@
+apps/system/zoninfo/README.txt
+Author: Gregory Nutt
+
+Directory Contents
+==================
+
+This directory contains logic to create a version of the TZ/Olson database.
+This database is required if localtime() support is selected via
+CONFIG_LIBC_LOCALTIME. This logic in this directory does the following:
+
+ - It downloads the current TZ database from the IANA website
+ - It downloads the current timezone tools from the same location
+ - It builds the tools and constructs the binary TZ database
+ - It will then, optionally, build a ROMFS filesystem image containing
+ the data base.
+
+Creating and Mounting a ROMFS TZ Database
+=========================================
+
+The ROMFS filesystem image can that be mounted during the boot-up sequence
+so that it is available for the localtime() logic. There are two steps to
+doing this:
+
+ - First, a ROM disk device must be created. This is done by calling
+ the function romdisk_register() as described in
+ nuttx/include/nuttx/fs/ramdisk.h. This is an OS level operation
+ and must be done in the board-level logic before your application
+ starts.
+
+ romdisk_register() will create a block driver at /dev/ramN where N
+ is the device minor number that was provided to romdisk_regsiter.
+
+ - The second step is to mount the file system. This step can be
+ performed either in your board configuration logic or by your
+ application using the mount() interface described in
+ nuttx/include/sys/mount.h.
+
+ These steps, however, must be done very early in initialization,
+ before there is any need for time-related services.
+
+Both of these steps are shown together in the following code sample at the
+end of this README file.
+
+Example Configuration
+=====================
+
+I have tested this using the sim/nsh configuration. Here are the
+modifications to the configuration that I used for testing:
+
+ CONFIG_BOARD_INITIALIZE=y
+
+ CONFIG_LIBC_LOCALTIME=y
+ CONFIG_LIBC_TZDIR="/share/zoneinfo"
+ CONFIG_LIBC_TZ_MAX_TIMES=370
+ CONFIG_LIBC_TZ_MAX_TYPES=20
+
+ CONFIG_LIB_ZONEINFO=y
+ CONFIG_LIB_ZONEINFO_ROMFS=y
+
+NOTE: The full TZ database is quite large. To create a reasonable sized
+ROMFS image, I had to trim some of the files like this:
+
+ cd nuttx
+ cd tools
+ ./configure.sh sim/nsh
+ cd ..
+ make menuconfig
+
+Select the above localtime() and nuttx/zoneinfo configuration settings.
+Then:
+
+ make context
+ cd ../nuttx/zoneinfo/tzbin/etc/zoneinfo
+
+Remove as many timezone files as you can. Do not remove the GMT, localtime,
+or posixrules files. Those might be needed in any event. Then you can
+force rebuilding of the ROMFS filesystem be removing some files:
+
+ cd ../../..
+ rm romfs_zoneinfo.*
+ rm *.o
+ cd ../../nuttx
+ make
+
+If you have problems building the simulator on your platform, check out
+nuttx/configs/sim/README.txt. You might find some help there.
+
+Here is a sample run. I have not seen any errors in single stepping through
+the logic but neither am I certain that everything is working properly:
+
+ NuttShell (NSH)
+ nsh> date
+ Jul 01 00:00:02 2008
+ nsh> set TZ US/Mountain
+ nsh> date -s "Apr 11 11:53:00 2015"
+ nsh> date
+ Apr 11 17:53:00 2015
+
+NOTE: Because of daylight savings time, US/Mountain is GMT-6 on Apr 11. The
+above suggests that perhaps the NSH data command may be setting local time,
+but printing GMT time?
+
+Sample Code to Mount the ROMFS Filesystem
+=========================================
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifndef CONFIG_LIBC_TZDIR
+# errror CONFIG_LIBC_TZDIR is not defined
+#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 SECTORSIZE 64
+#define NSECTORS(b) (((b)+SECTORSIZE-1)/SECTORSIZE)
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+int mount_zoneinfo(int minor)
+{
+ char devname[32];
+ int ret;
+
+ /* Create a RAM disk for the test */
+
+ ret = romdisk_register(minor, romfs_zoneinfo_img,
+ NSECTORS(romfs_zoneinfo_img_len), SECTORSIZE);
+ if (ret < 0)
+ {
+ printf("ERROR: Failed to create RAM disk\n");
+ return ret;
+ }
+
+ /* Use the minor number to create a name for the ROM disk block device */
+
+ snprintf(devname, 32, "/dev/ram%d", minor);
+
+ /* Mount the ROMFS file system */
+
+ printf("Mounting ROMFS filesystem at target=%s with source=%s\n",
+ CONFIG_LIBC_TZDIR, devname);
+
+ ret = mount(devname, CONFIG_LIBC_TZDIR, "romfs", MS_RDONLY, NULL);
+ if (ret < 0)
+ {
+ printf("ERROR: Mount failed: %d\n", errno);
+ return ret;
+ }
+
+ printf("TZ database mounted at %s\n", CONFIG_LIBC_TZDIR);
+ return OK;
+}
diff --git a/libc/zoneinfo/tzromfs.c b/libc/zoneinfo/tzromfs.c
new file mode 100644
index 00000000000..7ce1d9d4a3a
--- /dev/null
+++ b/libc/zoneinfo/tzromfs.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * nuttx/zoneinfo/tzromfs.c
+ *
+ * Copyright (C) 2015 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt
+ *
+ * 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
+#include
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+#include "romfs_zoneinfo.h"