GCC Code Coverage Report


Directory: ./
File: Os/Posix/Directory.cpp
Date: 2026-11-03 21:15:54
Exec Total Coverage
Lines: 38 41 92.7%
Functions: 5 6 83.3%
Branches: 33 42 78.6%

Line Branch Exec Source
1 // ======================================================================
2 // \title Os/Posix/Directory.cpp
3 // \brief Posix implementation for Os::Directory
4 // ======================================================================
5 #include <sys/stat.h>
6 #include <cerrno>
7 #include <cstring>
8
9 #include <Fw/Types/Assert.hpp>
10 #include <Fw/Types/StringUtils.hpp>
11 #include <Os/Posix/Directory.hpp>
12 #include <Os/Posix/error.hpp>
13
14 namespace Os {
15 namespace Posix {
16 namespace Directory {
17
18 2945 PosixDirectory::PosixDirectory() : Os::DirectoryInterface(), m_handle() {}
19
20 ✗ DirectoryHandle* PosixDirectory::getHandle() {
21 ✗ return &this->m_handle;
22 }
23
24 839 PosixDirectory::Status PosixDirectory::open(const char* path, OpenMode mode) {
25 839 Status status = Status::OP_OK;
26
27 // If one of the CREATE mode, attempt to create the directory
28
4/4
✓ Branch 0 taken 834 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 508 times.
✓ Branch 3 taken 326 times.
839 if (mode == OpenMode::CREATE_EXCLUSIVE || mode == OpenMode::CREATE_IF_MISSING) {
29
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 513 times.
✓ Branch 3 taken 254 times.
✓ Branch 4 taken 259 times.
513 if (::mkdir(path, S_IRWXU) == -1) {
30 254 status = errno_to_directory_status(errno);
31 // If error is not ALREADY_EXISTS, return the error
32 // If any error and mode CREATE_EXCLUSIVE, return the error
33 // Else, we keep going with OP_OK
34
3/4
✓ Branch 0 taken 254 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 252 times.
254 if (status != Status::ALREADY_EXISTS || mode == OpenMode::CREATE_EXCLUSIVE) {
35 2 return status;
36 } else {
37 252 status = Status::OP_OK;
38 }
39 }
40 }
41
42
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 837 times.
837 DIR* dir = ::opendir(path);
43
44
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 834 times.
837 if (dir == nullptr) {
45 3 status = errno_to_directory_status(errno);
46 }
47
48 837 this->m_handle.m_dir_descriptor = dir;
49 837 return status;
50 }
51
52 939 PosixDirectory::Status PosixDirectory::rewind() {
53 939 Status status = Status::OP_OK;
54 // no errors defined in man page for rewinddir
55
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 939 times.
939 ::rewinddir(this->m_handle.m_dir_descriptor);
56 939 return status;
57 }
58
59 7045 PosixDirectory::Status PosixDirectory::read(char* fileNameBuffer, FwSizeType bufSize) {
60 7045 FW_ASSERT(fileNameBuffer != nullptr);
61
62 7045 Status status = Status::OP_OK;
63
64 // Set errno to 0 so we know why we exited readdir
65 // This is recommended by the manual pages (man 3 readdir)
66 7045 errno = 0;
67
68
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 7045 times.
7045 struct dirent* direntData = ::readdir(this->m_handle.m_dir_descriptor);
69
2/2
✓ Branch 0 taken 7938 times.
✓ Branch 1 taken 588 times.
8526 while (direntData != nullptr) {
70 // Skip . and .. directory entries
71
4/4
✓ Branch 2 taken 1488 times.
✓ Branch 3 taken 6450 times.
✓ Branch 6 taken 776 times.
✓ Branch 7 taken 712 times.
7938 if ((direntData->d_name[0] == '.' and direntData->d_name[1] == '\0') or
72
5/6
✓ Branch 2 taken 776 times.
✓ Branch 3 taken 6450 times.
✓ Branch 6 taken 769 times.
✓ Branch 7 taken 7 times.
✓ Branch 10 taken 769 times.
✗ Branch 11 not taken.
7226 (direntData->d_name[0] == '.' and direntData->d_name[1] == '.' and direntData->d_name[2] == '\0')) {
73
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 1481 times.
1481 direntData = ::readdir(this->m_handle.m_dir_descriptor);
74 } else {
75 6457 (void)Fw::StringUtils::string_copy(fileNameBuffer, direntData->d_name, bufSize);
76 6457 break;
77 }
78 }
79
2/2
✓ Branch 0 taken 588 times.
✓ Branch 1 taken 6457 times.
7045 if (direntData == nullptr) {
80 // loop ended because readdir failed, did it error or did we run out of files?
81
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 588 times.
588 if (errno != 0) {
82 // Only error from readdir is EBADF
83 ✗ status = Status::BAD_DESCRIPTOR;
84 } else {
85 588 status = Status::NO_MORE_FILES;
86 }
87 }
88 7045 return status;
89 }
90
91 935 void PosixDirectory::close() {
92 // ::closedir errors if dir descriptor is nullptr
93
2/2
✓ Branch 4 taken 834 times.
✓ Branch 5 taken 101 times.
935 if (this->m_handle.m_dir_descriptor != nullptr) {
94
1/2
✗ Branch 4 not taken.
✓ Branch 5 taken 834 times.
834 (void)::closedir(this->m_handle.m_dir_descriptor);
95 }
96 935 this->m_handle.m_dir_descriptor = nullptr;
97 935 }
98
99 } // namespace Directory
100 } // namespace Posix
101 } // namespace Os
102