11#include <l4/l4re_vfs/vfs.h>
12#include <l4/crtn/initpriorities.h>
14extern "C" void l4re_vfs_select_poll_notify(
void);
33 void *
operator new (
size_t size)
noexcept
34 {
return vfs_ops->malloc(size); }
36 void *
operator new (size_t,
void *m)
noexcept
39 void operator delete (
void *m)
51 ssize_t
readv(
const struct iovec*,
int)
noexcept override
55 ssize_t
writev(
const struct iovec*,
int)
noexcept override
59 ssize_t
pwritev(
const struct iovec*,
int, off64_t)
noexcept override
63 ssize_t
preadv(
const struct iovec*,
int, off64_t)
noexcept override
67 off64_t
lseek(off64_t,
int)
noexcept override
75 int fsync() const noexcept
override
83 int ioctl(
unsigned long, va_list)
noexcept override
86 int fstat(
struct stat64 *)
const noexcept override
106 int set_lock(
struct flock64 *,
bool)
noexcept override
114 int fchmodat(
const char *, mode_t,
int)
noexcept override
118 int utime(
const struct utimbuf *)
noexcept override
122 int utimes(
const struct timeval [2])
noexcept override
126 int utimensat(
const char *,
const struct timespec [2],
int)
noexcept override
130 int mkdir(
const char *, mode_t)
noexcept override
134 int unlink(
const char *)
noexcept override
138 int rename(
const char *,
const char *)
noexcept override
142 int link(
const char *,
const char *)
noexcept override
146 int symlink(
const char *,
const char *)
noexcept override
150 int rmdir(
const char *)
noexcept override
157 ssize_t getdents(
char *,
size_t)
noexcept override
163 int bind(sockaddr
const *, socklen_t)
noexcept override
164 {
return -ENOTSOCK; }
166 int connect(sockaddr
const *, socklen_t)
noexcept override
167 {
return -ENOTSOCK; }
169 ssize_t send(
void const *,
size_t,
int)
noexcept override
170 {
return -ENOTSOCK; }
172 ssize_t recv(
void *,
size_t,
int)
noexcept override
173 {
return -ENOTSOCK; }
175 ssize_t sendto(
void const *,
size_t,
int, sockaddr
const *, socklen_t)
noexcept
177 {
return -ENOTSOCK; }
179 ssize_t recvfrom(
void *,
size_t,
int, sockaddr *, socklen_t *)
noexcept override
180 {
return -ENOTSOCK; }
182 ssize_t sendmsg(msghdr
const *,
int)
noexcept override
183 {
return -ENOTSOCK; }
185 ssize_t recvmsg(msghdr *,
int)
noexcept override
186 {
return -ENOTSOCK; }
188 int getsockopt(
int,
int,
void *, socklen_t *)
noexcept override
189 {
return -ENOTSOCK; }
191 int setsockopt(
int,
int,
void const *, socklen_t)
noexcept override
192 {
return -ENOTSOCK; }
194 int listen(
int)
noexcept override
195 {
return -ENOTSOCK; }
197 int accept(sockaddr *, socklen_t *)
noexcept override
198 {
return -ENOTSOCK; }
200 int shutdown(
int)
noexcept override
201 {
return -ENOTSOCK; }
203 int getsockname(sockaddr *, socklen_t *)
noexcept override
204 {
return -ENOTSOCK; }
206 int getpeername(sockaddr *, socklen_t *)
noexcept override
207 {
return -ENOTSOCK; }
224 int get_entry(const
char *,
int, mode_t,
cxx::Ref_ptr<
File> *) noexcept
override
232Be_file::~Be_file() noexcept {}
234class Be_file_pos :
public Be_file
237 Be_file_pos() noexcept : Be_file(), _pos(0) {}
239 virtual off64_t size() const noexcept = 0;
241 ssize_t readv(const struct iovec *v,
int iovcnt) noexcept
override
243 ssize_t r = preadv(v, iovcnt, _pos);
249 ssize_t writev(
const struct iovec *v,
int iovcnt)
noexcept override
251 ssize_t r = pwritev(v, iovcnt, _pos);
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;
260 off64_t lseek(off64_t offset,
int whence)
noexcept override
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;
278 ~Be_file_pos() noexcept = 0;
281 off64_t pos() const noexcept {
return _pos; }
287inline Be_file_pos::~Be_file_pos() noexcept {}
289class Be_file_stream :
public Be_file
292 ssize_t preadv(
const struct iovec *v,
int iovcnt, off64_t)
noexcept override
293 {
return readv(v, iovcnt); }
295 ssize_t pwritev(
const struct iovec *v,
int iovcnt, off64_t)
noexcept override
296 {
return writev(v, iovcnt); }
298 ~Be_file_stream() noexcept = 0;
302inline Be_file_stream::~Be_file_stream() noexcept {}
313 char const *
const _fstype;
325 : File_system(), _fstype(fstype)
327 vfs_ops->register_file_system(
this);
338 vfs_ops->unregister_file_system(
this);
346 char const *
type() const noexcept
override {
return _fstype; }
351#define L4RE_VFS_FILE_SYSTEM_ATTRIBUTE \
352 __attribute__((init_priority(INIT_PRIO_LATE)))
~Be_file_system() noexcept
Destroy a file-system object.
char const * type() const noexcept override
Return the file-system type.
Be_file_system(char const *fstype) noexcept
Create a file-system object for the given fstype.
Boiler plate class for implementing an open file for L4Re::Vfs.
int faccessat(const char *, int, int) noexcept override
Default backend for POSIX access and faccessat functions.
ssize_t writev(const struct iovec *, int) noexcept override
Default backend for POSIX write and writev functions.
int unlink(const char *) noexcept override
Default backend for POSIX unlink, unlinkat.
int fchmodat(const char *, mode_t, int) noexcept override
Default backend for POSIX fchmodat function.
int ioctl(unsigned long, va_list) noexcept override
Default backend for POSIX ioctl.
int utimensat(const char *, const struct timespec[2], int) noexcept override
Default backend for POSIX utimensat.
int unlock_all_locks() noexcept override
Unlock all locks on the file.
bool check_ready(Ready_type) noexcept override
Default implementation of a readiness check.
ssize_t preadv(const struct iovec *, int, off64_t) noexcept override
Default backend for POSIX pread and preadv functions.
int rmdir(const char *) noexcept override
Default backend for POSIX rmdir, rmdirat.
int utimes(const struct timeval[2]) noexcept override
Default backend for POSIX utimes.
int set_status_flags(long) noexcept override
Default backend for POSIX fcntl subfunctions.
ssize_t pwritev(const struct iovec *, int, off64_t) noexcept override
Default backend for POSIX pwrite and pwritev functions.
ssize_t readv(const struct iovec *, int) noexcept override
Default backend for POSIX read and readv functions.
int fsync() const noexcept override
Default backend for POSIX fsync.
int mkdir(const char *, mode_t) noexcept override
Default backend for POSIX mkdir and mkdirat.
int fchmod(mode_t) noexcept override
Default backend for POSIX chmod and fchmod.
int set_lock(struct flock64 *, bool) noexcept override
Default backend for POSIX fcntl subfunctions.
off64_t lseek(off64_t, int) noexcept override
Default backend for POSIX seek and lseek functions.
int get_status_flags() const noexcept override
Default backend for POSIX fcntl subfunctions.
int ftruncate(off64_t) noexcept override
Default backend for the POSIX truncate, ftruncate and similar functions.
int fdatasync() const noexcept override
Default backend for POSIX fdatasync.
int symlink(const char *, const char *) noexcept override
Default backend for POSIX symlink, symlinkat.
L4::Cap< L4Re::Dataspace > data_space() noexcept override
Get an L4Re::Dataspace object for the file.
int utime(const struct utimbuf *) noexcept override
Default backend for POSIX utime.
int rename(const char *, const char *) noexcept override
Default backend for POSIX rename, renameat.
int get_lock(struct flock64 *) noexcept override
Default backend for POSIX fcntl subfunctions.
int fstat(struct stat64 *) const noexcept override
Get status information for the file.
int link(const char *, const char *) noexcept override
Default backend for POSIX link, linkat.
ssize_t readlink(char *, size_t) override
Default backend for POSIX readlink, readlinkat.
The basic interface for an open POSIX file.
Ready_type
Type of I/O operation/condition a file can indicate readiness.
Interface for the POSIX backends of an application.
@ Invalid
Invalid capability selector.
C++ interface for capabilities.
A reference-counting pointer with automatic cleanup.
Virtual file system for interfaces in POSIX libc.