|
@@ -1,8 +1,113 @@
|
|
|
/******************************************************************************
|
|
|
* MiniFFS : Mini Flat File System
|
|
|
- * miniffs_tools.c: Contain all the funciton needed for offline tools
|
|
|
+ * 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>
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
+#include <string.h>
|
|
|
+#endif
|
|
|
+
|
|
|
+#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, 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);
|
|
|
+}
|