1
#pragma once
2

            
3
#include <cstdint>
4
#include <string>
5

            
6
#include "envoy/api/os_sys_calls.h"
7

            
8
#include "source/common/filesystem/file_shared_impl.h"
9

            
10
namespace Envoy {
11
namespace Filesystem {
12

            
13
class FileImplPosix : public FileSharedImpl {
14
public:
15
41660
  FileImplPosix(const FilePathAndType& file_info) : FileSharedImpl(file_info) {}
16
  ~FileImplPosix() override;
17

            
18
protected:
19
  struct FlagsAndMode {
20
    int flags_ = 0;
21
    mode_t mode_ = 0;
22
  };
23

            
24
  Api::IoCallBoolResult open(FlagSet flag) override;
25
  Api::IoCallSizeResult write(absl::string_view buffer) override;
26
  Api::IoCallBoolResult close() override;
27
  Api::IoCallSizeResult pread(void* buf, uint64_t count, uint64_t offset) override;
28
  Api::IoCallSizeResult pwrite(const void* buf, uint64_t count, uint64_t offset) override;
29
  Api::IoCallResult<FileInfo> info() override;
30
  FlagsAndMode translateFlag(FlagSet in);
31

            
32
private:
33
  friend class FileSystemImplTest;
34
};
35

            
36
class TmpFileImplPosix : public FileImplPosix {
37
public:
38
7
  TmpFileImplPosix(const FilePathAndType& file_info) : FileImplPosix(file_info) {}
39
  Api::IoCallBoolResult open(FlagSet flag) override;
40
  Api::IoCallBoolResult close() override;
41
  ~TmpFileImplPosix() override;
42

            
43
private:
44
  // Ideally opening a tmp file opens it with no name; this is a fallback option for
45
  // when the OS or filesystem doesn't support that. with_unlink is a test-only
46
  // parameter to allow us to also test-cover the path where unlinking an open file
47
  // doesn't work.
48
  Api::IoCallBoolResult openNamedTmpFile(FlagsAndMode flags_and_mode, bool with_unlink = true);
49
  // This is only set in the case where the file system does not support nameless tmp files.
50
  std::string tmp_file_path_;
51
  friend class FileSystemImplTest;
52
};
53

            
54
class InstanceImplPosix : public Instance {
55
public:
56
  // Filesystem::Instance
57
  FilePtr createFile(const FilePathAndType& file_info) override;
58
  bool fileExists(const std::string& path) override;
59
  bool directoryExists(const std::string& path) override;
60
  ssize_t fileSize(const std::string& path) override;
61
  absl::StatusOr<std::string> fileReadToEnd(const std::string& path) override;
62
  absl::StatusOr<PathSplitResult> splitPathFromFilename(absl::string_view path) override;
63
  bool illegalPath(const std::string& path) override;
64
  Api::IoCallResult<FileInfo> stat(absl::string_view path) override;
65
  Api::IoCallBoolResult createPath(absl::string_view path) override;
66

            
67
private:
68
  Api::SysCallStringResult canonicalPath(const std::string& path);
69
  friend class FileSystemImplTest;
70
};
71

            
72
using FileImpl = FileImplPosix;
73
using InstanceImpl = InstanceImplPosix;
74
} // namespace Filesystem
75
} // namespace Envoy