Browse Source

[dfs] move dfs back

Meco Man 3 years ago
parent
commit
973f25901c

+ 38 - 70
bsp/mini2440/.config

@@ -1,10 +1,14 @@
-# Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib)
+#
+# Automatically generated file; DO NOT EDIT.
+# RT-Thread Project Configuration
+#
 CONFIG_BOARD_MINI2440=y
 
 #
 # RT-Thread Kernel
 #
 CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_BIG_ENDIAN is not set
 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set
 # CONFIG_RT_USING_SMP is not set
 CONFIG_RT_ALIGN_SIZE=4
@@ -27,8 +31,8 @@ CONFIG_RT_TIMER_THREAD_STACK_SIZE=512
 #
 # CONFIG_RT_KSERVICE_USING_STDLIB is not set
 # CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set
-# end of kservice optimization
-
+# CONFIG_RT_USING_ASM_MEMCPY is not set
+# CONFIG_RT_USING_TINY_FFS is not set
 CONFIG_RT_DEBUG=y
 # CONFIG_RT_DEBUG_COLOR is not set
 # CONFIG_RT_DEBUG_INIT_CONFIG is not set
@@ -51,7 +55,6 @@ CONFIG_RT_USING_EVENT=y
 CONFIG_RT_USING_MAILBOX=y
 CONFIG_RT_USING_MESSAGEQUEUE=y
 # CONFIG_RT_USING_SIGNALS is not set
-# end of Inter-Thread communication
 
 #
 # Memory Management
@@ -65,7 +68,6 @@ CONFIG_RT_USING_SMALL_MEM=y
 # CONFIG_RT_USING_USERHEAP is not set
 # CONFIG_RT_USING_MEMTRACE is not set
 CONFIG_RT_USING_HEAP=y
-# end of Memory Management
 
 #
 # Kernel Device Object
@@ -77,13 +79,11 @@ CONFIG_RT_USING_CONSOLE=y
 CONFIG_RT_CONSOLEBUF_SIZE=128
 CONFIG_RT_CONSOLE_DEVICE_NAME="uart"
 # CONFIG_RT_PRINTF_LONGLONG is not set
-# end of Kernel Device Object
-
 CONFIG_RT_VER_NUM=0x40004
-# end of RT-Thread Kernel
-
 CONFIG_ARCH_ARM=y
+# CONFIG_RT_USING_CPU_FFS is not set
 CONFIG_ARCH_ARM_ARM9=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
 
 #
 # RT-Thread Components
@@ -98,7 +98,6 @@ CONFIG_RT_MAIN_THREAD_PRIORITY=10
 #
 CONFIG_RT_USING_CPLUSPLUS=y
 # CONFIG_RT_USING_CPLUSPLUS11 is not set
-# end of C++ features
 
 #
 # Command shell
@@ -118,12 +117,12 @@ CONFIG_FINSH_USING_DESCRIPTION=y
 # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
 # CONFIG_FINSH_USING_AUTH is not set
 CONFIG_FINSH_ARG_MAX=10
-# end of Command shell
 
 #
 # Device virtual file system
 #
 CONFIG_RT_USING_DFS=y
+CONFIG_DFS_USING_POSIX=y
 CONFIG_DFS_USING_WORKDIR=y
 CONFIG_DFS_FILESYSTEMS_MAX=5
 CONFIG_DFS_FILESYSTEM_TYPES_MAX=5
@@ -152,13 +151,10 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512
 # CONFIG_RT_DFS_ELM_USE_ERASE is not set
 CONFIG_RT_DFS_ELM_REENTRANT=y
 CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000
-# end of elm-chan's FatFs, Generic FAT Filesystem Module
-
 CONFIG_RT_USING_DFS_DEVFS=y
 # CONFIG_RT_USING_DFS_ROMFS is not set
 CONFIG_RT_USING_DFS_RAMFS=y
 # CONFIG_RT_USING_DFS_NFS is not set
-# end of Device virtual file system
 
 #
 # Device Drivers
@@ -206,27 +202,30 @@ CONFIG_RT_MMCSD_MAX_PARTITION=16
 #
 # Using USB
 #
+# CONFIG_RT_USING_USB is not set
 # CONFIG_RT_USING_USB_HOST is not set
 # CONFIG_RT_USING_USB_DEVICE is not set
-# end of Using USB
-# end of Device Drivers
 
 #
 # POSIX layer and C standard library
 #
 CONFIG_RT_USING_LIBC=y
-CONFIG_RT_USING_PTHREADS=y
-CONFIG_PTHREAD_NUM_MAX=8
-CONFIG_RT_USING_POSIX=y
-CONFIG_RT_USING_POSIX_MMAP=y
-CONFIG_RT_USING_POSIX_TERMIOS=y
-# CONFIG_RT_USING_POSIX_GETLINE is not set
-CONFIG_RT_USING_POSIX_AIO=y
 CONFIG_RT_LIBC_USING_TIME=y
+# CONFIG_RT_LIBC_USING_FILEIO is not set
 CONFIG_RT_USING_MODULE=y
 CONFIG_RT_USING_CUSTOM_DLMODULE=y
 CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8
-# end of POSIX layer and C standard library
+CONFIG_RT_USING_POSIX=y
+# CONFIG_RT_USING_POSIX_STDIO is not set
+CONFIG_RT_USING_POSIX_POLL=y
+CONFIG_RT_USING_POSIX_SELECT=y
+# CONFIG_RT_USING_POSIX_DELAY is not set
+# CONFIG_RT_USING_POSIX_GETLINE is not set
+CONFIG_RT_USING_POSIX_MMAP=y
+CONFIG_RT_USING_POSIX_TERMIOS=y
+CONFIG_RT_USING_POSIX_AIO=y
+CONFIG_RT_USING_PTHREADS=y
+CONFIG_PTHREAD_NUM_MAX=8
 
 #
 # Network
@@ -242,10 +241,7 @@ CONFIG_SAL_INTERNET_CHECK=y
 # protocol stack implement
 #
 CONFIG_SAL_USING_LWIP=y
-# end of protocol stack implement
-
 CONFIG_SAL_USING_POSIX=y
-# end of Socket abstraction layer
 
 #
 # Network interface device
@@ -258,7 +254,7 @@ CONFIG_NETDEV_USING_AUTO_DEFAULT=y
 # CONFIG_NETDEV_USING_IPV6 is not set
 CONFIG_NETDEV_IPV4=1
 CONFIG_NETDEV_IPV6=0
-# end of Network interface device
+# CONFIG_NETDEV_IPV6_SCOPES is not set
 
 #
 # light weight TCP/IP stack
@@ -284,8 +280,6 @@ CONFIG_IP_SOF_BROADCAST_RECV=1
 CONFIG_RT_LWIP_IPADDR="192.168.0.30"
 CONFIG_RT_LWIP_GWADDR="192.168.0.1"
 CONFIG_RT_LWIP_MSKADDR="255.255.255.0"
-# end of Static IPv4 Address
-
 CONFIG_RT_LWIP_UDP=y
 CONFIG_RT_LWIP_TCP=y
 CONFIG_RT_LWIP_RAW=y
@@ -320,22 +314,17 @@ CONFIG_RT_LWIP_STATS=y
 # CONFIG_RT_LWIP_USING_HW_CHECKSUM is not set
 CONFIG_RT_LWIP_USING_PING=y
 # CONFIG_RT_LWIP_DEBUG is not set
-# end of light weight TCP/IP stack
 
 #
 # AT commands
 #
 # CONFIG_RT_USING_AT is not set
-# end of AT commands
-
 # CONFIG_LWIP_USING_DHCPD is not set
-# end of Network
 
 #
 # VBUS(Virtual Software BUS)
 #
 # CONFIG_RT_USING_VBUS is not set
-# end of VBUS(Virtual Software BUS)
 
 #
 # Utilities
@@ -347,16 +336,12 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_RT_USING_UTEST is not set
 # CONFIG_RT_USING_VAR_EXPORT is not set
 # CONFIG_RT_USING_RT_LINK is not set
-# end of Utilities
-
 # CONFIG_RT_USING_LWP is not set
-# end of RT-Thread Components
 
 #
 # RT-Thread Utestcases
 #
 # CONFIG_RT_USING_UTESTCASES is not set
-# end of RT-Thread Utestcases
 
 #
 # RT-Thread online packages
@@ -391,17 +376,12 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # Marvell WiFi
 #
 # CONFIG_PKG_USING_WLANMARVELL is not set
-# end of Marvell WiFi
 
 #
 # Wiced WiFi
 #
 # CONFIG_PKG_USING_WLAN_WICED is not set
-# end of Wiced WiFi
-
 # CONFIG_PKG_USING_RW007 is not set
-# end of Wi-Fi
-
 # CONFIG_PKG_USING_COAP is not set
 # CONFIG_PKG_USING_NOPOLL is not set
 # CONFIG_PKG_USING_NETUTILS is not set
@@ -423,8 +403,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_JIOT-C-SDK is not set
 # CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
 # CONFIG_PKG_USING_JOYLINK is not set
-# end of IoT Cloud
-
 # CONFIG_PKG_USING_NIMBLE is not set
 # CONFIG_PKG_USING_OTA_DOWNLOADER is not set
 # CONFIG_PKG_USING_IPMSG is not set
@@ -458,7 +436,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set
 # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set
 # CONFIG_PKG_USING_HM is not set
-# end of IoT - internet of things
+# CONFIG_PKG_USING_SMALL_MODBUS is not set
 
 #
 # security packages
@@ -468,7 +446,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_TINYCRYPT is not set
 # CONFIG_PKG_USING_TFM is not set
 # CONFIG_PKG_USING_YD_CRYPTO is not set
-# end of security packages
 
 #
 # language packages
@@ -477,22 +454,19 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_JERRYSCRIPT is not set
 # CONFIG_PKG_USING_MICROPYTHON is not set
 # CONFIG_PKG_USING_PIKASCRIPT is not set
-# end of language packages
 
 #
 # multimedia packages
 #
-# CONFIG_PKG_USING_OPENMV is not set
-# CONFIG_PKG_USING_MUPDF is not set
-# CONFIG_PKG_USING_STEMWIN is not set
 
 #
