Zephyr API Documentation 4.0.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
fdtable.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Linaro Limited
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef ZEPHYR_INCLUDE_SYS_FDTABLE_H_
7#define ZEPHYR_INCLUDE_SYS_FDTABLE_H_
8
9#include <stdarg.h>
10#include <time.h>
11
12/* FIXME: For native_posix ssize_t, off_t. */
13#include <sys/types.h>
14#include <zephyr/kernel.h>
15#include <zephyr/sys/util.h>
16
17#ifdef CONFIG_PICOLIBC
18#define ZVFS_O_APPEND 0x0400
19#define ZVFS_O_CREAT 0x0040
20#define ZVFS_O_TRUNC 0x0200
21#else
22#define ZVFS_O_APPEND 0x0008
23#define ZVFS_O_CREAT 0x0200
24#define ZVFS_O_TRUNC 0x0400
25#endif
26
27#define ZVFS_O_RDONLY 00
28#define ZVFS_O_WRONLY 01
29#define ZVFS_O_RDWR 02
30
31#define ZVFS_O_EXCL 0x0800
32#define ZVFS_O_NONBLOCK 0x4000
33
34#define ZVFS_F_DUPFD 0
35#define ZVFS_F_GETFL 3
36#define ZVFS_F_SETFL 4
37
38/* File mode bits */
39#define ZVFS_MODE_IFMT 0170000
40#define ZVFS_MODE_UNSPEC 0000000
41#define ZVFS_MODE_IFIFO 0010000
42#define ZVFS_MODE_IFCHR 0020000
43#define ZVFS_MODE_IMSGQ 0030000
44#define ZVFS_MODE_IFDIR 0040000
45#define ZVFS_MODE_IFSEM 0050000
46#define ZVFS_MODE_IFBLK 0060000
47#define ZVFS_MODE_IFSHM 0070000
48#define ZVFS_MODE_IFREG 0100000
49#define ZVFS_MODE_IFLNK 0120000
50#define ZVFS_MODE_IFSOCK 0140000
51
52#define ZVFS_POLLIN BIT(0)
53#define ZVFS_POLLPRI BIT(1)
54#define ZVFS_POLLOUT BIT(2)
55#define ZVFS_POLLERR BIT(3)
56#define ZVFS_POLLHUP BIT(4)
57#define ZVFS_POLLNVAL BIT(5)
58
59#ifdef __cplusplus
60extern "C" {
61#endif
62
63/* FIXME: use k_off_t and k_ssize_t to avoid the POSIX->Zephyr->POSIX dependency cycle */
64#ifdef CONFIG_NEWLIB_LIBC
65#ifndef _OFF_T_DECLARED
66typedef __off_t off_t;
67#define _OFF_T_DECLARED
68#endif
69#ifndef _SSIZE_T_DECLARED
70typedef _ssize_t ssize_t;
71#define _SSIZE_T_DECLARED
72#endif
73#endif
74
80 union {
81 ssize_t (*read)(void *obj, void *buf, size_t sz);
82 ssize_t (*read_offs)(void *obj, void *buf, size_t sz, size_t offset);
83 };
84 union {
85 ssize_t (*write)(void *obj, const void *buf, size_t sz);
86 ssize_t (*write_offs)(void *obj, const void *buf, size_t sz, size_t offset);
87 };
88 union {
89 int (*close)(void *obj);
90 int (*close2)(void *obj, int fd);
91 };
92 int (*ioctl)(void *obj, unsigned int request, va_list args);
93};
94
106
123void zvfs_finalize_typed_fd(int fd, void *obj, const struct fd_op_vtable *vtable, uint32_t mode);
124
135static inline void zvfs_finalize_fd(int fd, void *obj, const struct fd_op_vtable *vtable)
136{
138}
139
151int zvfs_alloc_fd(void *obj, const struct fd_op_vtable *vtable);
152
161void zvfs_free_fd(int fd);
162
179void *zvfs_get_fd_obj(int fd, const struct fd_op_vtable *vtable, int err);
180
193void *zvfs_get_fd_obj_and_vtable(int fd, const struct fd_op_vtable **vtable,
194 struct k_mutex **lock);
195
211bool zvfs_get_obj_lock_and_cond(void *obj, const struct fd_op_vtable *vtable, struct k_mutex **lock,
212 struct k_condvar **cond);
213
226static inline int zvfs_fdtable_call_ioctl(const struct fd_op_vtable *vtable, void *obj,
227 unsigned long request, ...)
228{
229 va_list args;
230 int res;
231
232 va_start(args, request);
233 res = vtable->ioctl(obj, request, args);
234 va_end(args);
235
236 return res;
237}
238
240 int fd;
241 short events;
242 short revents;
243};
244
245__syscall int zvfs_poll(struct zvfs_pollfd *fds, int nfds, int poll_timeout);
246
248 uint32_t bitset[(CONFIG_ZVFS_OPEN_MAX + 31) / 32];
249};
250
252#define ZVFS_FD_SETSIZE (sizeof(((struct zvfs_fd_set *)0)->bitset) * 8)
253
254void ZVFS_FD_CLR(int fd, struct zvfs_fd_set *fdset);
255int ZVFS_FD_ISSET(int fd, struct zvfs_fd_set *fdset);
256void ZVFS_FD_SET(int fd, struct zvfs_fd_set *fdset);
257void ZVFS_FD_ZERO(struct zvfs_fd_set *fdset);
258
259__syscall int zvfs_select(int nfds, struct zvfs_fd_set *ZRESTRICT readfds,
260 struct zvfs_fd_set *ZRESTRICT writefds,
261 struct zvfs_fd_set *ZRESTRICT errorfds,
262 const struct timespec *ZRESTRICT timeout, const void *ZRESTRICT sigmask);
263
272enum {
273 /* Codes below 0x100 are reserved for fcntl() codes. */
283
284 /* Codes above 0x5400 and below 0x5500 are reserved for termios, FIO, etc */
287};
288
289#ifdef __cplusplus
290}
291#endif
292
293#include <zephyr/syscalls/fdtable.h>
294
295#endif /* ZEPHYR_INCLUDE_SYS_FDTABLE_H_ */
int zvfs_alloc_fd(void *obj, const struct fd_op_vtable *vtable)
Allocate file descriptor for underlying I/O object.
void ZVFS_FD_CLR(int fd, struct zvfs_fd_set *fdset)
int zvfs_reserve_fd(void)
Reserve file descriptor.
void * zvfs_get_fd_obj_and_vtable(int fd, const struct fd_op_vtable **vtable, struct k_mutex **lock)
Get underlying object pointer and vtable pointer from file descriptor.
static void zvfs_finalize_fd(int fd, void *obj, const struct fd_op_vtable *vtable)
Finalize creation of file descriptor.
Definition fdtable.h:135
int zvfs_poll(struct zvfs_pollfd *fds, int nfds, int poll_timeout)
@ ZFD_IOCTL_SET_LOCK
Definition fdtable.h:279
@ ZFD_IOCTL_FIONREAD
Definition fdtable.h:285
@ ZFD_IOCTL_POLL_PREPARE
Definition fdtable.h:276
@ ZFD_IOCTL_FSYNC
Definition fdtable.h:274
@ ZFD_IOCTL_LSEEK
Definition fdtable.h:275
@ ZFD_IOCTL_FIONBIO
Definition fdtable.h:286
@ ZFD_IOCTL_POLL_OFFLOAD
Definition fdtable.h:278
@ ZFD_IOCTL_POLL_UPDATE
Definition fdtable.h:277
@ ZFD_IOCTL_TRUNCATE
Definition fdtable.h:281
@ ZFD_IOCTL_STAT
Definition fdtable.h:280
@ ZFD_IOCTL_MMAP
Definition fdtable.h:282
void zvfs_finalize_typed_fd(int fd, void *obj, const struct fd_op_vtable *vtable, uint32_t mode)
Finalize creation of file descriptor, with type.
#define ZVFS_MODE_UNSPEC
Definition fdtable.h:40
void ZVFS_FD_ZERO(struct zvfs_fd_set *fdset)
bool zvfs_get_obj_lock_and_cond(void *obj, const struct fd_op_vtable *vtable, struct k_mutex **lock, struct k_condvar **cond)
Get the mutex and condition variable associated with the given object and vtable.
void zvfs_free_fd(int fd)
Release reserved file descriptor.
static int zvfs_fdtable_call_ioctl(const struct fd_op_vtable *vtable, void *obj, unsigned long request,...)
Call ioctl vmethod on an object using varargs.
Definition fdtable.h:226
int ZVFS_FD_ISSET(int fd, struct zvfs_fd_set *fdset)
void * zvfs_get_fd_obj(int fd, const struct fd_op_vtable *vtable, int err)
Get underlying object pointer from file descriptor.
int zvfs_select(int nfds, struct zvfs_fd_set *ZRESTRICT readfds, struct zvfs_fd_set *ZRESTRICT writefds, struct zvfs_fd_set *ZRESTRICT errorfds, const struct timespec *ZRESTRICT timeout, const void *ZRESTRICT sigmask)
void ZVFS_FD_SET(int fd, struct zvfs_fd_set *fdset)
#define ZRESTRICT
Definition common.h:36
Public kernel APIs.
__SIZE_TYPE__ ssize_t
Definition types.h:28
__INTPTR_TYPE__ off_t
Definition types.h:36
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
File descriptor virtual method table.
Definition fdtable.h:79
int(* close2)(void *obj, int fd)
Definition fdtable.h:90
ssize_t(* write_offs)(void *obj, const void *buf, size_t sz, size_t offset)
Definition fdtable.h:86
ssize_t(* read_offs)(void *obj, void *buf, size_t sz, size_t offset)
Definition fdtable.h:82
int(* close)(void *obj)
Definition fdtable.h:89
ssize_t(* read)(void *obj, void *buf, size_t sz)
Definition fdtable.h:81
ssize_t(* write)(void *obj, const void *buf, size_t sz)
Definition fdtable.h:85
int(* ioctl)(void *obj, unsigned int request, va_list args)
Definition fdtable.h:92
Definition kernel.h:3137
Mutex Structure.
Definition kernel.h:3025
Definition _timespec.h:22
Definition fdtable.h:247
uint32_t bitset[(CONFIG_ZVFS_OPEN_MAX+31)/32]
Definition fdtable.h:248
Definition fdtable.h:239
short events
Definition fdtable.h:241
short revents
Definition fdtable.h:242
int fd
Definition fdtable.h:240
Misc utilities.