1 /*
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)
5  *
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.
9  *
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.
18  */
19 #pragma once
20 
21 #include <l4/l4re_vfs/backend>
22 #include <l4/sys/capability>
23 #include <l4/re/namespace>
24 #include <l4/re/unique_cap>
25 
26 namespace L4Re { namespace Core {
27 
28 using cxx::Ref_ptr;
29 
30 class Env_dir : public L4Re::Vfs::Be_file
31 {
32 public:
Env_dir(L4Re::Env const * env)33   explicit Env_dir(L4Re::Env const *env)
34   : _env(env), _current_cap_entry(env->initial_caps())
35   {}
36 
readv(const struct iovec *,int)37   ssize_t readv(const struct iovec*, int) throw() { return -EISDIR; }
writev(const struct iovec *,int)38   ssize_t writev(const struct iovec*, int) throw() { return -EISDIR; }
preadv(const struct iovec *,int,off64_t)39   ssize_t preadv(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
pwritev(const struct iovec *,int,off64_t)40   ssize_t pwritev(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
41   int fstat64(struct stat64 *) const throw();
42   int faccessat(const char *path, int mode, int flags) throw();
43   int get_entry(const char *path, int flags, mode_t mode,
44                 Ref_ptr<L4Re::Vfs::File> *) throw();
45   ssize_t getdents(char *, size_t) throw();
46 
throw()47   ~Env_dir() throw() {}
48 
49 private:
50   int get_ds(const char *path, L4Re::Unique_cap<L4Re::Dataspace> *ds) throw();
51   bool check_type(Env::Cap_entry const *e, long protocol) throw();
52 
53   L4Re::Env const *_env;
54   Env::Cap_entry const *_current_cap_entry;
55 };
56 
57 class Ns_dir : public L4Re::Vfs::Be_file
58 {
59 public:
Ns_dir(L4::Cap<L4Re::Namespace> ns)60   explicit Ns_dir(L4::Cap<L4Re::Namespace> ns)
61   : _ns(ns), _current_dir_pos(0)
62   {}
63 
readv(const struct iovec *,int)64   ssize_t readv(const struct iovec*, int) throw() { return -EISDIR; }
writev(const struct iovec *,int)65   ssize_t writev(const struct iovec*, int) throw() { return -EISDIR; }
preadv(const struct iovec *,int,off64_t)66   ssize_t preadv(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
pwritev(const struct iovec *,int,off64_t)67   ssize_t pwritev(const struct iovec*, int, off64_t) throw() { return -EISDIR; }
68   int fstat64(struct stat64 *) const throw();
69   int faccessat(const char *path, int mode, int flags) throw();
70   int get_entry(const char *path, int flags, mode_t mode,
71                 Ref_ptr<L4Re::Vfs::File> *) throw();
72   ssize_t getdents(char *, size_t) throw();
73 
throw()74   ~Ns_dir() throw() {}
75 
76 private:
77   int get_ds(const char *path, L4Re::Unique_cap<L4Re::Dataspace> *ds) throw();
78 
79   L4::Cap<L4Re::Namespace> _ns;
80   size_t _current_dir_pos;
81 };
82 
83 }}
84