123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /******************************************************************************
- * MiniFFS : Mini Flat File System
- * file.c: This is the file based implementation of the MiniFFS
- *
- * Copyright (c) 2008-2022 986-Studio. All rights reserved.
- *
- ******************************************************************************/
- #ifdef _WIN32
- #include <stdio.h>
- #include <stdlib.h>
- #else
- #include <stdlib.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <fcntl.h>
- #endif
- #define __miniffs_internal
- #include <miniffs.h>
- /* Internal functions */
- size_t host_map_file(char *filename, char **dest)
- {
- char *ret_ptr;
- size_t fileSize;
- #ifdef _WIN32
- /* As windows do not provide an easy to use mmap equivalent, let's use the fallback
- * of opening the file, allocating memory and read the file in the said memory
- */
- FILE *fp;
- fp = fopen(filename, "rb");
- fseek(fp, 0, SEEK_END);
- fileSize = ftell(fp);
- fseek(fp, 0, SEEK_SET);
- ret_ptr = (char *)calloc(1, fileSize);
- fread(ret_ptr, 1, fileSize, fp);
- fclose(fp);
- #else
- int fd;
- struct stat FileStat;
- fd = open(filename, O_RDWR);
- fstat(fd, &FileStat);
- ret_ptr = (char *)mmap(NULL, FileStat.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
- close(fd);
- fileSize = FileStat.st_size;
- if (ret_ptr == MAP_FAILED)
- {
- ret_ptr = NULL;
- }
- #endif
- *dest = ret_ptr;
- return fileSize;
- }
- void host_unmap_file(char **dest, size_t length)
- {
- #ifdef _WIN32
- /* As for windows we don't mmap, let's just free! */
- free(*dest);
- #else
- munmap(*dest, length);
- #endif
- *dest = NULL;
- }
- /* Exported API */
- miniffs_t *miniffs_openfs(char *host_file)
- {
- miniffs_t *fs = NULL;
- fs = (miniffs_t *)calloc(1, sizeof(miniffs_t));
- if (fs == NULL)
- {
- miniffs_seterror(MINIFFS_ALLOCATION_ERROR);
- goto exit;
- }
- host_map_file(host_file, (char **)&fs->memoryOffset);
- fs->header = (miniffs_header_t *)fs->memoryOffset;
- if (!miniffs_isvalidfs(fs))
- {
- miniffs_seterror(MINIFFS_INVALID_FS);
- goto free_and_exit;
- }
- goto exit;
- free_and_exit:
- free(fs);
- fs = NULL;
- exit:
- return fs;
- }
- /* Some internal functions */
- void *miniffs_getfileaddr(miniffs_t *fs, fileentry_t *fent)
- {
- return fs->memoryOffset + fent->offset;
- }
|