1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef LIBRARIES_NACL_IO_FILESYSTEM_H_ 6 #define LIBRARIES_NACL_IO_FILESYSTEM_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "nacl_io/error.h" 12 #include "nacl_io/inode_pool.h" 13 #include "nacl_io/node.h" 14 #include "nacl_io/path.h" 15 16 #include "sdk_util/macros.h" 17 #include "sdk_util/ref_object.h" 18 #include "sdk_util/scoped_ref.h" 19 20 struct fuse_operations; 21 22 namespace nacl_io { 23 24 class Filesystem; 25 class Node; 26 class PepperInterface; 27 28 typedef sdk_util::ScopedRef<Filesystem> ScopedFilesystem; 29 typedef std::map<std::string, std::string> StringMap_t; 30 31 // This structure is passed to all filesystems via the Filesystem::Init virtual 32 // function. With it, we can add or remove initialization values without 33 // changing the function signature. 34 struct FsInitArgs { 35 FsInitArgs() : dev(0), ppapi(NULL), fuse_ops(NULL) {} 36 explicit FsInitArgs(int dev) : dev(dev), ppapi(NULL), fuse_ops(NULL) {} 37 38 // Device number of the new filesystem. 39 int dev; 40 StringMap_t string_map; 41 PepperInterface* ppapi; 42 fuse_operations* fuse_ops; 43 }; 44 45 // NOTE: The KernelProxy is the only class that should be setting errno. All 46 // other classes should return Error (as defined by nacl_io/error.h). 47 class Filesystem : public sdk_util::RefObject { 48 protected: 49 // The protected functions are only used internally and will not 50 // acquire or release the filesystem's lock. 51 Filesystem(); 52 virtual ~Filesystem(); 53 54 // Init must be called by the factory before the filesystem is used. 55 // |ppapi| can be NULL. If so, this filesystem cannot make any pepper calls. 56 virtual Error Init(const FsInitArgs& args); 57 virtual void Destroy(); 58 59 public: 60 PepperInterface* ppapi() { return ppapi_; } 61 int dev() { return dev_; } 62 63 // All paths in functions below are expected to containing a leading "/". 64 65 // Test whether a file or directory at a given path can be accessed. 66 // Returns 0 on success, or an appropriate errno value on failure. 67 virtual Error Access(const Path& path, int a_mode) = 0; 68 69 // Open a node at |path| with the specified open flags. The resulting 70 // Node is created with a ref count of 1. 71 // Assumes that |out_node| is non-NULL. 72 virtual Error Open(const Path& path, 73 int open_flags, 74 ScopedNode* out_node) = 0; 75 76 // OpenResource is only used to read files from the NaCl NMF file. No 77 // filesystem except PassthroughFs should implement it. 78 // Assumes that |out_node| is non-NULL. 79 virtual Error OpenResource(const Path& path, ScopedNode* out_node); 80 81 // Unlink, Mkdir, Rmdir will affect the both the RefCount 82 // and the nlink number in the stat object. 83 virtual Error Unlink(const Path& path) = 0; 84 virtual Error Mkdir(const Path& path, int permissions) = 0; 85 virtual Error Rmdir(const Path& path) = 0; 86 virtual Error Remove(const Path& path) = 0; 87 virtual Error Rename(const Path& path, const Path& newpath) = 0; 88 virtual Error Filesystem_VIoctl(int request, va_list args); 89 90 // Helper function that forwards to Filesystem_VIoctl. 91 Error Filesystem_Ioctl(int request, ...); 92 93 // Assumes that |node| is non-NULL. 94 void OnNodeCreated(Node* node); 95 96 // Assumes that |node| is non-NULL. 97 void OnNodeDestroyed(Node* node); 98 99 protected: 100 // Device number for the filesystem. 101 int dev_; 102 PepperInterface* ppapi_; // Weak reference. 103 INodePool inode_pool_; 104 105 private: 106 // May only be called by the KernelProxy when the Kernel's 107 // lock is held, so we make it private. 108 friend class KernelObject; 109 friend class KernelProxy; 110 DISALLOW_COPY_AND_ASSIGN(Filesystem); 111 }; 112 113 } // namespace nacl_io 114 115 #endif // LIBRARIES_NACL_IO_FILESYSTEM_H_ 116