mirror of https://github.com/ArduPilot/ardupilot
AP_Filesystem: support QURT with posix filesystem
some features disabled
This commit is contained in:
parent
3a6024e8ab
commit
f8ce4183b8
|
@ -16,6 +16,9 @@
|
||||||
#include "AP_Filesystem.h"
|
#include "AP_Filesystem.h"
|
||||||
|
|
||||||
#include "AP_Filesystem_config.h"
|
#include "AP_Filesystem_config.h"
|
||||||
|
|
||||||
|
#if AP_FILESYSTEM_FILE_READING_ENABLED
|
||||||
|
|
||||||
#include <AP_HAL/HAL.h>
|
#include <AP_HAL/HAL.h>
|
||||||
#include <AP_HAL/Util.h>
|
#include <AP_HAL/Util.h>
|
||||||
#include <AP_Math/AP_Math.h>
|
#include <AP_Math/AP_Math.h>
|
||||||
|
@ -202,7 +205,9 @@ AP_Filesystem::DirHandle *AP_Filesystem::opendir(const char *pathname)
|
||||||
(strlen(pathname) == 1 && pathname[0] == '/')) {
|
(strlen(pathname) == 1 && pathname[0] == '/')) {
|
||||||
virtual_dirent.backend_ofs = 0;
|
virtual_dirent.backend_ofs = 0;
|
||||||
virtual_dirent.d_off = 0;
|
virtual_dirent.d_off = 0;
|
||||||
|
#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE
|
||||||
virtual_dirent.de.d_type = DT_DIR;
|
virtual_dirent.de.d_type = DT_DIR;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
virtual_dirent.backend_ofs = 255;
|
virtual_dirent.backend_ofs = 255;
|
||||||
}
|
}
|
||||||
|
@ -430,3 +435,4 @@ AP_Filesystem &FS()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // AP_FILESYSTEM_FILE_READING_ENABLED
|
||||||
|
|
|
@ -54,7 +54,7 @@ struct dirent {
|
||||||
#define AP_FILESYSTEM_FORMAT_ENABLED 1
|
#define AP_FILESYSTEM_FORMAT_ENABLED 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX || CONFIG_HAL_BOARD == HAL_BOARD_SITL
|
#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX || CONFIG_HAL_BOARD == HAL_BOARD_SITL || CONFIG_HAL_BOARD == HAL_BOARD_QURT
|
||||||
#include "AP_Filesystem_posix.h"
|
#include "AP_Filesystem_posix.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -192,11 +192,14 @@ struct dirent *AP_Filesystem_ROMFS::readdir(void *dirp)
|
||||||
const char* slash = strchr(name, '/');
|
const char* slash = strchr(name, '/');
|
||||||
if (slash == nullptr) {
|
if (slash == nullptr) {
|
||||||
// File
|
// File
|
||||||
|
#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE
|
||||||
dir[idx].de.d_type = DT_REG;
|
dir[idx].de.d_type = DT_REG;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// Directory
|
// Directory
|
||||||
|
#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE
|
||||||
dir[idx].de.d_type = DT_DIR;
|
dir[idx].de.d_type = DT_DIR;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Add null termination after directory name
|
// Add null termination after directory name
|
||||||
const size_t index = slash - name;
|
const size_t index = slash - name;
|
||||||
|
|
|
@ -244,7 +244,9 @@ struct dirent *AP_Filesystem_Sys::readdir(void *dirp)
|
||||||
// we have reached end of list
|
// we have reached end of list
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE
|
||||||
dtracker->curr_file.d_type = DT_REG;
|
dtracker->curr_file.d_type = DT_REG;
|
||||||
|
#endif
|
||||||
size_t max_length = ARRAY_SIZE(dtracker->curr_file.d_name);
|
size_t max_length = ARRAY_SIZE(dtracker->curr_file.d_name);
|
||||||
strncpy_noterm(dtracker->curr_file.d_name, sysfs_file_list[dtracker->file_offset].name, max_length);
|
strncpy_noterm(dtracker->curr_file.d_name, sysfs_file_list[dtracker->file_offset].name, max_length);
|
||||||
dtracker->file_offset++;
|
dtracker->file_offset++;
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef AP_FILESYSTEM_POSIX_ENABLED
|
#ifndef AP_FILESYSTEM_POSIX_ENABLED
|
||||||
#define AP_FILESYSTEM_POSIX_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL || CONFIG_HAL_BOARD == HAL_BOARD_LINUX)
|
#define AP_FILESYSTEM_POSIX_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL || CONFIG_HAL_BOARD == HAL_BOARD_LINUX || CONFIG_HAL_BOARD == HAL_BOARD_QURT)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef AP_FILESYSTEM_ROMFS_ENABLED
|
#ifndef AP_FILESYSTEM_ROMFS_ENABLED
|
||||||
|
@ -34,6 +34,11 @@
|
||||||
#define AP_FILESYSTEM_SYS_ENABLED 1
|
#define AP_FILESYSTEM_SYS_ENABLED 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC
|
||||||
|
// this requires AP_FILESYSTEM_POSIX_MAP_FILENAME_BASEDIR
|
||||||
|
#define AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// AP_FILESYSTEM_FILE_WRITING_ENABLED is true if you could expect to
|
// AP_FILESYSTEM_FILE_WRITING_ENABLED is true if you could expect to
|
||||||
// be able to open and write a non-virtual file. Notably this
|
// be able to open and write a non-virtual file. Notably this
|
||||||
// excludes virtual files like SYSFS, and the magic param/mission
|
// excludes virtual files like SYSFS, and the magic param/mission
|
||||||
|
@ -47,7 +52,7 @@
|
||||||
// be able to open and read a non-virtual file. Notably this excludes
|
// be able to open and read a non-virtual file. Notably this excludes
|
||||||
// virtual files like SYSFS, and the magic param/mission upload targets.
|
// virtual files like SYSFS, and the magic param/mission upload targets.
|
||||||
#ifndef AP_FILESYSTEM_FILE_READING_ENABLED
|
#ifndef AP_FILESYSTEM_FILE_READING_ENABLED
|
||||||
#define AP_FILESYSTEM_FILE_READING_ENABLED (AP_FILESYSTEM_FILE_WRITING_ENABLED || AP_FILESYSTEM_ROMFS_ENABLED)
|
#define AP_FILESYSTEM_FILE_READING_ENABLED (AP_FILESYSTEM_FILE_WRITING_ENABLED || AP_FILESYSTEM_ROMFS_ENABLED || AP_FILESYSTEM_SYS_ENABLED || AP_FILESYSTEM_PARAM_ENABLED)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef AP_FILESYSTEM_SYS_FLASH_ENABLED
|
#ifndef AP_FILESYSTEM_SYS_FLASH_ENABLED
|
||||||
|
|
|
@ -26,18 +26,29 @@
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
#else
|
#elif CONFIG_HAL_BOARD != HAL_BOARD_QURT
|
||||||
#include <sys/vfs.h>
|
#include <sys/vfs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if AP_FILESYSTEM_POSIX_HAVE_UTIME
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
extern const AP_HAL::HAL& hal;
|
extern const AP_HAL::HAL& hal;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
map a filename for SITL so operations are relative to the current directory
|
map a filename so operations are relative to the current directory if needed
|
||||||
*/
|
*/
|
||||||
static const char *map_filename(const char *fname)
|
static const char *map_filename(const char *fname)
|
||||||
{
|
{
|
||||||
|
#if AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC
|
||||||
|
// this system needs to add a prefix to the filename, which means
|
||||||
|
// memory allocation. This is needed for QURT which lacks chdir()
|
||||||
|
char *fname2 = nullptr;
|
||||||
|
asprintf(&fname2, "%s/%s", AP_FILESYSTEM_POSIX_MAP_FILENAME_BASEDIR, fname);
|
||||||
|
return fname2;
|
||||||
|
#else
|
||||||
|
|
||||||
#if CONFIG_HAL_BOARD == HAL_BOARD_SITL && !APM_BUILD_TYPE(APM_BUILD_Replay)
|
#if CONFIG_HAL_BOARD == HAL_BOARD_SITL && !APM_BUILD_TYPE(APM_BUILD_Replay)
|
||||||
// on SITL only allow paths under subdirectory. Users can still
|
// on SITL only allow paths under subdirectory. Users can still
|
||||||
// escape with .. if they want to
|
// escape with .. if they want to
|
||||||
|
@ -50,6 +61,14 @@ static const char *map_filename(const char *fname)
|
||||||
#endif
|
#endif
|
||||||
// on Linux allow original name
|
// on Linux allow original name
|
||||||
return fname;
|
return fname;
|
||||||
|
#endif // AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC
|
||||||
|
}
|
||||||
|
|
||||||
|
static void map_filename_free(const char *fname)
|
||||||
|
{
|
||||||
|
#if AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC
|
||||||
|
::free(const_cast<char*>(fname));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int AP_Filesystem_Posix::open(const char *fname, int flags, bool allow_absolute_paths)
|
int AP_Filesystem_Posix::open(const char *fname, int flags, bool allow_absolute_paths)
|
||||||
|
@ -62,10 +81,18 @@ int AP_Filesystem_Posix::open(const char *fname, int flags, bool allow_absolute_
|
||||||
if (::stat(fname, &st) == 0 &&
|
if (::stat(fname, &st) == 0 &&
|
||||||
((st.st_mode & S_IFMT) != S_IFREG && (st.st_mode & S_IFMT) != S_IFLNK)) {
|
((st.st_mode & S_IFMT) != S_IFREG && (st.st_mode & S_IFMT) != S_IFLNK)) {
|
||||||
// only allow links and files
|
// only allow links and files
|
||||||
|
if (!allow_absolute_paths) {
|
||||||
|
map_filename_free(fname);
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// we automatically add O_CLOEXEC as we always want it for ArduPilot FS usage
|
// we automatically add O_CLOEXEC as we always want it for ArduPilot FS usage
|
||||||
return ::open(fname, flags | O_CLOEXEC, 0644);
|
auto ret = ::open(fname, flags | O_CLOEXEC, 0644);
|
||||||
|
if (!allow_absolute_paths) {
|
||||||
|
map_filename_free(fname);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AP_Filesystem_Posix::close(int fd)
|
int AP_Filesystem_Posix::close(int fd)
|
||||||
|
@ -88,8 +115,14 @@ int32_t AP_Filesystem_Posix::write(int fd, const void *buf, uint32_t count)
|
||||||
|
|
||||||
int AP_Filesystem_Posix::fsync(int fd)
|
int AP_Filesystem_Posix::fsync(int fd)
|
||||||
{
|
{
|
||||||
|
#if AP_FILESYSTEM_POSIX_HAVE_FSYNC
|
||||||
FS_CHECK_ALLOWED(-1);
|
FS_CHECK_ALLOWED(-1);
|
||||||
return ::fsync(fd);
|
return ::fsync(fd);
|
||||||
|
#else
|
||||||
|
// we have to pass success here as otherwise it is assumed to be
|
||||||
|
// failed IO and the caller may close the fd and give up
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t AP_Filesystem_Posix::lseek(int fd, int32_t offset, int seek_from)
|
int32_t AP_Filesystem_Posix::lseek(int fd, int32_t offset, int seek_from)
|
||||||
|
@ -102,7 +135,9 @@ int AP_Filesystem_Posix::stat(const char *pathname, struct stat *stbuf)
|
||||||
{
|
{
|
||||||
FS_CHECK_ALLOWED(-1);
|
FS_CHECK_ALLOWED(-1);
|
||||||
pathname = map_filename(pathname);
|
pathname = map_filename(pathname);
|
||||||
return ::stat(pathname, stbuf);
|
auto ret = ::stat(pathname, stbuf);
|
||||||
|
map_filename_free(pathname);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AP_Filesystem_Posix::unlink(const char *pathname)
|
int AP_Filesystem_Posix::unlink(const char *pathname)
|
||||||
|
@ -111,10 +146,11 @@ int AP_Filesystem_Posix::unlink(const char *pathname)
|
||||||
pathname = map_filename(pathname);
|
pathname = map_filename(pathname);
|
||||||
// we match the FATFS interface and use unlink
|
// we match the FATFS interface and use unlink
|
||||||
// for both files and directories
|
// for both files and directories
|
||||||
int ret = ::rmdir(pathname);
|
int ret = ::rmdir(const_cast<char*>(pathname));
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
ret = ::unlink(pathname);
|
ret = ::unlink(pathname);
|
||||||
}
|
}
|
||||||
|
map_filename_free(pathname);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,14 +158,18 @@ int AP_Filesystem_Posix::mkdir(const char *pathname)
|
||||||
{
|
{
|
||||||
FS_CHECK_ALLOWED(-1);
|
FS_CHECK_ALLOWED(-1);
|
||||||
pathname = map_filename(pathname);
|
pathname = map_filename(pathname);
|
||||||
return ::mkdir(pathname, 0775);
|
auto ret = ::mkdir(const_cast<char*>(pathname), 0775);
|
||||||
|
map_filename_free(pathname);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *AP_Filesystem_Posix::opendir(const char *pathname)
|
void *AP_Filesystem_Posix::opendir(const char *pathname)
|
||||||
{
|
{
|
||||||
FS_CHECK_ALLOWED(nullptr);
|
FS_CHECK_ALLOWED(nullptr);
|
||||||
pathname = map_filename(pathname);
|
pathname = map_filename(pathname);
|
||||||
return (void*)::opendir(pathname);
|
auto *ret = (void*)::opendir(pathname);
|
||||||
|
map_filename_free(pathname);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dirent *AP_Filesystem_Posix::readdir(void *dirp)
|
struct dirent *AP_Filesystem_Posix::readdir(void *dirp)
|
||||||
|
@ -149,31 +189,46 @@ int AP_Filesystem_Posix::rename(const char *oldpath, const char *newpath)
|
||||||
FS_CHECK_ALLOWED(-1);
|
FS_CHECK_ALLOWED(-1);
|
||||||
oldpath = map_filename(oldpath);
|
oldpath = map_filename(oldpath);
|
||||||
newpath = map_filename(newpath);
|
newpath = map_filename(newpath);
|
||||||
return ::rename(oldpath, newpath);
|
auto ret = ::rename(oldpath, newpath);
|
||||||
|
map_filename_free(oldpath);
|
||||||
|
map_filename_free(newpath);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return free disk space in bytes
|
// return free disk space in bytes
|
||||||
int64_t AP_Filesystem_Posix::disk_free(const char *path)
|
int64_t AP_Filesystem_Posix::disk_free(const char *path)
|
||||||
{
|
{
|
||||||
|
#if AP_FILESYSTEM_POSIX_HAVE_STATFS
|
||||||
FS_CHECK_ALLOWED(-1);
|
FS_CHECK_ALLOWED(-1);
|
||||||
path = map_filename(path);
|
path = map_filename(path);
|
||||||
struct statfs stats;
|
struct statfs stats;
|
||||||
if (::statfs(path, &stats) < 0) {
|
if (::statfs(path, &stats) < 0) {
|
||||||
|
map_filename_free(path);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
map_filename_free(path);
|
||||||
return (((int64_t)stats.f_bavail) * stats.f_bsize);
|
return (((int64_t)stats.f_bavail) * stats.f_bsize);
|
||||||
|
#else
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// return total disk space in bytes
|
// return total disk space in bytes
|
||||||
int64_t AP_Filesystem_Posix::disk_space(const char *path)
|
int64_t AP_Filesystem_Posix::disk_space(const char *path)
|
||||||
{
|
{
|
||||||
|
#if AP_FILESYSTEM_POSIX_HAVE_STATFS
|
||||||
FS_CHECK_ALLOWED(-1);
|
FS_CHECK_ALLOWED(-1);
|
||||||
path = map_filename(path);
|
path = map_filename(path);
|
||||||
struct statfs stats;
|
struct statfs stats;
|
||||||
if (::statfs(path, &stats) < 0) {
|
if (::statfs(path, &stats) < 0) {
|
||||||
|
map_filename_free(path);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
map_filename_free(path);
|
||||||
return (((int64_t)stats.f_blocks) * stats.f_bsize);
|
return (((int64_t)stats.f_blocks) * stats.f_bsize);
|
||||||
|
#else
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -182,13 +237,19 @@ int64_t AP_Filesystem_Posix::disk_space(const char *path)
|
||||||
*/
|
*/
|
||||||
bool AP_Filesystem_Posix::set_mtime(const char *filename, const uint32_t mtime_sec)
|
bool AP_Filesystem_Posix::set_mtime(const char *filename, const uint32_t mtime_sec)
|
||||||
{
|
{
|
||||||
|
#if AP_FILESYSTEM_POSIX_HAVE_UTIME
|
||||||
FS_CHECK_ALLOWED(false);
|
FS_CHECK_ALLOWED(false);
|
||||||
filename = map_filename(filename);
|
filename = map_filename(filename);
|
||||||
struct utimbuf times {};
|
struct utimbuf times {};
|
||||||
times.actime = mtime_sec;
|
times.actime = mtime_sec;
|
||||||
times.modtime = mtime_sec;
|
times.modtime = mtime_sec;
|
||||||
|
|
||||||
return utime(filename, ×) == 0;
|
auto ret = utime(filename, ×) == 0;
|
||||||
|
map_filename_free(filename);
|
||||||
|
return ret;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // AP_FILESYSTEM_POSIX_ENABLED
|
#endif // AP_FILESYSTEM_POSIX_ENABLED
|
||||||
|
|
|
@ -29,6 +29,22 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "AP_Filesystem_backend.h"
|
#include "AP_Filesystem_backend.h"
|
||||||
|
|
||||||
|
#ifndef AP_FILESYSTEM_POSIX_HAVE_UTIME
|
||||||
|
#define AP_FILESYSTEM_POSIX_HAVE_UTIME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef AP_FILESYSTEM_POSIX_HAVE_FSYNC
|
||||||
|
#define AP_FILESYSTEM_POSIX_HAVE_FSYNC 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef AP_FILESYSTEM_POSIX_HAVE_STATFS
|
||||||
|
#define AP_FILESYSTEM_POSIX_HAVE_STATFS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef O_CLOEXEC
|
||||||
|
#define O_CLOEXEC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
class AP_Filesystem_Posix : public AP_Filesystem_Backend
|
class AP_Filesystem_Posix : public AP_Filesystem_Backend
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -78,6 +78,12 @@ char *tmpnam(char s[L_tmpnam]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FILE APFS_FILE
|
#define FILE APFS_FILE
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
/*
|
||||||
|
only redefine posix functions for C code (eg. lua).
|
||||||
|
for C++ use the AP_Filsystem APIs
|
||||||
|
*/
|
||||||
#define fopen(p,m) apfs_fopen(p,m)
|
#define fopen(p,m) apfs_fopen(p,m)
|
||||||
#define fprintf(stream, format, args...) apfs_fprintf(stream, format, ##args)
|
#define fprintf(stream, format, args...) apfs_fprintf(stream, format, ##args)
|
||||||
#define fflush(s) apfs_fflush(s)
|
#define fflush(s) apfs_fflush(s)
|
||||||
|
@ -101,6 +107,7 @@ char *tmpnam(char s[L_tmpnam]);
|
||||||
#define remove(pathname) apfs_remove(pathname)
|
#define remove(pathname) apfs_remove(pathname)
|
||||||
int sprintf(char *str, const char *format, ...);
|
int sprintf(char *str, const char *format, ...);
|
||||||
#endif
|
#endif
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue