blob: e6b7ba2aa1e31b958a5662afb8768cacbaab68ba [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBRARIES_NACL_IO_FILESYSTEM_H_
#define LIBRARIES_NACL_IO_FILESYSTEM_H_
#include <map>
#include <string>
#include "nacl_io/error.h"
#include "nacl_io/inode_pool.h"
#include "nacl_io/node.h"
#include "nacl_io/path.h"
#include "sdk_util/macros.h"
#include "sdk_util/ref_object.h"
#include "sdk_util/scoped_ref.h"
struct fuse_operations;
namespace nacl_io {
class Filesystem;
class Node;
class PepperInterface;
typedef sdk_util::ScopedRef<Filesystem> ScopedFilesystem;
typedef std::map<std::string, std::string> StringMap_t;
// This structure is passed to all filesystems via the Filesystem::Init virtual
// function. With it, we can add or remove initialization values without
// changing the function signature.
struct FsInitArgs {
FsInitArgs() : dev(0), ppapi(NULL), fuse_ops(NULL) {}
explicit FsInitArgs(int dev) : dev(dev), ppapi(NULL), fuse_ops(NULL) {}
// Device number of the new filesystem.
int dev;
StringMap_t string_map;
PepperInterface* ppapi;
fuse_operations* fuse_ops;
};
// NOTE: The KernelProxy is the only class that should be setting errno. All
// other classes should return Error (as defined by nacl_io/error.h).
class Filesystem : public sdk_util::RefObject {
protected:
// The protected functions are only used internally and will not
// acquire or release the filesystem's lock.
Filesystem();
virtual ~Filesystem();
// Init must be called by the factory before the filesystem is used.
// |ppapi| can be NULL. If so, this filesystem cannot make any pepper calls.
virtual Error Init(const FsInitArgs& args);
virtual void Destroy();
public:
PepperInterface* ppapi() { return ppapi_; }
int dev() { return dev_; }
// All paths in functions below are expected to containing a leading "/".
// Open a node at |path| with the specified open and modeflags. The resulting
// Node is created with a ref count of 1.
// Assumes that |out_node| is non-NULL.
virtual Error OpenWithMode(const Path& path,
int open_flags,
mode_t mode,
ScopedNode* out_node) = 0;
// Open a node at |path| with the specified open flags. The resulting
// Node is created with a ref count of 1.
// Assumes that |out_node| is non-NULL.
Error Open(const Path& path,
int open_flags,
ScopedNode* out_node);
// OpenResource is only used to read files from the NaCl NMF file. No
// filesystem except PassthroughFs should implement it.
// Assumes that |out_node| is non-NULL.
virtual Error OpenResource(const Path& path, ScopedNode* out_node);
// Unlink, Mkdir, Rmdir will affect the both the RefCount
// and the nlink number in the stat object.
virtual Error Unlink(const Path& path) = 0;
virtual Error Mkdir(const Path& path, int permissions) = 0;
virtual Error Rmdir(const Path& path) = 0;
virtual Error Remove(const Path& path) = 0;
virtual Error Rename(const Path& path, const Path& newpath) = 0;
virtual Error Filesystem_VIoctl(int request, va_list args);
// Helper function that forwards to Filesystem_VIoctl.
Error Filesystem_Ioctl(int request, ...);
// Assumes that |node| is non-NULL.
virtual void OnNodeCreated(Node* node);
// Assumes that |node| is non-NULL.
virtual void OnNodeDestroyed(Node* node);
protected:
// Device number for the filesystem.
int dev_;
PepperInterface* ppapi_; // Weak reference.
INodePool inode_pool_;
private:
// May only be called by the KernelProxy when the Kernel's
// lock is held, so we make it private.
friend class KernelObject;
friend class KernelProxy;
DISALLOW_COPY_AND_ASSIGN(Filesystem);
};
} // namespace nacl_io
#endif // LIBRARIES_NACL_IO_FILESYSTEM_H_