~aleteoryx/muditaos

7bcc1c9bd4add82ca6d53aa22e12e620551ba172 — Lucjan Bryndza 5 years ago 1e55ef8
[EGD-6013] Fix no copy syscall

Due to lack of some filesystem syscalls std::filesystem::copy
functions family doesn't work. This path add missing syscalls
in the FS layer.
M board/rt1051/newlib/io_syscalls.cpp => board/rt1051/newlib/io_syscalls.cpp +17 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include <errno.h>
#include <stdio.h>


@@ 150,4 150,20 @@ extern "C"
    {
        utils::internal::syscalls::env_unlock(reent->_errno);
    }
    ssize_t readlink(const char *path, char *buf, size_t buflen)
    {
        return syscalls::readlink(_REENT->_errno, path, buf, buflen);
    }
    int symlink(const char *name1, const char *name2)
    {
        return syscalls::symlink(_REENT->_errno, name1, name2);
    }
    long fpathconf(int fd, int name)
    {
        return syscalls::fpathconf(_REENT->_errno, fd, name);
    }
    long pathconf(const char *path, int name)
    {
        return syscalls::pathconf(_REENT->_errno, path, name);
    }
}

M module-vfs/drivers/include/purefs/fs/drivers/filesystem_littlefs.hpp => module-vfs/drivers/include/purefs/fs/drivers/filesystem_littlefs.hpp +2 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 37,6 37,7 @@ namespace purefs::fs::drivers
        auto unlink(fsmount mnt, std::string_view name) noexcept -> int override;
        auto rename(fsmount mnt, std::string_view oldname, std::string_view newname) noexcept -> int override;
        auto mkdir(fsmount mnt, std::string_view path, int mode) noexcept -> int override;
        auto fchmod(fsfile zfile, mode_t mode) noexcept -> int override;

        /** Directory support API */
        auto diropen(fsmount mnt, std::string_view path) noexcept -> fsdir override;

M module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp => module-vfs/drivers/src/purefs/fs/filesystem_littlefs.cpp +8 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <purefs/fs/drivers/filesystem_littlefs.hpp>


@@ 448,4 448,11 @@ namespace purefs::fs::drivers
        return invoke_lfs(dirstate, ::lfs_dir_close);
    }

    auto filesystem_littlefs::fchmod(fsfile zfile, mode_t mode) noexcept -> int
    {
        // Littlefs doesn't support chmod() so we need that path exists
        struct stat filestat;
        return fstat(zfile, filestat);
    }

} // namespace purefs::fs::drivers

M module-vfs/include/internal/newlib/vfs_io_syscalls.hpp => module-vfs/include/internal/newlib/vfs_io_syscalls.hpp +5 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 43,5 43,9 @@ namespace vfsn::internal::syscalls
              const void *data);
    int umount(int &_errno_, const char *special_file);
    int statvfs(int &_errno_, const char *path, struct statvfs *buf);
    ssize_t readlink(int &_errno_, const char *path, char *buf, size_t buflen);
    int symlink(int &_errno_, const char *name1, const char *name2);
    long fpathconf(int &_errno, int fd, int name);
    long pathconf(int &_errno, const char *path, int name);

} // namespace vfsn::internal::syscalls

M module-vfs/src/newlib/vfs_io_syscalls.cpp => module-vfs/src/newlib/vfs_io_syscalls.cpp +35 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <errno.h>


@@ 364,5 364,39 @@ namespace vfsn::internal::syscalls
                         data);
    }

    ssize_t readlink(int &_errno_, const char *path, char *buf, size_t buflen)
    {
        // Symlinks are not supported. According to man(2) symlink EINVAL when is not symlink.
        _errno_ = EINVAL;
        return -1;
    }

    int symlink(int &_errno_, const char *name1, const char *name2)
    {
        return invoke_fs(_errno_, &purefs::fs::filesystem::symlink, name1, name2);
    }

    long fpathconf(int &_errno, int fd, int name)
    {
        if (name == _PC_PATH_MAX) {
            return PATH_MAX;
        }
        else {
            _errno = EINVAL;
            return -1;
        }
    }

    long pathconf(int &_errno, const char *path, int name)
    {
        if (name == _PC_PATH_MAX) {
            return PATH_MAX;
        }
        else {
            _errno = EINVAL;
            return -1;
        }
    }

} // namespace vfsn::internal::syscalls