-# lvgl: powerful and easy-to-use embedded GUI library
+# LVGL: powerful and easy-to-use embedded GUI library
 #
 # CONFIG_PKG_USING_LITTLEVGL2RTT is not set
 # CONFIG_PKG_USING_LVGL is not set
-# end of lvgl: powerful and easy-to-use embedded GUI library
-
+# CONFIG_PKG_USING_OPENMV is not set
+# CONFIG_PKG_USING_MUPDF is not set
+# CONFIG_PKG_USING_STEMWIN is not set
 # CONFIG_PKG_USING_WAVPLAYER is not set
 # CONFIG_PKG_USING_TJPGD is not set
 # CONFIG_PKG_USING_PDFGEN is not set
@@ -509,8 +483,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 #
 # CONFIG_PKG_USING_U8G2_OFFICIAL is not set
 # CONFIG_PKG_USING_U8G2 is not set
-# end of u8g2: a monochrome graphic library
-# end of multimedia packages
 
 #
 # tools packages
@@ -553,7 +525,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_MEM_SANDBOX is not set
 # CONFIG_PKG_USING_SOLAR_TERMS is not set
 # CONFIG_PKG_USING_GAN_ZHI is not set
-# end of tools packages
+# CONFIG_PKG_USING_FDT is not set
 
 #
 # system packages
@@ -566,7 +538,13 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
 # CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
 # CONFIG_PKG_USING_QFPLIB_M3 is not set
-# end of acceleration: Assembly language or algorithmic acceleration packages
+
+#
+# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard
+#
+# CONFIG_PKG_USING_CMSIS_5 is not set
+# CONFIG_PKG_USING_CMSIS_5_AUX is not set
+# CONFIG_PKG_USING_CMSIS_RTOS2 is not set
 
 #
 # Micrium: Micrium software products porting for RT-Thread
@@ -577,8 +555,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_UC_CLK is not set
 # CONFIG_PKG_USING_UC_COMMON is not set
 # CONFIG_PKG_USING_UC_MODBUS is not set
-# end of Micrium: Micrium software products porting for RT-Thread
-
 # CONFIG_PKG_USING_GUIENGINE is not set
 # CONFIG_PKG_USING_PERSIMMON is not set
 # CONFIG_PKG_USING_CAIRO is not set
@@ -588,7 +564,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_FLASHDB is not set
 # CONFIG_PKG_USING_SQLITE is not set
 # CONFIG_PKG_USING_RTI is not set
-# CONFIG_PKG_USING_CMSIS is not set
 # CONFIG_PKG_USING_DFS_YAFFS is not set
 # CONFIG_PKG_USING_LITTLEFS is not set
 # CONFIG_PKG_USING_DFS_JFFS2 is not set
@@ -613,7 +588,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_WCWIDTH is not set
 # CONFIG_PKG_USING_MCUBOOT is not set
 # CONFIG_PKG_USING_TINYUSB is not set
-# end of system packages
 
 #
 # peripheral libraries and drivers
@@ -689,7 +663,7 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_MISAKA_RGB_BLING is not set
 # CONFIG_PKG_USING_BL_MCU_SDK is not set
 # CONFIG_PKG_USING_SOFT_SERIAL is not set
-# end of peripheral libraries and drivers
+# CONFIG_PKG_USING_MB85RS16 is not set
 
 #
 # AI packages
@@ -703,7 +677,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_ULAPACK is not set
 # CONFIG_PKG_USING_QUEST is not set
 # CONFIG_PKG_USING_NAXOS is not set
-# end of AI packages
 
 #
 # miscellaneous packages
@@ -716,7 +689,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
 # CONFIG_PKG_USING_NETWORK_SAMPLES is not set
 # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
-# end of samples: kernel and components samples
 
 #
 # entertainment: terminal games and other interesting software packages
@@ -730,8 +702,6 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_SNAKE is not set
 # CONFIG_PKG_USING_TETRIS is not set
 # CONFIG_PKG_USING_DONUT is not set
-# end of entertainment: terminal games and other interesting software packages
-
 # CONFIG_PKG_USING_LIBCSV is not set
 # CONFIG_PKG_USING_OPTPARSE is not set
 # CONFIG_PKG_USING_FASTLZ is not set
@@ -761,5 +731,3 @@ CONFIG_YMODEM_USING_FILE_TRANSFER=y
 # CONFIG_PKG_USING_MCURSES is not set
 # CONFIG_PKG_USING_COWSAY is not set
 # CONFIG_PKG_USING_TERMBOX is not set
-# end of miscellaneous packages
-# end of RT-Thread online packages

+ 16 - 52
bsp/mini2440/rtconfig.h

@@ -1,7 +1,9 @@
 #ifndef RT_CONFIG_H__
 #define RT_CONFIG_H__
 
-/* Generated by Kconfiglib (https://github.com/ulfalizer/Kconfiglib) */
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread Project Configuration */
+
 #define BOARD_MINI2440
 
 /* RT-Thread Kernel */
@@ -22,7 +24,6 @@
 
 /* kservice optimization */
 
-/* end of kservice optimization */
 #define RT_DEBUG
 
 /* Inter-Thread communication */
@@ -32,7 +33,6 @@
 #define RT_USING_EVENT
 #define RT_USING_MAILBOX
 #define RT_USING_MESSAGEQUEUE
-/* end of Inter-Thread communication */
 
 /* Memory Management */
 
@@ -40,7 +40,6 @@
 #define RT_USING_MEMHEAP
 #define RT_USING_SMALL_MEM
 #define RT_USING_HEAP
-/* end of Memory Management */
 
 /* Kernel Device Object */
 
@@ -48,9 +47,7 @@
 #define RT_USING_CONSOLE
 #define RT_CONSOLEBUF_SIZE 128
 #define RT_CONSOLE_DEVICE_NAME "uart"
-/* end of Kernel Device Object */
 #define RT_VER_NUM 0x40004
-/* end of RT-Thread Kernel */
 #define ARCH_ARM
 #define ARCH_ARM_ARM9
 
@@ -64,7 +61,6 @@
 /* C++ features */
 
 #define RT_USING_CPLUSPLUS
-/* end of C++ features */
 
 /* Command shell */
 
@@ -81,11 +77,11 @@
 #define MSH_USING_BUILT_IN_COMMANDS
 #define FINSH_USING_DESCRIPTION
 #define FINSH_ARG_MAX 10
-/* end of Command shell */
 
 /* Device virtual file system */
 
 #define RT_USING_DFS
+#define DFS_USING_POSIX
 #define DFS_USING_WORKDIR
 #define DFS_FILESYSTEMS_MAX 5
 #define DFS_FILESYSTEM_TYPES_MAX 5
@@ -105,10 +101,8 @@
 #define RT_DFS_ELM_MAX_SECTOR_SIZE 512
 #define RT_DFS_ELM_REENTRANT
 #define RT_DFS_ELM_MUTEX_TIMEOUT 3000
-/* end of elm-chan's FatFs, Generic FAT Filesystem Module */
 #define RT_USING_DFS_DEVFS
 #define RT_USING_DFS_RAMFS
-/* end of Device virtual file system */
 
 /* Device Drivers */
 
@@ -131,23 +125,22 @@
 
 /* Using USB */
 
-/* end of Using USB */
-/* end of Device Drivers */
 
 /* POSIX layer and C standard library */
 
 #define RT_USING_LIBC
-#define RT_USING_PTHREADS
-#define PTHREAD_NUM_MAX 8
-#define RT_USING_POSIX
-#define RT_USING_POSIX_MMAP
-#define RT_USING_POSIX_TERMIOS
-#define RT_USING_POSIX_AIO
 #define RT_LIBC_USING_TIME
 #define RT_USING_MODULE
 #define RT_USING_CUSTOM_DLMODULE
 #define RT_LIBC_DEFAULT_TIMEZONE 8
-/* end of POSIX layer and C standard library */
+#define RT_USING_POSIX
+#define RT_USING_POSIX_POLL
+#define RT_USING_POSIX_SELECT
+#define RT_USING_POSIX_MMAP
+#define RT_USING_POSIX_TERMIOS
+#define RT_USING_POSIX_AIO
+#define RT_USING_PTHREADS
+#define PTHREAD_NUM_MAX 8
 
 /* Network */
 
@@ -159,9 +152,7 @@
 /* protocol stack implement */
 
 #define SAL_USING_LWIP
-/* end of protocol stack implement */
 #define SAL_USING_POSIX
-/* end of Socket abstraction layer */
 
 /* Network interface device */
 
@@ -172,7 +163,6 @@
 #define NETDEV_USING_AUTO_DEFAULT
 #define NETDEV_IPV4 1
 #define NETDEV_IPV6 0
-/* end of Network interface device */
 
 /* light weight TCP/IP stack */
 
@@ -191,7 +181,6 @@
 #define RT_LWIP_IPADDR "192.168.0.30"
 #define RT_LWIP_GWADDR "192.168.0.1"
 #define RT_LWIP_MSKADDR "255.255.255.0"
-/* end of Static IPv4 Address */
 #define RT_LWIP_UDP
 #define RT_LWIP_TCP
 #define RT_LWIP_RAW
@@ -220,28 +209,21 @@
 #define LWIP_NETIF_LOOPBACK 1
 #define RT_LWIP_STATS
 #define RT_LWIP_USING_PING
-/* end of light weight TCP/IP stack */
 
 /* AT commands */
 
-/* end of AT commands */
-/* end of Network */
 
 /* VBUS(Virtual Software BUS) */
 
-/* end of VBUS(Virtual Software BUS) */
 
 /* Utilities */
 
 #define RT_USING_RYM
 #define YMODEM_USING_CRC_TABLE
 #define YMODEM_USING_FILE_TRANSFER
-/* end of Utilities */
-/* end of RT-Thread Components */
 
 /* RT-Thread Utestcases */
 
-/* end of RT-Thread Utestcases */
 
 /* RT-Thread online packages */
 
@@ -252,71 +234,53 @@
 
 /* Marvell WiFi */
 
-/* end of Marvell WiFi */
 
 /* Wiced WiFi */
 
