bool FileInfoUtils_GetNewestFilesInDirUnderSize()

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;
}