L4Re Operating System Framework
Interface and Usage Documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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
14namespace L4Re { namespace Vfs {
15
17extern L4Re::Vfs::Ops *vfs_ops asm ("l4re_env_posix_vfs_ops");
18
19class Mount_tree;
20
28class Be_file : public File
29{
30public:
31 void *operator new (size_t size) noexcept
32 { return vfs_ops->malloc(size); }
33
34 void *operator new (size_t, void *m) noexcept
35 { return m; }
36
37 void operator delete (void *m)
38 { vfs_ops->free(m); }
39
40 // used in close, to unlock all locks of a file (as POSIX says)
41 int unlock_all_locks() noexcept override
42 { return 0; }
43
44 // for mmap
47
49 ssize_t readv(const struct iovec*, int) noexcept override
50 { return -EINVAL; }
51
53 ssize_t writev(const struct iovec*, int) noexcept override
54 { return -EINVAL; }
55
57 ssize_t pwritev(const struct iovec*, int, off64_t) noexcept override
58 { return -EINVAL; }
59
61 ssize_t preadv(const struct iovec*, int, off64_t) noexcept override
62 { return -EINVAL; }
63
65 off64_t lseek64(off64_t, int) noexcept override
66 { return -ESPIPE; }
67
69 int ftruncate64(off64_t) noexcept override
70 { return -EINVAL; }
71
73 int fsync() const noexcept override
74 { return -EINVAL; }
75
77 int fdatasync() const noexcept override
78 { return -EINVAL; }
79
81 int ioctl(unsigned long, va_list) noexcept override
82 { return -EINVAL; }
83
84 int fstat64(struct stat64 *) const noexcept override
85 { return -EINVAL; }
86
88 int fchmod(mode_t) noexcept override
89 { return -EINVAL; }
90
92 int get_status_flags() const noexcept override
93 { return 0; }
94
96 int set_status_flags(long) noexcept override
97 { return 0; }
98
100 int get_lock(struct flock64 *) noexcept override
101 { return -ENOLCK; }
102
104 int set_lock(struct flock64 *, bool) noexcept override
105 { return -ENOLCK; }
106
108 int faccessat(const char *, int, int) noexcept override
109 { return -ENOTDIR; }
110
112 int fchmodat(const char *, mode_t, int) noexcept override
113 { return -ENOTDIR; }
114
116 int utime(const struct utimbuf *) noexcept override
117 { return -EROFS; }
118
120 int utimes(const struct timeval [2]) noexcept override
121 { return -EROFS; }
122
124 int utimensat(const char *, const struct timespec [2], int) noexcept override
125 { return -EROFS; }
126
128 int mkdir(const char *, mode_t) noexcept override
129 { return -ENOTDIR; }
130
132 int unlink(const char *) noexcept override
133 { return -ENOTDIR; }
134
136 int rename(const char *, const char *) noexcept override
137 { return -ENOTDIR; }
138
140 int link(const char *, const char *) noexcept override
141 { return -ENOTDIR; }
142
144 int symlink(const char *, const char *) noexcept override
145 { return -EPERM; }
146
148 int rmdir(const char *) noexcept override
149 { return -ENOTDIR; }
150
152 ssize_t readlink(char *, size_t) override
153 { return -EINVAL; }
154
155 ssize_t getdents(char *, size_t) noexcept override
156 { return -ENOTDIR; }
157
158
159
160 // Socket interface
161 int bind(sockaddr const *, socklen_t) noexcept override
162 { return -ENOTSOCK; }
163
164 int connect(sockaddr const *, socklen_t) noexcept override
165 { return -ENOTSOCK; }
166
167 ssize_t send(void const *, size_t, int) noexcept override
168 { return -ENOTSOCK; }
169
170 ssize_t recv(void *, size_t, int) noexcept override
171 { return -ENOTSOCK; }
172
173 ssize_t sendto(void const *, size_t, int, sockaddr const *, socklen_t) noexcept
174 override
175 { return -ENOTSOCK; }
176
177 ssize_t recvfrom(void *, size_t, int, sockaddr *, socklen_t *) noexcept override
178 { return -ENOTSOCK; }
179
180 ssize_t sendmsg(msghdr const *, int) noexcept override
181 { return -ENOTSOCK; }
182
183 ssize_t recvmsg(msghdr *, int) noexcept override
184 { return -ENOTSOCK; }
185
186 int getsockopt(int, int, void *, socklen_t *) noexcept override
187 { return -ENOTSOCK; }
188
189 int setsockopt(int, int, void const *, socklen_t) noexcept override
190 { return -ENOTSOCK; }
191
192 int listen(int) noexcept override
193 { return -ENOTSOCK; }
194
195 int accept(sockaddr *, socklen_t *) noexcept override
196 { return -ENOTSOCK; }
197
198 int shutdown(int) noexcept override
199 { return -ENOTSOCK; }
200
201 int getsockname(sockaddr *, socklen_t *) noexcept override
202 { return -ENOTSOCK; }
203
204 int getpeername(sockaddr *, socklen_t *) noexcept override
205 { return -ENOTSOCK; }
206
215 bool check_ready(Ready_type) noexcept override
216 { return false; }
217
218 ~Be_file() noexcept = 0;
219
220private:
222 int get_entry(const char *, int, mode_t, cxx::Ref_ptr<File> *) noexcept override
223 { return -ENOTDIR; }
224
225protected:
226 const char *get_mount(const char *path, cxx::Ref_ptr<File> *dir) noexcept;
227};
228
229inline
230Be_file::~Be_file() noexcept {}
231
232class Be_file_pos : public Be_file
233{
234public:
235 Be_file_pos() noexcept : Be_file(), _pos(0) {}
236
237 virtual off64_t size() const noexcept = 0;
238
239 ssize_t readv(const struct iovec *v, int iovcnt) noexcept override
240 {
241 ssize_t r = preadv(v, iovcnt, _pos);
242 if (r > 0)
243 _pos += r;
244 return r;
245 }
246
247 ssize_t writev(const struct iovec *v, int iovcnt) noexcept override
248 {
249 ssize_t r = pwritev(v, iovcnt, _pos);
250 if (r > 0)
251 _pos += r;
252 return r;
253 }
254
255 ssize_t preadv(const struct iovec *v, int iovcnt, off64_t offset) noexcept override = 0;
256 ssize_t pwritev(const struct iovec *v, int iovcnt, off64_t offset) noexcept override = 0;
257
258 off64_t lseek64(off64_t offset, int whence) noexcept override
259 {
260 off64_t r;
261 switch (whence)
262 {
263 case SEEK_SET: r = offset; break;
264 case SEEK_CUR: r = _pos + offset; break;
265 case SEEK_END: r = size() + offset; break;
266 default: return -EINVAL;
267 };
268
269 if (r < 0)
270 return -EINVAL;
271
272 _pos = r;
273 return _pos;
274 }
275
276 ~Be_file_pos() noexcept = 0;
277
278protected:
279 off64_t pos() const noexcept { return _pos; }
280
281private:
282 off64_t _pos;
283};
284
285inline Be_file_pos::~Be_file_pos() noexcept {}
286
287class Be_file_stream : public Be_file
288{
289public:
290 ssize_t preadv(const struct iovec *v, int iovcnt, off64_t) noexcept override
291 { return readv(v, iovcnt); }
292
293 ssize_t pwritev(const struct iovec *v, int iovcnt, off64_t) noexcept override
294 { return writev(v, iovcnt); }
295
296 ~Be_file_stream() noexcept = 0;
297
298};
299
300inline Be_file_stream::~Be_file_stream() noexcept {}
301
309{
310private:
311 char const *const _fstype;
312
313public:
314
322 explicit Be_file_system(char const *fstype) noexcept
323 : File_system(), _fstype(fstype)
324 {
325 vfs_ops->register_file_system(this);
326 }
327
335 {
336 vfs_ops->unregister_file_system(this);
337 }
338
344 char const *type() const noexcept override { return _fstype; }
345};
346
347/* Make sure filesystems can register before the constructor of libmount
348 * runs */
349#define L4RE_VFS_FILE_SYSTEM_ATTRIBUTE \
350 __attribute__((init_priority(INIT_PRIO_LATE)))
351
352}}
Boilerplate class for implementing a L4Re::Vfs::File_system.
Definition backend:309
~Be_file_system() noexcept
Destroy a file-system object.
Definition backend:334
char const * type() const noexcept override
Return the file-system type.
Definition backend:344
Be_file_system(char const *fstype) noexcept
Create a file-system object for the given fstype.
Definition backend:322
Boiler plate class for implementing an open file for L4Re::Vfs.
Definition backend:29
int faccessat(const char *, int, int) noexcept override
Default backend for POSIX access and faccessat functions.
Definition backend:108
ssize_t writev(const struct iovec *, int) noexcept override
Default backend for POSIX write and writev functions.
Definition backend:53
int unlink(const char *) noexcept override
Default backend for POSIX unlink, unlinkat.
Definition backend:132
int fchmodat(const char *, mode_t, int) noexcept override
Default backend for POSIX fchmodat function.
Definition backend:112
int ioctl(unsigned long, va_list) noexcept override
Default backend for POSIX ioctl.
Definition backend:81
int utimensat(const char *, const struct timespec[2], int) noexcept override
Default backend for POSIX utimensat.
Definition backend:124
int unlock_all_locks() noexcept override
Unlock all locks on the file.
Definition backend:41
bool check_ready(Ready_type) noexcept override
Default implementation of a readiness check.
Definition backend:215
ssize_t preadv(const struct iovec *, int, off64_t) noexcept override
Default backend for POSIX pread and preadv functions.
Definition backend:61
int rmdir(const char *) noexcept override
Default backend for POSIX rmdir, rmdirat.
Definition backend:148
int utimes(const struct timeval[2]) noexcept override
Default backend for POSIX utimes.
Definition backend:120
int set_status_flags(long) noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:96
ssize_t pwritev(const struct iovec *, int, off64_t) noexcept override
Default backend for POSIX pwrite and pwritev functions.
Definition backend:57
ssize_t readv(const struct iovec *, int) noexcept override
Default backend for POSIX read and readv functions.
Definition backend:49
int fsync() const noexcept override
Default backend for POSIX fsync.
Definition backend:73
int mkdir(const char *, mode_t) noexcept override
Default backend for POSIX mkdir and mkdirat.
Definition backend:128
int ftruncate64(off64_t) noexcept override
Default backend for the POSIX truncate, ftruncate and similar functions.
Definition backend:69
int fchmod(mode_t) noexcept override
Default backend for POSIX chmod and fchmod.
Definition backend:88
int set_lock(struct flock64 *, bool) noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:104
int get_status_flags() const noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:92
int fstat64(struct stat64 *) const noexcept override
Get status information for the file.
Definition backend:84
off64_t lseek64(off64_t, int) noexcept override
Default backend for POSIX seek and lseek functions.
Definition backend:65
int fdatasync() const noexcept override
Default backend for POSIX fdatasync.
Definition backend:77
int symlink(const char *, const char *) noexcept override
Default backend for POSIX symlink, symlinkat.
Definition backend:144
L4::Cap< L4Re::Dataspace > data_space() noexcept override
Get an L4Re::Dataspace object for the file.
Definition backend:45
int utime(const struct utimbuf *) noexcept override
Default backend for POSIX utime.
Definition backend:116
int rename(const char *, const char *) noexcept override
Default backend for POSIX rename, renameat.
Definition backend:136
int get_lock(struct flock64 *) noexcept override
Default backend for POSIX fcntl subfunctions.
Definition backend:100
int link(const char *, const char *) noexcept override
Default backend for POSIX link, linkat.
Definition backend:140
ssize_t readlink(char *, size_t) override
Default backend for POSIX readlink, readlinkat.
Definition backend:152
Basic interface for an L4Re::Vfs file system.
Definition vfs.h:847
The basic interface for an open POSIX file.
Definition vfs.h:460
Ready_type
Type of I/O operation/condition a file can indicate readiness.
Definition vfs.h:60
Interface for the POSIX backends of an application.
Definition vfs.h:1099
C++ interface for capabilities.
Definition capability.h:219
A reference-counting pointer with automatic cleanup.
Definition ref_ptr:71
L4Re C++ Interfaces.
Definition cmd_control:14
Our C++ library.
Definition arith:11