F´ Flight Software - C/C++ Documentation NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LogFile.cpp
Go to the documentation of this file.
1// \copyright
2// Copyright 2009-2015, by the California Institute of Technology.
3// ALL RIGHTS RESERVED. United States Government Sponsorship
4// acknowledged.
5
7#include <Fw/Types/Assert.hpp>
8#include <Os/File.hpp>
9#include <Os/FileSystem.hpp>
10#include <limits>
11#include <cstring>
12#include <cstdio>
14
15
16namespace Svc {
17
18 // ----------------------------------------------------------------------
19 // Initialization/Exiting
20 // ----------------------------------------------------------------------
21
23 m_fileName(), m_file(), m_maxFileSize(0), m_openFile(false), m_currentFileSize(0)
24 {
25
26 }
27
29 {
30 // Close the file if needed:
31 if (this->m_openFile) {
32 this->m_file.close();
33 }
34 }
35
36 // ----------------------------------------------------------------------
37 // Member Functions
38 // ----------------------------------------------------------------------
39
40 bool LogFile::write_to_log(const char *const buf, const U32 size)
41 {
42
43 FW_ASSERT(buf != nullptr);
44
45 bool status = true;
46
47 // Print to file if there is one, and given a valid size:
48 if (this->m_openFile && size > 0) {
49
50 // Make sure we won't exceed the maximum size:
51 // Note: second condition in if statement is true if there is overflow
52 // in the addition below
53 U32 projectedSize = this->m_currentFileSize + size;
54 if ( projectedSize > this->m_maxFileSize ||
55 (this->m_currentFileSize > (std::numeric_limits<U32>::max() - size)) ) {
56
57 status = false;
58 this->m_openFile = false;
59 this->m_file.close();
60 }
61 // Won't exceed max size, so write to file:
62 else {
63
64 NATIVE_INT_TYPE writeSize = static_cast<NATIVE_INT_TYPE>(size);
65 Os::File::Status stat = this->m_file.write(buf,writeSize,true);
66
67 // Assert that we are not trying to write to a file we never opened:
69
70 // Only return a good status if the write was valid
71 status = (writeSize > 0);
72
73 this->m_currentFileSize += writeSize;
74 }
75 }
76
77 return status;
78 }
79
80
81 bool LogFile::set_log_file(const char* fileName, const U32 maxSize, const U32 maxBackups)
82 {
83 FW_ASSERT(fileName != nullptr);
84
85 // If there is already a previously open file then close it:
86 if (this->m_openFile) {
87 this->m_openFile = false;
88 this->m_file.close();
89 }
90
91 // If file name is too large, return failure:
92 U32 fileNameSize = Fw::StringUtils::string_length(fileName, Fw::String::STRING_SIZE);
93 if (fileNameSize == Fw::String::STRING_SIZE) {
94 return false;
95 }
96
97 U32 suffix = 0;
98 FwSizeType tmp;
99 char fileNameFinal[Fw::String::STRING_SIZE];
100 (void) strncpy(fileNameFinal,fileName,
102 fileNameFinal[Fw::String::STRING_SIZE-1] = 0;
103
104 // Check if file already exists, and if it does try to tack on a suffix.
105 // Quit after 10 suffix addition tries (first try is w/ the original name).
106 bool failedSuffix = false;
107 while (Os::FileSystem::getFileSize(fileNameFinal,tmp) == Os::FileSystem::OP_OK) {
108
109 // If the file name was the max size, then can't append a suffix,
110 // so just fail:
111 if (fileNameSize == (Fw::String::STRING_SIZE-1)) {
112 return false;
113 }
114
115 // Not able to create a new non-existing file in maxBackups tries, then mark that it failed:
116 if (suffix >= maxBackups) {
117 failedSuffix = true;
118 break;
119 }
120
121 NATIVE_INT_TYPE stat = snprintf(fileNameFinal,Fw::String::STRING_SIZE,
122 "%s%" PRIu32,fileName,suffix);
123
124 // If there was error, then just fail:
125 if (stat <= 0) {
126 return false;
127 }
128
129 // There should never be truncation:
131
132 ++suffix;
133 }
134
135 // If failed trying to make a new file, just use the original file
136 if (failedSuffix) {
137 (void) strncpy(fileNameFinal,fileName,
139 fileNameFinal[Fw::String::STRING_SIZE-1] = 0;
140 }
141
142 // Open the file (using CREATE so that it truncates an already existing file):
143 Os::File::Status stat = this->m_file.open(fileNameFinal, Os::File::OPEN_CREATE, false);
144
145 // Bad status when trying to open the file:
146 if (stat != Os::File::OP_OK) {
147 return false;
148 }
149
150 this->m_currentFileSize = 0;
151 this->m_maxFileSize = maxSize;
152 this->m_fileName = fileNameFinal;
153 this->m_openFile = true;
154
155 return true;
156 }
157
158
159} // namespace Svc
#define FW_ASSERT(...)
Definition Assert.hpp:7
PlatformIntType NATIVE_INT_TYPE
Definition BasicTypes.h:51
PlatformSizeType FwSizeType
Definition FpConfig.h:18
@ STRING_SIZE
Storage for string.
Definition String.hpp:15
void close()
close file
Definition File.cpp:36
@ NOT_OPENED
file hasn't been opened yet
Definition File.hpp:29
@ OP_OK
Operation was successful.
Definition File.hpp:24
Status write(const void *buffer, NATIVE_INT_TYPE &size, bool waitForDone=true)
write size; will return amount written or errno
Definition File.cpp:32
@ OPEN_CREATE
Open file for writing and truncates file if it exists, ie same flags as creat()
Definition File.hpp:19
Status open(const char *fileName, Mode mode)
open file. Writing creates file if it doesn't exist
Definition File.cpp:12
U32 string_length(const CHAR *source, U32 max_len)
get the length of the source string or max_len if the string is longer than max_len.
Status getFileSize(const char *path, FwSizeType &size)
append file origin to destination file. If boolean true, creates a brand new file if the destination ...
@ OP_OK
Operation was successful.
~LogFile()
Destructor.
Definition LogFile.cpp:28
Os::File m_file
Definition LogFile.hpp:61
U32 m_currentFileSize
Definition LogFile.hpp:70
LogFile()
Constructor.
Definition LogFile.cpp:22
bool set_log_file(const char *fileName, const U32 maxSize, const U32 maxBackups=10)
Set log file and max size.
Definition LogFile.cpp:81
bool write_to_log(const char *const buf, const U32 size)
Write the passed buf to the log if possible.
Definition LogFile.cpp:40
bool m_openFile
Definition LogFile.hpp:67
U32 m_maxFileSize
Definition LogFile.hpp:64
Fw::String m_fileName
Definition LogFile.hpp:58