feat(storage/vfs): Deprecate context-less function pointers

This commit is contained in:
Tomáš Rohlínek
2025-12-11 10:59:00 +01:00
parent 71da0fdf4a
commit 859ca9e5e2
6 changed files with 119 additions and 85 deletions
+7
View File
@@ -86,6 +86,13 @@ menu "Virtual file system"
help
Define maximum number of virtual filesystems that can be registered.
config VFS_SUPPRESS_CTX_DEPRECATION
bool "Suppress context-less API deprecation warning"
default n
help
The VFS APIs without context pointer are deprecated and will be removed in the next major release.
Please switch to the APIs with context pointer,
or alternatively enable this option to silence the warning.
menu "Host File System I/O (Semihosting)"
depends on VFS_SUPPORT_IO
+51 -39
View File
@@ -1,11 +1,10 @@
/*
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef __ESP_VFS_H__
#define __ESP_VFS_H__
#pragma once
#include <stdint.h>
#include <stddef.h>
@@ -68,6 +67,17 @@ extern "C" {
*/
#define ESP_VFS_FLAG_STATIC (1 << 3)
#ifndef __DOXYGEN__
# pragma push_macro("deprecated")
# undef deprecated
# if defined(CONFIG_VFS_SUPPRESS_CTX_DEPRECATION) || defined(_VFS_SUPPRESS_CTX_DEPRECATION)
# define deprecated(msg)
# else
# define deprecated(msg) deprecated("Context pointer-less API is deprecated, please use the version with context pointer")
# endif
#endif
/**
* @brief VFS definition structure
* @note Prefer using esp_vfs_fs_ops_t with esp_vfs_register_fs*() instead.
@@ -94,144 +104,144 @@ typedef struct
{
int flags; /*!< ESP_VFS_FLAG_CONTEXT_PTR and/or ESP_VFS_FLAG_READONLY_FS or ESP_VFS_FLAG_DEFAULT */
union {
ssize_t (*write_p)(void* p, int fd, const void * data, size_t size); /*!< Write with context pointer */
ssize_t (*write_p)(void* p, int fd, const void * data, size_t size) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< Write with context pointer */
ssize_t (*write)(int fd, const void * data, size_t size); /*!< Write without context pointer */
};
union {
off_t (*lseek_p)(void* p, int fd, off_t size, int mode); /*!< Seek with context pointer */
off_t (*lseek_p)(void* p, int fd, off_t size, int mode) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< Seek with context pointer */
off_t (*lseek)(int fd, off_t size, int mode); /*!< Seek without context pointer */
};
union {
ssize_t (*read_p)(void* ctx, int fd, void * dst, size_t size); /*!< Read with context pointer */
ssize_t (*read_p)(void* ctx, int fd, void * dst, size_t size) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< Read with context pointer */
ssize_t (*read)(int fd, void * dst, size_t size); /*!< Read without context pointer */
};
union {
ssize_t (*pread_p)(void *ctx, int fd, void * dst, size_t size, off_t offset); /*!< pread with context pointer */
ssize_t (*pread_p)(void *ctx, int fd, void * dst, size_t size, off_t offset) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< pread with context pointer */
ssize_t (*pread)(int fd, void * dst, size_t size, off_t offset); /*!< pread without context pointer */
};
union {
ssize_t (*pwrite_p)(void *ctx, int fd, const void *src, size_t size, off_t offset); /*!< pwrite with context pointer */
ssize_t (*pwrite_p)(void *ctx, int fd, const void *src, size_t size, off_t offset) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< pwrite with context pointer */
ssize_t (*pwrite)(int fd, const void *src, size_t size, off_t offset); /*!< pwrite without context pointer */
};
union {
int (*open_p)(void* ctx, const char * path, int flags, int mode); /*!< open with context pointer */
int (*open_p)(void* ctx, const char * path, int flags, int mode) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< open with context pointer */
int (*open)(const char * path, int flags, int mode); /*!< open without context pointer */
};
union {
int (*close_p)(void* ctx, int fd); /*!< close with context pointer */
int (*close_p)(void* ctx, int fd) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< close with context pointer */
int (*close)(int fd); /*!< close without context pointer */
};
union {
int (*fstat_p)(void* ctx, int fd, struct stat * st); /*!< fstat with context pointer */
int (*fstat_p)(void* ctx, int fd, struct stat * st) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< fstat with context pointer */
int (*fstat)(int fd, struct stat * st); /*!< fstat without context pointer */
};
#ifdef CONFIG_VFS_SUPPORT_DIR
union {
int (*stat_p)(void* ctx, const char * path, struct stat * st); /*!< stat with context pointer */
int (*stat_p)(void* ctx, const char * path, struct stat * st) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< stat with context pointer */
int (*stat)(const char * path, struct stat * st); /*!< stat without context pointer */
};
union {
int (*link_p)(void* ctx, const char* n1, const char* n2); /*!< link with context pointer */
int (*link_p)(void* ctx, const char* n1, const char* n2) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< link with context pointer */
int (*link)(const char* n1, const char* n2); /*!< link without context pointer */
};
union {
int (*unlink_p)(void* ctx, const char *path); /*!< unlink with context pointer */
int (*unlink_p)(void* ctx, const char *path) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< unlink with context pointer */
int (*unlink)(const char *path); /*!< unlink without context pointer */
};
union {
int (*rename_p)(void* ctx, const char *src, const char *dst); /*!< rename with context pointer */
int (*rename_p)(void* ctx, const char *src, const char *dst) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< rename with context pointer */
int (*rename)(const char *src, const char *dst); /*!< rename without context pointer */
};
union {
DIR* (*opendir_p)(void* ctx, const char* name); /*!< opendir with context pointer */
DIR* (*opendir_p)(void* ctx, const char* name) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< opendir with context pointer */
DIR* (*opendir)(const char* name); /*!< opendir without context pointer */
};
union {
struct dirent* (*readdir_p)(void* ctx, DIR* pdir); /*!< readdir with context pointer */
struct dirent* (*readdir_p)(void* ctx, DIR* pdir) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< readdir with context pointer */
struct dirent* (*readdir)(DIR* pdir); /*!< readdir without context pointer */
};
union {
int (*readdir_r_p)(void* ctx, DIR* pdir, struct dirent* entry, struct dirent** out_dirent); /*!< readdir_r with context pointer */
int (*readdir_r_p)(void* ctx, DIR* pdir, struct dirent* entry, struct dirent** out_dirent) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< readdir_r with context pointer */
int (*readdir_r)(DIR* pdir, struct dirent* entry, struct dirent** out_dirent); /*!< readdir_r without context pointer */
};
union {
long (*telldir_p)(void* ctx, DIR* pdir); /*!< telldir with context pointer */
long (*telldir_p)(void* ctx, DIR* pdir) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< telldir with context pointer */
long (*telldir)(DIR* pdir); /*!< telldir without context pointer */
};
union {
void (*seekdir_p)(void* ctx, DIR* pdir, long offset); /*!< seekdir with context pointer */
void (*seekdir_p)(void* ctx, DIR* pdir, long offset) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< seekdir with context pointer */
void (*seekdir)(DIR* pdir, long offset); /*!< seekdir without context pointer */
};
union {
int (*closedir_p)(void* ctx, DIR* pdir); /*!< closedir with context pointer */
int (*closedir_p)(void* ctx, DIR* pdir) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< closedir with context pointer */
int (*closedir)(DIR* pdir); /*!< closedir without context pointer */
};
union {
int (*mkdir_p)(void* ctx, const char* name, mode_t mode); /*!< mkdir with context pointer */
int (*mkdir_p)(void* ctx, const char* name, mode_t mode) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< mkdir with context pointer */
int (*mkdir)(const char* name, mode_t mode); /*!< mkdir without context pointer */
};
union {
int (*rmdir_p)(void* ctx, const char* name); /*!< rmdir with context pointer */
int (*rmdir_p)(void* ctx, const char* name) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< rmdir with context pointer */
int (*rmdir)(const char* name); /*!< rmdir without context pointer */
};
#endif // CONFIG_VFS_SUPPORT_DIR
union {
int (*fcntl_p)(void* ctx, int fd, int cmd, int arg); /*!< fcntl with context pointer */
int (*fcntl_p)(void* ctx, int fd, int cmd, int arg) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< fcntl with context pointer */
int (*fcntl)(int fd, int cmd, int arg); /*!< fcntl without context pointer */
};
union {
int (*ioctl_p)(void* ctx, int fd, int cmd, va_list args); /*!< ioctl with context pointer */
int (*ioctl_p)(void* ctx, int fd, int cmd, va_list args) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< ioctl with context pointer */
int (*ioctl)(int fd, int cmd, va_list args); /*!< ioctl without context pointer */
};
union {
int (*fsync_p)(void* ctx, int fd); /*!< fsync with context pointer */
int (*fsync_p)(void* ctx, int fd) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< fsync with context pointer */
int (*fsync)(int fd); /*!< fsync without context pointer */
};
#ifdef CONFIG_VFS_SUPPORT_DIR
union {
int (*access_p)(void* ctx, const char *path, int amode); /*!< access with context pointer */
int (*access_p)(void* ctx, const char *path, int amode) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< access with context pointer */
int (*access)(const char *path, int amode); /*!< access without context pointer */
};
union {
int (*truncate_p)(void* ctx, const char *path, off_t length); /*!< truncate with context pointer */
int (*truncate_p)(void* ctx, const char *path, off_t length) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< truncate with context pointer */
int (*truncate)(const char *path, off_t length); /*!< truncate without context pointer */
};
union {
int (*ftruncate_p)(void* ctx, int fd, off_t length); /*!< ftruncate with context pointer */
int (*ftruncate_p)(void* ctx, int fd, off_t length) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< ftruncate with context pointer */
int (*ftruncate)(int fd, off_t length); /*!< ftruncate without context pointer */
};
union {
int (*utime_p)(void* ctx, const char *path, const struct utimbuf *times); /*!< utime with context pointer */
int (*utime_p)(void* ctx, const char *path, const struct utimbuf *times) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< utime with context pointer */
int (*utime)(const char *path, const struct utimbuf *times); /*!< utime without context pointer */
};
#endif // CONFIG_VFS_SUPPORT_DIR
#ifdef CONFIG_VFS_SUPPORT_TERMIOS
union {
int (*tcsetattr_p)(void *ctx, int fd, int optional_actions, const struct termios *p); /*!< tcsetattr with context pointer */
int (*tcsetattr_p)(void *ctx, int fd, int optional_actions, const struct termios *p) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcsetattr with context pointer */
int (*tcsetattr)(int fd, int optional_actions, const struct termios *p); /*!< tcsetattr without context pointer */
};
union {
int (*tcgetattr_p)(void *ctx, int fd, struct termios *p); /*!< tcgetattr with context pointer */
int (*tcgetattr_p)(void *ctx, int fd, struct termios *p) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcgetattr with context pointer */
int (*tcgetattr)(int fd, struct termios *p); /*!< tcgetattr without context pointer */
};
union {
int (*tcdrain_p)(void *ctx, int fd); /*!< tcdrain with context pointer */
int (*tcdrain_p)(void *ctx, int fd) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcdrain with context pointer */
int (*tcdrain)(int fd); /*!< tcdrain without context pointer */
};
union {
int (*tcflush_p)(void *ctx, int fd, int select); /*!< tcflush with context pointer */
int (*tcflush_p)(void *ctx, int fd, int select) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcflush with context pointer */
int (*tcflush)(int fd, int select); /*!< tcflush without context pointer */
};
union {
int (*tcflow_p)(void *ctx, int fd, int action); /*!< tcflow with context pointer */
int (*tcflow_p)(void *ctx, int fd, int action) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcflow with context pointer */
int (*tcflow)(int fd, int action); /*!< tcflow without context pointer */
};
union {
pid_t (*tcgetsid_p)(void *ctx, int fd); /*!< tcgetsid with context pointer */
pid_t (*tcgetsid_p)(void *ctx, int fd) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcgetsid with context pointer */
pid_t (*tcgetsid)(int fd); /*!< tcgetsid without context pointer */
};
union {
int (*tcsendbreak_p)(void *ctx, int fd, int duration); /*!< tcsendbreak with context pointer */
int (*tcsendbreak_p)(void *ctx, int fd, int duration) __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcsendbreak with context pointer */
int (*tcsendbreak)(int fd, int duration); /*!< tcsendbreak without context pointer */
};
#endif // CONFIG_VFS_SUPPORT_TERMIOS
@@ -502,8 +512,10 @@ void esp_vfs_dump_fds(FILE *fp);
*/
void esp_vfs_dump_registered_paths(FILE *fp);
#if !defined(__DOXYGEN__)
#pragma pop_macro("deprecated")
#endif
#ifdef __cplusplus
} // extern "C"
#endif
#endif //__ESP_VFS_H__
+48 -39
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2024-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -27,10 +27,15 @@
extern "C" {
#endif
#ifndef CONFIG_IDF_TARGET_LINUX
#ifndef _SYS_TYPES_FD_SET
#error "VFS should be used with FD_SETSIZE and FD_SET from sys/types.h"
#endif
#ifndef __DOXYGEN__
# pragma push_macro("deprecated")
# undef deprecated
# if defined(CONFIG_VFS_SUPPRESS_CTX_DEPRECATION) || defined(_VFS_SUPPRESS_CTX_DEPRECATION)
# define deprecated(msg)
# else
# define deprecated(msg) deprecated("Context pointer-less API is deprecated, please use the version with context pointer")
# endif
#endif
/*
@@ -91,67 +96,67 @@ typedef int (*esp_vfs_utime_op_t) ( const char *pat
typedef struct {
union {
const esp_vfs_stat_ctx_op_t stat_p; /*!< stat with context pointer */
const esp_vfs_stat_op_t stat; /*!< stat without context pointer */
const esp_vfs_stat_op_t stat __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< stat without context pointer */
};
union {
const esp_vfs_link_ctx_op_t link_p; /*!< link with context pointer */
const esp_vfs_link_op_t link; /*!< link without context pointer */
const esp_vfs_link_op_t link __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< link without context pointer */
};
union {
const esp_vfs_unlink_ctx_op_t unlink_p; /*!< unlink with context pointer */
const esp_vfs_unlink_op_t unlink; /*!< unlink without context pointer */
const esp_vfs_unlink_op_t unlink __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< unlink without context pointer */
};
union {
const esp_vfs_rename_ctx_op_t rename_p; /*!< rename with context pointer */
const esp_vfs_rename_op_t rename; /*!< rename without context pointer */
const esp_vfs_rename_op_t rename __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< rename without context pointer */
};
union {
const esp_vfs_opendir_ctx_op_t opendir_p; /*!< opendir with context pointer */
const esp_vfs_opendir_op_t opendir; /*!< opendir without context pointer */
const esp_vfs_opendir_op_t opendir __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< opendir without context pointer */
};
union {
const esp_vfs_readdir_ctx_op_t readdir_p; /*!< readdir with context pointer */
const esp_vfs_readdir_op_t readdir; /*!< readdir without context pointer */
const esp_vfs_readdir_op_t readdir __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< readdir without context pointer */
};
union {
const esp_vfs_readdir_r_ctx_op_t readdir_r_p; /*!< readdir_r with context pointer */
const esp_vfs_readdir_r_op_t readdir_r; /*!< readdir_r without context pointer */
const esp_vfs_readdir_r_op_t readdir_r __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< readdir_r without context pointer */
};
union {
const esp_vfs_telldir_ctx_op_t telldir_p; /*!< telldir with context pointer */
const esp_vfs_telldir_op_t telldir; /*!< telldir without context pointer */
const esp_vfs_telldir_op_t telldir __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< telldir without context pointer */
};
union {
const esp_vfs_seekdir_ctx_op_t seekdir_p; /*!< seekdir with context pointer */
const esp_vfs_seekdir_op_t seekdir; /*!< seekdir without context pointer */
const esp_vfs_seekdir_op_t seekdir __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< seekdir without context pointer */
};
union {
const esp_vfs_closedir_ctx_op_t closedir_p; /*!< closedir with context pointer */
const esp_vfs_closedir_op_t closedir; /*!< closedir without context pointer */
const esp_vfs_closedir_op_t closedir __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< closedir without context pointer */
};
union {
const esp_vfs_mkdir_ctx_op_t mkdir_p; /*!< mkdir with context pointer */
const esp_vfs_mkdir_op_t mkdir; /*!< mkdir without context pointer */
const esp_vfs_mkdir_op_t mkdir __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< mkdir without context pointer */
};
union {
const esp_vfs_rmdir_ctx_op_t rmdir_p; /*!< rmdir with context pointer */
const esp_vfs_rmdir_op_t rmdir; /*!< rmdir without context pointer */
const esp_vfs_rmdir_op_t rmdir __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< rmdir without context pointer */
};
union {
const esp_vfs_access_ctx_op_t access_p; /*!< access with context pointer */
const esp_vfs_access_op_t access; /*!< access without context pointer */
const esp_vfs_access_op_t access __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< access without context pointer */
};
union {
const esp_vfs_truncate_ctx_op_t truncate_p; /*!< truncate with context pointer */
const esp_vfs_truncate_op_t truncate; /*!< truncate without context pointer */
const esp_vfs_truncate_op_t truncate __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< truncate without context pointer */
};
union {
const esp_vfs_ftruncate_ctx_op_t ftruncate_p; /*!< ftruncate with context pointer */
const esp_vfs_ftruncate_op_t ftruncate; /*!< ftruncate without context pointer */
const esp_vfs_ftruncate_op_t ftruncate __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< ftruncate without context pointer */
};
union {
const esp_vfs_utime_ctx_op_t utime_p; /*!< utime with context pointer */
const esp_vfs_utime_op_t utime; /*!< utime without context pointer */
const esp_vfs_utime_op_t utime __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< utime without context pointer */
};
} esp_vfs_dir_ops_t;
@@ -181,31 +186,31 @@ typedef int (*esp_vfs_tcsendbreak_op_t) ( int fd, int duration);
typedef struct {
union {
const esp_vfs_tcsetattr_ctx_op_t tcsetattr_p; /*!< tcsetattr with context pointer */
const esp_vfs_tcsetattr_op_t tcsetattr; /*!< tcsetattr without context pointer */
const esp_vfs_tcsetattr_op_t tcsetattr __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcsetattr without context pointer */
};
union {
const esp_vfs_tcgetattr_ctx_op_t tcgetattr_p; /*!< tcgetattr with context pointer */
const esp_vfs_tcgetattr_op_t tcgetattr; /*!< tcgetattr without context pointer */
const esp_vfs_tcgetattr_op_t tcgetattr __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcgetattr without context pointer */
};
union {
const esp_vfs_tcdrain_ctx_op_t tcdrain_p; /*!< tcdrain with context pointer */
const esp_vfs_tcdrain_op_t tcdrain; /*!< tcdrain without context pointer */
const esp_vfs_tcdrain_op_t tcdrain __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcdrain without context pointer */
};
union {
const esp_vfs_tcflush_ctx_op_t tcflush_p; /*!< tcflush with context pointer */
const esp_vfs_tcflush_op_t tcflush; /*!< tcflush without context pointer */
const esp_vfs_tcflush_op_t tcflush __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcflush without context pointer */
};
union {
const esp_vfs_tcflow_ctx_op_t tcflow_p; /*!< tcflow with context pointer */
const esp_vfs_tcflow_op_t tcflow; /*!< tcflow without context pointer */
const esp_vfs_tcflow_op_t tcflow __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcflow without context pointer */
};
union {
const esp_vfs_tcgetsid_ctx_op_t tcgetsid_p; /*!< tcgetsid with context pointer */
const esp_vfs_tcgetsid_op_t tcgetsid; /*!< tcgetsid without context pointer */
const esp_vfs_tcgetsid_op_t tcgetsid __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcgetsid without context pointer */
};
union {
const esp_vfs_tcsendbreak_ctx_op_t tcsendbreak_p; /*!< tcsendbreak with context pointer */
const esp_vfs_tcsendbreak_op_t tcsendbreak; /*!< tcsendbreak without context pointer */
const esp_vfs_tcsendbreak_op_t tcsendbreak __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< tcsendbreak without context pointer */
};
} esp_vfs_termios_ops_t;
@@ -276,47 +281,47 @@ typedef int (*esp_vfs_fsync_op_t) ( int fd);
typedef struct {
union {
const esp_vfs_write_ctx_op_t write_p; /*!< Write with context pointer */
const esp_vfs_write_op_t write; /*!< Write without context pointer */
const esp_vfs_write_op_t write __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< Write without context pointer */
};
union {
const esp_vfs_lseek_ctx_op_t lseek_p; /*!< Seek with context pointer */
const esp_vfs_lseek_op_t lseek; /*!< Seek without context pointer */
const esp_vfs_lseek_op_t lseek __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< Seek without context pointer */
};
union {
const esp_vfs_read_ctx_op_t read_p; /*!< Read with context pointer */
const esp_vfs_read_op_t read; /*!< Read without context pointer */
const esp_vfs_read_op_t read __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< Read without context pointer */
};
union {
const esp_vfs_pread_ctx_op_t pread_p; /*!< pread with context pointer */
const esp_vfs_pread_op_t pread; /*!< pread without context pointer */
const esp_vfs_pread_op_t pread __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< pread without context pointer */
};
union {
const esp_vfs_pwrite_ctx_op_t pwrite_p; /*!< pwrite with context pointer */
const esp_vfs_pwrite_op_t pwrite; /*!< pwrite without context pointer */
const esp_vfs_pwrite_op_t pwrite __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< pwrite without context pointer */
};
union {
const esp_vfs_open_ctx_op_t open_p; /*!< open with context pointer */
const esp_vfs_open_op_t open; /*!< open without context pointer */
const esp_vfs_open_op_t open __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< open without context pointer */
};
union {
const esp_vfs_close_ctx_op_t close_p; /*!< close with context pointer */
const esp_vfs_close_op_t close; /*!< close without context pointer */
const esp_vfs_close_op_t close __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< close without context pointer */
};
union {
const esp_vfs_fstat_ctx_op_t fstat_p; /*!< fstat with context pointer */
const esp_vfs_fstat_op_t fstat; /*!< fstat without context pointer */
const esp_vfs_fstat_op_t fstat __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< fstat without context pointer */
};
union {
const esp_vfs_fcntl_ctx_op_t fcntl_p; /*!< fcntl with context pointer */
const esp_vfs_fcntl_op_t fcntl; /*!< fcntl without context pointer */
const esp_vfs_fcntl_op_t fcntl __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< fcntl without context pointer */
};
union {
const esp_vfs_ioctl_ctx_op_t ioctl_p; /*!< ioctl with context pointer */
const esp_vfs_ioctl_op_t ioctl; /*!< ioctl without context pointer */
const esp_vfs_ioctl_op_t ioctl __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< ioctl without context pointer */
};
union {
const esp_vfs_fsync_ctx_op_t fsync_p; /*!< fsync with context pointer */
const esp_vfs_fsync_op_t fsync; /*!< fsync without context pointer */
const esp_vfs_fsync_op_t fsync __attribute__((deprecated("Context pointer-less API is deprecated"))); /*!< fsync without context pointer */
};
#ifdef CONFIG_VFS_SUPPORT_DIR
@@ -380,6 +385,10 @@ esp_err_t esp_vfs_unregister_fs(const char *base_path);
*/
esp_err_t esp_vfs_unregister_fs_with_id(esp_vfs_id_t id);
#if !defined(__DOXYGEN__)
#pragma pop_macro("deprecated")
#endif
#ifdef __cplusplus
}
#endif
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -18,7 +18,7 @@
* It is enough to check just one of them for NULL, as both variants are part of a union.
*/
#define CHECK_AND_CALL(ret, r, pvfs, func, ...) \
if (pvfs->vfs->func == NULL) { \
if (pvfs->vfs->func ## _p == NULL) { \
__errno_r(r) = ENOSYS; \
return -1; \
} \
@@ -29,7 +29,7 @@
}
#define CHECK_AND_CALL_SUBCOMPONENT(ret, r, pvfs, component, func, ...) \
if (pvfs->vfs->component == NULL || pvfs->vfs->component->func == NULL) { \
if (pvfs->vfs->component == NULL || pvfs->vfs->component->func ## _p == NULL) { \
__errno_r(r) = ENOSYS; \
return -1; \
} \
@@ -40,7 +40,7 @@
}
#define CHECK_AND_CALLV(r, pvfs, func, ...) \
if (pvfs->vfs->func == NULL) { \
if (pvfs->vfs->func ## _p == NULL) { \
__errno_r(r) = ENOSYS; \
return; \
} \
@@ -51,7 +51,7 @@
}
#define CHECK_AND_CALL_SUBCOMPONENTV(r, pvfs, component, func, ...) \
if (pvfs->vfs->component == NULL || pvfs->vfs->component->func == NULL) { \
if (pvfs->vfs->component == NULL || pvfs->vfs->component->func ## _p == NULL) { \
__errno_r(r) = ENOSYS; \
return; \
} \
@@ -62,7 +62,7 @@
}
#define CHECK_AND_CALLP(ret, r, pvfs, func, ...) \
if (pvfs->vfs->func == NULL) { \
if (pvfs->vfs->func ## _p == NULL) { \
__errno_r(r) = ENOSYS; \
return NULL; \
} \
@@ -73,7 +73,7 @@
}
#define CHECK_AND_CALL_SUBCOMPONENTP(ret, r, pvfs, component, func, ...) \
if (pvfs->vfs->component == NULL || pvfs->vfs->component->func == NULL) { \
if (pvfs->vfs->component == NULL || pvfs->vfs->component->func ## _p == NULL) { \
__errno_r(r) = ENOSYS; \
return NULL; \
} \
+3
View File
@@ -4,6 +4,8 @@
* SPDX-License-Identifier: Apache-2.0
*/
#define _VFS_SUPPRESS_CTX_DEPRECATION
#include <stdlib.h>
#include <string.h>
#include <sys/errno.h>
@@ -16,6 +18,7 @@
#include "esp_vfs.h"
#include "esp_vfs_private.h"
#include "esp_private/socket.h"
#include "sdkconfig.h"
// Warn about using deprecated option
+3
View File
@@ -3,6 +3,9 @@
*
* SPDX-License-Identifier: Apache-2.0
*/
#define _VFS_SUPPRESS_CTX_DEPRECATION
#include <stdlib.h>
#include <string.h>
#include <assert.h>