-/* end of Wiced WiFi */
-/* end of Wi-Fi */
 
 /* IoT Cloud */
 
-/* end of IoT Cloud */
-/* end of IoT - internet of things */
 
 /* security packages */
 
-/* end of security packages */
 
 /* language packages */
 
-/* end of language packages */
 
 /* multimedia packages */
 
+/* LVGL: powerful and easy-to-use embedded GUI library */
 
-/* lvgl: powerful and easy-to-use embedded GUI library */
-
-/* end of lvgl: powerful and easy-to-use embedded GUI library */
 
 /* u8g2: a monochrome graphic library */
 
-/* end of u8g2: a monochrome graphic library */
-/* end of multimedia packages */
 
 /* tools packages */
 
-/* end of tools packages */
 
 /* system packages */
 
 /* acceleration: Assembly language or algorithmic acceleration packages */
 
-/* end of acceleration: Assembly language or algorithmic acceleration packages */
+
+/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */
+
 
 /* Micrium: Micrium software products porting for RT-Thread */
 
-/* end of Micrium: Micrium software products porting for RT-Thread */
-/* end of system packages */
 
 /* peripheral libraries and drivers */
 
-/* end of peripheral libraries and drivers */
 
 /* AI packages */
 
-/* end of AI packages */
 
 /* miscellaneous packages */
 
 /* samples: kernel and components samples */
 
-/* end of samples: kernel and components samples */
 
 /* entertainment: terminal games and other interesting software packages */
 
-/* end of entertainment: terminal games and other interesting software packages */
-/* end of miscellaneous packages */
-/* end of RT-Thread online packages */
 
 #endif

+ 3 - 0
bsp/qemu-vexpress-a9/.config

@@ -33,6 +33,7 @@ CONFIG_RT_TIMER_THREAD_STACK_SIZE=1024
 # CONFIG_RT_KSERVICE_USING_STDLIB is not set
 # CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set
 # CONFIG_RT_USING_ASM_MEMCPY is not set
+# CONFIG_RT_USING_TINY_FFS is not set
 CONFIG_RT_DEBUG=y
 CONFIG_RT_DEBUG_COLOR=y
 # CONFIG_RT_DEBUG_INIT_CONFIG is not set
@@ -126,6 +127,7 @@ CONFIG_FINSH_ARG_MAX=10
 # Device virtual file system
 #
 CONFIG_RT_USING_DFS=y
+CONFIG_DFS_USING_POSIX=y
 CONFIG_DFS_USING_WORKDIR=y
 CONFIG_DFS_FILESYSTEMS_MAX=4
 CONFIG_DFS_FILESYSTEM_TYPES_MAX=8
@@ -541,6 +543,7 @@ CONFIG_RT_USING_LWP=y
 # CONFIG_PKG_USING_MEM_SANDBOX is not set
 # CONFIG_PKG_USING_SOLAR_TERMS is not set
 # CONFIG_PKG_USING_GAN_ZHI is not set
+# CONFIG_PKG_USING_FDT is not set
 
 #
 # system packages

+ 1 - 0
bsp/qemu-vexpress-a9/rtconfig.h

@@ -90,6 +90,7 @@
 /* Device virtual file system */
 
 #define RT_USING_DFS
+#define DFS_USING_POSIX
 #define DFS_USING_WORKDIR
 #define DFS_FILESYSTEMS_MAX 4
 #define DFS_FILESYSTEM_TYPES_MAX 8

+ 4 - 0
components/dfs/Kconfig

@@ -8,6 +8,10 @@ config RT_USING_DFS
         The device file system is a light weight virtual file system.
 
 if RT_USING_DFS
+    config DFS_USING_POSIX
+        bool "Using posix-like functions, open/read/write/close"
+        default y
+
     config DFS_USING_WORKDIR
         bool "Using working directory"
         default y

+ 3 - 0
components/dfs/SConscript

@@ -9,6 +9,9 @@ src/dfs_fs.c
 cwd = GetCurrentDir()
 CPPPATH = [cwd + "/include"]
 
+if GetDepend('DFS_USING_POSIX'):
+    src += ['src/dfs_posix.c']
+
 group = DefineGroup('Filesystem', src, depend = ['RT_USING_DFS'], CPPPATH = CPPPATH)
 
 if GetDepend('RT_USING_DFS'):

+ 5 - 3
components/dfs/include/dfs.h

@@ -81,16 +81,18 @@ int dfs_init(void);
 char *dfs_normalize_path(const char *directory, const char *filename);
 const char *dfs_subdir(const char *directory, const char *filename);
 
+int fd_is_open(const char *pathname);
+struct dfs_fdtable *dfs_fdtable_get(void);
+
 void dfs_lock(void);
 void dfs_unlock(void);
 
+#ifdef DFS_USING_POSIX
 /* FD APIs */
 int fd_new(void);
 struct dfs_fd *fd_get(int fd);
 void fd_put(struct dfs_fd *fd);
-int fd_is_open(const char *pathname);
-
-struct dfs_fdtable *dfs_fdtable_get(void);
+#endif /* DFS_USING_POSIX */
 
 #ifdef __cplusplus
 }

+ 3 - 1
components/dfs/src/dfs.c

@@ -34,7 +34,6 @@ char working_directory[DFS_PATH_MAX] = {"/"};
 #endif
 
 static struct dfs_fdtable _fdtab;
-static int  fd_alloc(struct dfs_fdtable *fdt, int startfd);
 
 /**
  * @addtogroup DFS
@@ -118,6 +117,7 @@ void dfs_unlock(void)
     rt_mutex_release(&fslock);
 }
 
+#ifdef DFS_USING_POSIX
 static int fd_alloc(struct dfs_fdtable *fdt, int startfd)
 {
     int idx;
@@ -276,6 +276,8 @@ void fd_put(struct dfs_fd *fd)
     dfs_unlock();
 }
 
+#endif /* DFS_USING_POSIX */
+
 /**
  * @ingroup Fd
  *

+ 2 - 2
components/dfs/src/dfs_file.c

@@ -621,7 +621,7 @@ void cat(const char *filename)
 }
 FINSH_FUNCTION_EXPORT(cat, print file);
 
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
 #define BUF_SZ  4096
 static void copyfile(const char *src, const char *dst)
 {
@@ -843,7 +843,7 @@ void copy(const char *src, const char *dst)
     }
 }
 FINSH_FUNCTION_EXPORT(copy, copy file or dir)
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 
 #endif /* RT_USING_FINSH */
 /* @} */

+ 937 - 0
components/dfs/src/dfs_posix.c

