VSF Documented
vsf_linux_fs.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_LINUX_FS_INTERNAL_H__
19#define __VSF_LINUX_FS_INTERNAL_H__
20
21/*============================ INCLUDES ======================================*/
22
23// avoid to include vsf.h, include necessary headers only
24// #include "vsf.h"
25
27#include "hal/arch/vsf_arch.h"
28#include "kernel/vsf_kernel.h"
29
30#if VSF_USE_LINUX == ENABLED
31
32#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED
33# include "../../include/termios.h"
35#else
36# include <termios.h>
37# include <sys/stat.h>
38#endif
39
40#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT)
41# define __VSF_CLASS_IMPLEMENT__
42#elif defined(__VSF_LINUX_FS_CLASS_INHERIT__)
43# define __VSF_CLASS_INHERIT__
44#endif
45
46#include "utilities/ooc_class.h"
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52/*============================ MACROS ========================================*/
53
54#if VSF_USE_FS != ENABLED
55# error VSF_USE_FS MUST be enabled to use fs in linux
56#endif
57
58/*============================ MACROFIED FUNCTIONS ===========================*/
59/*============================ TYPES =========================================*/
60
65
66enum {
68};
69
70typedef struct vsf_linux_fd_op_t {
73 void (*fn_init)(vsf_linux_fd_t *sfd);
74 void (*fn_fini)(vsf_linux_fd_t *sfd);
75 int (*fn_fcntl)(vsf_linux_fd_t *sfd, int cmd, uintptr_t arg);
76 ssize_t (*fn_read)(vsf_linux_fd_t *sfd, void *buf, size_t count);
77 ssize_t (*fn_write)(vsf_linux_fd_t *sfd, const void *buf, size_t count);
79 int (*fn_eof)(vsf_linux_fd_t *sfd);
81 int (*fn_stat)(vsf_linux_fd_t *sfd, struct stat *buf);
82
83 void * (*fn_mmap)(vsf_linux_fd_t *sfd, off64_t offset, size_t len, uint_fast32_t feature);
84 int (*fn_munmap)(vsf_linux_fd_t *sfd, void *buffer);
85 int (*fn_msync)(vsf_linux_fd_t *sfd, void *buffer);
87
90 void *param;
91 void (*cb)(vsf_linux_fd_priv_t *priv, void *param, short events, vsf_protect_t orig);
93
95 protected_member(
96 // target is used in socket_unix to indicate message for sendmsg/recvmsg,
97 // ofc it can be used in other fd types
98 void *target;
99 int flags;
100
101 short status;
102 short events;
103 // sticky_events will not be cleared
104 // use for eg pipe, pipe_tx is closed, pipe_rx will always POLLIN
105 short sticky_events;
106 short user_data;
107
108 vsf_linux_fd_priv_callback_t events_callback[2];
110 private_member(
111 int ref;
112 )
113};
114
116 protected_member(
117 int fd;
118 int fd_flags;
119 int cur_rdflags;
120 int cur_wrflags;
121 const vsf_linux_fd_op_t *op;
123
124 private_member(
125 vsf_dlist_node_t fd_node;
126 void *mmapped_buffer;
127 bool is_close_pending_on_munmap;
128 )
129
130 protected_member(
131 int unget_buff;
133
134 // used while binding fd to something
135 // eg: in popen, fd is binded with the target pid
136 union {
137 pid_t pid;
138 } binding;
140};
141
142#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT) || defined(__VSF_LINUX_FS_CLASS_INHERIT__)
143# if VSF_LINUX_CFG_FS_CACHE_SIZE > 0
144VSF_STATIC_ASSERT(VSF_LINUX_CFG_FS_CACHE_SIZE <= ((1 << (sizeof(uint16_t) << 3)) - 1));
145VSF_STATIC_ASSERT(VSF_LINUX_CFG_FS_CACHE_SIZE > VSF_LINUX_CFG_FS_CACHE_THRESHOLD);
146# endif
147typedef struct vk_file_t vk_file_t;
148typedef struct vsf_linux_fs_priv_t {
149 implement(vsf_linux_fd_priv_t)
150 vk_file_t *file;
151
152 union {
153 struct dirent dir;
154 struct dirent64 dir64;
155 };
156# if VSF_LINUX_CFG_FS_CACHE_SIZE > 0
157 uint8_t *cache_buffer;
158 uint16_t cache_size;
159 uint16_t cache_offset;
160 uint64_t cache_pos;
161# endif
162} vsf_linux_fs_priv_t;
163
164vsf_dcl_class(vsf_linux_stream_priv_t)
165typedef void (*vsf_linux_stream_on_evt_t)(vsf_linux_stream_priv_t *priv, vsf_protect_t orig, short event, bool is_ready);
166
167vsf_class(vsf_linux_stream_priv_t) {
168 public_member(
169 implement(vsf_linux_fs_priv_t)
170 )
171 protected_member(
172 vsf_stream_t *stream_rx;
173 vsf_stream_t *stream_tx;
174 vsf_linux_stream_on_evt_t on_evt;
175 bool stream_rx_allocated;
176 bool stream_tx_allocated;
177 )
178};
179
180vsf_class(vsf_linux_pipe_priv_t) {
181 protected_member(
182 implement(vsf_linux_stream_priv_t)
183 vsf_linux_pipe_priv_t *pipe_remote;
184 )
185};
186
187typedef struct vsf_linux_term_priv_t {
188 implement(vsf_linux_pipe_priv_t)
189 const vsf_linux_fd_op_t *subop;
190 struct termios termios;
191 char esc_type;
192 bool line_start;
193 bool subop_inited;
194} vsf_linux_term_priv_t;
195
196typedef struct vsf_linux_key_t vsf_linux_key_t;
197vsf_class(vsf_linux_key_priv_t) {
198 public_member(
199 implement(vsf_linux_fd_priv_t)
200 )
201 protected_member(
202 union {
203 struct {
204 unsigned short *semadj_arr;
205 } sem;
206 } u;
207 vsf_linux_key_t *key;
208 void (*fn_fini)(vsf_linux_fd_t *sfd);
209 int (*fn_close)(vsf_linux_fd_t *sfd);
210 )
211};
212#endif
213
214/*============================ GLOBAL VARIABLES ==============================*/
215
216#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT) || defined(__VSF_LINUX_FS_CLASS_INHERIT__)
222#endif
223
224/*============================ LOCAL VARIABLES ===============================*/
225/*============================ PROTOTYPES ====================================*/
226
227#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT) || defined(__VSF_LINUX_FS_CLASS_INHERIT__)
228extern int vsf_linux_fd_bind_target_ex(int fd,
229 void *target, const vsf_linux_fd_op_t *op,
232 uint_fast32_t feature, uint64_t size);
233extern int vsf_linux_fd_bind_target(int fd, void *target,
235 vsf_param_eda_evthandler_t peda_write);
236// compatible with file and directory
237extern int vsf_linux_fd_get_target(int fd, void **target);
238extern int vsf_linux_fs_bind_target(const char *pathname, void *target,
240 vsf_param_eda_evthandler_t peda_write);
241extern int vsf_linux_fs_bind_dir_target(const char *pathname, void *target);
242int vsf_linux_fs_bind_target_ex(const char *pathname,
243 void *target, const vsf_linux_fd_op_t *op,
246 uint_fast32_t feature, uint64_t size);
247extern int vsf_linux_fs_get_target(const char *pathname, void **target);
248typedef struct vk_vfs_file_t vk_vfs_file_t;
249extern int vsf_linux_fs_bind_target_relative(vk_vfs_file_t *dir, const char *pathname,
250 void *target, const vsf_linux_fd_op_t *op,
251 uint_fast32_t feature, uint64_t size);
252extern int vsf_linux_fs_bind_pipe(const char *pathname1, const char *pathname2, bool exclusive);
253extern int vsf_linux_create_pty(int num);
254
255extern int vsf_linux_fd_create(vsf_linux_fd_t **sfd, const vsf_linux_fd_op_t *op);
256extern vsf_linux_fd_t * vsf_linux_fd_get(int fd);
257extern void vsf_linux_fd_delete(int fd);
258extern bool vsf_linux_fd_is_block(vsf_linux_fd_t *sfd);
259
260extern int vsf_linux_fd_get_feature(int fd, uint_fast32_t *feature);
261extern int vsf_linux_fd_set_feature(int fd, uint_fast32_t feature);
262extern int vsf_linux_fd_add_feature(int fd, uint_fast32_t feature);
263
264extern int vsf_linux_fd_set_size(int fd, uint64_t size);
265
266// vsf_linux_fd_xx_trigger/vsf_linux_fd_xx_pend MUST be called scheduler protected
273extern short vsf_linux_fd_get_status(vsf_linux_fd_priv_t *priv, short status);
274
275// stream
276// IMPORTANT: priority of stream MUST be within scheduler priorities
277extern vsf_linux_fd_t * vsf_linux_stream(vsf_stream_t *stream_rx, vsf_stream_t *stream_tx);
280
281// pipe
283extern vsf_linux_fd_t * vsf_linux_tx_pipe(vsf_linux_pipe_priv_t *priv_rx);
284#endif
285
286extern int vsf_linux_fs_bind_buffer(const char *pathname, void *buffer,
287 uint_fast32_t feature, uint64_t size);
288extern int vsf_linux_fs_bind_stream(const char *pathname, vsf_stream_t *stream_rx, vsf_stream_t *stream_tx);
289
290#ifdef __cplusplus
291}
292#endif
293
294// DO NOT undefine MACROs below, because lower header will check the same MACROs to include necessary codes
295//#undef __VSF_LINUX_FS_CLASS_IMPLEMENT
296//#undef __VSF_LINUX_FS_CLASS_INHERIT__
297
298/*============================ INCLUDES ======================================*/
299
300#include "./vfs/vsf_linux_vfs.h"
301
302#endif // VSF_USE_LINUX
303#endif // __VSF_LINUX_FS_INTERNAL_H__
304/* EOF */
#define VSF_STATIC_ASSERT(__COND,...)
Definition __type.h:199
Definition vsf_fs.h:114
Definition vsf_linux_fs.h:94
Definition vsf_linux_fs.h:115
Definition vsf_linux.h:281
Definition vsf_linux.h:158
Definition vsf_queue_stream.h:60
Definition vsf_simple_stream.h:254
union @1020::@1031::@1032 u
int pid_t
Definition types.h:113
long long off64_t
Definition types.h:125
int ssize_t
Definition types.h:91
#define vsf_dcl_class
Definition ooc_class.h:50
#define vsf_class(__name)
Definition ooc_class.h:52
uint32_t uintptr_t
Definition stdint.h:38
unsigned short uint16_t
Definition stdint.h:7
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned long long uint64_t
Definition stdint.h:11
unsigned char uint8_t
Definition stdint.h:5
Definition dirent.h:42
Definition dirent.h:35
Definition stat.h:107
Definition termios.h:205
Definition vsf_list.h:888
Definition vsf_linux_fs.h:70
int(* fn_setsize)(vsf_linux_fd_t *sfd, off64_t size)
Definition vsf_linux_fs.h:80
ssize_t(* fn_write)(vsf_linux_fd_t *sfd, const void *buf, size_t count)
Definition vsf_linux_fs.h:77
int feature
Definition vsf_linux_fs.h:72
int(* fn_msync)(vsf_linux_fd_t *sfd, void *buffer)
Definition vsf_linux_fs.h:85
int priv_size
Definition vsf_linux_fs.h:71
int(* fn_fcntl)(vsf_linux_fd_t *sfd, int cmd, uintptr_t arg)
Definition vsf_linux_fs.h:75
int(* fn_stat)(vsf_linux_fd_t *sfd, struct stat *buf)
Definition vsf_linux_fs.h:81
int(* fn_close)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:78
int(* fn_eof)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:79
ssize_t(* fn_read)(vsf_linux_fd_t *sfd, void *buf, size_t count)
Definition vsf_linux_fs.h:76
int(* fn_munmap)(vsf_linux_fd_t *sfd, void *buffer)
Definition vsf_linux_fs.h:84
void(* fn_init)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:73
void(* fn_fini)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:74
Definition vsf_linux_fs.h:88
short pendind_events
Definition vsf_linux_fs.h:89
void(* cb)(vsf_linux_fd_priv_t *priv, void *param, short events, vsf_protect_t orig)
Definition vsf_linux_fs.h:91
void * param
Definition vsf_linux_fs.h:90
Definition vsf_linux.h:128
uintalu_t vsf_protect_t
Definition vsf_arch_abstraction.h:60
void(* vsf_param_eda_evthandler_t)(uintptr_t target, vsf_evt_t evt)
Definition vsf_eda.h:658
#define VSF_LINUX_CFG_FS_CACHE_SIZE
Definition vsf_linux_cfg.h:42
int vsf_linux_fs_bind_target_relative(vk_vfs_file_t *dir, const char *pathname, void *target, const vsf_linux_fd_op_t *op, uint_fast32_t feature, uint64_t size)
Definition vsf_linux_fs.c:2849
int vsf_linux_fs_get_target(const char *pathname, void **target)
Definition vsf_linux_fs.c:2837
int vsf_linux_fs_bind_dir_target(const char *pathname, void *target)
Definition vsf_linux_fs.c:2902
vsf_linux_fd_t * vsf_linux_tx_pipe(vsf_linux_pipe_priv_t *priv_rx)
Definition vsf_linux_fs.c:3433
int vsf_linux_fd_bind_target_ex(int fd, void *target, const vsf_linux_fd_op_t *op, vsf_param_eda_evthandler_t peda_read, vsf_param_eda_evthandler_t peda_write, uint_fast32_t feature, uint64_t size)
Definition vsf_linux_fs.c:2810
void vsf_linux_fd_set_events(vsf_linux_fd_priv_t *priv, short events, vsf_protect_t orig)
Definition vsf_linux_fs.c:1245
int vsf_linux_fd_set_feature(int fd, uint_fast32_t feature)
Definition vsf_linux_fs.c:972
int vsf_linux_fs_bind_target(const char *pathname, void *target, vsf_param_eda_evthandler_t peda_read, vsf_param_eda_evthandler_t peda_write)
Definition vsf_linux_fs.c:2889
bool vsf_linux_fd_is_block(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.c:1168
const vsf_linux_fd_op_t __vsf_linux_stream_fdop
Definition vsf_linux_fs.c:234
int vsf_linux_fd_get_feature(int fd, uint_fast32_t *feature)
Definition vsf_linux_fs.c:960
int vsf_linux_create_pty(int num)
Definition vsf_linux_fs.c:3490
vsf_linux_fd_priv_callback_t * vsf_linux_fd_claim_calback(vsf_linux_fd_priv_t *priv)
Definition vsf_linux_fs.c:1193
int vsf_linux_fd_create(vsf_linux_fd_t **sfd, const vsf_linux_fd_op_t *op)
Definition vsf_linux_fs.c:1114
vsf_linux_fd_t * vsf_linux_rx_stream(vsf_stream_t *stream)
Definition vsf_linux_fs.c:3301
int vsf_linux_fs_bind_pipe(const char *pathname1, const char *pathname2, bool exclusive)
Definition vsf_linux_fs.c:3461
vsf_linux_fd_t * vsf_linux_fd_get(int fd)
Definition vsf_linux_fs.c:936
int vsf_linux_fd_bind_target(int fd, void *target, vsf_param_eda_evthandler_t peda_read, vsf_param_eda_evthandler_t peda_write)
Definition vsf_linux_fs.c:2830
const vsf_linux_fd_op_t vsf_linux_term_fdop
Definition vsf_linux_fs.c:255
int vsf_linux_fd_get_target(int fd, void **target)
Definition vsf_linux_fs.c:2797
void vsf_linux_fd_delete(int fd)
Definition vsf_linux_fs.c:1142
const vsf_linux_fd_op_t vsf_linux_pipe_fdop
Definition vsf_linux_fs.c:244
void vsf_linux_fd_clear_status(vsf_linux_fd_priv_t *priv, short status, vsf_protect_t orig)
Definition vsf_linux_fs.c:1271
int vsf_linux_fd_set_size(int fd, uint64_t size)
Definition vsf_linux_fs.c:991
void vsf_linux_fd_release_calback(vsf_linux_fd_priv_t *priv, vsf_linux_fd_priv_callback_t *callback)
Definition vsf_linux_fs.c:1207
int vsf_linux_fs_bind_target_ex(const char *pathname, void *target, const vsf_linux_fd_op_t *op, vsf_param_eda_evthandler_t peda_read, vsf_param_eda_evthandler_t peda_write, uint_fast32_t feature, uint64_t size)
Definition vsf_linux_fs.c:2871
short vsf_linux_fd_get_status(vsf_linux_fd_priv_t *priv, short status)
Definition vsf_linux_fs.c:1278
short vsf_linux_fd_pend_events(vsf_linux_fd_priv_t *priv, short events, vsf_linux_trigger_t *trig, vsf_protect_t orig)
Definition vsf_linux_fs.c:1212
void vsf_linux_fd_set_status(vsf_linux_fd_priv_t *priv, short status, vsf_protect_t orig)
Definition vsf_linux_fs.c:1260
vsf_linux_fd_t * vsf_linux_stream(vsf_stream_t *stream_rx, vsf_stream_t *stream_tx)
Definition vsf_linux_fs.c:3287
const vsf_linux_fd_op_t vsf_linux_key_fdop
Definition vsf_linux_fs.c:267
vsf_linux_fd_t * vsf_linux_rx_pipe(vsf_queue_stream_t *queue_stream)
Definition vsf_linux_fs.c:3404
vsf_linux_fd_t * vsf_linux_tx_stream(vsf_stream_t *stream)
Definition vsf_linux_fs.c:3306
const vsf_linux_fd_op_t __vsf_linux_fs_fdop
Definition vsf_linux_fs.c:202
int vsf_linux_fd_add_feature(int fd, uint_fast32_t feature)
Definition vsf_linux_fs.c:982
@ VSF_LINUX_FDOP_FEATURE_FS
Definition vsf_linux_fs.h:67
int vsf_linux_fs_bind_buffer(const char *pathname, void *buffer, uint_fast32_t feature, uint64_t size)
Definition vsf_linux_fs.c:2968
int vsf_linux_fs_bind_stream(const char *pathname, vsf_stream_t *stream_rx, vsf_stream_t *stream_tx)
Definition vsf_linux_fs.c:3311
uint64_t offset
Definition vsf_memfs.h:49
uint32_t size
Definition vsf_memfs.h:50
uint8_t status
Definition vsf_tgui.h:144
struct event_t events[32]
Definition vsf_xboot.c:36
Generated from commit: vsfteam/vsf@85be636