agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
vfs_file.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_FILE_H
8 #define ZRTOS_VFS_FILE_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/error.h>
15 #include <zrtos/bitfield.h>
16 #include <zrtos/vfs_dentry.h>
17 
18 typedef struct _zrtos_vfs_file_t{
21  void *ctx;
23 
24 #ifndef ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX
25 #error "define ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX"
26 #endif
27 
29 
30 zrtos_error_t zrtos_vfs_file__open(char *path,zrtos_vfs_file_t **file,void *file_ctx){
31  zrtos_error_t ret;
33  0
34  ,path
35  );
36  if(dentry){
37  for(size_t fd=0;fd<ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX;fd++){
38  if(0 == zrtos_vfs_file__index[fd].dentry){
39  zrtos_vfs_file_t *tmp = *file = &zrtos_vfs_file__index[fd];
40 
41  dentry->count++;
42  tmp->dentry = dentry;
43  tmp->ctx = file_ctx;
44 
45  zrtos_vfs_plugin_t *plugin = dentry->inode.plugin;
47  plugin
49  ,tmp
50  );
51  if(!zrtos_error__is_success(ret)){
52  dentry->count--;
53  tmp->dentry = 0;
54  }
55  goto L_OUT;
56  }
57  }
58  ret = ZRTOS_ERROR__MFILE;
59  }else{
60  ret = ZRTOS_ERROR__NOENT;
61  }
62 
63 L_OUT:
64  return ret;
65 }
66 
68  return file->dentry->count;
69 }
70 
72  zrtos_error_t ret;
73 
74  file->dentry->count--;
76  file->dentry->inode.plugin
78  ,file
79  );
80  file->dentry = 0;
81  file->offset = 0;
82 
83  return ret;
84 }
85 
87  zrtos_vfs_file_t *file
88  ,char *path
89  ,void *buffer
90  ,size_t len
91  ,size_t offset
92  ,size_t *ret
93 ){
94  return file->dentry ? ZRTOS_VFS_PLUGIN__INVOKE(
95  file->dentry->inode.plugin
97  ,file
98  ,path
99  ,buffer
100  ,len
101  ,offset
102  ,ret
103  ) : ZRTOS_ERROR__BADF;
104 }
105 
107  zrtos_vfs_file_t *file
108  ,char *path
109  ,void *buffer
110  ,size_t len
111  ,size_t offset
112  ,size_t *ret
113 ){
114  return file->dentry ? ZRTOS_VFS_PLUGIN__INVOKE(
115  file->dentry->inode.plugin
117  ,file
118  ,path
119  ,buffer
120  ,len
121  ,offset
122  ,ret
123  ) : ZRTOS_ERROR__BADF;
124 }
125 
127  zrtos_vfs_file_t *file
128 ){
129  return file->dentry ? ZRTOS_VFS_PLUGIN__INVOKE(
130  file->dentry->inode.plugin
132  ,file
133  ) : ZRTOS_ERROR__BADF;
134 }
135 
137  zrtos_vfs_file_t *file
138 ){
139  return file->dentry ? ZRTOS_VFS_PLUGIN__INVOKE(
140  file->dentry->inode.plugin
142  ,file
143  ) : ZRTOS_ERROR__BADF;
144 }
145 
147  zrtos_vfs_file_t *file
148  ,char *path
149  ,int request
150  ,va_list args
151 ){
152  zrtos_error_t ret;
153 
154  ret = file->dentry ? ZRTOS_VFS_PLUGIN__INVOKE(
155  file->dentry->inode.plugin
157  ,file
158  ,path
159  ,request
160  ,args
161  ) : ZRTOS_ERROR__BADF;
162 
163  return ret;
164 }
165 
167  zrtos_vfs_file_t *file
168  ,char *path
169  ,int request
170  ,...
171 ){
172  zrtos_error_t ret;
173  va_list args;
174 
175  va_start(args,request);
177  file
178  ,path
179  ,request
180  ,args
181  );
182  va_end(args);
183 
184  return ret;
185 }
186 
188  thiz->dentry->inode.ctx = ctx;
189 }
190 
192  return thiz->dentry->inode.ctx;
193 }
194 
196  thiz->ctx = ctx;
197 }
198 
200  return thiz->ctx;
201 }
202 
204  thiz->offset = offset;
205 }
206 
208  return thiz->offset;
209 }
210 
211 #define ZRTOS_VFS_FILE__EACH_BEGIN(fd,file)\
212  for(size_t fd = 0;fd < ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX;fd++){\
213  zrtos_vfs_file_t *file = &zrtos_vfs_file__index[fd];\
214  if(0 != file->dentry){
215 
216 #define ZRTOS_VFS_FILE__EACH_END\
217  }\
218  }
219 
220 #ifdef __cplusplus
221 }
222 #endif
223 #endif
zrtos_error_t zrtos_vfs_file__write(zrtos_vfs_file_t *file, char *path, void *buffer, size_t len, size_t offset, size_t *ret)
Definition: vfs_file.h:106
#define ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX
Definition: cfg.h:26
zrtos_vfs_inode_t inode
Definition: vfs_dentry.h:25
size_t zrtos_vfs_offset_t
Definition: vfs_plugin.h:49
zrtos_vfs_offset_t zrtos_vfs_file__get_offset(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:207
No such file or directory.
Definition: error.h:26
zrtos_error_t zrtos_vfs_file__read(zrtos_vfs_file_t *file, char *path, void *buffer, size_t len, size_t offset, size_t *ret)
Definition: vfs_file.h:86
#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
#define ZRTOS_VFS_PLUGIN__INVOKE(thiz, operation,...)
Definition: vfs_plugin.h:139
zrtos_error_t zrtos_vfs_file__ioctl_va(zrtos_vfs_file_t *file, char *path, int request, va_list args)
Definition: vfs_file.h:146
zrtos_error_t zrtos_vfs_file__open(char *path, zrtos_vfs_file_t **file, void *file_ctx)
Definition: vfs_file.h:30
zrtos_error_t zrtos_vfs_file__can_read(zrtos_vfs_file_t *file)
Definition: vfs_file.h:126
void zrtos_vfs_file__set_inode_data(zrtos_vfs_file_t *thiz, void *ctx)
Definition: vfs_file.h:187
Too many open files.
Definition: error.h:48
zrtos_vfs_dentry_t * dentry
Definition: vfs_file.h:19
#define ZRTOS_VFS_PLUGIN_OPERATION__IOCTL
Definition: vfs_plugin.h:84
zrtos_error_t zrtos_vfs_file__close(zrtos_vfs_file_t *file)
Definition: vfs_file.h:71
void zrtos_vfs_file__set_data(zrtos_vfs_file_t *thiz, void *ctx)
Definition: vfs_file.h:195
zrtos_vfs_offset_t offset
Definition: vfs_file.h:20
zrtos_vfs_plugin_t * plugin
Definition: vfs_inode.h:18
void * zrtos_vfs_file__get_inode_data(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:191
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
#define ZRTOS_VFS_PLUGIN_OPERATION__CAN_WRITE
Definition: vfs_plugin.h:82
void * zrtos_vfs_file__get_data(zrtos_vfs_file_t *thiz)
Definition: vfs_file.h:199
Bad file number.
Definition: error.h:33
zrtos_vfs_file_t zrtos_vfs_file__index[ZRTOS_VFS_FILE_DESCRIPTOR__CFG_MAX]
Definition: vfs_file.h:28
#define ZRTOS_VFS_PLUGIN_OPERATION__CAN_READ
Definition: vfs_plugin.h:81
#define ZRTOS_VFS_PLUGIN_OPERATION__CLOSE
Definition: vfs_plugin.h:76
struct _zrtos_vfs_file_t zrtos_vfs_file_t
zrtos_vfs_dentry_t * zrtos_vfs_dentry__lookup(zrtos_vfs_dentry_t *thiz, char *path)
Definition: vfs_dentry.h:126
void zrtos_vfs_file__set_offset(zrtos_vfs_file_t *thiz, zrtos_vfs_offset_t offset)
Definition: vfs_file.h:203
zrtos_error_t zrtos_vfs_file__can_write(zrtos_vfs_file_t *file)
Definition: vfs_file.h:136
size_t zrtos_vfs_file__get_dentry_count(zrtos_vfs_file_t *file)
Definition: vfs_file.h:67
zrtos_error_t zrtos_vfs_file__ioctl(zrtos_vfs_file_t *file, char *path, int request,...)
Definition: vfs_file.h:166
zrtos_error_t
Definition: error.h:20