15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef LIBRARIES_NACL_IO_FILESYSTEM_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define LIBRARIES_NACL_IO_FILESYSTEM_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "nacl_io/error.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/inode_pool.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "nacl_io/node.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/path.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/macros.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/ref_object.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "sdk_util/scoped_ref.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct fuse_operations; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace nacl_io { 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Filesystem; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Node; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PepperInterface; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef sdk_util::ScopedRef<Filesystem> ScopedFilesystem; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<std::string, std::string> StringMap_t; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This structure is passed to all filesystems via the Filesystem::Init virtual 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// function. With it, we can add or remove initialization values without 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// changing the function signature. 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct FsInitArgs { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FsInitArgs() : dev(0), ppapi(NULL), fuse_ops(NULL) {} 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit FsInitArgs(int dev) : dev(dev), ppapi(NULL), fuse_ops(NULL) {} 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Device number of the new filesystem. 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int dev; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringMap_t string_map; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PepperInterface* ppapi; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fuse_operations* fuse_ops; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// NOTE: The KernelProxy is the only class that should be setting errno. All 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// other classes should return Error (as defined by nacl_io/error.h). 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Filesystem : public sdk_util::RefObject { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The protected functions are only used internally and will not 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // acquire or release the filesystem's lock. 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Filesystem(); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~Filesystem(); 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Init must be called by the factory before the filesystem is used. 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |ppapi| can be NULL. If so, this filesystem cannot make any pepper calls. 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual Error Init(const FsInitArgs& args); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Destroy(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperInterface* ppapi() { return ppapi_; } 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int dev() { return dev_; } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // All paths in functions below are expected to containing a leading "/". 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Open a node at |path| with the specified open and modeflags. The resulting 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Node is created with a ref count of 1. 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Assumes that |out_node| is non-NULL. 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual Error OpenWithMode(const Path& path, 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int open_flags, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mode_t mode, 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedNode* out_node) = 0; 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Open a node at |path| with the specified open flags. The resulting 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Node is created with a ref count of 1. 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Assumes that |out_node| is non-NULL. 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Error Open(const Path& path, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int open_flags, 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedNode* out_node); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // OpenResource is only used to read files from the NaCl NMF file. No 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // filesystem except PassthroughFs should implement it. 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Assumes that |out_node| is non-NULL. 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual Error OpenResource(const Path& path, ScopedNode* out_node); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unlink, Mkdir, Rmdir will affect the both the RefCount 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the nlink number in the stat object. 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual Error Unlink(const Path& path) = 0; 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual Error Mkdir(const Path& path, int permissions) = 0; 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual Error Rmdir(const Path& path) = 0; 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual Error Remove(const Path& path) = 0; 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual Error Rename(const Path& path, const Path& newpath) = 0; 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual Error Filesystem_VIoctl(int request, va_list args); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Helper function that forwards to Filesystem_VIoctl. 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Error Filesystem_Ioctl(int request, ...); 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Assumes that |node| is non-NULL. 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnNodeCreated(Node* node); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Assumes that |node| is non-NULL. 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnNodeDestroyed(Node* node); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Device number for the filesystem. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dev_; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PepperInterface* ppapi_; // Weak reference. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INodePool inode_pool_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // May only be called by the KernelProxy when the Kernel's 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lock is held, so we make it private. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class KernelObject; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class KernelProxy; 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Filesystem); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace nacl_io 118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // LIBRARIES_NACL_IO_FILESYSTEM_H_ 120