miniffs_tools.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /******************************************************************************
  2. * MiniFFS : Mini Flat File System
  3. * miniffs_tools.c: Contain all the function needed for offline tools
  4. *
  5. * Copyright (c) 2008-2022 986-Studio. All rights reserved.
  6. *
  7. ******************************************************************************/
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <stdbool.h>
  11. #ifdef _WIN32
  12. #include <string.h>
  13. #endif
  14. #include <miniffs.h>
  15. miniffs_t *miniffs_createfs()
  16. {
  17. miniffs_t *fs = (miniffs_t *)calloc(1, sizeof(miniffs_t));
  18. fs->file_list_size = 2;
  19. fs->files = (fs_fent_t *)calloc(2, sizeof(fs_fent_t));
  20. return fs;
  21. }
  22. int miniffs_addfile(miniffs_t *fs, char *name, char *ext, char *host_path)
  23. {
  24. fs_fent_t *cur;
  25. uint8_t nameLen = strnlen(name, 8);
  26. uint8_t extLen = strnlen(ext, 3);
  27. if (fs->file_list_count == fs->file_list_size)
  28. {
  29. fs->file_list_size *= 2;
  30. fs->files = realloc(fs->files, sizeof(fs_fent_t) * fs->file_list_size);
  31. }
  32. cur = &fs->files[fs->file_list_count];
  33. memset(cur, 0, sizeof(fs_fent_t));
  34. memcpy(cur->name, name, nameLen);
  35. memcpy(cur->ext, ext, extLen);
  36. cur->size = host_map_file(host_path, &cur->file_pointer);
  37. cur->deleted = false;
  38. fs->file_list_count++;
  39. fs->file_count++;
  40. }
  41. int miniffs_delfile(miniffs_t *fs, char *name, char *ext, char *host_path)
  42. {
  43. // TODO:
  44. // 1 - find file
  45. // 2 - mark as deleted
  46. }
  47. int miniffs_writeimage(miniffs_t *fs, char *host_path)
  48. {
  49. int i;
  50. FILE *fp;
  51. miniffs_header_t *header;
  52. size_t headerSize = sizeof(miniffs_header_t) + fs->file_count * sizeof(fileentry_t);
  53. size_t fileIndex = 0;
  54. size_t filePosition = headerSize;
  55. header = (miniffs_header_t *)calloc(1, headerSize);
  56. header->magic = MINIFFS_MAGIC;
  57. header->entry_count = fs->file_count;
  58. for(i = 0; i < fs->file_list_count; i++)
  59. {
  60. if (fs->files[i].deleted == false)
  61. {
  62. memcpy(header->fent[fileIndex].name, fs->files[i].name, 8);
  63. memcpy(header->fent[fileIndex].ext, fs->files[i].ext, 3);
  64. header->fent[fileIndex].size = fs->files[i].size;
  65. header->fent[fileIndex].offset = filePosition;
  66. fileIndex ++;
  67. filePosition += header->fent[fileIndex].size;
  68. }
  69. }
  70. fp = fopen(host_path, "wb");
  71. fwrite(header, 1, headerSize, fp);
  72. for(i = 0; i < fs->file_count; i++)
  73. {
  74. if (fs->files[i].deleted == false)
  75. {
  76. fwrite(fs->files[i].file_pointer, 1, fs->files[i].size, fp);
  77. }
  78. }
  79. fclose(fp);
  80. }
  81. int miniffs_closefs(miniffs_t *fs)
  82. {
  83. int i;
  84. for(i = 0; i < fs->file_count; i++)
  85. {
  86. if (fs->files[i].mapped)
  87. {
  88. host_unmap_file(&fs->files[i].file_pointer, fs->files[i].size);
  89. fs->files[i].mapped = false;
  90. }
  91. }
  92. free(fs->files);
  93. free(fs);
  94. }