L4Re Operating System Framework
Interface and Usage Documentation
Loading...
Searching...
No Matches
backend
1// vi:set ft=cpp: -*- Mode: C++ -*-
2/*
3 * (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
4 * Alexander Warg <warg@os.inf.tu-dresden.de>
5 * economic rights: Technische Universität Dresden (Germany)
6 *
7 * License: see LICENSE.spdx (in this directory or the directories above)
8 */
9#pragma once
10
11#include <l4/l4re_vfs/vfs.h>
12#include <l4/crtn/initpriorities.h>
13
14extern "C" void l4re_vfs_select_poll_notify(void);
15
16namespace L4Re { namespace Vfs {
17
19extern L4Re::Vfs::Ops *vfs_ops asm ("l4re_env_posix_vfs_ops");
20
21class Mount_tree;
22
30class Be_file : public File
31{
32public:
33 void *operator new (size_t size) noexcept
34 { return vfs_ops->malloc(size); }
35
36 void *operator new (size_t, void *m) noexcept
37 { return m; }
38
39 void operator delete (void *m)
40 { vfs_ops->free(m); }
41
42 // used in close, to unlock all locks of a file (as POSIX says)
43 int unlock_all_locks() noexcept override
44 { return 0; }
45
46 // for mmap
49
51 ssize_t readv(const struct iovec*, int) noexcept override
52 { return -EINVAL; }
53
55 ssize_t writev(const struct iovec*, int) noexcept override
56 { return -EINVAL; }
57
59 ssize_t pwritev(const struct iovec*, int, off64_t) noexcept override
60 { return -EINVAL; }
61
63 ssize_t preadv(const struct iovec*, int, off64_t) noexcept override
64 { return -EINVAL; }
65
67 off64_t lseek(off64_t, int) noexcept override
68 { return -ESPIPE; }
69
71 int ftruncate(off64_t) noexcept override
72 { return -EINVAL; }
73
75 int fsync() const noexcept override
76 { return -EINVAL; }
77
79 int fdatasync() const noexcept override
80 { return -EINVAL; }
81
83 int ioctl(unsigned long, va_list) noexcept override
84 { return -EINVAL; }
85
86 int fstat(struct stat64 *) const noexcept override
87 { return -EINVAL; }
88
90 int fchmod(mode_t) noexcept override
91 { return -EINVAL; }
92
94 int get_status_flags() const noexcept override
95 { return 0; }
96
98 int set_status_flags(long) noexcept override
99 { return 0; }
100
102 int get_lock(struct flock64 *) noexcept override
103 { return -ENOLCK; }
104
106 int set_lock(struct flock64 *, bool) noexcept override
107 { return -ENOLCK; }
108
110 int faccessat(const char *, int, int) noexcept override
111 { return -ENOTDIR; }
112
114 int fchmodat(const char *, mode_t, int) noexcept override
115 { return -ENOTDIR; }
116
118 int utime(const struct utimbuf *) noexcept override
119 { return -EROFS; }
120
122 int utimes(const struct timeval [2]) noexcept override
123 { return -EROFS; }
124
126 int utimensat(const char *, const struct timespec [2], int) noexcept override
127 { return -EROFS; }
128
130 int mkdir(const char *, mode_t) noexcept override
131 { return -ENOTDIR; }
132
134 int unlink(const char *) noexcept override
135 { return -ENOTDIR; }
136
138 int rename(const char *, const char *) noexcept override
139 { return -ENOTDIR; }
140
142 int link(const char *, const char *) noexcept override
143 { return -ENOTDIR; }
144
146 int symlink(const char *, const char *) noexcept override
147 { return -EPERM; }
148
150 int rmdir(const char *) noexcept override
151 { return -ENOTDIR; }
152
154 ssize_t readlink(char *, size_t) override
155 { return -EINVAL; }
156
157 ssize_t getdents(char *, size_t) noexcept override
158 { return -ENOTDIR; }
159
160
161
162 // Socket interface
163 int bind(sockaddr const *, socklen_t) noexcept override
164 { return -ENOTSOCK; }
165
166 int connect(sockaddr const *, socklen_t) noexcept override
167 { return -ENOTSOCK; }
168
169 ssize_t send(void const *, size_t, int) noexcept override
170 { return -ENOTSOCK; }
171
172 ssize_t recv(void *, size_t, int) noexcept override
173 { return -ENOTSOCK; }
174
175 ssize_t sendto(void const *, size_t, int, sockaddr const *, socklen_t) noexcept
176 override
177 { return -ENOTSOCK; }
178
179 ssize_t recvfrom(void *, size_t, int, sockaddr *, socklen_t *) noexcept override
180 { return -ENOTSOCK; }
181
182 ssize_t sendmsg(msghdr const *, int) noexcept override
183 { return -ENOTSOCK; }
184
185 ssize_t recvmsg(msghdr *, int) noexcept override
186 { return -ENOTSOCK; }
187
188 int getsockopt(int, int, void *, socklen_t *) noexcept override
189 { return -ENOTSOCK; }
190
191 int setsockopt(int, int, void const *, socklen_t) noexcept override
192 { return -ENOTSOCK; }
193
194 int listen(int) noexcept override
195 { return -ENOTSOCK; }
196
197 int accept(sockaddr *, socklen_t *) noexcept override
198 { return -ENOTSOCK; }
199
200 int shutdown(int) noexcept override
201 { return -ENOTSOCK; }
202
203 int getsockname(sockaddr *, socklen_t *) noexcept override
204 { return -ENOTSOCK; }
205
206 int getpeername(sockaddr *, socklen_t *) noexcept override
207 { return -ENOTSOCK; }
208
217 bool check_ready(Ready_type) noexcept override
218 { return false; }
219
220 ~Be_file() noexcept = 0;
221
222private:
224 int get_entry(const char *, int, mode_t, cxx::Ref_ptr<File> *) noexcept override
225 { return -ENOTDIR; }
226
227protected:
228 const char *get_mount(const char *path, cxx::Ref_ptr<File> *dir) noexcept;
229};
230
231inline
232Be_file::~Be_file() noexcept {}
233
234class Be_file_pos : public Be_file
235{
236public:
237 Be_file_pos() noexcept : Be_file(), _pos(0) {}
238
239 virtual off64_t size() const noexcept = 0;
240
241 ssize_t readv(const struct iovec *v, int iovcnt) noexcept override
242 {
243 ssize_t r = preadv(v, iovcnt, _pos);
244 if (r > 0)
245 _pos += r;
246 return r;
247 }
248
249 ssize_t writev(const struct iovec *v, int iovcnt) noexcept override
250 {
251 ssize_t r = pwritev(v, iovcnt, _pos);
252 if (r > 0)
253 _pos += r;
254 return r;
255 }
256
257 ssize_t preadv(const struct iovec *v, int iovcnt, off64_t offset) noexcept override = 0;
258 ssize_t pwritev(const struct iovec *v, int iovcnt, off64_t offset) noexcept override = 0;
259
260 off64_t lseek(off64_t offset, int whence) noexcept override
261 {
262 off64_t r;
263 switch (whence)
264 {
265 case SEEK_SET: r = offset; break;
266 case SEEK_CUR: r = _pos + offset; break;
267 case SEEK_END: r = size() + offset; break;
268 default: return -EINVAL;
269 };
270
271 if (r < 0)
272 return -EINVAL;
273
274 _pos = r;
275 return _pos;
276 }
277
278 ~Be_file_pos() noexcept = 0;
279
280protected:
281 off64_t pos() const noexcept { return _pos; }
282
283private:
284 off64_t _pos;
285};
286
287inline Be_file_pos::~Be_file_pos() noexcept {}
288
289class Be_file_stream : public Be_file
290{
291public:
292 ssize_t preadv(const struct iovec *v, int iovcnt, off64_t) noexcept override
293 { return readv(v, iovcnt); }
294
295 ssize_t pwritev(const struct iovec *v, int iovcnt, off64_t) noexcept override
296 { return writev(v, iovcnt); }
297
298 ~Be_file_stream() noexcept = 0;
299
300};
301
302inline Be_file_stream::~Be_file_stream() noexcept {}
303
310class Be_file_system : public File_system
311{
312private:
313 char const *const _fstype;
314
315public:
316
324 explicit Be_file_system(char const *fstype) noexcept
325 : File_system(), _fstype(fstype)
326 {
327 vfs_ops->register_file_system(this);
328 }
329
337 {
338 vfs_ops->unregister_file_system(this);
339 }
340
346 char const *type() const noexcept override { return _fstype; }
347};
348
349/* Make sure filesystems can register before the constructor of libmount
350 * runs */
351#define L4RE_VFS_FILE_SYSTEM_ATTRIBUTE \
352 __attribute__((init_priority(INIT_PRIO_LATE)))
353
354}}
~Be_file_system() noexcept
Destroy a file-system object.
Definition backend:336
char const * type() const noexcept override
Return the file-system type.
Definition backend:346
Be_file_system(char const *fstype) noexcept
Create a file-system object for the given fstype.
Definition backend:324
Boiler plate class for implementing an open file for L4Re::Vfs.
Definition backend:31
int faccessat(const char *, int, int) noexcept override
Default backend for POSIX access and faccessat functions.
Definition backend:110
ssize_t writev(const struct iovec *, int) noexcept override
Default backend for POSIX write and writev functions.
Definition backend:55
int unlink(const char *) noexcept override
Default backend for POSIX unlink, unlinkat.
Definition backend:134
int fchmodat(const char *, mode_t, int) noexcept override
Default backend for POSIX fchmodat function.
Definition backend:114
int ioctl(unsigned long, va_list) noexcept override
Default backend for POSIX ioctl.
Definition backend:83
int utimensat(const char *, const struct timespec[2], int) noexcept override
Default backend for POSIX utimensat.
Definition backend:126
int unlock_all_locks() noexcept override
Unlock all locks on the file.
Definition backend:43
bool check_ready(Ready_type) noexcept override
Default implementation of a readiness check.
Definition backend:217
ssize_t preadv(const struct iovec *, int, off64_t) noexcept override
Default backend for POSIX pread and preadv functions.
Definition backend:63
int rmdir(const char *) noexcept override
Default backend for POSIX rmdir, rmdirat.
Definition backend:150
int utimes(const struct timeval[2]) noexcept override
Default backend for POSIX utimes.
Definition backend:122
int set_status_flags(long) noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:98
ssize_t pwritev(const struct iovec *, int, off64_t) noexcept override
Default backend for POSIX pwrite and pwritev functions.
Definition backend:59
ssize_t readv(const struct iovec *, int) noexcept override
Default backend for POSIX read and readv functions.
Definition backend:51
int fsync() const noexcept override
Default backend for POSIX fsync.
Definition backend:75
int mkdir(const char *, mode_t) noexcept override
Default backend for POSIX mkdir and mkdirat.
Definition backend:130
int fchmod(mode_t) noexcept override
Default backend for POSIX chmod and fchmod.
Definition backend:90
int set_lock(struct flock64 *, bool) noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:106
off64_t lseek(off64_t, int) noexcept override
Default backend for POSIX seek and lseek functions.
Definition backend:67
int get_status_flags() const noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:94
int ftruncate(off64_t) noexcept override
Default backend for the POSIX truncate, ftruncate and similar functions.
Definition backend:71
int fdatasync() const noexcept override
Default backend for POSIX fdatasync.
Definition backend:79
int symlink(const char *, const char *) noexcept override
Default backend for POSIX symlink, symlinkat.
Definition backend:146
L4::Cap< L4Re::Dataspace > data_space() noexcept override
Get an L4Re::Dataspace object for the file.
Definition backend:47
int utime(const struct utimbuf *) noexcept override
Default backend for POSIX utime.
Definition backend:118
int rename(const char *, const char *) noexcept override
Default backend for POSIX rename, renameat.
Definition backend:138
int get_lock(struct flock64 *) noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:102
int fstat(struct stat64 *) const noexcept override
Get status information for the file.
Definition backend:86
int link(const char *, const char *) noexcept override
Default backend for POSIX link, linkat.
Definition backend:142
ssize_t readlink(char *, size_t) override
Default backend for POSIX readlink, readlinkat.
Definition backend:154
The basic interface for an open POSIX file.
Definition vfs.h:461
Ready_type
Type of I/O operation/condition a file can indicate readiness.
Definition vfs.h:61
Interface for the POSIX backends of an application.
Definition vfs.h:1110
@ Invalid
Invalid capability selector.
Definition capability.h:42
C++ interface for capabilities.
Definition capability.h:224
A reference-counting pointer with automatic cleanup.
Definition ref_ptr:71
Virtual file system for interfaces in POSIX libc.
Definition backend:16
L4Re C++ Interfaces.
Definition cmd_control:14
Our C++ library.
Definition arith:11