1d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)// found in the LICENSE file. 4d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 5d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#ifndef LIBRARIES_NACL_IO_MOUNT_FUSE_H_ 6d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#define LIBRARIES_NACL_IO_MOUNT_FUSE_H_ 7d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 8d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include <map> 9d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 10d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "nacl_io/fuse.h" 11d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "nacl_io/mount.h" 12d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "nacl_io/mount_node.h" 13d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "nacl_io/typed_mount_factory.h" 14d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 15d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)namespace nacl_io { 16d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 17d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)class MountFuse : public Mount { 18d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) protected: 19d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) MountFuse(); 20d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 21d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Init(const MountInitArgs& args); 22d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual void Destroy(); 23d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 24d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) public: 25d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Access(const Path& path, int a_mode); 26d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Open(const Path& path, int mode, ScopedMountNode* out_node); 27d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Unlink(const Path& path); 28d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Mkdir(const Path& path, int perm); 29d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Rmdir(const Path& path); 30d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Remove(const Path& path); 31d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Rename(const Path& path, const Path& newpath); 32d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 33d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)private: 34d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_operations* fuse_ops_; 35d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) void* fuse_user_data_; 36d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 37d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) friend class MountNodeFuse; 38d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) friend class FuseMountFactory; 39d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MountFuse); 40d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}; 41d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 42d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)class MountNodeFuse : public MountNode { 43d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) protected: 44d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) MountNodeFuse(Mount* mount, 45d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_operations* fuse_ops, 46d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_file_info& info, 47d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const std::string& path); 48d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 49d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) public: 50d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual bool CanOpen(int open_flags); 51d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error GetStat(struct stat* stat); 52d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error VIoctl(int request, va_list args); 53d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Tcflush(int queue_selector); 54d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Tcgetattr(struct termios* termios_p); 55d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Tcsetattr(int optional_actions, 56d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const struct termios *termios_p); 57d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error GetSize(size_t* out_size); 58d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 59d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) protected: 60d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_operations* fuse_ops_; 61d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_file_info info_; 62d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) std::string path_; 63d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}; 64d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 65d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)class MountNodeFuseFile : public MountNodeFuse { 66d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) public: 67d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) MountNodeFuseFile(Mount* mount, 68d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_operations* fuse_ops, 69d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_file_info& info, 70d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const std::string& path); 71d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 72d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) protected: 73d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual void Destroy(); 74d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 75d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) public: 76d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error FSync(); 77d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error FTruncate(off_t length); 78d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Read(const HandleAttr& attr, 79d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) void* buf, 80d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) size_t count, 81d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) int* out_bytes); 82d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error Write(const HandleAttr& attr, 83d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const void* buf, 84d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) size_t count, 85d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) int* out_bytes); 86d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 87d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) private: 88d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) friend class MountFuse; 89d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MountNodeFuseFile); 90d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}; 91d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 92d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)class MountNodeFuseDir : public MountNodeFuse { 93d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) public: 94d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) MountNodeFuseDir(Mount* mount, 95d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_operations* fuse_ops, 96d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct fuse_file_info& info, 97d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const std::string& path); 98d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 99d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) protected: 100d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual void Destroy(); 101d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 102d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) public: 103d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error FSync(); 104d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) virtual Error GetDents(size_t offs, 105d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) struct dirent* pdir, 106d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) size_t count, 107d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) int* out_bytes); 108d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 109d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) private: 110d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) static int FillDirCallback(void* buf, 111d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const char* name, 112d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const struct stat* stbuf, 113d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) off_t off); 114d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 115d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) private: 116d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) friend class MountFuse; 117d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MountNodeFuseDir); 118d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}; 119d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 120d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)} // namespace nacl_io 121d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 122d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#endif // LIBRARIES_NACL_IO_MOUNT_FUSE_H_ 123