file.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 <sys/mman.h>
  13. #include <sys/types.h>
  14. #include <unistd.h>
  15. #include <fcntl.h>
  16. #endif
  17. #define __miniffs_internal
  18. #include <miniffs.h>
  19. size_t host_map_file(char *filename, char **dest)
  20. {
  21. char *ret_ptr;
  22. size_t fileSize;
  23. #ifdef _WIN32
  24. /* As windows do not provide an easy to use mmap equivalent, let's use the fallback
  25. * of opening the file, allocating memory and read the file in the said memory
  26. */
  27. FILE *fp;
  28. fp = fopen(filename, "rb");
  29. fseek(fp, 0, SEEK_END);
  30. fileSize = ftell(fp);
  31. fseek(fp, 0, SEEK_SET);
  32. ret_ptr = (char *)calloc(1, fileSize);
  33. fread(ret_ptr, 1, fileSize, fp);
  34. fclose(fp);
  35. #else
  36. int fd;
  37. struct stat FileStat;
  38. fd = open(filename, O_RDWR);
  39. fstat(fd, &FileStat);
  40. ret_ptr = (char *)mmap(NULL, FileStat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  41. close(fd);
  42. fileSize = FileStat.st_size
  43. if (ret_ptr == MAP_FAILED)
  44. {
  45. ret_ptr = NULL;
  46. }
  47. #endif
  48. *dest = ret_ptr;
  49. return fileSize;
  50. }
  51. void host_unmap_file(char **dest, size_t length)
  52. {
  53. #ifdef _WIN32
  54. /* As for windows we don't mmap, let's just free! */
  55. free(*dest);
  56. #else
  57. munmap(*dest, length);
  58. #endif
  59. *dest = NULL;
  60. }