@@ -0,0 +1,937 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2009-05-27     Yi.qiu       The first version
+ * 2018-02-07     Bernard      Change the 3rd parameter of open/fcntl/ioctl to '...'
+ */
+
+#include <dfs_file.h>
+#include <dfs_private.h>
+#include <sys/errno.h>
+
+/**
+ * this function is a POSIX compliant version, which will open a file and
+ * return a file descriptor according specified flags.
+ *
+ * @param file the path name of file.
+ * @param flags the file open flags.
+ *
+ * @return the non-negative integer on successful open, others for failed.
+ */
+int open(const char *file, int flags, ...)
+{
+    int fd, result;
+    struct dfs_fd *d;
+
+    /* allocate a fd */
+    fd = fd_new();
+    if (fd < 0)
+    {
+        rt_set_errno(-ENOMEM);
+
+        return -1;
+    }
+    d = fd_get(fd);
+
+    result = dfs_file_open(d, file, flags);
+    if (result < 0)
+    {
+        /* release the ref-count of fd */
+        fd_put(d);
+        fd_put(d);
+
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    /* release the ref-count of fd */
+    fd_put(d);
+
+    return fd;
+}
+RTM_EXPORT(open);
+
+/**
+ * this function is a POSIX compliant version, which will close the open
+ * file descriptor.
+ *
+ * @param fd the file descriptor.
+ *
+ * @return 0 on successful, -1 on failed.
+ */
+int close(int fd)
+{
+    int result;
+    struct dfs_fd *d;
+
+    d = fd_get(fd);
+    if (d == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return -1;
+    }
+
+    result = dfs_file_close(d);
+    fd_put(d);
+
+    if (result < 0)
+    {
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    fd_put(d);
+
+    return 0;
+}
+RTM_EXPORT(close);
+
+/**
+ * this function is a POSIX compliant version, which will read specified data
+ * buffer length for an open file descriptor.
+ *
+ * @param fd the file descriptor.
+ * @param buf the buffer to save the read data.
+ * @param len the maximal length of data buffer
+ *
+ * @return the actual read data buffer length. If the returned value is 0, it
+ * may be reach the end of file, please check errno.
+ */
+#ifdef _READ_WRITE_RETURN_TYPE
+_READ_WRITE_RETURN_TYPE read(int fd, void *buf, size_t len) /* some gcc tool chains will use different data structure */
+#else
+ssize_t read(int fd, void *buf, size_t len)
+#endif
+{
+    int result;
+    struct dfs_fd *d;
+
+    /* get the fd */
+    d = fd_get(fd);
+    if (d == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return -1;
+    }
+
+    result = dfs_file_read(d, buf, len);
+    if (result < 0)
+    {
+        fd_put(d);
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    /* release the ref-count of fd */
+    fd_put(d);
+
+    return result;
+}
+RTM_EXPORT(read);
+
+/**
+ * this function is a POSIX compliant version, which will write specified data
+ * buffer length for an open file descriptor.
+ *
+ * @param fd the file descriptor
+ * @param buf the data buffer to be written.
+ * @param len the data buffer length.
+ *
+ * @return the actual written data buffer length.
+ */
+#ifdef _READ_WRITE_RETURN_TYPE
+_READ_WRITE_RETURN_TYPE write(int fd, const void *buf, size_t len) /* some gcc tool chains will use different data structure */
+#else
+ssize_t write(int fd, const void *buf, size_t len)
+#endif
+{
+    int result;
+    struct dfs_fd *d;
+
+    /* get the fd */
+    d = fd_get(fd);
+    if (d == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return -1;
+    }
+
+    result = dfs_file_write(d, buf, len);
+    if (result < 0)
+    {
+        fd_put(d);
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    /* release the ref-count of fd */
+    fd_put(d);
+
+    return result;
+}
+RTM_EXPORT(write);
+
+/**
+ * this function is a POSIX compliant version, which will seek the offset for
+ * an open file descriptor.
+ *
+ * @param fd the file descriptor.
+ * @param offset the offset to be seeked.
+ * @param whence the directory of seek.
+ *
+ * @return the current read/write position in the file, or -1 on failed.
+ */
+off_t lseek(int fd, off_t offset, int whence)
+{
+    int result;
+    struct dfs_fd *d;
+
+    d = fd_get(fd);
+    if (d == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return -1;
+    }
+
+    switch (whence)
+    {
+    case SEEK_SET:
+        break;
+
+    case SEEK_CUR:
+        offset += d->pos;
+        break;
+
+    case SEEK_END:
+        offset += d->size;
+        break;
+
+    default:
+        fd_put(d);
+        rt_set_errno(-EINVAL);
+
+        return -1;
+    }
+
+    if (offset < 0)
+    {
+        fd_put(d);
+        rt_set_errno(-EINVAL);
+
+        return -1;
+    }
+    result = dfs_file_lseek(d, offset);
+    if (result < 0)
+    {
+        fd_put(d);
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    /* release the ref-count of fd */
+    fd_put(d);
+
+    return offset;
+}
+RTM_EXPORT(lseek);
+
+#ifndef _WIN32
+/**
+ * this function is a POSIX compliant version, which will rename old file name
+ * to new file name.
+ *
+ * @param old the old file name.
+ * @param new the new file name.
+ *
+ * @return 0 on successful, -1 on failed.
+ *
+ * note: the old and new file name must be belong to a same file system.
+ */
+int rename(const char *old_file, const char *new_file)
+{
+    int result;
+
+    result = dfs_file_rename(old_file, new_file);
+    if (result < 0)
+    {
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    return 0;
+}
+RTM_EXPORT(rename);
+#endif
+
+/**
+ * this function is a POSIX compliant version, which will unlink (remove) a
+ * specified path file from file system.
+ *
+ * @param pathname the specified path name to be unlinked.
+ *
+ * @return 0 on successful, -1 on failed.
+ */
+int unlink(const char *pathname)
+{
+    int result;
+
+    result = dfs_file_unlink(pathname);
+    if (result < 0)
+    {
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    return 0;
+}
+RTM_EXPORT(unlink);
+
+/**
+ * this function is a POSIX compliant version, which will get file information.
+ *
+ * @param file the file name
+ * @param buf the data buffer to save stat description.
+ *
+ * @return 0 on successful, -1 on failed.
+ */
+int stat(const char *file, struct stat *buf)
+{
+    int result;
+
+    result = dfs_file_stat(file, buf);
+    if (result < 0)
+    {
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    return result;
+}
+RTM_EXPORT(stat);
+
+/**
+ * this function is a POSIX compliant version, which will get file status.
+ *
+ * @param fildes the file description
+ * @param buf the data buffer to save stat description.
+ *
+ * @return 0 on successful, -1 on failed.
+ */
+int fstat(int fildes, struct stat *buf)
+{
+    struct dfs_fd *d;
+
+    /* get the fd */
+    d = fd_get(fildes);
+    if (d == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return -1;
+    }
+
+    /* it's the root directory */
+    buf->st_dev = 0;
+
+    buf->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH |
+                   S_IWUSR | S_IWGRP | S_IWOTH;
+    if (d->type == FT_DIRECTORY)
+    {
+        buf->st_mode &= ~S_IFREG;
+        buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
+    }
+
+    buf->st_size    = d->size;
+    buf->st_mtime   = 0;
+
+    fd_put(d);
+
+    return RT_EOK;
+}
+RTM_EXPORT(fstat);
+
+/**
+ * this function is a POSIX compliant version, which shall request that all data
+ * for the open file descriptor named by fildes is to be transferred to the storage
+ * device associated with the file described by fildes.
+ *
+ * @param fildes the file description
+ *
+ * @return 0 on successful completion. Otherwise, -1 shall be returned and errno
+ * set to indicate the error.
+ */
+int fsync(int fildes)
+{
+    int ret;
+    struct dfs_fd *d;
+
+    /* get the fd */
+    d = fd_get(fildes);
+    if (d == NULL)
+    {
+        rt_set_errno(-EBADF);
+        return -1;
+    }
+
+    ret = dfs_file_flush(d);
+
+    fd_put(d);
+    return ret;
+}
+RTM_EXPORT(fsync);
+
+/**
+ * this function is a POSIX compliant version, which shall perform a variety of
+ * control functions on devices.
+ *
+ * @param fildes the file description
+ * @param cmd the specified command
+ * @param data represents the additional information that is needed by this
+ * specific device to perform the requested function.
+ *
+ * @return 0 on successful completion. Otherwise, -1 shall be returned and errno
+ * set to indicate the error.
+ */
+int fcntl(int fildes, int cmd, ...)
+{
+    int ret = -1;
+    struct dfs_fd *d;
+
+    /* get the fd */
+    d = fd_get(fildes);
+    if (d)
+    {
+        void *arg;
+        va_list ap;
+
+        va_start(ap, cmd);
+        arg = va_arg(ap, void *);
+        va_end(ap);
+
+        ret = dfs_file_ioctl(d, cmd, arg);
+        fd_put(d);
+    }
+    else ret = -EBADF;
+
+    if (ret < 0)
+    {
+        rt_set_errno(ret);
+        ret = -1;
+    }
+
+    return ret;
+}
+RTM_EXPORT(fcntl);
+
+/**
+ * this function is a POSIX compliant version, which shall perform a variety of
+ * control functions on devices.
+ *
+ * @param fildes the file description
+ * @param cmd the specified command
+ * @param data represents the additional information that is needed by this
+ * specific device to perform the requested function.
+ *
+ * @return 0 on successful completion. Otherwise, -1 shall be returned and errno
+ * set to indicate the error.
+ */
+int ioctl(int fildes, int cmd, ...)
+{
+    void *arg;
+    va_list ap;
+
+    va_start(ap, cmd);
+    arg = va_arg(ap, void *);
+    va_end(ap);
+
+    /* we use fcntl for this API. */
+    return fcntl(fildes, cmd, arg);
+}
+RTM_EXPORT(ioctl);
+
+/**
+ *
+ * this function is a POSIX compliant version, which cause the regular file
+ * referenced by fd to be truncated to a size of precisely length bytes.
+ * @param fd the file descriptor.
+ * @param length the length to be truncated.
+ *
+ * @return Upon successful completion, ftruncate() shall return 0;
+ * otherwise, -1 shall be returned and errno set to indicate the error.
+ */
+int ftruncate(int fd, off_t length)
+{
+    int result;
+    struct dfs_fd *d;
+
+    d = fd_get(fd);
+    if (d == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return -1;
+    }
+
+    if (length < 0)
+    {
+        fd_put(d);
+        rt_set_errno(-EINVAL);
+
+        return -1;
+    }
+    result = dfs_file_ftruncate(d, length);
+    if (result < 0)
+    {
+        fd_put(d);
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    /* release the ref-count of fd */
+    fd_put(d);
+
+    return 0;
+}
+RTM_EXPORT(ftruncate);
+
+/**
+ * this function is a POSIX compliant version, which will return the
+ * information about a mounted file system.
+ *
+ * @param path the path which mounted file system.
+ * @param buf the buffer to save the returned information.
+ *
+ * @return 0 on successful, others on failed.
+ */
+int statfs(const char *path, struct statfs *buf)
+{
+    int result;
+
+    result = dfs_statfs(path, buf);
+    if (result < 0)
+    {
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    return result;
+}
+RTM_EXPORT(statfs);
+
+/**
+ * this function is a POSIX compliant version, which will make a directory
+ *
+ * @param path the directory path to be made.
+ * @param mode
+ *
+ * @return 0 on successful, others on failed.
+ */
+int mkdir(const char *path, mode_t mode)
+{
+    int fd;
+    struct dfs_fd *d;
+    int result;
+
+    fd = fd_new();
+    if (fd == -1)
+    {
+        rt_set_errno(-ENOMEM);
+
+        return -1;
+    }
+
+    d = fd_get(fd);
+
+    result = dfs_file_open(d, path, O_DIRECTORY | O_CREAT);
+
+    if (result < 0)
+    {
+        fd_put(d);
+        fd_put(d);
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    dfs_file_close(d);
+    fd_put(d);
+    fd_put(d);
+
+    return 0;
+}
+RTM_EXPORT(mkdir);
+
+/**
+ * this function is a POSIX compliant version, which will remove a directory.
+ *
+ * @param pathname the path name to be removed.
+ *
+ * @return 0 on successful, others on failed.
+ */
+int rmdir(const char *pathname)
+{
+    int result;
+
+    result = dfs_file_unlink(pathname);
+    if (result < 0)
+    {
+        rt_set_errno(result);
+
+        return -1;
+    }
+
+    return 0;
+}
+RTM_EXPORT(rmdir);
+
+/**
+ * this function is a POSIX compliant version, which will open a directory.
+ *
+ * @param name the path name to be open.
+ *
+ * @return the DIR pointer of directory, NULL on open directory failed.
+ */
+DIR *opendir(const char *name)
+{
+    struct dfs_fd *d;
+    int fd, result;
+    DIR *t;
+
+    t = NULL;
+
+    /* allocate a fd */
+    fd = fd_new();
+    if (fd == -1)
+    {
+        rt_set_errno(-ENOMEM);
+
+        return NULL;
+    }
+    d = fd_get(fd);
+
+    result = dfs_file_open(d, name, O_RDONLY | O_DIRECTORY);
+    if (result >= 0)
+    {
+        /* open successfully */
+        t = (DIR *) rt_malloc(sizeof(DIR));
+        if (t == NULL)
+        {
+            dfs_file_close(d);
+            fd_put(d);
+        }
+        else
+        {
+            memset(t, 0, sizeof(DIR));
+
+            t->fd = fd;
+        }
+        fd_put(d);
+
+        return t;
+    }
+
+    /* open failed */
+    fd_put(d);
+    fd_put(d);
+    rt_set_errno(result);
+
+    return NULL;
+}
+RTM_EXPORT(opendir);
+
+/**
+ * this function is a POSIX compliant version, which will return a pointer
+ * to a dirent structure representing the next directory entry in the
+ * directory stream.
+ *
+ * @param d the directory stream pointer.
+ *
+ * @return the next directory entry, NULL on the end of directory or failed.
+ */
+struct dirent *readdir(DIR *d)
+{
+    int result;
+    struct dfs_fd *fd;
+
+    fd = fd_get(d->fd);
+    if (fd == NULL)
+    {
+        rt_set_errno(-EBADF);
+        return NULL;
+    }
+
+    if (d->num)
+    {
+        struct dirent *dirent_ptr;
+        dirent_ptr = (struct dirent *)&d->buf[d->cur];
+        d->cur += dirent_ptr->d_reclen;
+    }
+
+    if (!d->num || d->cur >= d->num)
+    {
+        /* get a new entry */
+        result = dfs_file_getdents(fd,
+                                   (struct dirent *)d->buf,
+                                   sizeof(d->buf) - 1);
+        if (result <= 0)
+        {
+            fd_put(fd);
+            rt_set_errno(result);
+
+            return NULL;
+        }
+
+        d->num = result;
+        d->cur = 0; /* current entry index */
+    }
+
+    fd_put(fd);
+
+    return (struct dirent *)(d->buf + d->cur);
+}
+RTM_EXPORT(readdir);
+
+/**
+ * this function is a POSIX compliant version, which will return current
+ * location in directory stream.
+ *
+ * @param d the directory stream pointer.
+ *
+ * @return the current location in directory stream.
+ */
+long telldir(DIR *d)
+{
+    struct dfs_fd *fd;
+    long result;
+
+    fd = fd_get(d->fd);
+    if (fd == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return 0;
+    }
+
+    result = fd->pos - d->num + d->cur;
+    fd_put(fd);
+
+    return result;
+}
+RTM_EXPORT(telldir);
+
+/**
+ * this function is a POSIX compliant version, which will set position of
+ * next directory structure in the directory stream.
+ *
+ * @param d the directory stream.
+ * @param offset the offset in directory stream.
+ */
+void seekdir(DIR *d, off_t offset)
+{
+    struct dfs_fd *fd;
+
+    fd = fd_get(d->fd);
+    if (fd == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return ;
+    }
+
+    /* seek to the offset position of directory */
+    if (dfs_file_lseek(fd, offset) >= 0)
+        d->num = d->cur = 0;
+    fd_put(fd);
+}
+RTM_EXPORT(seekdir);
+
+/**
+ * this function is a POSIX compliant version, which will reset directory
+ * stream.
+ *
+ * @param d the directory stream.
+ */
+void rewinddir(DIR *d)
+{
+    struct dfs_fd *fd;
+
+    fd = fd_get(d->fd);
+    if (fd == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return ;
+    }
+
+    /* seek to the beginning of directory */
+    if (dfs_file_lseek(fd, 0) >= 0)
+        d->num = d->cur = 0;
+    fd_put(fd);
+}
+RTM_EXPORT(rewinddir);
+
+/**
+ * this function is a POSIX compliant version, which will close a directory
+ * stream.
+ *
+ * @param d the directory stream.
+ *
+ * @return 0 on successful, -1 on failed.
+ */
+int closedir(DIR *d)
+{
+    int result;
+    struct dfs_fd *fd;
+
+    fd = fd_get(d->fd);
+    if (fd == NULL)
+    {
+        rt_set_errno(-EBADF);
+
+        return -1;
+    }
+
+    result = dfs_file_close(fd);
+    fd_put(fd);
+
+    fd_put(fd);
+    rt_free(d);
+
+    if (result < 0)
+    {
+        rt_set_errno(result);
+
+        return -1;
+    }
+    else
+        return 0;
+}
+RTM_EXPORT(closedir);
+
+#ifdef DFS_USING_WORKDIR
+/**
+ * this function is a POSIX compliant version, which will change working
+ * directory.
+ *
+ * @param path the path name to be changed to.
+ *
+ * @return 0 on successful, -1 on failed.
+ */
+int chdir(const char *path)
+{
+    char *fullpath;
+    DIR *d;
+
+    if (path == NULL)
+    {
+        dfs_lock();
+        rt_kprintf("%s\n", working_directory);
+        dfs_unlock();
+
+        return 0;
+    }
+
+    if (strlen(path) > DFS_PATH_MAX)
+    {
+        rt_set_errno(-ENOTDIR);
+
+        return -1;
+    }
+
+    fullpath = dfs_normalize_path(NULL, path);
+    if (fullpath == NULL)
+    {
+        rt_set_errno(-ENOTDIR);
+
+        return -1; /* build path failed */
+    }
+
+    dfs_lock();
+    d = opendir(fullpath);
+    if (d == NULL)
+    {
+        rt_free(fullpath);
+        /* this is a not exist directory */
+        dfs_unlock();
+
+        return -1;
+    }
+
+    /* close directory stream */
+    closedir(d);
+
+    /* copy full path to working directory */
+    strncpy(working_directory, fullpath, DFS_PATH_MAX);
+    /* release normalize directory path name */
+    rt_free(fullpath);
+
+    dfs_unlock();
+
+    return 0;
+}
+RTM_EXPORT(chdir);
+
+#ifdef RT_USING_FINSH
+FINSH_FUNCTION_EXPORT_ALIAS(chdir, cd, change current working directory);
+#endif
+#endif
+
+/**
+ * this function is a POSIX compliant version, which shall check the file named
+ * by the pathname pointed to by the path argument for accessibility according
+ * to the bit pattern contained in amode.
+ *
+ * @param path the specified file/dir path.
+ * @param amode the value is either the bitwise-inclusive OR of the access
+ * permissions to be checked (R_OK, W_OK, X_OK) or the existence test (F_OK).
+ */
+int access(const char *path, int amode)
+{
+    struct stat sb;
+    if (stat(path, &sb) < 0)
+        return -1; /* already sets errno */
+
+    /* ignore R_OK,W_OK,X_OK condition */
+    return 0;
+}
+
+/**
+ * this function is a POSIX compliant version, which will return current
+ * working directory.
+ *
+ * @param buf the returned current directory.
+ * @param size the buffer size.
+ *
+ * @return the returned current directory.
+ */
+char *getcwd(char *buf, size_t size)
+{
+#ifdef DFS_USING_WORKDIR
+    dfs_lock();
+    strncpy(buf, working_directory, size);
+    dfs_unlock();
+#else
+    rt_kprintf(NO_WORKING_DIR);
+#endif
+
+    return buf;
+}
+RTM_EXPORT(getcwd);

+ 1 - 1
components/finsh/SConscript

@@ -9,7 +9,7 @@ msh.c
 if GetDepend('MSH_USING_BUILT_IN_COMMANDS'):
     src += ['cmd.c']
 
-if GetDepend('RT_USING_POSIX'):
+if GetDepend('DFS_USING_POSIX'):
     src += ['msh_file.c']
 
 CPPPATH = [cwd]

+ 17 - 19
components/finsh/msh.c

@@ -15,19 +15,17 @@
 #ifdef RT_USING_FINSH
 
 #ifndef FINSH_ARG_MAX
-    #define FINSH_ARG_MAX    8
-#endif
+#define FINSH_ARG_MAX    8
+#endif /* FINSH_ARG_MAX */
 
 #include "msh.h"
 #include "shell.h"
-
-#ifdef RT_USING_POSIX
-    #include <dfs_posix.h>
-#endif
-
+#ifdef DFS_USING_POSIX
+#include <dfs_posix.h>
+#endif /* DFS_USING_POSIX */
 #ifdef RT_USING_MODULE
-    #include <dlmodule.h>
-#endif
+#include <dlmodule.h>
+#endif /* RT_USING_MODULE */
 
 typedef int (*cmd_function_t)(int argc, char **argv);
 
@@ -186,7 +184,7 @@ static cmd_function_t msh_get_cmd(char *cmd, int size)
     return cmd_func;
 }
 
-#if defined(RT_USING_MODULE) && defined(RT_USING_POSIX)
+#if defined(RT_USING_MODULE) && defined(DFS_USING_POSIX)
 /* Return 0 on module executed. Other value indicate error.
  */
 int msh_exec_module(const char *cmd_line, int size)
@@ -257,7 +255,7 @@ int msh_exec_module(const char *cmd_line, int size)
     rt_free(pg_name);
     return ret;
 }
-#endif /* defined(RT_USING_MODULE) && defined(RT_USING_POSIX) */
+#endif /* defined(RT_USING_MODULE) && defined(DFS_USING_POSIX) */
 
 static int _msh_exec_cmd(char *cmd, rt_size_t length, int *retp)
 {
@@ -290,7 +288,7 @@ static int _msh_exec_cmd(char *cmd, rt_size_t length, int *retp)
     return 0;
 }
 
-#if defined(RT_USING_LWP) && defined(RT_USING_POSIX)
+#if defined(RT_USING_LWP) && defined(DFS_USING_POSIX)
 static int _msh_exec_lwp(char *cmd, rt_size_t length)
 {
     int argc;
@@ -326,7 +324,7 @@ static int _msh_exec_lwp(char *cmd, rt_size_t length)
 
     return 0;
 }
-#endif /* defined(RT_USING_LWP) && defined(RT_USING_DFS) */
+#endif /* defined(RT_USING_LWP) && defined(DFS_USING_POSIX) */
 
 int msh_exec(char *cmd, rt_size_t length)
 {
@@ -350,7 +348,7 @@ int msh_exec(char *cmd, rt_size_t length)
     {
         return cmd_ret;
     }
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
 #ifdef DFS_USING_WORKDIR
     if (msh_exec_script(cmd, length) == 0)
     {
@@ -371,7 +369,7 @@ int msh_exec(char *cmd, rt_size_t length)
         return 0;
     }
 #endif /* RT_USING_LWP */
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 
     /* truncate the cmd at the first space. */
     {
@@ -400,7 +398,7 @@ static int str_common(const char *str1, const char *str2)
     return (str - str1);
 }
 
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
 void msh_auto_complete_path(char *path)
 {
     DIR *dir = RT_NULL;
@@ -521,7 +519,7 @@ void msh_auto_complete_path(char *path)
     closedir(dir);
     rt_free(full_path);
 }
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 
 void msh_auto_complete(char *prefix)
 {
@@ -538,7 +536,7 @@ void msh_auto_complete(char *prefix)
         return;
     }
 
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     /* check whether a spare in the command */
     {
         char *ptr;
@@ -564,7 +562,7 @@ void msh_auto_complete(char *prefix)
         }
 #endif /* RT_USING_MODULE */
     }
-#endif /* RT_USING_DFS */
+#endif /* DFS_USING_POSIX */
 
     /* checks in internal command */
     {

+ 2 - 3
components/finsh/msh_file.c

@@ -11,7 +11,7 @@
 
 #include <rtthread.h>
 
-#if defined(RT_USING_FINSH) && defined(RT_USING_POSIX)
+#if defined(RT_USING_FINSH) && defined(DFS_USING_POSIX)
 
 #include <finsh.h>
 #include "msh.h"
@@ -702,5 +702,4 @@ static int cmd_tail(int argc, char **argv)
 }
 MSH_CMD_EXPORT_ALIAS(cmd_tail, tail, print the last N - lines data of the given file);
 
-#endif /* defined(RT_USING_FINSH) && defined(RT_USING_POSIX) */
-
+#endif /* defined(RT_USING_FINSH) && defined(DFS_USING_POSIX) */

+ 3 - 3
components/finsh/shell.c

@@ -27,9 +27,9 @@
 #include "shell.h"
 #include "msh.h"
 
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
 #include <dfs_posix.h>
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 
 /* finsh thread */
 #ifndef RT_USING_HEAP
@@ -104,7 +104,7 @@ const char *finsh_get_prompt(void)
     }
     strcpy(finsh_prompt, _MSH_PROMPT);
 
-#if defined(RT_USING_POSIX) && defined(DFS_USING_WORKDIR)
+#if defined(DFS_USING_POSIX) && defined(DFS_USING_WORKDIR)
     /* get current working directory */
     getcwd(&finsh_prompt[rt_strlen(finsh_prompt)], RT_CONSOLEBUF_SIZE - rt_strlen(finsh_prompt));
 #endif

+ 19 - 19
components/libc/compilers/armlibc/syscalls.c

@@ -33,7 +33,7 @@
 __asm(".global __use_no_semihosting\n\t");
 #else
 #pragma import(__use_no_semihosting_swi)
-#endif
+#endif /* __CLANG_ARM */
 
 /* Standard IO device handles. */
 #define STDIN       0
@@ -55,10 +55,10 @@ const char __stderr_name[] = "STDERR";
  */
 FILEHANDLE _sys_open(const char *name, int openmode)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int fd;
     int mode = O_RDONLY;
-#endif
+#endif /* DFS_USING_POSIX */
 
     /* Register standard Input Output devices. */
     if (strcmp(name, __stdin_name) == 0)
@@ -68,7 +68,7 @@ FILEHANDLE _sys_open(const char *name, int openmode)
     if (strcmp(name, __stderr_name) == 0)
         return (STDERR);
 
-#ifndef RT_USING_POSIX
+#ifndef DFS_USING_POSIX
     return 0; /* error */
 #else
     /* Correct openmode from fopen to open */
@@ -102,19 +102,19 @@ FILEHANDLE _sys_open(const char *name, int openmode)
         return 0; /* error */
     else
         return fd;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 int _sys_close(FILEHANDLE fh)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     if (fh <= STDERR)
         return 0; /* error */
 
     return close(fh);
 #else
     return 0;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 /*
@@ -144,7 +144,7 @@ int _sys_close(FILEHANDLE fh)
  */
 int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int size;
 
     if (fh == STDIN)
@@ -175,7 +175,7 @@ int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode)
     }
 #else
     return 0; /* error */
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 /*
@@ -189,9 +189,9 @@ int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode)
  */
 int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int size;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 
     if (fh == STDOUT || fh == STDERR)
     {
@@ -213,7 +213,7 @@ int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
     }
     else
     {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
         size = write(fh, buf, len);
         if (size >= 0)
             return 0; /* success */
@@ -221,7 +221,7 @@ int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
             return 0; /* error */
 #else
         return 0; /* error */
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
     }
 }
 
@@ -231,7 +231,7 @@ int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)
  */
 int _sys_seek(FILEHANDLE fh, long pos)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     if (fh < STDERR)
         return 0; /* error */
 
@@ -239,7 +239,7 @@ int _sys_seek(FILEHANDLE fh, long pos)
     return lseek(fh, pos, 0);
 #else
     return 0; /* error */
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 /**
@@ -284,7 +284,7 @@ RT_WEAK void _sys_exit(int return_code)
  */
 long _sys_flen(FILEHANDLE fh)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     struct stat stat;
 
     if (fh < STDERR)
@@ -294,7 +294,7 @@ long _sys_flen(FILEHANDLE fh)
     return stat.st_size;
 #else
     return 0;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 int _sys_istty(FILEHANDLE fh)
@@ -307,11 +307,11 @@ int _sys_istty(FILEHANDLE fh)
 
 int remove(const char *filename)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     return unlink(filename);
 #else
     return 0; /* error */
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 #ifdef __MICROLIB

+ 1 - 1
components/libc/compilers/dlib/SConscript

@@ -7,7 +7,7 @@ group = []
 CPPDEFINES = ['RT_USING_DLIBC']
 
 if rtconfig.PLATFORM == 'iar':
-    if GetDepend('RT_USING_POSIX'):
+    if GetDepend('DFS_USING_POSIX'):
         from distutils.version import LooseVersion
         from iar import IARVersion
 

+ 2 - 2
components/libc/compilers/dlib/syscall_close.c

@@ -24,9 +24,9 @@ int __close(int handle)
         handle == _LLIO_STDERR ||
         handle == _LLIO_STDIN)
         return _LLIO_ERROR;
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     return close(handle);
 #else
     return _LLIO_ERROR;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }

+ 2 - 2
components/libc/compilers/dlib/syscall_lseek.c

@@ -33,9 +33,9 @@ long __lseek(int handle, long offset, int whence)
         handle == _LLIO_STDERR ||
         handle == _LLIO_STDIN)
         return _LLIO_ERROR;
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     return lseek(handle, offset, whence);
 #else
     return _LLIO_ERROR;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }

