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#include "vsf.h"
24
25#if VSF_USE_LINUX == ENABLED
26
27#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED
28# include "../../include/termios.h"
30#else
31# include <termios.h>
32# include <sys/stat.h>
33#endif
34
35#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT)
36# define __VSF_CLASS_IMPLEMENT__
37#elif defined(__VSF_LINUX_FS_CLASS_INHERIT__)
38# define __VSF_CLASS_INHERIT__
39#endif
40
41#include "utilities/ooc_class.h"
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47/*============================ MACROS ========================================*/
48
49#if VSF_USE_FS != ENABLED
50# error VSF_USE_FS MUST be enabled to use fs in linux
51#endif
52
53/*============================ MACROFIED FUNCTIONS ===========================*/
54/*============================ TYPES =========================================*/
55
60
61enum {
63};
64
65typedef struct vsf_linux_fd_op_t {
68 void (*fn_init)(vsf_linux_fd_t *sfd);
69 void (*fn_fini)(vsf_linux_fd_t *sfd);
70 int (*fn_fcntl)(vsf_linux_fd_t *sfd, int cmd, uintptr_t arg);
71 ssize_t (*fn_read)(vsf_linux_fd_t *sfd, void *buf, size_t count);
72 ssize_t (*fn_write)(vsf_linux_fd_t *sfd, const void *buf, size_t count);
74 int (*fn_eof)(vsf_linux_fd_t *sfd);
76 int (*fn_stat)(vsf_linux_fd_t *sfd, struct stat *buf);
77
78 void * (*fn_mmap)(vsf_linux_fd_t *sfd, off64_t offset, size_t len, uint_fast32_t feature);
79 int (*fn_munmap)(vsf_linux_fd_t *sfd, void *buffer);
80 int (*fn_msync)(vsf_linux_fd_t *sfd, void *buffer);
82
85 void *param;
86 void (*cb)(vsf_linux_fd_priv_t *priv, void *param, short events, vsf_protect_t orig);
88
90 protected_member(
91 // target is used in socket_unix to indicate message for sendmsg/recvmsg,
92 // ofc it can be used in other fd types
93 void *target;
94 int flags;
95
96 short status;
97 short events;
98 // sticky_events will not be cleared
99 // use for eg pipe, pipe_tx is closed, pipe_rx will always POLLIN
100 short sticky_events;
101 short user_data;
102
103 vsf_linux_fd_priv_callback_t events_callback[2];
105 private_member(
106 int ref;
107 )
108};
109
111 protected_member(
112 int fd;
113 int fd_flags;
114 int cur_rdflags;
115 int cur_wrflags;
116 const vsf_linux_fd_op_t *op;
118
119 private_member(
120 vsf_dlist_node_t fd_node;
121 void *mmapped_buffer;
122 )
123
124 protected_member(
125 int unget_buff;
127
128 // used while binding fd to something
129 // eg: in popen, fd is binded with the target pid
130 union {
131 pid_t pid;
132 } binding;
134};
135
136#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT) || defined(__VSF_LINUX_FS_CLASS_INHERIT__)
137typedef struct vsf_linux_fs_priv_t {
138 implement(vsf_linux_fd_priv_t)
139 vk_file_t *file;
140
141 union {
142 struct dirent dir;
143 struct dirent64 dir64;
144 };
145} vsf_linux_fs_priv_t;
146
147vsf_dcl_class(vsf_linux_stream_priv_t)
148typedef void (*vsf_linux_stream_on_evt_t)(vsf_linux_stream_priv_t *priv, vsf_protect_t orig, short event, bool is_ready);
149
150vsf_class(vsf_linux_stream_priv_t) {
151 public_member(
152 implement(vsf_linux_fs_priv_t)
153 )
154 protected_member(
155 vsf_stream_t *stream_rx;
156 vsf_stream_t *stream_tx;
157 vsf_linux_stream_on_evt_t on_evt;
158 bool stream_rx_allocated;
159 bool stream_tx_allocated;
160 )
161};
162
163vsf_class(vsf_linux_pipe_priv_t) {
164 protected_member(
165 implement(vsf_linux_stream_priv_t)
166 vsf_linux_pipe_priv_t *pipe_remote;
167 )
168};
169
170typedef struct vsf_linux_term_priv_t {
171 implement(vsf_linux_pipe_priv_t)
172 const vsf_linux_fd_op_t *subop;
173 struct termios termios;
174 char esc_type;
175 bool line_start;
176 bool subop_inited;
177} vsf_linux_term_priv_t;
178
179typedef struct vsf_linux_key_t vsf_linux_key_t;
180vsf_class(vsf_linux_key_priv_t) {
181 public_member(
182 implement(vsf_linux_fd_priv_t)
183 )
184 protected_member(
185 union {
186 struct {
187 unsigned short *semadj_arr;
188 } sem;
189 } u;
190 vsf_linux_key_t *key;
191 void (*fn_fini)(vsf_linux_fd_t *sfd);
192 int (*fn_close)(vsf_linux_fd_t *sfd);
193 )
194};
195#endif
196
197/*============================ GLOBAL VARIABLES ==============================*/
198
199#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT) || defined(__VSF_LINUX_FS_CLASS_INHERIT__)
205#endif
206
207/*============================ LOCAL VARIABLES ===============================*/
208/*============================ PROTOTYPES ====================================*/
209
210#if defined(__VSF_LINUX_FS_CLASS_IMPLEMENT) || defined(__VSF_LINUX_FS_CLASS_INHERIT__)
211extern int vsf_linux_fd_bind_target(int fd, void *target,
213 vsf_param_eda_evthandler_t peda_write);
214extern int vsf_linux_fd_get_target(int fd, void **target);
215extern int vsf_linux_fs_bind_target(const char *pathname, void *target,
217 vsf_param_eda_evthandler_t peda_write);
218int vsf_linux_fs_bind_target_ex(const char *pathname,
219 void *target, const vsf_linux_fd_op_t *op,
222 uint_fast32_t feature, uint64_t size);
223extern int vsf_linux_fs_get_target(const char *pathname, void **target);
224extern int vsf_linux_fs_bind_target_relative(vk_vfs_file_t *dir, const char *pathname,
225 void *target, const vsf_linux_fd_op_t *op,
226 uint_fast32_t feature, uint64_t size);
227extern int vsf_linux_fs_bind_pipe(const char *pathname1, const char *pathname2, bool exclusive);
228extern int vsf_linux_create_pty(int num);
229
230extern int vsf_linux_fd_create(vsf_linux_fd_t **sfd, const vsf_linux_fd_op_t *op);
231extern vsf_linux_fd_t * vsf_linux_fd_get(int fd);
232extern void vsf_linux_fd_delete(int fd);
233extern bool vsf_linux_fd_is_block(vsf_linux_fd_t *sfd);
234
235extern int vsf_linux_fd_get_feature(int fd, uint_fast32_t *feature);
236extern int vsf_linux_fd_set_feature(int fd, uint_fast32_t feature);
237extern int vsf_linux_fd_add_feature(int fd, uint_fast32_t feature);
238
239extern int vsf_linux_fd_set_size(int fd, uint64_t size);
240
241// vsf_linux_fd_xx_trigger/vsf_linux_fd_xx_pend MUST be called scheduler protected
248extern short vsf_linux_fd_get_status(vsf_linux_fd_priv_t *priv, short status);
249
250// stream
251// IMPORTANT: priority of stream MUST be within scheduler priorities
252extern vsf_linux_fd_t * vsf_linux_stream(vsf_stream_t *stream_rx, vsf_stream_t *stream_tx);
255
256// pipe
258extern vsf_linux_fd_t * vsf_linux_tx_pipe(vsf_linux_pipe_priv_t *priv_rx);
259#endif
260
261extern int vsf_linux_fs_bind_buffer(const char *pathname, void *buffer,
262 uint_fast32_t feature, uint64_t size);
263
264#ifdef __cplusplus
265}
266#endif
267
268#undef __VSF_LINUX_FS_CLASS_IMPLEMENT
269#undef __VSF_LINUX_FS_CLASS_INHERIT__
270
271/*============================ INCLUDES ======================================*/
272
273#include "./vfs/vsf_linux_vfs.h"
274
275#endif // VSF_USE_LINUX
276#endif // __VSF_LINUX_FS_INTERNAL_H__
277/* EOF */
Definition vsf_fs.h:114
Definition vsf_linux_fs.h:89
Definition vsf_linux_fs.h:110
Definition vsf_linux.h:270
Definition vsf_linux.h:150
Definition vsf_queue_stream.h:60
Definition vsf_simple_stream.h:254
union @848::@859::@860 u
int pid_t
Definition types.h:85
long long off64_t
Definition types.h:97
int ssize_t
Definition types.h:68
#define vsf_dcl_class
Definition ooc_class.h:46
#define vsf_class(__name)
Definition ooc_class.h:48
uint32_t uintptr_t
Definition stdint.h:38
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned long long uint64_t
Definition stdint.h:11
Definition dirent.h:42
Definition dirent.h:35
Definition stat.h:105
Definition termios.h:205
Definition vsf_list.h:888
Definition vsf_linux_fs.h:65
int(* fn_setsize)(vsf_linux_fd_t *sfd, off64_t size)
Definition vsf_linux_fs.h:75
ssize_t(* fn_write)(vsf_linux_fd_t *sfd, const void *buf, size_t count)
Definition vsf_linux_fs.h:72
int feature
Definition vsf_linux_fs.h:67
int(* fn_msync)(vsf_linux_fd_t *sfd, void *buffer)
Definition vsf_linux_fs.h:80
int priv_size
Definition vsf_linux_fs.h:66
int(* fn_fcntl)(vsf_linux_fd_t *sfd, int cmd, uintptr_t arg)
Definition vsf_linux_fs.h:70
int(* fn_stat)(vsf_linux_fd_t *sfd, struct stat *buf)
Definition vsf_linux_fs.h:76
int(* fn_close)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:73
int(* fn_eof)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:74
ssize_t(* fn_read)(vsf_linux_fd_t *sfd, void *buf, size_t count)
Definition vsf_linux_fs.h:71
int(* fn_munmap)(vsf_linux_fd_t *sfd, void *buffer)
Definition vsf_linux_fs.h:79
void(* fn_init)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:68
void(* fn_fini)(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.h:69
Definition vsf_linux_fs.h:83
short pendind_events
Definition vsf_linux_fs.h:84
void(* cb)(vsf_linux_fd_priv_t *priv, void *param, short events, vsf_protect_t orig)
Definition vsf_linux_fs.h:86
void * param
Definition vsf_linux_fs.h:85
Definition vsf_linux.h:120
uintalu_t vsf_protect_t
Definition vsf_arch_abstraction.h:53
void(* vsf_param_eda_evthandler_t)(uintptr_t target, vsf_evt_t evt)
Definition vsf_eda.h:658
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:2719
int vsf_linux_fs_get_target(const char *pathname, void **target)
Definition vsf_linux_fs.c:2707
vsf_linux_fd_t * vsf_linux_tx_pipe(vsf_linux_pipe_priv_t *priv_rx)
Definition vsf_linux_fs.c:3266
void vsf_linux_fd_set_events(vsf_linux_fd_priv_t *priv, short events, vsf_protect_t orig)
Definition vsf_linux_fs.c:1159
int vsf_linux_fd_set_feature(int fd, uint_fast32_t feature)
Definition vsf_linux_fs.c:886
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:2765
bool vsf_linux_fd_is_block(vsf_linux_fd_t *sfd)
Definition vsf_linux_fs.c:1082
const vsf_linux_fd_op_t __vsf_linux_stream_fdop
Definition vsf_linux_fs.c:231
int vsf_linux_fd_get_feature(int fd, uint_fast32_t *feature)
Definition vsf_linux_fs.c:874
int vsf_linux_create_pty(int num)
Definition vsf_linux_fs.c:3323
vsf_linux_fd_priv_callback_t * vsf_linux_fd_claim_calback(vsf_linux_fd_priv_t *priv)
Definition vsf_linux_fs.c:1107
int vsf_linux_fd_create(vsf_linux_fd_t **sfd, const vsf_linux_fd_op_t *op)
Definition vsf_linux_fs.c:1028
vsf_linux_fd_t * vsf_linux_rx_stream(vsf_stream_t *stream)
Definition vsf_linux_fs.c:3152
int vsf_linux_fs_bind_pipe(const char *pathname1, const char *pathname2, bool exclusive)
Definition vsf_linux_fs.c:3294
vsf_linux_fd_t * vsf_linux_fd_get(int fd)
Definition vsf_linux_fs.c:850
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:2692
const vsf_linux_fd_op_t vsf_linux_term_fdop
Definition vsf_linux_fs.c:252
int vsf_linux_fd_get_target(int fd, void **target)
Definition vsf_linux_fs.c:2679
void vsf_linux_fd_delete(int fd)
Definition vsf_linux_fs.c:1056
const vsf_linux_fd_op_t vsf_linux_pipe_fdop
Definition vsf_linux_fs.c:241
void vsf_linux_fd_clear_status(vsf_linux_fd_priv_t *priv, short status, vsf_protect_t orig)
Definition vsf_linux_fs.c:1185
int vsf_linux_fd_set_size(int fd, uint64_t size)
Definition vsf_linux_fs.c:905
void vsf_linux_fd_release_calback(vsf_linux_fd_priv_t *priv, vsf_linux_fd_priv_callback_t *callback)
Definition vsf_linux_fs.c:1121
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:2741
short vsf_linux_fd_get_status(vsf_linux_fd_priv_t *priv, short status)
Definition vsf_linux_fs.c:1192
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:1126
void vsf_linux_fd_set_status(vsf_linux_fd_priv_t *priv, short status, vsf_protect_t orig)
Definition vsf_linux_fs.c:1174
vsf_linux_fd_t * vsf_linux_stream(vsf_stream_t *stream_rx, vsf_stream_t *stream_tx)
Definition vsf_linux_fs.c:3138
const vsf_linux_fd_op_t vsf_linux_key_fdop
Definition vsf_linux_fs.c:263
vsf_linux_fd_t * vsf_linux_rx_pipe(vsf_queue_stream_t *queue_stream)
Definition vsf_linux_fs.c:3237
vsf_linux_fd_t * vsf_linux_tx_stream(vsf_stream_t *stream)
Definition vsf_linux_fs.c:3157
const vsf_linux_fd_op_t __vsf_linux_fs_fdop
Definition vsf_linux_fs.c:200
int vsf_linux_fd_add_feature(int fd, uint_fast32_t feature)
Definition vsf_linux_fs.c:896
@ VSF_LINUX_FDOP_FEATURE_FS
Definition vsf_linux_fs.h:62
int vsf_linux_fs_bind_buffer(const char *pathname, void *buffer, uint_fast32_t feature, uint64_t size)
Definition vsf_linux_fs.c:2826
uint64_t offset
Definition vsf_memfs.h:49
uint32_t size
Definition vsf_memfs.h:50
uint8_t status
Definition vsf_tgui.h:122
struct event_t events[32]
Definition vsf_xboot.c:36