diff --git a/includes/platform/file.h b/includes/platform/file.h index 10428d1..3208044 100644 --- a/includes/platform/file.h +++ b/includes/platform/file.h @@ -28,6 +28,7 @@ typedef struct miniffs_t { miniffs_header_t *header; + void *memoryOffset; #ifdef BUILD_HOST_TOOLS uint32_t file_count; /***< Number of valid files in the list */ uint32_t file_list_count; /***< Number of items in the list */ diff --git a/platform/file.c b/platform/file.c index a61942c..44bc851 100644 --- a/platform/file.c +++ b/platform/file.c @@ -10,8 +10,10 @@ #include #include #else +#include #include #include +#include #include #include #endif @@ -19,20 +21,7 @@ #define __miniffs_internal #include -/* Exported API */ -miniffs_t *miniffs_openfs(char *host_file) -{ - return NULL; -} - - -/* Some internal functions */ -void *miniffs_getfileaddr(miniffs_t *fs, fileentry_t *fent) -{ - -} - - +/* Internal functions */ size_t host_map_file(char *filename, char **dest) { char *ret_ptr; @@ -55,7 +44,7 @@ size_t host_map_file(char *filename, char **dest) fd = open(filename, O_RDWR); fstat(fd, &FileStat); - ret_ptr = (char *)mmap(NULL, FileStat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + 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) @@ -77,4 +66,43 @@ void host_unmap_file(char **dest, size_t length) #endif *dest = NULL; -} \ No newline at end of file +} + +/* 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; +}