+ 2 - 2
components/libc/compilers/dlib/syscall_open.c

@@ -21,7 +21,7 @@
 
 int __open(const char *filename, int mode)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
   int handle;
   int open_mode = O_RDONLY;
 
@@ -73,5 +73,5 @@ int __open(const char *filename, int mode)
   return handle;
 #else
   return _LLIO_ERROR;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }

+ 2 - 2
components/libc/compilers/dlib/syscall_read.c

@@ -34,7 +34,7 @@
 
 size_t __read(int handle, unsigned char *buf, size_t len)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int size;
 
     if (handle == _LLIO_STDIN)
@@ -59,5 +59,5 @@ size_t __read(int handle, unsigned char *buf, size_t len)
     return size; /* return the length of the data read */
 #else
     return _LLIO_ERROR;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }

+ 2 - 2
components/libc/compilers/dlib/syscall_remove.c

@@ -20,9 +20,9 @@
 
 int remove(const char *filename)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     return unlink(filename);
 #else
     return _LLIO_ERROR;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }

+ 4 - 4
components/libc/compilers/dlib/syscall_write.c

@@ -37,9 +37,9 @@
 
 size_t __write(int handle, const unsigned char *buf, size_t len)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int size;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 
     if ((handle == _LLIO_STDOUT) || (handle == _LLIO_STDERR))
     {
@@ -63,11 +63,11 @@ size_t __write(int handle, const unsigned char *buf, size_t len)
     }
     else
     {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
         size = write(handle, buf, len);
         return size; /* return the length of the data written */
 #else
         return _LLIO_ERROR;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
     }
 }

