diff --git a/Makefile.dep b/Makefile.dep index bde52cff2826..95a1c4542ae6 100644 --- a/Makefile.dep +++ b/Makefile.dep @@ -605,6 +605,12 @@ ifneq (,$(filter devfs,$(USEMODULE))) USEMODULE += vfs endif +ifneq (,$(filter vfs,$(USEMODULE))) + ifeq (native, $(BOARD)) + USEMODULE += native_vfs + endif +endif + # include package dependencies -include $(USEPKG:%=$(RIOTPKG)/%/Makefile.dep) diff --git a/cpu/native/Makefile b/cpu/native/Makefile index c601d3323e72..d66f5a971ea0 100644 --- a/cpu/native/Makefile +++ b/cpu/native/Makefile @@ -1,6 +1,7 @@ MODULE = cpu DIRS += periph +DIRS += vfs ifneq (,$(filter netdev2_tap,$(USEMODULE))) DIRS += netdev2_tap diff --git a/cpu/native/vfs/Makefile b/cpu/native/vfs/Makefile new file mode 100644 index 000000000000..e3b46ebd7f4e --- /dev/null +++ b/cpu/native/vfs/Makefile @@ -0,0 +1,3 @@ +MODULE=native_vfs + +include $(RIOTBASE)/Makefile.base diff --git a/cpu/native/vfs/native_vfs.c b/cpu/native/vfs/native_vfs.c new file mode 100644 index 000000000000..d3e18cc394ca --- /dev/null +++ b/cpu/native/vfs/native_vfs.c @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2016 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for + * more details. + */ + +/** + * @ingroup native_cpu + * @{ + * + * @file + * @brief VFS wrappers for POSIX file I/O functions + * + * @author Kaspar Schleiser + */ + +#include +#include +#include +#include +#include + +#include "vfs.h" + +int open(const char *name, int flags, ...) +{ + unsigned mode = 0; + + if ((flags & O_CREAT)) { + va_list ap; + va_start(ap, flags); + mode = va_arg(ap, unsigned); + va_end(ap); + } + + int fd = vfs_open(name, flags, mode); + if (fd < 0) { + /* vfs returns negative error codes */ + errno = -fd; + return -1; + } + return fd; +} + +ssize_t read(int fd, void *dest, size_t count) +{ + int res = vfs_read(fd, dest, count); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return res; +} + +ssize_t write(int fd, const void *src, size_t count) +{ + int res = vfs_write(fd, src, count); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return res; +} + +int close(int fd) +{ + int res = vfs_close(fd); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return res; +} + +int fcntl(int fd, int cmd, ...) +{ + unsigned long arg; + va_list ap; + va_start(ap, cmd); + arg = va_arg(ap, unsigned long); + va_end(ap); + + int res = vfs_fcntl(fd, cmd, arg); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return res; +} + + +off_t lseek(int fd, off_t off, int whence) +{ + int res = vfs_lseek(fd, off, whence); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return res; +} + +int fstat(int fd, struct stat *buf) +{ + int res = vfs_fstat(fd, buf); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return 0; +} + +int stat(const char *name, struct stat *st) +{ + int res = vfs_stat(name, st); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return 0; +} + +int unlink(const char *path) +{ + int res = vfs_unlink(path); + + if (res < 0) { + /* vfs returns negative error codes */ + errno = -res; + return -1; + } + return 0; +} + +/** @} */ diff --git a/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c b/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c index 88a96b510d03..ab18da5a7456 100644 --- a/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c +++ b/tests/unittests/tests-vfs/tests-vfs-mount-constfs.c @@ -171,7 +171,7 @@ static void test_vfs_constfs_read_lseek(void) TEST_ASSERT_EQUAL_INT(0, res); } -#if MODULE_NEWLIB +#if MODULE_NEWLIB || defined(BOARD_NATIVE) static void test_vfs_constfs__posix(void) { int res; @@ -210,7 +210,7 @@ Test *tests_vfs_mount_constfs_tests(void) new_TestFixture(test_vfs_umount__invalid_mount), new_TestFixture(test_vfs_constfs_open), new_TestFixture(test_vfs_constfs_read_lseek), -#if MODULE_NEWLIB +#if MODULE_NEWLIB || defined(BOARD_NATIVE) new_TestFixture(test_vfs_constfs__posix), #endif };