/****************************************************************************** * 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 #include #include #ifdef _WIN32 #include #endif #include 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, 8); uint8_t extLen = strnlen(ext, 3); 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->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, 8); memcpy(header->fent[fileIndex].ext, fs->files[i].ext, 3); 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); }