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_FUSEFS_FUSE_FS_H_
6#define LIBRARIES_NACL_IO_FUSEFS_FUSE_FS_H_
7
8#include <map>
9
10#include "nacl_io/filesystem.h"
11#include "nacl_io/fuse.h"
12#include "nacl_io/node.h"
13
14namespace nacl_io {
15
16class FuseFs : public Filesystem {
17 protected:
18  FuseFs();
19
20  virtual Error Init(const FsInitArgs& args);
21  virtual void Destroy();
22
23 public:
24  virtual Error OpenWithMode(const Path& path, int open_flags, mode_t mode,
25                             ScopedNode* out_node);
26  virtual Error Unlink(const Path& path);
27  virtual Error Mkdir(const Path& path, int perm);
28  virtual Error Rmdir(const Path& path);
29  virtual Error Remove(const Path& path);
30  virtual Error Rename(const Path& path, const Path& newpath);
31
32 private:
33  struct fuse_operations* fuse_ops_;
34  void* fuse_user_data_;
35
36  friend class FuseFsNode;
37  friend class FuseFsFactory;
38  DISALLOW_COPY_AND_ASSIGN(FuseFs);
39};
40
41class FuseFsNode : public Node {
42 protected:
43  FuseFsNode(Filesystem* filesystem,
44             struct fuse_operations* fuse_ops,
45             struct fuse_file_info& info,
46             const std::string& path);
47
48 public:
49  virtual bool CanOpen(int open_flags);
50  virtual Error GetStat(struct stat* stat);
51  virtual Error VIoctl(int request, va_list args);
52  virtual Error Tcflush(int queue_selector);
53  virtual Error Tcgetattr(struct termios* termios_p);
54  virtual Error Tcsetattr(int optional_actions,
55                          const struct termios* termios_p);
56  virtual Error GetSize(off_t* out_size);
57  virtual Error Futimens(const struct timespec times[2]);
58  virtual Error Fchmod(mode_t mode);
59
60 protected:
61  struct fuse_operations* fuse_ops_;
62  struct fuse_file_info info_;
63  std::string path_;
64};
65
66class FileFuseFsNode : public FuseFsNode {
67 public:
68  FileFuseFsNode(Filesystem* filesystem,
69                 struct fuse_operations* fuse_ops,
70                 struct fuse_file_info& info,
71                 const std::string& path);
72
73 protected:
74  virtual void Destroy();
75
76 public:
77  virtual Error FSync();
78  virtual Error FTruncate(off_t length);
79  virtual Error Read(const HandleAttr& attr,
80                     void* buf,
81                     size_t count,
82                     int* out_bytes);
83  virtual Error Write(const HandleAttr& attr,
84                      const void* buf,
85                      size_t count,
86                      int* out_bytes);
87
88 private:
89  friend class FuseFs;
90  DISALLOW_COPY_AND_ASSIGN(FileFuseFsNode);
91};
92
93class DirFuseFsNode : public FuseFsNode {
94 public:
95  DirFuseFsNode(Filesystem* filesystem,
96                struct fuse_operations* fuse_ops,
97                struct fuse_file_info& info,
98                const std::string& path);
99
100 protected:
101  virtual void Destroy();
102
103 public:
104  virtual Error FSync();
105  virtual Error GetDents(size_t offs,
106                         struct dirent* pdir,
107                         size_t count,
108                         int* out_bytes);
109
110 private:
111  static int FillDirCallback(void* buf,
112                             const char* name,
113                             const struct stat* stbuf,
114                             off_t off);
115
116 private:
117  friend class FuseFs;
118  DISALLOW_COPY_AND_ASSIGN(DirFuseFsNode);
119};
120
121}  // namespace nacl_io
122
123#endif  // LIBRARIES_NACL_IO_FUSEFS_FUSE_FS_H_
124