116 lines
3.1 KiB
C
116 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);
|
|
}
|