in src/diagnostics_component/utils/file_info_utils/src/file_info_utils.c [194:284]
bool FileInfoUtils_GetNewestFilesInDirUnderSize(
VECTOR_HANDLE* fileNameVector, const char* directoryPath, const long long maxFileSize)
{
bool succeeded = false;
VECTOR_HANDLE fileVector = NULL;
// Note: Total amount of files set to MAX_FILES_TO_REPORT to ease diagnostics and scanning efforts.
FileInfo discoveredFiles[MAX_FILES_TO_REPORT];
memset(&discoveredFiles, 0, sizeof(discoveredFiles));
const size_t discoveredFilesSize = ARRAY_SIZE(discoveredFiles);
if (directoryPath == NULL || fileNameVector == NULL || maxFileSize == 0)
{
goto done;
}
fileVector = VECTOR_create(sizeof(STRING_HANDLE));
if (fileVector == NULL)
{
goto done;
}
if (!FileInfoUtils_FillFileInfoWithNewestFilesInDir(discoveredFiles, discoveredFilesSize, directoryPath))
{
goto done;
}
int fileIndex = 0;
long long currentFileMaxCount = 0;
while (currentFileMaxCount < maxFileSize && fileIndex < discoveredFilesSize)
{
if (discoveredFiles[fileIndex].fileName == NULL)
{
// No more files to add
break;
}
currentFileMaxCount += discoveredFiles[fileIndex].fileSize;
++fileIndex;
}
// Only log file found is larger than our maxFileSize
if (fileIndex == 1 && currentFileMaxCount > maxFileSize)
{
goto done;
}
for (int i = 0; i < fileIndex; ++i)
{
STRING_HANDLE fileName = STRING_construct(discoveredFiles[i].fileName);
if (fileName == NULL)
{
goto done;
}
if (VECTOR_push_back(fileVector, &fileName, 1) != 0)
{
STRING_delete(fileName);
goto done;
}
}
succeeded = true;
done:
for (int i = 0; i < discoveredFilesSize; ++i)
{
free(discoveredFiles[i].fileName);
memset(&discoveredFiles[i], 0, sizeof(FileInfo));
}
if (!succeeded)
{
const size_t fileVectorSize = VECTOR_size(fileVector);
for (size_t i = 0; i < fileVectorSize; ++i)
{
STRING_HANDLE* elem = (STRING_HANDLE*)VECTOR_element(fileVector, i);
STRING_delete(*elem);
}
VECTOR_destroy(fileVector);
fileVector = NULL;
}
*fileNameVector = fileVector;
return succeeded;
}