agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
vfs_plugin.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_VFS_PLUGIN_H
8 #define ZRTOS_VFS_PLUGIN_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 /*
13 struct fuse_operations {
14  int (*getattr) (const char *, struct stat *);
15  int (*readlink) (const char *, char *, size_t);
16  int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
17  int (*mknod) (const char *, mode_t, dev_t);
18  int (*mkdir) (const char *, mode_t);
19  int (*unlink) (const char *);
20  int (*rmdir) (const char *);
21  int (*symlink) (const char *, const char *);
22  int (*rename) (const char *, const char *);
23  int (*link) (const char *, const char *);
24  int (*chmod) (const char *, mode_t);
25  int (*chown) (const char *, uid_t, gid_t);
26  int (*truncate) (const char *, off_t);
27  int (*utime) (const char *, struct utimbuf *);
28  int (*open) (const char *, struct fuse_file_info *);
29  int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *);
30  int (*write) (const char *, const char *, size_t, off_t,struct fuse_file_info *);
31  int (*statfs) (const char *, struct statfs *);
32  int (*flush) (const char *, struct fuse_file_info *);
33  int (*release) (const char *, struct fuse_file_info *);
34  int (*fsync) (const char *, int, struct fuse_file_info *);
35  int (*setxattr) (const char *, const char *, const char *, size_t, int);
36  int (*getxattr) (const char *, const char *, char *, size_t);
37  int (*listxattr) (const char *, char *, size_t);
38  int (*removexattr) (const char *, const char *);
39 };
40 */
41 #include <stdarg.h>
42 
43 
44 #include <zrtos/types.h>
45 #include <zrtos/error.h>
46 
47 struct _zrtos_vfs_file_t;
48 struct _zrtos_vfs_dentry_t;
50 
51 typedef size_t zrtos_vfs_offset_t;
52 
53 typedef enum{
58 
59 #ifdef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
60 typedef enum{
67  ,ZRTOS_VFS_PLUGIN_OPERATION__READ_SYNC
68  ,ZRTOS_VFS_PLUGIN_OPERATION__WRITE_SYNC
73 }zrtos_vfs_plugin_operation_t;
74 #else
75 # define ZRTOS_VFS_PLUGIN_OPERATION__OPEN open
76 # define ZRTOS_VFS_PLUGIN_OPERATION__CLOSE close
77 # define ZRTOS_VFS_PLUGIN_OPERATION__MOUNT mount
78 # define ZRTOS_VFS_PLUGIN_OPERATION__UMOUNT umount
79 # define ZRTOS_VFS_PLUGIN_OPERATION__READ read
80 # define ZRTOS_VFS_PLUGIN_OPERATION__WRITE write
81 # define ZRTOS_VFS_PLUGIN_OPERATION__CAN_READ can_read
82 # define ZRTOS_VFS_PLUGIN_OPERATION__CAN_WRITE can_write
83 # define ZRTOS_VFS_PLUGIN_OPERATION__SEEK seek
84 # define ZRTOS_VFS_PLUGIN_OPERATION__IOCTL ioctl
85 #endif
86 
87 #define ZRTOS_VFS_PLUGIN__ARG(type) va_arg(args,type)
88 #define ZRTOS_VFS_PLUGIN__RETURN(val)\
89 do{\
90  ret = val;\
91  goto L_RETURN;\
92 }while(0);
93 
94 #ifdef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
95 #define ZRTOS_VFS_PLUGIN__INIT(name,...)\
96 zrtos_error_t zrtos_vfs_plugin_module_##name##__operation(\
97  zrtos_vfs_plugin_operation_t operation\
98  ,...\
99 ){\
100  zrtos_error_t ret;\
101  va_list args;\
102  va_start(args,operation);\
103  switch(operation){\
104  __VA_ARGS__\
105  default:\
106  ZRTOS_VFS_PLUGIN__RETURN(ZRTOS_ERROR__NOSYS);\
107  break;\
108  }\
109 \
110 L_RETURN:\
111  va_end(args);\
112  return ret;\
113 }\
114 \
115 zrtos_vfs_plugin_t zrtos_vfs_plugin_module_##name = {\
116  .operation = zrtos_vfs_plugin_module_##name##__operation\
117 };
118 #else
123 zrtos_error_t zrtos_vfs_plugin__default_read(struct _zrtos_vfs_file_t *thiz,char *path,void *buf,size_t len,zrtos_vfs_offset_t offset,size_t *out){return ZRTOS_ERROR__NOSYS;}
124 zrtos_error_t zrtos_vfs_plugin__default_write(struct _zrtos_vfs_file_t *thiz,char *path,void *buf,size_t len,zrtos_vfs_offset_t offset,size_t *out){return ZRTOS_ERROR__NOSYS;}
128 zrtos_error_t zrtos_vfs_plugin__default_seek(struct _zrtos_vfs_file_t *thiz, zrtos_vfs_offset_t offset, int whence, zrtos_vfs_offset_t *out){return ZRTOS_ERROR__NOSYS;}
129 zrtos_error_t zrtos_vfs_plugin__default_ioctl(struct _zrtos_vfs_file_t *thiz,char *path, int request, va_list args){return ZRTOS_ERROR__NOSYS;}
130 #define ZRTOS_VFS_PLUGIN__INIT(name,...)\
131 zrtos_vfs_plugin_t zrtos_vfs_plugin_module_##name = {\
132  __VA_ARGS__\
133 };
134 #endif
135 
136 #define ZRTOS_VFS_PLUGIN(name) (&zrtos_vfs_plugin_module_##name)
137 
138 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
139 #define ZRTOS_VFS_PLUGIN__INVOKE(thiz,operation,...) (thiz->operation(__VA_ARGS__))
140 #else
141 #define ZRTOS_VFS_PLUGIN__INVOKE(thiz,...) (thiz->operation(__VA_ARGS__))
142 #endif
143 
144 typedef struct{
145 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
146  zrtos_error_t (*open)(struct _zrtos_vfs_file_t *thiz);
147 # define ZRTOS_VFS_PLUGIN__0_ON_OPEN(callback) .open=callback
148 # define ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()\
149  .open = zrtos_vfs_plugin__default_open
150 #else
151 # define ZRTOS_VFS_PLUGIN__0_ON_OPEN(callback) \
152  case ZRTOS_VFS_PLUGIN_OPERATION__OPEN:{ \
153  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
154  struct _zrtos_vfs_file_t* \
155  ); \
156  ZRTOS_VFS_PLUGIN__RETURN(callback(file)); \
157  break; \
158  }
159 # define ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()
160 #endif
161 
162 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
163  zrtos_error_t (*close)(struct _zrtos_vfs_file_t *thiz);
164 # define ZRTOS_VFS_PLUGIN__1_ON_CLOSE(callback) ,.close=callback
165 # define ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT()\
166  ,.close = zrtos_vfs_plugin__default_close
167 #else
168 # define ZRTOS_VFS_PLUGIN__1_ON_CLOSE(callback) \
169  case ZRTOS_VFS_PLUGIN_OPERATION__CLOSE:{ \
170  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
171  struct _zrtos_vfs_file_t* \
172  ); \
173  ZRTOS_VFS_PLUGIN__RETURN(callback(file)); \
174  break; \
175  }
176 # define ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT()
177 #endif
178 
179 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
180  zrtos_error_t (*mount)(struct _zrtos_vfs_dentry_t *thiz);
181 # define ZRTOS_VFS_PLUGIN__2_ON_MOUNT(callback) ,.mount=callback
182 # define ZRTOS_VFS_PLUGIN__2_ON_MOUNT_DEFAULT()\
183  ,.mount = zrtos_vfs_plugin__default_mount
184 #else
185 # define ZRTOS_VFS_PLUGIN__2_ON_MOUNT(callback) \
186  case ZRTOS_VFS_PLUGIN_OPERATION__MOUNT:{ \
187  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
188  struct _zrtos_vfs_file_t* \
189  ); \
190  ZRTOS_VFS_PLUGIN__RETURN(callback(file)); \
191  break; \
192  }
193 # define ZRTOS_VFS_PLUGIN__2_ON_MOUNT_DEFAULT()
194 #endif
195 
196 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
197  zrtos_error_t (*umount)(struct _zrtos_vfs_dentry_t *thiz);
198 # define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(callback) ,.umount=callback
199 # define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT_DEFAULT()\
200  ,.umount = zrtos_vfs_plugin__default_umount
201 #else
202 # define ZRTOS_VFS_PLUGIN__ON_UMOUNT(ret,dentry,callback) \
203  case ZRTOS_VFS_PLUGIN_OPERATION__UMOUNT:{ \
204  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
205  struct _zrtos_vfs_file_t* \
206  ); \
207  ZRTOS_VFS_PLUGIN__RETURN(callback(file)); \
208  break; \
209  }
210 # define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT_DEFAULT()
211 #endif
212 
213 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
214  zrtos_error_t (*read)(struct _zrtos_vfs_file_t *thiz,char *path,void *buf,size_t len,zrtos_vfs_offset_t offset,size_t *out);
215 # define ZRTOS_VFS_PLUGIN__4_ON_READ(callback) ,.read=callback
216 # define ZRTOS_VFS_PLUGIN__4_ON_READ_DEFAULT()\
217  ,.read = zrtos_vfs_plugin__default_read
218 #else
219 # define ZRTOS_VFS_PLUGIN__4_ON_READ(callback)\
220  case ZRTOS_VFS_PLUGIN_OPERATION__READ:{ \
221  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
222  struct _zrtos_vfs_file_t* \
223  ); \
224  char *path = ZRTOS_VFS_PLUGIN__ARG(char*); \
225  void *buf = ZRTOS_VFS_PLUGIN__ARG(void*); \
226  size_t len = ZRTOS_VFS_PLUGIN__ARG(size_t); \
227  zrtos_vfs_offset_t offset = ZRTOS_VFS_PLUGIN__ARG(zrtos_vfs_offset_t); \
228  size_t *out = ZRTOS_VFS_PLUGIN__ARG(size_t*); \
229  ZRTOS_VFS_PLUGIN__RETURN(callback(file,path,buf,len,offset,out)); \
230  break; \
231  }
232 # define ZRTOS_VFS_PLUGIN__4_ON_READ_DEFAULT()
233 #endif
234 
235 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
236  zrtos_error_t (*write)(struct _zrtos_vfs_file_t *thiz,char *path,void *buf,size_t len,zrtos_vfs_offset_t offset,size_t *out);
237 # define ZRTOS_VFS_PLUGIN__5_ON_WRITE(callback) ,.write=callback
238 # define ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT()\
239  ,.write = zrtos_vfs_plugin__default_write
240 #else
241 # define ZRTOS_VFS_PLUGIN__5_ON_WRITE(callback)\
242  case ZRTOS_VFS_PLUGIN_OPERATION__WRITE:{ \
243  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
244  struct _zrtos_vfs_file_t* \
245  ); \
246  char *path = ZRTOS_VFS_PLUGIN__ARG(char*); \
247  void *buf = ZRTOS_VFS_PLUGIN__ARG(void*); \
248  size_t len = ZRTOS_VFS_PLUGIN__ARG(size_t); \
249  zrtos_vfs_offset_t offset = ZRTOS_VFS_PLUGIN__ARG(zrtos_vfs_offset_t); \
250  size_t *out = ZRTOS_VFS_PLUGIN__ARG(size_t*); \
251  ZRTOS_VFS_PLUGIN__RETURN(callback(file,path,buf,len,offset,out)); \
252  break; \
253  }
254 # define ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT()
255 #endif
256 
257 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
258  zrtos_error_t (*can_read)(struct _zrtos_vfs_file_t *thiz);
259 # define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(callback) ,.can_read=callback
260 # define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ_DEFAULT()\
261  ,.can_read = zrtos_vfs_plugin__default_can_read
262 #else
263 # define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ(callback) \
264  case ZRTOS_VFS_PLUGIN_OPERATION__CAN_READ:{ \
265  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
266  struct _zrtos_vfs_file_t* \
267  ); \
268  ZRTOS_VFS_PLUGIN__RETURN(callback(file)); \
269  break; \
270  }
271 # define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ_DEFAULT()
272 #endif
273 
274 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
275  zrtos_error_t (*can_write)(struct _zrtos_vfs_file_t *thiz);
276 # define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(callback) ,.can_write=callback
277 # define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE_DEFAULT()\
278  ,.can_write = zrtos_vfs_plugin__default_can_write
279 #else
280 # define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(callback) \
281  case ZRTOS_VFS_PLUGIN_OPERATION__CAN_WRITE:{ \
282  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
283  struct _zrtos_vfs_file_t* \
284  ); \
285  ZRTOS_VFS_PLUGIN__RETURN(callback(file)); \
286  break; \
287  }
288 # define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE_DEFAULT()
289 #endif
290 
291 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
292  zrtos_error_t (*seek)(struct _zrtos_vfs_file_t *thiz, zrtos_vfs_offset_t offset, int whence,zrtos_vfs_offset_t *out);
293 # define ZRTOS_VFS_PLUGIN__8_ON_SEEK(callback) ,.seek=callback
294 # define ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()\
295  ,.seek = zrtos_vfs_plugin__default_seek
296 #else
297 # define ZRTOS_VFS_PLUGIN__8_ON_SEEK(callback) \
298  case ZRTOS_VFS_PLUGIN_OPERATION__SEEK:{ \
299  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
300  struct _zrtos_vfs_file_t* \
301  ); \
302  ZRTOS_VFS_PLUGIN__RETURN(callback(file)); \
303  break; \
304  } \
305  zrtos_vfs_offset_t *ret = ZRTOS_VFS_PLUGIN__ARG(zrtos_vfs_offset_t*); \
306  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG(struct _zrtos_vfs_file_t*); \
307  char *path = ZRTOS_VFS_PLUGIN__ARG(char*); \
308  zrtos_vfs_offset_t offset = ZRTOS_VFS_PLUGIN__ARG(zrtos_vfs_offset_t); \
309  size_t whence = ZRTOS_VFS_PLUGIN__ARG(size_t); \
310  ZRTOS_VFS_PLUGIN__RETURN(callback()); \
311  break; \
312  }
313 # define ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()
314 #endif
315 
316 #ifndef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
317  zrtos_error_t (*ioctl)(struct _zrtos_vfs_file_t *thiz,char *path, int request, va_list args);
318 # define ZRTOS_VFS_PLUGIN__9_ON_IOCTL(callback) ,.ioctl=callback
319 # define ZRTOS_VFS_PLUGIN__9_ON_IOCTL_DEFAULT()\
320  ,.ioctl = zrtos_vfs_plugin__default_ioctl
321 #else
322 # define ZRTOS_VFS_PLUGIN__9_ON_IOCTL(callback) \
323  case ZRTOS_VFS_PLUGIN_OPERATION__IOCTL:{ \
324  struct _zrtos_vfs_file_t *file = ZRTOS_VFS_PLUGIN__ARG( \
325  struct _zrtos_vfs_file_t* \
326  ); \
327  char *path = ZRTOS_VFS_PLUGIN__ARG(char*); \
328  int request = ZRTOS_VFS_PLUGIN__ARG(int); \
329  va_list args = ZRTOS_VFS_PLUGIN__ARG(va_list); \
330  ZRTOS_VFS_PLUGIN__RETURN(callback(file,path,request,args)); \
331  break; \
332  }
333 # define ZRTOS_VFS_PLUGIN__9_ON_IOCTL_DEFAULT()
334 #endif
335 
336 #ifdef ZRTOS_VFS_PLUGIN__CFG_USE_SWITCH
337  zrtos_error_t (*operation)(
338  zrtos_vfs_plugin_operation_t operation
339  ,...
340  );
341 #endif
343 
344 
345 #ifdef __cplusplus
346 }
347 #endif
348 #endif
zrtos_error_t zrtos_vfs_plugin__default_ioctl(struct _zrtos_vfs_file_t *thiz, char *path, int request, va_list args)
Definition: vfs_plugin.h:129
zrtos_error_t zrtos_vfs_plugin__default_mount(struct _zrtos_vfs_dentry_t *thiz)
Definition: vfs_plugin.h:121
Try again.
Definition: error.h:35
zrtos_error_t zrtos_vfs_plugin__default_can_read(struct _zrtos_vfs_file_t *thiz)
Definition: vfs_plugin.h:125
size_t zrtos_vfs_offset_t
Definition: vfs_plugin.h:49
zrtos_error_t zrtos_vfs_plugin__default_close(struct _zrtos_vfs_file_t *thiz)
Definition: vfs_plugin.h:120
zrtos_error_t zrtos_vfs_plugin__default_umount(struct _zrtos_vfs_dentry_t *thiz)
Definition: vfs_plugin.h:122
zrtos_error_t zrtos_vfs_plugin__default_open(struct _zrtos_vfs_file_t *thiz)
Definition: vfs_plugin.h:119
#define ZRTOS_VFS_PLUGIN_OPERATION__READ
Definition: vfs_plugin.h:79
#define ZRTOS_VFS_PLUGIN_OPERATION__OPEN
Definition: vfs_plugin.h:75
#define ZRTOS_VFS_PLUGIN_OPERATION__WRITE
Definition: vfs_plugin.h:80
zrtos_vfs_plugin_type_t
Definition: vfs_plugin.h:53
#define ZRTOS_VFS_PLUGIN_OPERATION__IOCTL
Definition: vfs_plugin.h:84
zrtos_error_t zrtos_vfs_plugin__default_can_write(struct _zrtos_vfs_file_t *thiz)
Definition: vfs_plugin.h:126
zrtos_vfs_offset_t offset
Definition: vfs_file.h:20
zrtos_error_t zrtos_vfs_plugin__default_write(struct _zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: vfs_plugin.h:124
#define ZRTOS_VFS_PLUGIN_OPERATION__MOUNT
Definition: vfs_plugin.h:77
#define ZRTOS_VFS_PLUGIN_OPERATION__CAN_WRITE
Definition: vfs_plugin.h:82
#define ZRTOS_VFS_PLUGIN_OPERATION__SEEK
Definition: vfs_plugin.h:83
Successful program execution status.
Definition: error.h:22
zrtos_error_t zrtos_vfs_plugin__default_seek(struct _zrtos_vfs_file_t *thiz, zrtos_vfs_offset_t offset, int whence, zrtos_vfs_offset_t *out)
Definition: vfs_plugin.h:128
#define ZRTOS_VFS_PLUGIN_OPERATION__CAN_READ
Definition: vfs_plugin.h:81
#define ZRTOS_VFS_PLUGIN_OPERATION__CLOSE
Definition: vfs_plugin.h:76
Function not implemented.
Definition: error.h:62
zrtos_error_t zrtos_vfs_plugin__default_read(struct _zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: vfs_plugin.h:123
zrtos_error_t
Definition: error.h:20
zrtos_error_t zrtos_vfs_plugin__default_can_write_read_only(struct _zrtos_vfs_file_t *thiz)
Definition: vfs_plugin.h:127
#define ZRTOS_VFS_PLUGIN_OPERATION__UMOUNT
Definition: vfs_plugin.h:78