file.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /******************************************************************************
  2. * MiniFFS : Mini Flat File System
  3. * file.c: This is the file based implementation of the MiniFFS
  4. *
  5. * Copyright (c) 2008-2022 986-Studio. All rights reserved.
  6. *
  7. ******************************************************************************/
  8. #ifdef _WIN32
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #else
  12. #include <stdlib.h>
  13. #include <sys/mman.h>
  14. #include <sys/types.h>
  15. #include <sys/stat.h>
  16. #include <unistd.h>
  17. #include <fcntl.h>
  18. #endif
  19. #define __miniffs_internal
  20. #include <miniffs.h>
  21. /* Internal functions */
  22. size_t host_map_file(char *filename, char **dest)
  23. {
  24. char *ret_ptr;
  25. size_t fileSize;
  26. #ifdef _WIN32
  27. /* As windows do not provide an easy to use mmap equivalent, let's use the fallback
  28. * of opening the file, allocating memory and read the file in the said memory
  29. */
  30. FILE *fp;
  31. fp = fopen(filename, "rb");
  32. fseek(fp, 0, SEEK_END);
  33. fileSize = ftell(fp);
  34. fseek(fp, 0, SEEK_SET);
  35. ret_ptr = (char *)calloc(1, fileSize);
  36. fread(ret_ptr, 1, fileSize, fp);
  37. fclose(fp);
  38. #else
  39. int fd;
  40. struct stat FileStat;
  41. fd = open(filename, O_RDWR);
  42. fstat(fd, &FileStat);
  43. ret_ptr = (char *)mmap(NULL, FileStat.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
  44. close(fd);
  45. fileSize = FileStat.st_size;
  46. if (ret_ptr == MAP_FAILED)
  47. {
  48. ret_ptr = NULL;
  49. }
  50. #endif
  51. *dest = ret_ptr;
  52. return fileSize;
  53. }
  54. void host_unmap_file(char **dest, size_t length)
  55. {
  56. #ifdef _WIN32
  57. /* As for windows we don't mmap, let's just free! */
  58. free(*dest);
  59. #else
  60. munmap(*dest, length);
  61. #endif
  62. *dest = NULL;
  63. }
  64. /* Exported API */
  65. miniffs_t *miniffs_openfs(char *host_file)
  66. {
  67. miniffs_t *fs = NULL;
  68. fs = (miniffs_t *)calloc(1, sizeof(miniffs_t));
  69. if (fs == NULL)
  70. {
  71. miniffs_seterror(MINIFFS_ALLOCATION_ERROR);
  72. goto exit;
  73. }
  74. host_map_file(host_file, (char **)&fs->memoryOffset);
  75. fs->header = (miniffs_header_t *)fs->memoryOffset;
  76. if (!miniffs_isvalidfs(fs))
  77. {
  78. miniffs_seterror(MINIFFS_INVALID_FS);
  79. goto free_and_exit;
  80. }
  81. goto exit;
  82. free_and_exit:
  83. free(fs);
  84. fs = NULL;
  85. exit:
  86. return fs;
  87. }
  88. /* Some internal functions */
  89. void *miniffs_getfileaddr(miniffs_t *fs, fileentry_t *fent)
  90. {
  91. return fs->memoryOffset + fent->offset;
  92. }