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