grblHAL core  20260824
vfs.h
Go to the documentation of this file.
1 /*
2  vfs.h - An embedded CNC Controller with rs274/ngc (g-code) support
3 
4  Virtual File System handler
5 
6  Part of grblHAL
7 
8  Copyright (c) 2022-2026 Terje Io
9 
10  grblHAL is free software: you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  grblHAL is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with grblHAL. If not, see <http://www.gnu.org/licenses/>.
22 */
23 
24 #ifndef INCLUDE_VFS_H
25 #define INCLUDE_VFS_H
26 
27 #define GRBL_VFS
28 
29 #include <stdint.h>
30 #include <stdbool.h>
31 #include <stddef.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <time.h>
35 
36 #define VFS_MOUNT_PATH_LEN 33
37 
38 #define vfs_load_plugin(x)
39 
40 #ifndef bcopy
41 #define bcopy(src, dest, len) memmove(dest, src, len)
42 #endif
43 
44 #if !(defined(__time_t_defined) || defined(_TIME_H_) || defined(__MSP432P401R__) || defined(PART_TM4C123GH6PM))
45 typedef struct {
46  short date;
47  short time;
48 } time_t;
49 
50 struct tm {
51  int tm_year;
52  int tm_mon;
53  int tm_mday;
54  int tm_hour;
55  int tm_min;
56  int tm_sec;
57 };
58 #endif // __time_t_defined
59 
60 typedef struct
61 {
62  char *name;
63  size_t len;
64 } vfs_path_t;
65 
66 typedef union
67 {
68  uint8_t mode;
69  struct {
70  uint8_t read_only :1,
71  hidden :1,
72  system :1,
73  unused :1,
75  archive :1;
76  };
78 
79 typedef struct {
80  size_t st_size;
82 #ifdef ESP_PLATFORM // some versions of ESP-IDF/Compiler combos are fcked up
83  time_t st_mtim;
84 #else
86 #endif
87 } vfs_stat_t;
88 
89 typedef struct {
90  uint8_t update :1,
92  unused :6;
94 
95 typedef struct {
96  const void *fs;
97  size_t size;
99  uint8_t handle __attribute__ ((aligned (4))); // first byte of file handle structure
100 } vfs_file_t;
101 
102 struct vfs_dir;
103 typedef struct vfs_dir vfs_dir_t;
104 
105 typedef struct {
106  char name[255];
107  size_t size;
109 } vfs_dirent_t;
110 
111 typedef struct {
112  uint64_t size;
113  uint64_t used;
114 } vfs_free_t;
115 
116 typedef struct {
117  const char *name;
118  size_t size;
120  const uint8_t data[];
122 
123 typedef vfs_file_t *(*vfs_open_ptr)(const char *filename, const char *mode);
124 typedef char *(*vfs_getcwd_ptr)(char *buf, size_t size);
125 typedef size_t (*vfs_read_ptr)(void *buffer, size_t size, size_t count, vfs_file_t *file);
126 typedef size_t (*vfs_write_ptr)(const void *buffer, size_t size, size_t count, vfs_file_t *file);
127 typedef void (*vfs_close_ptr)(vfs_file_t *file);
128 typedef size_t (*vfs_ftell_ptr)(vfs_file_t *file);
129 typedef int (*vfs_fseek_ptr)(vfs_file_t *file, size_t offset);
130 typedef int (*vfs_ftruncate_ptr)(vfs_file_t *file, size_t length);
131 typedef bool (*vfs_eof_ptr)(vfs_file_t *file);
132 typedef int (*vfs_rename_ptr)(const char *from, const char *to);
133 typedef int (*vfs_unlink_ptr)(const char *filename);
134 
135 typedef int (*vfs_mkdir_ptr)(const char *path);
136 typedef int (*vfs_chdir_ptr)(const char *path);
137 typedef int (*vfs_rmdir_ptr)(const char *path);
138 typedef vfs_dir_t *(*vfs_opendir_ptr)(const char *path);
139 typedef char *(*vfs_readdir_ptr)(vfs_dir_t *dir, vfs_dirent_t *dirent);
140 typedef void (*vfs_closedir_ptr)(vfs_dir_t *dir);
141 typedef int (*vfs_chmod_ptr)(const char *filename, vfs_st_mode_t attr, vfs_st_mode_t mask);
142 typedef int (*vfs_stat_ptr)(const char *filename, vfs_stat_t *st);
143 typedef int (*vfs_utime_ptr)(const char *filename, struct tm *modified);
144 
145 typedef bool (*vfs_getfree_ptr)(vfs_free_t *free);
146 typedef int (*vfs_format_ptr)(void);
147 typedef bool (*vfs_device_mount_ptr)(const void *dev, bool mount);
148 
149 typedef struct
150 {
151  const char *fs_name;
152  bool removable;
176 } vfs_t;
177 
178 typedef void (*on_vfs_changed_ptr)(const vfs_t *fs);
179 typedef void (*on_vfs_mount_ptr)(const char *path, const vfs_t *fs, vfs_st_mode_t mode);
180 typedef void (*on_vfs_unmount_ptr)(const char *path);
181 
182 typedef struct {
186 } vfs_events_t;
187 
188 typedef struct vfs_mount
189 {
191  const void *device;
192  const vfs_t *vfs;
194 #ifdef ESP_PLATFORM // some versions of ESP-IDF/Compiler combos are fcked up
195  time_t st_mtim;
196 #else
198 #endif
199  struct vfs_mount *next;
201 
202 typedef struct vfs_mount_ll_entry
203 {
207 
208 typedef struct {
210 } vfs_drives_t;
211 
212 typedef struct {
213  const char *name;
214  char *path;
215  bool removable;
217  const void *fs;
218 } vfs_drive_t;
219 
220 struct vfs_dir {
221  const void *fs;
223  uint8_t handle __attribute__ ((aligned (4))); // must be last!
224 };
225 
226 extern volatile int vfs_errno;
227 extern vfs_events_t vfs;
228 
229 char *vfs_fixpath (char *path);
230 
231 bool vfs_mount (const void *device, const char *path, const vfs_t *fs, vfs_st_mode_t mode);
232 bool vfs_unmount (const void *device, const char *path);
233 vfs_file_t *vfs_open (const char *filename, const char *mode);
234 void vfs_close (vfs_file_t *file);
235 size_t vfs_read (void *buffer, size_t size, size_t count, vfs_file_t *file);
236 size_t vfs_write (const void *buffer, size_t size, size_t count, vfs_file_t *file);
237 int vfs_puts (const char *s, vfs_file_t *file);
238 size_t vfs_tell (vfs_file_t *file);
239 int vfs_seek (vfs_file_t *file, size_t offset);
240 int vfs_truncate (vfs_file_t *file, size_t length);
241 bool vfs_eof (vfs_file_t *file);
242 int vfs_rename (const char *from, const char *to);
243 int vfs_unlink (const char *filename);
244 int vfs_mkdir (const char *path);
245 int vfs_rmdir (const char *path);
246 int vfs_chdir (const char *path);
247 vfs_dir_t *vfs_opendir (const char *path);
249 void vfs_closedir (vfs_dir_t *dir);
250 char *vfs_getcwd (char *buf, size_t len);
251 int vfs_chmod (const char *filename, vfs_st_mode_t attr, vfs_st_mode_t mask);
252 int vfs_stat (const char *filename, vfs_stat_t *st);
253 int vfs_utime (const char *filename, struct tm *modified);
254 vfs_free_t *vfs_fgetfree (const char *path);
255 
257 vfs_drive_t *vfs_drives_read (vfs_drives_t *handle, bool add_hidden);
258 void vfs_drives_close (vfs_drives_t *handle);
260 int vfs_drive_format (vfs_drive_t *drive);
261 vfs_drive_t *vfs_get_drive (const char *path);
262 
263 #endif // INCLUDE_VFS_H
uint32_t size
Definition: nvs_buffer.c:46
Definition: vfs.h:116
vfs_st_mode_t st_mode
Definition: vfs.h:119
size_t size
Definition: vfs.h:118
const char * name
Definition: vfs.h:117
Definition: vfs.h:45
short time
Definition: vfs.h:47
short date
Definition: vfs.h:46
Definition: vfs.h:50
int tm_mday
Definition: vfs.h:53
int tm_sec
Definition: vfs.h:56
int tm_hour
Definition: vfs.h:54
int tm_min
Definition: vfs.h:55
int tm_year
Definition: vfs.h:51
int tm_mon
Definition: vfs.h:52
Definition: vfs.h:220
uint8_t handle
Definition: vfs.h:223
const void * fs
Definition: vfs.h:221
vfs_mount_ll_entry_t * mounts
Definition: vfs.h:222
Definition: vfs.h:105
vfs_st_mode_t st_mode
Definition: vfs.h:108
size_t size
Definition: vfs.h:107
Definition: vfs.h:212
bool removable
Definition: vfs.h:215
const void * fs
Definition: vfs.h:217
char * path
Definition: vfs.h:214
const char * name
Definition: vfs.h:213
vfs_st_mode_t mode
Definition: vfs.h:216
Definition: vfs.h:208
vfs_mount_t * mount
Definition: vfs.h:209
Definition: vfs.h:182
on_vfs_unmount_ptr on_unmount
Called when a file system is unmounted.
Definition: vfs.h:184
on_vfs_changed_ptr on_fs_changed
Called when file system content is changed.
Definition: vfs.h:185
on_vfs_mount_ptr on_mount
Called when a file system is mounted.
Definition: vfs.h:183
Definition: vfs.h:89
uint8_t is_temporary
Definition: vfs.h:91
uint8_t update
Definition: vfs.h:90
uint8_t unused
Definition: vfs.h:92
Definition: vfs.h:95
const void * fs
Definition: vfs.h:96
size_t size
Definition: vfs.h:97
vfs_file_status_t status
Definition: vfs.h:98
Definition: vfs.h:111
uint64_t used
Definition: vfs.h:113
uint64_t size
Definition: vfs.h:112
Definition: vfs.h:203
struct vfs_mount_ll_entry * next
Definition: vfs.h:205
vfs_mount_t * mount
Definition: vfs.h:204
Definition: vfs.h:189
struct vfs_mount * next
Definition: vfs.h:199
char path[VFS_MOUNT_PATH_LEN]
Definition: vfs.h:190
const vfs_t * vfs
Definition: vfs.h:192
vfs_st_mode_t mode
Definition: vfs.h:193
const void * device
Definition: vfs.h:191
time_t st_mtime
Definition: vfs.h:197
Definition: vfs.h:61
char * name
Definition: vfs.h:62
size_t len
Definition: vfs.h:63
Definition: vfs.h:79
vfs_st_mode_t st_mode
Definition: vfs.h:81
size_t st_size
Definition: vfs.h:80
time_t st_mtime
Definition: vfs.h:85
Definition: vfs.h:150
vfs_open_ptr fopen
Definition: vfs.h:153
vfs_getfree_ptr fgetfree
Definition: vfs.h:173
bool removable
Definition: vfs.h:152
vfs_chmod_ptr fchmod
Definition: vfs.h:169
vfs_format_ptr format
Definition: vfs.h:174
vfs_chdir_ptr fchdir
Definition: vfs.h:164
vfs_write_ptr fwrite
Definition: vfs.h:156
vfs_stat_ptr fstat
Definition: vfs.h:170
vfs_eof_ptr feof
Definition: vfs.h:160
vfs_mkdir_ptr fmkdir
Definition: vfs.h:163
const char * fs_name
Definition: vfs.h:151
vfs_close_ptr fclose
Definition: vfs.h:154
vfs_getcwd_ptr fgetcwd
Definition: vfs.h:172
vfs_fseek_ptr fseek
Definition: vfs.h:158
vfs_ftruncate_ptr ftruncate
Definition: vfs.h:159
vfs_readdir_ptr readdir
Definition: vfs.h:167
vfs_unlink_ptr funlink
Definition: vfs.h:162
vfs_device_mount_ptr device_mount
Definition: vfs.h:175
vfs_rename_ptr frename
Definition: vfs.h:161
vfs_opendir_ptr fopendir
Definition: vfs.h:166
vfs_read_ptr fread
Definition: vfs.h:155
vfs_ftell_ptr ftell
Definition: vfs.h:157
vfs_utime_ptr futime
Definition: vfs.h:171
vfs_rmdir_ptr frmdir
Definition: vfs.h:165
vfs_closedir_ptr fclosedir
Definition: vfs.h:168
Definition: vfs.h:67
uint8_t directory
Definition: vfs.h:74
uint8_t system
Definition: vfs.h:72
uint8_t mode
Definition: vfs.h:68
uint8_t hidden
Definition: vfs.h:71
uint8_t read_only
Definition: vfs.h:70
uint8_t archive
Definition: vfs.h:75
uint8_t unused
Definition: vfs.h:73
int(* vfs_chmod_ptr)(const char *filename, vfs_st_mode_t attr, vfs_st_mode_t mask)
Definition: vfs.h:141
vfs_free_t * vfs_drive_getfree(vfs_drive_t *drive)
Definition: vfs.c:813
struct vfs_mount vfs_mount_t
void(* vfs_closedir_ptr)(vfs_dir_t *dir)
Definition: vfs.h:140
int vfs_rename(const char *from, const char *to)
Definition: vfs.c:419
void(* on_vfs_mount_ptr)(const char *path, const vfs_t *fs, vfs_st_mode_t mode)
Definition: vfs.h:179
void(* on_vfs_unmount_ptr)(const char *path)
Definition: vfs.h:180
size_t(* vfs_read_ptr)(void *buffer, size_t size, size_t count, vfs_file_t *file)
Definition: vfs.h:125
vfs_free_t * vfs_fgetfree(const char *path)
Definition: vfs.c:633
int(* vfs_rename_ptr)(const char *from, const char *to)
Definition: vfs.h:132
int(* vfs_mkdir_ptr)(const char *path)
Definition: vfs.h:135
volatile int vfs_errno
Definition: vfs.c:230
vfs_dir_t *(* vfs_opendir_ptr)(const char *path)
Definition: vfs.h:138
int vfs_puts(const char *s, vfs_file_t *file)
Definition: vfs.c:379
void vfs_closedir(vfs_dir_t *dir)
Definition: vfs.c:577
bool vfs_eof(vfs_file_t *file)
Definition: vfs.c:412
vfs_dir_t * vfs_opendir(const char *path)
Definition: vfs.c:521
vfs_drive_t * vfs_drives_read(vfs_drives_t *handle, bool add_hidden)
Definition: vfs.c:781
size_t vfs_read(void *buffer, size_t size, size_t count, vfs_file_t *file)
Definition: vfs.c:365
char * vfs_fixpath(char *path)
Definition: vfs.c:239
bool(* vfs_getfree_ptr)(vfs_free_t *free)
Definition: vfs.h:145
int vfs_truncate(vfs_file_t *file, size_t length)
Definition: vfs.c:405
vfs_drive_t * vfs_get_drive(const char *path)
Definition: vfs.c:741
int(* vfs_unlink_ptr)(const char *filename)
Definition: vfs.h:133
char *(* vfs_readdir_ptr)(vfs_dir_t *dir, vfs_dirent_t *dirent)
Definition: vfs.h:139
int vfs_rmdir(const char *path)
Definition: vfs.c:461
size_t(* vfs_ftell_ptr)(vfs_file_t *file)
Definition: vfs.h:128
int vfs_stat(const char *filename, vfs_stat_t *st)
Definition: vfs.c:617
int vfs_mkdir(const char *path)
Definition: vfs.c:448
vfs_drives_t * vfs_drives_open(void)
Definition: vfs.c:757
int vfs_drive_format(vfs_drive_t *drive)
Definition: vfs.c:822
bool(* vfs_device_mount_ptr)(const void *dev, bool mount)
Definition: vfs.h:147
struct vfs_mount_ll_entry vfs_mount_ll_entry_t
bool(* vfs_eof_ptr)(vfs_file_t *file)
Definition: vfs.h:131
int vfs_seek(vfs_file_t *file, size_t offset)
Definition: vfs.c:398
int(* vfs_rmdir_ptr)(const char *path)
Definition: vfs.h:137
char *(* vfs_getcwd_ptr)(char *buf, size_t size)
Definition: vfs.h:124
int(* vfs_chdir_ptr)(const char *path)
Definition: vfs.h:136
int(* vfs_stat_ptr)(const char *filename, vfs_stat_t *st)
Definition: vfs.h:142
void vfs_close(vfs_file_t *file)
Definition: vfs.c:355
bool vfs_mount(const void *device, const char *path, const vfs_t *fs, vfs_st_mode_t mode)
Definition: vfs.c:656
int(* vfs_fseek_ptr)(vfs_file_t *file, size_t offset)
Definition: vfs.h:129
vfs_events_t vfs
Definition: vfs.c:231
void(* vfs_close_ptr)(vfs_file_t *file)
Definition: vfs.h:127
int vfs_chmod(const char *filename, vfs_st_mode_t attr, vfs_st_mode_t mask)
Definition: vfs.c:610
char * vfs_getcwd(char *buf, size_t len)
Definition: vfs.c:590
size_t(* vfs_write_ptr)(const void *buffer, size_t size, size_t count, vfs_file_t *file)
Definition: vfs.h:126
int vfs_utime(const char *filename, struct tm *modified)
Definition: vfs.c:626
int vfs_chdir(const char *path)
Definition: vfs.c:479
vfs_file_t *(* vfs_open_ptr)(const char *filename, const char *mode)
Definition: vfs.h:123
vfs_file_t * vfs_open(const char *filename, const char *mode)
Definition: vfs.c:342
void(* on_vfs_changed_ptr)(const vfs_t *fs)
Definition: vfs.h:178
#define VFS_MOUNT_PATH_LEN
Definition: vfs.h:36
void vfs_drives_close(vfs_drives_t *handle)
Definition: vfs.c:808
bool vfs_unmount(const void *device, const char *path)
Definition: vfs.c:704
int(* vfs_utime_ptr)(const char *filename, struct tm *modified)
Definition: vfs.h:143
int(* vfs_format_ptr)(void)
Definition: vfs.h:146
int vfs_unlink(const char *filename)
Definition: vfs.c:435
vfs_dirent_t * vfs_readdir(vfs_dir_t *dir)
Definition: vfs.c:551
size_t vfs_write(const void *buffer, size_t size, size_t count, vfs_file_t *file)
Definition: vfs.c:372
size_t vfs_tell(vfs_file_t *file)
Definition: vfs.c:391
int(* vfs_ftruncate_ptr)(vfs_file_t *file, size_t length)
Definition: vfs.h:130