GCC Code Coverage Report


Directory: Os/Posix/
File: FileSystem.cpp
Date: 2026-11-03 21:17:37
Exec Total Coverage
Lines: 48 57 84.2%
Functions: 7 8 87.5%
Branches: 25 42 59.5%

Line Branch Exec Source
1 // ======================================================================
2 // \title Os/Posix/FileSystem.cpp
3 // \brief Posix implementation for Os::FileSystem
4 // ======================================================================
5 #include "Os/Posix/FileSystem.hpp"
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
22 181 PosixFileSystem::Status PosixFileSystem::_removeDirectory(const char* path) {
23 181 Status status = OP_OK;
24
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 181 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 180 times.
181 if (::rmdir(path) == -1) {
25 1 status = errno_to_filesystem_status(errno);
26 }
27 181 return status;
28 }
29
30 655 PosixFileSystem::Status PosixFileSystem::_removeFile(const char* path) {
31 655 Status status = OP_OK;
32
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 655 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 655 times.
655 if (::unlink(path) == -1) {
33 ✗ status = errno_to_filesystem_status(errno);
34 }
35 655 return status;
36 }
37
38 127 PosixFileSystem::Status PosixFileSystem::_rename(const char* originPath, const char* destPath) {
39 127 Status status = OP_OK;
40
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 127 times.
127 if (::rename(originPath, destPath) == -1) {
41 ✗ status = errno_to_filesystem_status(errno);
42 }
43 127 return status;
44 }
45
46 136 PosixFileSystem::Status PosixFileSystem::_getWorkingDirectory(char* path, FwSizeType bufferSize) {
47 136 Status status = OP_OK;
48 136 const char* cwd = ::getcwd(path, static_cast<size_t>(bufferSize));
49
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 136 times.
136 if (cwd == nullptr) {
50 ✗ status = errno_to_filesystem_status(errno);
51 }
52 136 return status;
53 }
54
55 136 PosixFileSystem::Status PosixFileSystem::_changeWorkingDirectory(const char* path) {
56 136 Status status = OP_OK;
57
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 136 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 136 times.
136 if (::chdir(path) == -1) {
58 ✗ status = errno_to_filesystem_status(errno);
59 }
60 136 return status;
61 }
62
63 66 PosixFileSystem::Status PosixFileSystem::_getFreeSpace(const char* path,
64 FwSizeType& totalBytes,
65 FwSizeType& freeBytes) {
66 #ifdef TGT_OS_TYPE_VXWORKS
67 return Status::NOT_SUPPORTED;
68 #else
69 66 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");
72 static_assert(std::numeric_limits<FwSizeType>::min() <= std::numeric_limits<fsblkcnt_t>::min(),
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 66 struct statvfs fsStat;
77
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
66 int ret = statvfs(path, &fsStat);
78
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
66 if (ret) {
79 ✗ return errno_to_filesystem_status(errno);
80 }
81
82 66 const FwSizeType block_size = static_cast<FwSizeType>(fsStat.f_frsize);
83 66 const FwSizeType free_blocks = static_cast<FwSizeType>(fsStat.f_bfree);
84 66 const FwSizeType total_blocks = static_cast<FwSizeType>(fsStat.f_blocks);
85
86 // Guard against divide-by-zero if filesystem reports invalid block size
87
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
66 if (block_size == 0) {
88 ✗ return OTHER_ERROR;
89 }
90
91 // Check for overflow in multiplication
92
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 66 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 66 times.
132 if (free_blocks > (std::numeric_limits<FwSizeType>::max() / block_size) ||
93
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 66 times.
66 total_blocks > (std::numeric_limits<FwSizeType>::max() / block_size)) {
94 ✗ return OVERFLOW_ERROR;
95 }
96 66 freeBytes = free_blocks * block_size;
97 66 totalBytes = total_blocks * block_size;
98 66 return stat;
99 #endif
100 }
101
102 ✗ FileSystemHandle* PosixFileSystem::getHandle() {
103 ✗ return &this->m_handle;
104 }
105
106 1846 PosixFileSystem::Status PosixFileSystem::_getPathType(const char* path, PathType& pathType) {
107 1846 FW_ASSERT(path != nullptr);
108 1846 struct stat path_stat;
109
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1846 times.
1846 const I32 status = lstat(path, &path_stat);
110
2/2
✓ Branch 0 taken 1193 times.
✓ Branch 1 taken 653 times.
1846 if (status == 0) {
111
2/2
✓ Branch 0 taken 191 times.
✓ Branch 1 taken 1002 times.
1193 if (S_ISDIR(path_stat.st_mode)) {
112 191 pathType = PathType::DIRECTORY;
113
2/2
✓ Branch 0 taken 1001 times.
✓ Branch 1 taken 1 times.
1002 } else if (S_ISREG(path_stat.st_mode)) {
114 1001 pathType = PathType::FILE;
115 } else {
116 1 pathType = PathType::OTHER;
117 }
118 1193 return Status::OP_OK;
119 } else {
120
1/1
✓ Branch 2 taken 653 times.
653 return errno_to_filesystem_status(errno);
121 }
122 }
123
124 } // namespace FileSystem
125 } // namespace Posix
126 } // namespace Os
127