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