Loading...
Searching...
No Matches
vfs.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016 Eistec AB
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser
5 * General Public License v2.1. See the file LICENSE in the top level
6 * directory for more details.
7 */
8
9#pragma once
10
54
55#include <stdint.h>
56#include <sys/stat.h> /* for struct stat */
57#include <sys/types.h> /* for off_t etc. */
58#include <sys/statvfs.h> /* for struct statvfs */
59
60#include "sched.h"
61#include "clist.h"
62#include "iolist.h"
63#include "macros/utils.h"
64#include "mtd.h"
65#ifdef MODULE_NANOCOAP_FS
66#include "net/sock/config.h"
67#endif
68#include "xfa.h"
69
70#ifdef __cplusplus
71extern "C" {
72/* restrict is a C99 keyword, not valid in C++, but GCC and Clang have the
73 * __restrict__ extension keyword which can be used instead */
74#define restrict __restrict__
75/* If the above is not supported by the compiler, you can replace it with an
76 * empty definition instead: */
77/* #define restrict */
78#endif
79
83#ifndef MAX7
84#define MAX7(a, b, c, d, e, f, g) MAX(MAX(MAX(MAX(MAX((a), (b)), MAX((c), (d))), (e)), (f)), (g))
85#endif
86
91#ifdef MODULE_FATFS_VFS
92#include "ffconf.h"
93
94# if FF_FS_TINY
95# define _FATFS_FILE_CACHE (0)
96# else
97# define _FATFS_FILE_CACHE FF_MAX_SS
98# endif
99
100# if FF_USE_FASTSEEK
101# if (__SIZEOF_POINTER__ == 8)
102# define _FATFS_FILE_SEEK_PTR (8)
103# else
104# define _FATFS_FILE_SEEK_PTR (4)
105# endif
106# else
107# define _FATFS_FILE_SEEK_PTR (0)
108# endif
109
110# if FF_FS_EXFAT
111# define _FATFS_FILE_EXFAT (48)
112# define _FATFS_DIR_EXFAT (32)
113# else
114# define _FATFS_FILE_EXFAT (0)
115# define _FATFS_DIR_EXFAT (0)
116# endif
117
118# if FF_USE_LFN
119# if (__SIZEOF_POINTER__ == 8)
120# define _FATFS_DIR_LFN (8)
121# else
122# define _FATFS_DIR_LFN (4)
123# endif
124# else
125# define _FATFS_DIR_LFN (0)
126# endif
127
128# if (__SIZEOF_POINTER__ == 8)
129# define FATFS_VFS_DIR_BUFFER_SIZE (64 + _FATFS_DIR_LFN + _FATFS_DIR_EXFAT)
130# define FATFS_VFS_FILE_BUFFER_SIZE (64 + VFS_NAME_MAX + _FATFS_FILE_CACHE + \
131 _FATFS_FILE_SEEK_PTR + _FATFS_FILE_EXFAT)
132# else
133# define FATFS_VFS_DIR_BUFFER_SIZE (44 + _FATFS_DIR_LFN + _FATFS_DIR_EXFAT)
134# define FATFS_VFS_FILE_BUFFER_SIZE (44 + VFS_NAME_MAX + _FATFS_FILE_CACHE + \
135 _FATFS_FILE_SEEK_PTR + _FATFS_FILE_EXFAT)
136# endif
137#else
138# define FATFS_VFS_DIR_BUFFER_SIZE (1)
139# define FATFS_VFS_FILE_BUFFER_SIZE (1)
140#endif
142
147#ifdef MODULE_LITTLEFS
148# if (__SIZEOF_POINTER__ == 8)
149# define LITTLEFS_VFS_DIR_BUFFER_SIZE (48)
150# define LITTLEFS_VFS_FILE_BUFFER_SIZE (72)
151# else
152# define LITTLEFS_VFS_DIR_BUFFER_SIZE (44)
153# define LITTLEFS_VFS_FILE_BUFFER_SIZE (56)
154# endif
155#else
156# define LITTLEFS_VFS_DIR_BUFFER_SIZE (1)
157# define LITTLEFS_VFS_FILE_BUFFER_SIZE (1)
158#endif
160
165#ifdef MODULE_LITTLEFS2
166# if (__SIZEOF_POINTER__ == 8)
167# define LITTLEFS2_VFS_DIR_BUFFER_SIZE (56)
168# define LITTLEFS2_VFS_FILE_BUFFER_SIZE (104)
169# else
170# define LITTLEFS2_VFS_DIR_BUFFER_SIZE (52)
171# define LITTLEFS2_VFS_FILE_BUFFER_SIZE (84)
172# endif
173#else
174# define LITTLEFS2_VFS_DIR_BUFFER_SIZE (1)
175# define LITTLEFS2_VFS_FILE_BUFFER_SIZE (1)
176#endif
178
183#ifdef MODULE_SPIFFS
184# define SPIFFS_VFS_DIR_BUFFER_SIZE (12)
185# define SPIFFS_VFS_FILE_BUFFER_SIZE (1)
186#else
187# define SPIFFS_VFS_DIR_BUFFER_SIZE (1)
188# define SPIFFS_VFS_FILE_BUFFER_SIZE (1)
189#endif
191
196#if defined(MODULE_LWEXT4) || DOXYGEN
197# define LWEXT4_VFS_DIR_BUFFER_SIZE (308)
198# define LWEXT4_VFS_FILE_BUFFER_SIZE (32)
199#else
200# define LWEXT4_VFS_DIR_BUFFER_SIZE (1)
201# define LWEXT4_VFS_FILE_BUFFER_SIZE (1)
202#endif
204
209#if defined(MODULE_NANOCOAP_FS) || DOXYGEN
210# define NANOCOAP_FS_VFS_DIR_BUFFER_SIZE \
211 (4 + CONFIG_SOCK_URLPATH_MAXLEN)
212# define NANOCOAP_FS_VFS_FILE_BUFFER_SIZE \
213 (4 + CONFIG_SOCK_URLPATH_MAXLEN)
214#else
215# define NANOCOAP_FS_VFS_DIR_BUFFER_SIZE (1)
216# define NANOCOAP_FS_VFS_FILE_BUFFER_SIZE (1)
217#endif
219
224#if defined(MODULE_XIPFS) || DOXYGEN
225# define XIPFS_VFS_DIR_BUFFER_SIZE (68)
226# define XIPFS_VFS_FILE_BUFFER_SIZE (12)
227#else
228# define XIPFS_VFS_DIR_BUFFER_SIZE (1)
229# define XIPFS_VFS_FILE_BUFFER_SIZE (1)
230#endif
232
233#ifndef VFS_MAX_OPEN_FILES
237#define VFS_MAX_OPEN_FILES (16)
238#endif
239
240#ifndef VFS_DIR_BUFFER_SIZE
268#define VFS_DIR_BUFFER_SIZE MAX7(FATFS_VFS_DIR_BUFFER_SIZE, \
269 LITTLEFS_VFS_DIR_BUFFER_SIZE, \
270 LITTLEFS2_VFS_DIR_BUFFER_SIZE, \
271 SPIFFS_VFS_DIR_BUFFER_SIZE, \
272 LWEXT4_VFS_DIR_BUFFER_SIZE, \
273 NANOCOAP_FS_VFS_DIR_BUFFER_SIZE, \
274 XIPFS_VFS_DIR_BUFFER_SIZE \
275 )
276#endif
277
278#ifndef VFS_FILE_BUFFER_SIZE
298#define VFS_FILE_BUFFER_SIZE MAX7(FATFS_VFS_FILE_BUFFER_SIZE, \
299 LITTLEFS_VFS_FILE_BUFFER_SIZE, \
300 LITTLEFS2_VFS_FILE_BUFFER_SIZE, \
301 SPIFFS_VFS_FILE_BUFFER_SIZE, \
302 LWEXT4_VFS_FILE_BUFFER_SIZE, \
303 NANOCOAP_FS_VFS_FILE_BUFFER_SIZE, \
304 XIPFS_VFS_FILE_BUFFER_SIZE \
305 )
306#endif
307
308#ifndef VFS_NAME_MAX
316#define VFS_NAME_MAX (31)
317#endif
318
322#define VFS_ANY_FD (-1)
323
329#define VFS_MTD(mtd) { .dev = &mtd.base }
330
344#define VFS_AUTO_MOUNT(type, mtd, path, idx) \
345 static type ## _desc_t fs_desc_ ## idx = mtd; \
346 \
347 XFA(vfs_mount_t, vfs_mountpoints_xfa, 0) \
348 _mount_mtd_ ## idx = { \
349 .fs = &type ## _file_system, \
350 .mount_point = path, \
351 .private_data = &fs_desc_ ## idx, \
352 }
353
354/* Forward declarations */
359
364
369
373/* not struct vfs_mount because of name collision with the function */
375
379extern const vfs_file_ops_t mtd_vfs_ops;
380
384#define VFS_FS_FLAG_WANT_ABS_PATH (1 << 0)
385
389typedef struct {
393 const uint32_t flags;
395
407
413typedef struct {
416 int flags;
417 off_t pos;
419 union {
420 void *ptr;
421 int value;
423 } private_data;
424} vfs_file_t;
425
434typedef struct {
437 union {
438 void *ptr;
439 int value;
441 } private_data;
442} vfs_DIR;
443
452typedef struct {
453 ino_t d_ino;
456
481 int (*close) (vfs_file_t *filp);
482
493 int (*fcntl) (vfs_file_t *filp, int cmd, int arg);
494
504 int (*fstat) (vfs_file_t *filp, struct stat *buf);
505
523 off_t (*lseek) (vfs_file_t *filp, off_t off, int whence);
524
551 int (*open) (vfs_file_t *filp, const char *name, int flags, mode_t mode);
552
563 ssize_t (*read) (vfs_file_t *filp, void *dest, size_t nbytes);
564
575 ssize_t (*write) (vfs_file_t *filp, const void *src, size_t nbytes);
576
586 int (*fsync) (vfs_file_t *filp);
587};
588
602 int (*opendir) (vfs_DIR *dirp, const char *dirname);
603
623 int (*readdir) (vfs_DIR *dirp, vfs_dirent_t *entry);
624
633 int (*closedir) (vfs_DIR *dirp);
634};
635
650 int (*format) (vfs_mount_t *mountp);
651
666 int (*mount) (vfs_mount_t *mountp);
667
676 int (*umount) (vfs_mount_t *mountp);
677
692 int (*rename) (vfs_mount_t *mountp, const char *from_path, const char *to_path);
693
703 int (*unlink) (vfs_mount_t *mountp, const char *name);
704
715 int (*mkdir) (vfs_mount_t *mountp, const char *name, mode_t mode);
716
728 int (*rmdir) (vfs_mount_t *mountp, const char *name);
729
740 int (*stat) (vfs_mount_t *mountp, const char *restrict path, struct stat *restrict buf);
741
757 int (*statvfs) (vfs_mount_t *mountp, const char *restrict path, struct statvfs *restrict buf);
758};
759
767void vfs_bind_stdio(void);
768
777int vfs_close(int fd);
778
789int vfs_fcntl(int fd, int cmd, int arg);
790
800int vfs_fstat(int fd, struct stat *buf);
801
811int vfs_fstatvfs(int fd, struct statvfs *buf);
812
822int vfs_dstatvfs(vfs_DIR *dirp, struct statvfs *buf);
823
841off_t vfs_lseek(int fd, off_t off, int whence);
842
853int vfs_open(const char *name, int flags, mode_t mode);
854
868ssize_t vfs_read(int fd, void *dest, size_t count);
869
882ssize_t vfs_readline(int fd, char *dest, size_t count);
883
897ssize_t vfs_write(int fd, const void *src, size_t count);
898
908ssize_t vfs_write_iol(int fd, const iolist_t *iolist);
909
919int vfs_fsync(int fd);
920
932int vfs_opendir(vfs_DIR *dirp, const char *dirname);
933
952
965
980
994int vfs_format_by_path(const char *path);
995
1008
1022int vfs_mount_by_path(const char *path);
1023
1035int vfs_unmount_by_path(const char *path, bool force);
1036
1050int vfs_rename(const char *from_path, const char *to_path);
1051
1063int vfs_umount(vfs_mount_t *mountp, bool force);
1064
1073int vfs_unlink(const char *name);
1074
1084int vfs_mkdir(const char *name, mode_t mode);
1085
1096int vfs_rmdir(const char *name);
1097
1107int vfs_stat(const char *restrict path, struct stat *restrict buf);
1108
1121int vfs_statvfs(const char *restrict path, struct statvfs *restrict buf);
1122
1142int vfs_bind(int fd, int flags, const vfs_file_ops_t *f_op, void *private_data);
1143
1161int vfs_normalize_path(char *buf, const char *path, size_t buflen);
1162
1193
1208
1220 const char *restrict path,
1221 struct stat *restrict buf);
1222
1223#ifdef __cplusplus
1224}
1225#endif
1226
Circular linked list.
list_node_t clist_node_t
List node structure.
Definition clist.h:106
Various helper macros.
int16_t kernel_pid_t
Unique process identifier.
Definition sched.h:138
struct iolist iolist_t
iolist forward declaration
Definition iolist.h:33
#define VFS_DIR_BUFFER_SIZE
Size of buffer space in vfs_DIR.
Definition vfs.h:268
int vfs_mount(vfs_mount_t *mountp)
Mount a file system.
int vfs_normalize_path(char *buf, const char *path, size_t buflen)
Normalize a path.
struct vfs_file_system_ops vfs_file_system_ops_t
struct vfs_file_system_ops typedef
Definition vfs.h:368
int vfs_open(const char *name, int flags, mode_t mode)
Open a file.
int vfs_statvfs(const char *restrict path, struct statvfs *restrict buf)
Get file system status.
ssize_t vfs_write(int fd, const void *src, size_t count)
Write bytes to an open file.
int vfs_mkdir(const char *name, mode_t mode)
Create a directory on the file system.
int vfs_umount(vfs_mount_t *mountp, bool force)
Unmount a mounted file system.
int vfs_close(int fd)
Close an open file.
#define VFS_FILE_BUFFER_SIZE
Size of buffer space in vfs_file_t.
Definition vfs.h:298
int vfs_sysop_stat_from_fstat(vfs_mount_t *mountp, const char *restrict path, struct stat *restrict buf)
Implementation of stat using fstat
#define VFS_NAME_MAX
Maximum length of the name in a vfs_dirent_t (not including terminating null)
Definition vfs.h:316
int vfs_readdir(vfs_DIR *dirp, vfs_dirent_t *entry)
Read a single entry from the open directory dirp and advance the read position by one.
off_t vfs_lseek(int fd, off_t off, int whence)
Seek to position in file.
int vfs_format(vfs_mount_t *mountp)
Format a file system.
int vfs_bind(int fd, int flags, const vfs_file_ops_t *f_op, void *private_data)
Allocate a new file descriptor and give it file operations.
int vfs_format_by_path(const char *path)
Format a file system.
int vfs_rename(const char *from_path, const char *to_path)
Rename a file.
ssize_t vfs_write_iol(int fd, const iolist_t *iolist)
Write bytes from an iolist to an open file.
int vfs_stat(const char *restrict path, struct stat *restrict buf)
Get file status.
void vfs_bind_stdio(void)
Allocate and bind file descriptors for STDIN, STDERR, and STDOUT.
ssize_t vfs_readline(int fd, char *dest, size_t count)
Read a line from an open text file.
struct vfs_mount_struct vfs_mount_t
struct vfs_mount_struct typedef
Definition vfs.h:374
const vfs_file_t * vfs_file_get(int fd)
Get information about the file for internal purposes.
int vfs_unlink(const char *name)
Unlink (delete) a file from a mounted file system.
struct vfs_file_ops vfs_file_ops_t
struct vfs_file_ops typedef
Definition vfs.h:358
int vfs_fsync(int fd)
Synchronize a file on storage Any pending writes are written out to storage.
int vfs_opendir(vfs_DIR *dirp, const char *dirname)
Open a directory for reading with readdir.
const vfs_file_ops_t mtd_vfs_ops
MTD driver for VFS.
int vfs_dstatvfs(vfs_DIR *dirp, struct statvfs *buf)
Get file system status of the file system containing an open directory.
int vfs_rmdir(const char *name)
Remove a directory from the file system.
int vfs_fcntl(int fd, int cmd, int arg)
Query/set options on an open file.
int vfs_fstat(int fd, struct stat *buf)
Get status of an open file.
ssize_t vfs_read(int fd, void *dest, size_t count)
Read bytes from an open file.
bool vfs_iterate_mount_dirs(vfs_DIR *dir)
Iterate through all mounted file systems by their root directories.
struct vfs_dir_ops vfs_dir_ops_t
struct vfs_dir_ops typedef
Definition vfs.h:363
int vfs_closedir(vfs_DIR *dirp)
Close an open directory.
int vfs_fstatvfs(int fd, struct statvfs *buf)
Get file system status of the file system containing an open file.
int vfs_mount_by_path(const char *path)
Mount a file system with a pre-configured mount path.
int vfs_unmount_by_path(const char *path, bool force)
Unmount a file system with a pre-configured mount path.
iolist scatter / gather IO
Scheduler API definition.
POSIX compatible sys/statvfs.h definitions.
iolist structure definition
Definition iolist.h:38
File system information.
Definition statvfs.h:46
Internal representation of a file system directory entry.
Definition vfs.h:434
const vfs_dir_ops_t * d_op
Directory operations table.
Definition vfs.h:435
int value
alternatively, you can use private_data as an int
Definition vfs.h:439
uint8_t buffer[VFS_DIR_BUFFER_SIZE]
Buffer space, in case a single pointer is not enough.
Definition vfs.h:440
vfs_mount_t * mp
Pointer to mount table entry.
Definition vfs.h:436
void * ptr
pointer to private data
Definition vfs.h:438
Operations on open directories.
Definition vfs.h:592
int(* readdir)(vfs_DIR *dirp, vfs_dirent_t *entry)
Read a single entry from the open directory dirp and advance the read position by one.
Definition vfs.h:623
int(* opendir)(vfs_DIR *dirp, const char *dirname)
Open a directory for reading with readdir.
Definition vfs.h:602
int(* closedir)(vfs_DIR *dirp)
Close an open directory.
Definition vfs.h:633
User facing directory entry.
Definition vfs.h:452
ino_t d_ino
file serial number, unique for the file system ("inode" in Linux)
Definition vfs.h:453
char d_name[VFS_NAME_MAX+1]
file name, relative to its containing directory
Definition vfs.h:454
Operations on open files.
Definition vfs.h:462
int(* fcntl)(vfs_file_t *filp, int cmd, int arg)
Query/set options on an open file.
Definition vfs.h:493
int(* close)(vfs_file_t *filp)
Close an open file.
Definition vfs.h:481
int(* fstat)(vfs_file_t *filp, struct stat *buf)
Get status of an open file.
Definition vfs.h:504
int(* fsync)(vfs_file_t *filp)
Synchronize a file on storage Any pending writes are written out to storage.
Definition vfs.h:586
off_t(* lseek)(vfs_file_t *filp, off_t off, int whence)
Seek to position in file.
Definition vfs.h:523
int(* open)(vfs_file_t *filp, const char *name, int flags, mode_t mode)
Attempt to open a file in the file system at rel_path.
Definition vfs.h:551
ssize_t(* read)(vfs_file_t *filp, void *dest, size_t nbytes)
Read bytes from an open file.
Definition vfs.h:563
ssize_t(* write)(vfs_file_t *filp, const void *src, size_t nbytes)
Write bytes to an open file.
Definition vfs.h:575
Operations on mounted file systems.
Definition vfs.h:641
int(* statvfs)(vfs_mount_t *mountp, const char *restrict path, struct statvfs *restrict buf)
Get file system status.
Definition vfs.h:757
int(* mount)(vfs_mount_t *mountp)
Perform any extra processing needed after mounting a file system.
Definition vfs.h:666
int(* unlink)(vfs_mount_t *mountp, const char *name)
Unlink (delete) a file from the file system.
Definition vfs.h:703
int(* rename)(vfs_mount_t *mountp, const char *from_path, const char *to_path)
Rename a file.
Definition vfs.h:692
int(* stat)(vfs_mount_t *mountp, const char *restrict path, struct stat *restrict buf)
Get file status.
Definition vfs.h:740
int(* mkdir)(vfs_mount_t *mountp, const char *name, mode_t mode)
Create a directory on the file system.
Definition vfs.h:715
int(* format)(vfs_mount_t *mountp)
Format the file system on the given mount point.
Definition vfs.h:650
int(* rmdir)(vfs_mount_t *mountp, const char *name)
Remove a directory from the file system.
Definition vfs.h:728
int(* umount)(vfs_mount_t *mountp)
Perform the necessary clean up for unmounting a file system.
Definition vfs.h:676
A file system driver.
Definition vfs.h:389
const vfs_file_system_ops_t * fs_op
File system operations table.
Definition vfs.h:392
const vfs_dir_ops_t * d_op
Directory operations table.
Definition vfs.h:391
const vfs_file_ops_t * f_op
File operations table.
Definition vfs.h:390
const uint32_t flags
File system flags.
Definition vfs.h:393
Information about an open file.
Definition vfs.h:413
void * ptr
pointer to private data
Definition vfs.h:420
vfs_mount_t * mp
Pointer to mount table entry.
Definition vfs.h:415
kernel_pid_t pid
PID of the process that opened the file.
Definition vfs.h:418
int value
alternatively, you can use private_data as an int
Definition vfs.h:421
int flags
File flags.
Definition vfs.h:416
const vfs_file_ops_t * f_op
File operations table.
Definition vfs.h:414
uint8_t buffer[VFS_FILE_BUFFER_SIZE]
Buffer space, in case a single pointer is not enough.
Definition vfs.h:422
off_t pos
Current position in the file.
Definition vfs.h:417
A mounted file system.
Definition vfs.h:399
const vfs_file_system_t * fs
The file system driver for the mount point.
Definition vfs.h:401
clist_node_t list_entry
List entry for the _vfs_mount_list list.
Definition vfs.h:400
size_t mount_point_len
Length of mount_point string (set by vfs_mount)
Definition vfs.h:403
uint16_t open_files
Number of currently open files and directories.
Definition vfs.h:404
void * private_data
File system driver private data, implementation defined.
Definition vfs.h:405
const char * mount_point
Mount point, e.g.
Definition vfs.h:402
Cross File Arrays.