miniffs/miniffs_tools.c
2023-02-10 17:59:19 +00:00

117 lines
3.1 KiB
C

/******************************************************************************
* MiniFFS : Mini Flat File System
* miniffs_tools.c: Contain all the function needed for offline tools
*
* Copyright (c) 2008-2022 986-Studio. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define __miniffs_internal
#include <miniffs.h>
miniffs_t *miniffs_createfs()
{
miniffs_t *fs = (miniffs_t *)calloc(1, sizeof(miniffs_t));
fs->file_list_size = 2;
fs->files = (fs_fent_t *)calloc(2, sizeof(fs_fent_t));
return fs;
}
int miniffs_addfile(miniffs_t *fs, char *name, char *ext, char *host_path)
{
fs_fent_t *cur;
uint8_t nameLen = strnlen(name, MINIFFS_FILENAME_LENGTH);
uint8_t extLen = strnlen(ext, MINIFFS_EXTENSION_LENGTH);
if (fs->file_list_count == fs->file_list_size)
{
fs->file_list_size *= 2;
fs->files = realloc(fs->files, sizeof(fs_fent_t) * fs->file_list_size);
}
cur = &fs->files[fs->file_list_count];
memset(cur, 0, sizeof(fs_fent_t));
memcpy(cur->name, name, nameLen);
memcpy(cur->ext, ext, extLen);
cur->size = host_map_file(host_path, &cur->file_pointer);
cur->deleted = false;
fs->file_list_count++;
fs->file_count++;
}
int miniffs_delfile(miniffs_t *fs, char *name, char *ext, char *host_path)
{
// TODO:
// 1 - find file
// 2 - mark as deleted
}
int miniffs_writeimage(miniffs_t *fs, char *host_path)
{
int i;
FILE *fp;
miniffs_header_t *header;
size_t headerSize = sizeof(miniffs_header_t) + fs->file_count * sizeof(fileentry_t);
size_t fileIndex = 0;
size_t filePosition = headerSize;
header = (miniffs_header_t *)calloc(1, headerSize);
header->magic = MINIFFS_MAGIC;
header->fs_version_major = MINIFFS_VERSION_MAJOR;
header->fs_version_minor = MINIFFS_VERSION_MINOR;
header->fs_filename_len = MINIFFS_FILENAME_LENGTH;
header->fs_extention_len = MINIFFS_EXTENSION_LENGTH;
header->entry_count = fs->file_count;
for(i = 0; i < fs->file_list_count; i++)
{
if (fs->files[i].deleted == false)
{
memcpy(header->fent[fileIndex].name, fs->files[i].name, MINIFFS_FILENAME_LENGTH);
memcpy(header->fent[fileIndex].ext, fs->files[i].ext, MINIFFS_EXTENSION_LENGTH);
header->fent[fileIndex].size = fs->files[i].size;
header->fent[fileIndex].offset = filePosition;
fileIndex ++;
filePosition += header->fent[fileIndex].size;
}
}
fp = fopen(host_path, "wb");
fwrite(header, 1, headerSize, fp);
for(i = 0; i < fs->file_count; i++)
{
if (fs->files[i].deleted == false)
{
fwrite(fs->files[i].file_pointer, 1, fs->files[i].size, fp);
}
}
fclose(fp);
}
int miniffs_closefs(miniffs_t *fs)
{
int i;
for(i = 0; i < fs->file_count; i++)
{
if (fs->files[i].mapped)
{
host_unmap_file(&fs->files[i].file_pointer, fs->files[i].size);
fs->files[i].mapped = false;
}
}
free(fs->files);
free(fs);
}