F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
FileSystem.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title Os/Posix/FileSystem.cpp
3 // \brief Posix implementation for Os::FileSystem
4 // ======================================================================
6 #include "Os/Posix/error.hpp"
7 
8 #include <dirent.h>
9 #ifndef TGT_OS_TYPE_VXWORKS
10 #include <sys/statvfs.h>
11 #endif
12 #include <sys/stat.h>
13 #include <unistd.h>
14 #include <cstdio>
15 
16 #include <cerrno>
17 
18 namespace Os {
19 namespace Posix {
20 namespace FileSystem {
21 
23  Status status = OP_OK;
24  if (::rmdir(path) == -1) {
25  status = errno_to_filesystem_status(errno);
26  }
27  return status;
28 }
29 
31  Status status = OP_OK;
32  if (::unlink(path) == -1) {
33  status = errno_to_filesystem_status(errno);
34  }
35  return status;
36 }
37 
38 PosixFileSystem::Status PosixFileSystem::_rename(const char* originPath, const char* destPath) {
39  Status status = OP_OK;
40  if (::rename(originPath, destPath) == -1) {
41  status = errno_to_filesystem_status(errno);
42  }
43  return status;
44 }
45 
47  Status status = OP_OK;
48  const char* cwd = ::getcwd(path, static_cast<size_t>(bufferSize));
49  if (cwd == nullptr) {
50  status = errno_to_filesystem_status(errno);
51  }
52  return status;
53 }
54 
56  Status status = OP_OK;
57  if (::chdir(path) == -1) {
58  status = errno_to_filesystem_status(errno);
59  }
60  return status;
61 }
62 
64  FwSizeType& totalBytes,
65  FwSizeType& freeBytes) {
66 #ifdef TGT_OS_TYPE_VXWORKS
67  return Status::NOT_SUPPORTED;
68 #else
69  Status stat = OP_OK;
70  static_assert(std::numeric_limits<FwSizeType>::max() >= std::numeric_limits<fsblkcnt_t>::max(),
71  "FwSizeType must be able to hold fsblkcnt_t");
73  "FwSizeType must be able to hold fsblkcnt_t");
74  static_assert(std::numeric_limits<FwSizeType>::max() >= std::numeric_limits<unsigned long>::max(),
75  "FwSizeType must be able to hold unsigned long");
76  struct statvfs fsStat;
77  int ret = statvfs(path, &fsStat);
78  if (ret) {
79  return errno_to_filesystem_status(errno);
80  }
81 
82  const FwSizeType block_size = static_cast<FwSizeType>(fsStat.f_frsize);
83  const FwSizeType free_blocks = static_cast<FwSizeType>(fsStat.f_bfree);
84  const FwSizeType total_blocks = static_cast<FwSizeType>(fsStat.f_blocks);
85 
86  // Guard against divide-by-zero if filesystem reports invalid block size
87  if (block_size == 0) {
88  return OTHER_ERROR;
89  }
90 
91  // Check for overflow in multiplication
92  if (free_blocks > (std::numeric_limits<FwSizeType>::max() / block_size) ||
93  total_blocks > (std::numeric_limits<FwSizeType>::max() / block_size)) {
94  return OVERFLOW_ERROR;
95  }
96  freeBytes = free_blocks * block_size;
97  totalBytes = total_blocks * block_size;
98  return stat;
99 #endif
100 }
101 
103  return &this->m_handle;
104 }
105 
107  FW_ASSERT(path != nullptr);
108  struct stat path_stat;
109  const I32 status = lstat(path, &path_stat);
110  if (status == 0) {
111  if (S_ISDIR(path_stat.st_mode)) {
112  pathType = PathType::DIRECTORY;
113  } else if (S_ISREG(path_stat.st_mode)) {
114  pathType = PathType::FILE;
115  } else {
116  pathType = PathType::OTHER;
117  }
118  return Status::OP_OK;
119  } else {
120  return errno_to_filesystem_status(errno);
121  }
122 }
123 
124 } // namespace FileSystem
125 } // namespace Posix
126 } // namespace Os
Status _removeDirectory(const char *path) override
Remove a directory at the specified path.
Definition: FileSystem.cpp:22
Operation succeeded.
Definition: Os.hpp:27
PlatformSizeType FwSizeType
Status _changeWorkingDirectory(const char *path) override
Change the current working directory to the specified path.
Definition: FileSystem.cpp:55
Status _rename(const char *sourcePath, const char *destPath) override
Rename a file from source to destination.
Definition: FileSystem.cpp:38
Status _getPathType(const char *path, PathType &pathType) override
Get the type of the path (file, directory, etc.)
Definition: FileSystem.cpp:106
Status _removeFile(const char *path) override
Remove a file at the specified path.
Definition: FileSystem.cpp:30
FileSystemHandle * getHandle() override
Get the raw FileSystem handle.
Definition: FileSystem.cpp:102
static U32 min(const U32 a, const U32 b)
Definition: Checksum.cpp:16
other OS-specific error
Definition: FileSystem.hpp:40
Status _getFreeSpace(const char *path, FwSizeType &totalBytes, FwSizeType &freeBytes) override
Get filesystem free and total space in bytes on the filesystem containing the specified path...
Definition: FileSystem.cpp:63
FileSystem::Status errno_to_filesystem_status(int errno_input)
Definition: error.cpp:51
FileSystem class.
Definition: FileSystem.hpp:124
Status _getWorkingDirectory(char *path, FwSizeType bufferSize) override
Get the current working directory.
Definition: FileSystem.cpp:46
Operation was successful.
Definition: FileSystem.hpp:24
#define FW_ASSERT(...)
Definition: Assert.hpp:14