+ 20 - 20
components/libc/compilers/gcc/newlib/syscalls.c

@@ -109,12 +109,12 @@ int _getpid_r(struct _reent *ptr)
 
 int _close_r(struct _reent *ptr, int fd)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     return close(fd);
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif
+#endif /* DFS_USING_POSIX */
 }
 
 int _execve_r(struct _reent *ptr, const char * name, char *const *argv, char *const *env)
@@ -183,7 +183,7 @@ int flock(int fd, int operation)
 
 _off_t _lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     _off_t rc;
 
     rc = lseek(fd, pos, whence);
@@ -191,12 +191,12 @@ _off_t _lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence)
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 int _mkdir_r(struct _reent *ptr, const char *name, int mode)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int rc;
 
     rc = mkdir(name, mode);
@@ -204,24 +204,24 @@ int _mkdir_r(struct _reent *ptr, const char *name, int mode)
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 int _open_r(struct _reent *ptr, const char *file, int flags, int mode)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int rc;
     rc = open(file, flags, mode);
     return rc;
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 _ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     _ssize_t rc;
     if (fd == STDIN_FILENO)
     {
@@ -247,12 +247,12 @@ _ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes)
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 int _rename_r(struct _reent *ptr, const char *old, const char *new)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int rc;
 
     rc = rename(old, new);
@@ -260,12 +260,12 @@ int _rename_r(struct _reent *ptr, const char *old, const char *new)
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 int _stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     int rc;
 
     rc = stat(file, pstat);
@@ -273,24 +273,24 @@ int _stat_r(struct _reent *ptr, const char *file, struct stat *pstat)
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 int _unlink_r(struct _reent *ptr, const char *file)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     return unlink(file);
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 _ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
 {
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     _ssize_t rc;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 
     if (fd == STDOUT_FILENO || fd == STDERR_FILENO)
     {
@@ -311,13 +311,13 @@ _ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
         return -1;
     }
 
-#ifdef RT_USING_POSIX
+#ifdef DFS_USING_POSIX
     rc = write(fd, buf, nbytes);
     return rc;
 #else
     ptr->_errno = ENOTSUP;
     return -1;
-#endif /* RT_USING_POSIX */
+#endif /* DFS_USING_POSIX */
 }
 
 /* for exit() and abort() */

