2 * (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
10 * As a special exception, you may use this file as part of a free software
11 * library without restriction. Specifically, if other files instantiate
12 * templates or use macros or inline functions from this file, or you compile
13 * this file and link it with other files to produce an executable, this
14 * file does not by itself cause the resulting executable to be covered by
15 * the GNU General Public License. This exception does not however
16 * invalidate any other reasons why the executable file might be covered by
17 * the GNU General Public License.
21 #include <l4/l4re_vfs/backend>
22 #include <l4/sys/capability>
23 #include <l4/re/namespace>
24 #include "simple_store.h"
26 namespace L4Re { namespace Core {
30 class Ns_base_dir : public L4Re::Vfs::Be_file
33 enum { Size = sizeof(L4Re::Vfs::Be_file) + 2 * sizeof(l4_addr_t) };
35 void *operator new(size_t s) throw();
36 void operator delete(void *b) throw();
39 static Simple_store_sz<Size> store;
42 class Env_dir : public Ns_base_dir
45 explicit Env_dir(L4Re::Env const *env)
46 : _env(env), _current_cap_entry(env->initial_caps())
47 { static_assert(Ns_base_dir::Size >= sizeof(*this), "Size too small"); }
49 ssize_t readv(const struct iovec*, int) throw() { return -EISDIR; }
50 ssize_t writev(const struct iovec*, int) throw() { return -EISDIR; }
51 ssize_t preadv(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
52 ssize_t pwritev(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
53 int fstat64(struct stat64 *) const throw();
54 int faccessat(const char *path, int mode, int flags) throw();
55 int get_entry(const char *path, int flags, mode_t mode,
56 Ref_ptr<L4Re::Vfs::File> *) throw();
57 ssize_t getdents(char *, size_t) throw();
62 int get_ds(const char *path, L4Re::Auto_cap<L4Re::Dataspace>::Cap *ds) throw();
63 bool check_type(Env::Cap_entry const *e, long protocol) throw();
65 L4Re::Env const *_env;
66 Env::Cap_entry const *_current_cap_entry;
69 class Ns_dir : public Ns_base_dir
72 explicit Ns_dir(L4::Cap<L4Re::Namespace> ns)
73 : _ns(ns), _current_dir_pos(0)
74 { static_assert(Ns_base_dir::Size >= sizeof(*this), "Size too small"); }
76 ssize_t readv(const struct iovec*, int) throw() { return -EISDIR; }
77 ssize_t writev(const struct iovec*, int) throw() { return -EISDIR; }
78 ssize_t preadv(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
79 ssize_t pwritev(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
80 int fstat64(struct stat64 *) const throw();
81 int faccessat(const char *path, int mode, int flags) throw();
82 int get_entry(const char *path, int flags, mode_t mode,
83 Ref_ptr<L4Re::Vfs::File> *) throw();
84 ssize_t getdents(char *, size_t) throw();
89 int get_ds(const char *path, L4Re::Auto_cap<L4Re::Dataspace>::Cap *ds) throw();
91 L4::Cap<L4Re::Namespace> _ns;
92 size_t _current_dir_pos;