123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /******************************************************************************
- * 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);
- }
|