+ 1 - 926
components/libc/posix/src/unistd.c

@@ -8,935 +8,10 @@
  * 2020-09-01     Meco Man     first Version
  * 2021-02-12     Meco Man     move all functions located in <pthread_sleep.c> to this file
  */
+
 #include <rtthread.h>
-#include <dfs_file.h>
-#include <dfs_private.h>
-#include <sys/errno.h>
 #include <unistd.h>
 
-/**
- * this function is a POSIX compliant version, which will open a file and
- * return a file descriptor according specified flags.
- *
- * @param file the path name of file.
- * @param flags the file open flags.
- *
- * @return the non-negative integer on successful open, others for failed.
- */
-int open(const char *file, int flags, ...)
-{
-    int fd, result;
-    struct dfs_fd *d;
-
-    /* allocate a fd */
-    fd = fd_new();
-    if (fd < 0)
-    {
-        rt_set_errno(-ENOMEM);
-
-        return -1;
-    }
-    d = fd_get(fd);
-
-    result = dfs_file_open(d, file, flags);
-    if (result < 0)
-    {
-        /* release the ref-count of fd */
-        fd_put(d);
-        fd_put(d);
-
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    /* release the ref-count of fd */
-    fd_put(d);
-
-    return fd;
-}
-RTM_EXPORT(open);
-
-/**
- * this function is a POSIX compliant version, which will close the open
- * file descriptor.
- *
- * @param fd the file descriptor.
- *
- * @return 0 on successful, -1 on failed.
- */
-int close(int fd)
-{
-    int result;
-    struct dfs_fd *d;
-
-    d = fd_get(fd);
-    if (d == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return -1;
-    }
-
-    result = dfs_file_close(d);
-    fd_put(d);
-
-    if (result < 0)
-    {
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    fd_put(d);
-
-    return 0;
-}
-RTM_EXPORT(close);
-
-/**
- * this function is a POSIX compliant version, which will read specified data
- * buffer length for an open file descriptor.
- *
- * @param fd the file descriptor.
- * @param buf the buffer to save the read data.
- * @param len the maximal length of data buffer
- *
- * @return the actual read data buffer length. If the returned value is 0, it
- * may be reach the end of file, please check errno.
- */
-#ifdef _READ_WRITE_RETURN_TYPE
-_READ_WRITE_RETURN_TYPE read(int fd, void *buf, size_t len) /* some gcc tool chains will use different data structure */
-#else
-ssize_t read(int fd, void *buf, size_t len)
-#endif
-{
-    int result;
-    struct dfs_fd *d;
-
-    /* get the fd */
-    d = fd_get(fd);
-    if (d == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return -1;
-    }
-
-    result = dfs_file_read(d, buf, len);
-    if (result < 0)
-    {
-        fd_put(d);
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    /* release the ref-count of fd */
-    fd_put(d);
-
-    return result;
-}
-RTM_EXPORT(read);
-
-/**
- * this function is a POSIX compliant version, which will write specified data
- * buffer length for an open file descriptor.
- *
- * @param fd the file descriptor
- * @param buf the data buffer to be written.
- * @param len the data buffer length.
- *
- * @return the actual written data buffer length.
- */
-#ifdef _READ_WRITE_RETURN_TYPE
-_READ_WRITE_RETURN_TYPE write(int fd, const void *buf, size_t len) /* some gcc tool chains will use different data structure */
-#else
-ssize_t write(int fd, const void *buf, size_t len)
-#endif
-{
-    int result;
-    struct dfs_fd *d;
-
-    /* get the fd */
-    d = fd_get(fd);
-    if (d == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return -1;
-    }
-
-    result = dfs_file_write(d, buf, len);
-    if (result < 0)
-    {
-        fd_put(d);
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    /* release the ref-count of fd */
-    fd_put(d);
-
-    return result;
-}
-RTM_EXPORT(write);
-
-/**
- * this function is a POSIX compliant version, which will seek the offset for
- * an open file descriptor.
- *
- * @param fd the file descriptor.
- * @param offset the offset to be seeked.
- * @param whence the directory of seek.
- *
- * @return the current read/write position in the file, or -1 on failed.
- */
-off_t lseek(int fd, off_t offset, int whence)
-{
-    int result;
-    struct dfs_fd *d;
-
-    d = fd_get(fd);
-    if (d == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return -1;
-    }
-
-    switch (whence)
-    {
-    case SEEK_SET:
-        break;
-
-    case SEEK_CUR:
-        offset += d->pos;
-        break;
-
-    case SEEK_END:
-        offset += d->size;
-        break;
-
-    default:
-        fd_put(d);
-        rt_set_errno(-EINVAL);
-
-        return -1;
-    }
-
-    if (offset < 0)
-    {
-        fd_put(d);
-        rt_set_errno(-EINVAL);
-
-        return -1;
-    }
-    result = dfs_file_lseek(d, offset);
-    if (result < 0)
-    {
-        fd_put(d);
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    /* release the ref-count of fd */
-    fd_put(d);
-
-    return offset;
-}
-RTM_EXPORT(lseek);
-
-#ifndef _WIN32 /* we can not implement these functions */
-/**
- * this function is a POSIX compliant version, which will rename old file name
- * to new file name.
- *
- * @param old the old file name.
- * @param new the new file name.
- *
- * @return 0 on successful, -1 on failed.
- *
- * note: the old and new file name must be belong to a same file system.
- */
-int rename(const char *old_file, const char *new_file)
-{
-    int result;
-
-    result = dfs_file_rename(old_file, new_file);
-    if (result < 0)
-    {
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    return 0;
-}
-RTM_EXPORT(rename);
-#endif
-
-/**
- * this function is a POSIX compliant version, which will unlink (remove) a
- * specified path file from file system.
- *
- * @param pathname the specified path name to be unlinked.
- *
- * @return 0 on successful, -1 on failed.
- */
-int unlink(const char *pathname)
-{
-    int result;
-
-    result = dfs_file_unlink(pathname);
-    if (result < 0)
-    {
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    return 0;
-}
-RTM_EXPORT(unlink);
-
-/**
- * this function is a POSIX compliant version, which will get file information.
- *
- * @param file the file name
- * @param buf the data buffer to save stat description.
- *
- * @return 0 on successful, -1 on failed.
- */
-int stat(const char *file, struct stat *buf)
-{
-    int result;
-
-    result = dfs_file_stat(file, buf);
-    if (result < 0)
-    {
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    return result;
-}
-RTM_EXPORT(stat);
-
-/**
- * this function is a POSIX compliant version, which will get file status.
- *
- * @param fildes the file description
- * @param buf the data buffer to save stat description.
- *
- * @return 0 on successful, -1 on failed.
- */
-int fstat(int fildes, struct stat *buf)
-{
-    struct dfs_fd *d;
-
-    /* get the fd */
-    d = fd_get(fildes);
-    if (d == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return -1;
-    }
-
-    /* it's the root directory */
-    buf->st_dev = 0;
-
-    buf->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH |
-                   S_IWUSR | S_IWGRP | S_IWOTH;
-    if (d->type == FT_DIRECTORY)
-    {
-        buf->st_mode &= ~S_IFREG;
-        buf->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
-    }
-
-    buf->st_size    = d->size;
-    buf->st_mtime   = 0;
-
-    fd_put(d);
-
-    return RT_EOK;
-}
-RTM_EXPORT(fstat);
-
-/**
- * this function is a POSIX compliant version, which shall request that all data
- * for the open file descriptor named by fildes is to be transferred to the storage
- * device associated with the file described by fildes.
- *
- * @param fildes the file description
- *
- * @return 0 on successful completion. Otherwise, -1 shall be returned and errno
- * set to indicate the error.
- */
-int fsync(int fildes)
-{
-    int ret;
-    struct dfs_fd *d;
-
-    /* get the fd */
-    d = fd_get(fildes);
-    if (d == NULL)
-    {
-        rt_set_errno(-EBADF);
-        return -1;
-    }
-
-    ret = dfs_file_flush(d);
-
-    fd_put(d);
-    return ret;
-}
-RTM_EXPORT(fsync);
-
-/**
- * this function is a POSIX compliant version, which shall perform a variety of
- * control functions on devices.
- *
- * @param fildes the file description
- * @param cmd the specified command
- * @param data represents the additional information that is needed by this
- * specific device to perform the requested function.
- *
- * @return 0 on successful completion. Otherwise, -1 shall be returned and errno
- * set to indicate the error.
- */
-int fcntl(int fildes, int cmd, ...)
-{
-    int ret = -1;
-    struct dfs_fd *d;
-
-    /* get the fd */
-    d = fd_get(fildes);
-    if (d)
-    {
-        void *arg;
-        va_list ap;
-
-        va_start(ap, cmd);
-        arg = va_arg(ap, void *);
-        va_end(ap);
-
-        ret = dfs_file_ioctl(d, cmd, arg);
-        fd_put(d);
-    }
-    else ret = -EBADF;
-
-    if (ret < 0)
-    {
-        rt_set_errno(ret);
-        ret = -1;
-    }
-
-    return ret;
-}
-RTM_EXPORT(fcntl);
-
-/**
- * this function is a POSIX compliant version, which shall perform a variety of
- * control functions on devices.
- *
- * @param fildes the file description
- * @param cmd the specified command
- * @param data represents the additional information that is needed by this
- * specific device to perform the requested function.
- *
- * @return 0 on successful completion. Otherwise, -1 shall be returned and errno
- * set to indicate the error.
- */
-int ioctl(int fildes, int cmd, ...)
-{
-    void *arg;
-    va_list ap;
-
-    va_start(ap, cmd);
-    arg = va_arg(ap, void *);
-    va_end(ap);
-
-    /* we use fcntl for this API. */
-    return fcntl(fildes, cmd, arg);
-}
-RTM_EXPORT(ioctl);
-
-/**
- *
- * this function is a POSIX compliant version, which cause the regular file
- * referenced by fd to be truncated to a size of precisely length bytes.
- * @param fd the file descriptor.
- * @param length the length to be truncated.
- *
- * @return Upon successful completion, ftruncate() shall return 0;
- * otherwise, -1 shall be returned and errno set to indicate the error.
- */
-int ftruncate(int fd, off_t length)
-{
-    int result;
-    struct dfs_fd *d;
-
-    d = fd_get(fd);
-    if (d == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return -1;
-    }
-
-    if (length < 0)
-    {
-        fd_put(d);
-        rt_set_errno(-EINVAL);
-
-        return -1;
-    }
-    result = dfs_file_ftruncate(d, length);
-    if (result < 0)
-    {
-        fd_put(d);
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    /* release the ref-count of fd */
-    fd_put(d);
-
-    return 0;
-}
-RTM_EXPORT(ftruncate);
-
-/**
- * this function is a POSIX compliant version, which will return the
- * information about a mounted file system.
- *
- * @param path the path which mounted file system.
- * @param buf the buffer to save the returned information.
- *
- * @return 0 on successful, others on failed.
- */
-int statfs(const char *path, struct statfs *buf)
-{
-    int result;
-
-    result = dfs_statfs(path, buf);
-    if (result < 0)
-    {
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    return result;
-}
-RTM_EXPORT(statfs);
-
-/**
- * this function is a POSIX compliant version, which will make a directory
- *
- * @param path the directory path to be made.
- * @param mode
- *
- * @return 0 on successful, others on failed.
- */
-int mkdir(const char *path, mode_t mode)
-{
-    int fd;
-    struct dfs_fd *d;
-    int result;
-
-    fd = fd_new();
-    if (fd == -1)
-    {
-        rt_set_errno(-ENOMEM);
-
-        return -1;
-    }
-
-    d = fd_get(fd);
-
-    result = dfs_file_open(d, path, O_DIRECTORY | O_CREAT);
-
-    if (result < 0)
-    {
-        fd_put(d);
-        fd_put(d);
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    dfs_file_close(d);
-    fd_put(d);
-    fd_put(d);
-
-    return 0;
-}
-RTM_EXPORT(mkdir);
-
-/**
- * this function is a POSIX compliant version, which will remove a directory.
- *
- * @param pathname the path name to be removed.
- *
- * @return 0 on successful, others on failed.
- */
-int rmdir(const char *pathname)
-{
-    int result;
-
-    result = dfs_file_unlink(pathname);
-    if (result < 0)
-    {
-        rt_set_errno(result);
-
-        return -1;
-    }
-
-    return 0;
-}
-RTM_EXPORT(rmdir);
-
-/**
- * this function is a POSIX compliant version, which will open a directory.
- *
- * @param name the path name to be open.
- *
- * @return the DIR pointer of directory, NULL on open directory failed.
- */
-DIR *opendir(const char *name)
-{
-    struct dfs_fd *d;
-    int fd, result;
-    DIR *t;
-
-    t = NULL;
-
-    /* allocate a fd */
-    fd = fd_new();
-    if (fd == -1)
-    {
-        rt_set_errno(-ENOMEM);
-
-        return NULL;
-    }
-    d = fd_get(fd);
-
-    result = dfs_file_open(d, name, O_RDONLY | O_DIRECTORY);
-    if (result >= 0)
-    {
-        /* open successfully */
-        t = (DIR *) rt_malloc(sizeof(DIR));
-        if (t == NULL)
-        {
-            dfs_file_close(d);
-            fd_put(d);
-        }
-        else
-        {
-            memset(t, 0, sizeof(DIR));
-
-            t->fd = fd;
-        }
-        fd_put(d);
-
-        return t;
-    }
-
-    /* open failed */
-    fd_put(d);
-    fd_put(d);
-    rt_set_errno(result);
-
-    return NULL;
-}
-RTM_EXPORT(opendir);
-
-/**
- * this function is a POSIX compliant version, which will return a pointer
- * to a dirent structure representing the next directory entry in the
- * directory stream.
- *
- * @param d the directory stream pointer.
- *
- * @return the next directory entry, NULL on the end of directory or failed.
- */
-struct dirent *readdir(DIR *d)
-{
-    int result;
-    struct dfs_fd *fd;
-
-    fd = fd_get(d->fd);
-    if (fd == NULL)
-    {
-        rt_set_errno(-EBADF);
-        return NULL;
-    }
-
-    if (d->num)
-    {
-        struct dirent *dirent_ptr;
-        dirent_ptr = (struct dirent *)&d->buf[d->cur];
-        d->cur += dirent_ptr->d_reclen;
-    }
-
-    if (!d->num || d->cur >= d->num)
-    {
-        /* get a new entry */
-        result = dfs_file_getdents(fd,
-                                   (struct dirent *)d->buf,
-                                   sizeof(d->buf) - 1);
-        if (result <= 0)
-        {
-            fd_put(fd);
-            rt_set_errno(result);
-
-            return NULL;
-        }
-
-        d->num = result;
-        d->cur = 0; /* current entry index */
-    }
-
-    fd_put(fd);
-
-    return (struct dirent *)(d->buf + d->cur);
-}
-RTM_EXPORT(readdir);
-
-/**
- * this function is a POSIX compliant version, which will return current
- * location in directory stream.
- *
- * @param d the directory stream pointer.
- *
- * @return the current location in directory stream.
- */
-long telldir(DIR *d)
-{
-    struct dfs_fd *fd;
-    long result;
-
-    fd = fd_get(d->fd);
-    if (fd == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return 0;
-    }
-
-    result = fd->pos - d->num + d->cur;
-    fd_put(fd);
-
-    return result;
-}
-RTM_EXPORT(telldir);
-
-/**
- * this function is a POSIX compliant version, which will set position of
- * next directory structure in the directory stream.
- *
- * @param d the directory stream.
- * @param offset the offset in directory stream.
- */
-void seekdir(DIR *d, off_t offset)
-{
-    struct dfs_fd *fd;
-
-    fd = fd_get(d->fd);
-    if (fd == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return ;
-    }
-
-    /* seek to the offset position of directory */
-    if (dfs_file_lseek(fd, offset) >= 0)
-        d->num = d->cur = 0;
-    fd_put(fd);
-}
-RTM_EXPORT(seekdir);
-
-/**
- * this function is a POSIX compliant version, which will reset directory
- * stream.
- *
- * @param d the directory stream.
- */
-void rewinddir(DIR *d)
-{
-    struct dfs_fd *fd;
-
-    fd = fd_get(d->fd);
-    if (fd == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return ;
-    }
-
-    /* seek to the beginning of directory */
-    if (dfs_file_lseek(fd, 0) >= 0)
-        d->num = d->cur = 0;
-    fd_put(fd);
-}
-RTM_EXPORT(rewinddir);
-
-/**
- * this function is a POSIX compliant version, which will close a directory
- * stream.
- *
- * @param d the directory stream.
- *
- * @return 0 on successful, -1 on failed.
- */
-int closedir(DIR *d)
-{
-    int result;
-    struct dfs_fd *fd;
-
-    fd = fd_get(d->fd);
-    if (fd == NULL)
-    {
-        rt_set_errno(-EBADF);
-
-        return -1;
-    }
-
-    result = dfs_file_close(fd);
-    fd_put(fd);
-
-    fd_put(fd);
-    rt_free(d);
-
-    if (result < 0)
-    {
-        rt_set_errno(result);
-
-        return -1;
-    }
-    else
-        return 0;
-}
-RTM_EXPORT(closedir);
-
-#ifdef DFS_USING_WORKDIR
-/**
- * this function is a POSIX compliant version, which will change working
- * directory.
- *
- * @param path the path name to be changed to.
- *
- * @return 0 on successful, -1 on failed.
- */
-int chdir(const char *path)
-{
-    char *fullpath;
-    DIR *d;
-
-    if (path == NULL)
-    {
-        dfs_lock();
-        rt_kprintf("%s\n", working_directory);
-        dfs_unlock();
-
-        return 0;
-    }
-
-    if (strlen(path) > DFS_PATH_MAX)
-    {
-        rt_set_errno(-ENOTDIR);
-
-        return -1;
-    }
-
-    fullpath = dfs_normalize_path(NULL, path);
-    if (fullpath == NULL)
-    {
-        rt_set_errno(-ENOTDIR);
-
-        return -1; /* build path failed */
-    }
-
-    dfs_lock();
-    d = opendir(fullpath);
-    if (d == NULL)
-    {
-        rt_free(fullpath);
-        /* this is a not exist directory */
-        dfs_unlock();
-
-        return -1;
-    }
-
-    /* close directory stream */
-    closedir(d);
-
-    /* copy full path to working directory */
-    strncpy(working_directory, fullpath, DFS_PATH_MAX);
-    /* release normalize directory path name */
-    rt_free(fullpath);
-
-    dfs_unlock();
-
-    return 0;
-}
-RTM_EXPORT(chdir);
-
-#ifdef RT_USING_FINSH
-FINSH_FUNCTION_EXPORT_ALIAS(chdir, cd, change current working directory);
-#endif
-#endif
-
-/**
- * this function is a POSIX compliant version, which shall check the file named
- * by the pathname pointed to by the path argument for accessibility according
- * to the bit pattern contained in amode.
- *
- * @param path the specified file/dir path.
- * @param amode the value is either the bitwise-inclusive OR of the access
- * permissions to be checked (R_OK, W_OK, X_OK) or the existence test (F_OK).
- */
-int access(const char *path, int amode)
-{
-    struct stat sb;
-    if (stat(path, &sb) < 0)
-        return -1; /* already sets errno */
-
-    /* ignore R_OK,W_OK,X_OK condition */
-    return 0;
-}
-
-/**
- * this function is a POSIX compliant version, which will return current
- * working directory.
- *
- * @param buf the returned current directory.
- * @param size the buffer size.
- *
- * @return the returned current directory.
- */
-char *getcwd(char *buf, size_t size)
-{
-#ifdef DFS_USING_WORKDIR
-    dfs_lock();
-    strncpy(buf, working_directory, size);
-    dfs_unlock();
-#else
-    rt_kprintf(NO_WORKING_DIR);
-#endif
-
-    return buf;
-}
-RTM_EXPORT(getcwd);
-
 #ifdef RT_USING_POSIX_TERMIOS
 #include "termios.h"
 int isatty(int fd)