bh_read_file.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "bh_read_file.h"
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #if defined(_WIN32) || defined(_WIN32_)
  5. #include <io.h>
  6. #else
  7. #include <unistd.h>
  8. #endif
  9. #if defined(_WIN32) || defined(_WIN32_)
  10. #if defined(__MINGW32__) && !defined(_SH_DENYNO)
  11. #define _SH_DENYNO 0x40
  12. #endif
  13. char *
  14. bh_read_file_to_buffer(const char *filename, uint32 *ret_size)
  15. {
  16. char *buffer;
  17. int file;
  18. uint32 file_size, buf_size, read_size;
  19. struct stat stat_buf;
  20. if (!filename || !ret_size) {
  21. printf("Read file to buffer failed: invalid filename or ret size.\n");
  22. return NULL;
  23. }
  24. if (_sopen_s(&file, filename, _O_RDONLY | _O_BINARY, _SH_DENYNO, 0)) {
  25. printf("Read file to buffer failed: open file %s failed.\n", filename);
  26. return NULL;
  27. }
  28. if (fstat(file, &stat_buf) != 0) {
  29. printf("Read file to buffer failed: fstat file %s failed.\n", filename);
  30. _close(file);
  31. return NULL;
  32. }
  33. file_size = (uint32)stat_buf.st_size;
  34. /* At lease alloc 1 byte to avoid malloc failed */
  35. buf_size = file_size > 0 ? file_size : 1;
  36. if (!(buffer = (char *)BH_MALLOC(buf_size))) {
  37. printf("Read file to buffer failed: alloc memory failed.\n");
  38. _close(file);
  39. return NULL;
  40. }
  41. #if WASM_ENABLE_MEMORY_TRACING != 0
  42. printf("Read file, total size: %u\n", file_size);
  43. #endif
  44. read_size = _read(file, buffer, file_size);
  45. _close(file);
  46. if (read_size < file_size) {
  47. printf("Read file to buffer failed: read file content failed.\n");
  48. BH_FREE(buffer);
  49. return NULL;
  50. }
  51. *ret_size = file_size;
  52. return buffer;
  53. }
  54. #else /* else of defined(_WIN32) || defined(_WIN32_) */
  55. char *
  56. bh_read_file_to_buffer(const char *filename, uint32 *ret_size)
  57. {
  58. char *buffer;
  59. int file;
  60. uint32 file_size, buf_size, read_size;
  61. struct stat stat_buf;
  62. if (!filename || !ret_size) {
  63. printf("Read file to buffer failed: invalid filename or ret size.\n");
  64. return NULL;
  65. }
  66. if ((file = open(filename, O_RDONLY, 0)) == -1) {
  67. printf("Read file to buffer failed: open file %s failed.\n", filename);
  68. return NULL;
  69. }
  70. if (fstat(file, &stat_buf) != 0) {
  71. printf("Read file to buffer failed: fstat file %s failed.\n", filename);
  72. close(file);
  73. return NULL;
  74. }
  75. file_size = (uint32)stat_buf.st_size;
  76. /* At lease alloc 1 byte to avoid malloc failed */
  77. buf_size = file_size > 0 ? file_size : 1;
  78. if (!(buffer = BH_MALLOC(buf_size))) {
  79. printf("Read file to buffer failed: alloc memory failed.\n");
  80. close(file);
  81. return NULL;
  82. }
  83. #if WASM_ENABLE_MEMORY_TRACING != 0
  84. printf("Read file, total size: %u\n", file_size);
  85. #endif
  86. read_size = (uint32)read(file, buffer, file_size);
  87. close(file);
  88. if (read_size < file_size) {
  89. printf("Read file to buffer failed: read file content failed.\n");
  90. BH_FREE(buffer);
  91. return NULL;
  92. }
  93. *ret_size = file_size;
  94. return buffer;
  95. }
  96. #endif /* end of defined(_WIN32) || defined(_WIN32_) */