| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #include "luat_base.h"
- #include "luat_fs.h"
- #include "luat_mem.h"
- #define LUAT_LOG_TAG "fs"
- #include "luat_log.h"
- typedef struct luat_fs_onefile
- {
- char* ptr;
- uint32_t size;
- uint32_t offset;
- }luat_fs_onefile_t;
- // fs的默认实现, 指向poisx的stdio.h声明的方法
- #ifdef LUAT_USE_FS_VFS
- // #define PRINT_IT LLOGD("fd %p offset %d size %d", fd, fd->offset, fd->size)
- FILE* luat_vfs_onefile_fopen(void* userdata, const char *filename, const char *mode) {
- //LLOGD("open onefile %s", filename);
- if (!strcmp("r", mode) || !strcmp("rb", mode)) {
- luat_fs_onefile_t* fd = luat_heap_malloc(sizeof(luat_fs_onefile_t));
- if (fd == NULL) {
- LLOGE("out of memory when malloc luat_fs_onefile_t");
- return NULL;
- }
- //LLOGD("fd %p userdata %p", fd, userdata);
- memcpy(fd, userdata, sizeof(luat_fs_onefile_t));
- fd->offset = 0;
- return (FILE*)fd;
- }
- return NULL;
- }
- int luat_vfs_onefile_getc(void* userdata, FILE* stream) {
- //LLOGD("getc %p %p", userdata, stream);
- luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
- //LLOGD("getc %p %p %d %d", userdata, stream, fd->offset, fd->size);
- if (fd->offset < fd->size) {
- uint8_t c = (uint8_t)fd->ptr[fd->offset];
- fd->offset ++;
- //LLOGD("getc %02X", c);
- return c;
- }
- return -1;
- }
- int luat_vfs_onefile_fseek(void* userdata, FILE* stream, long int offset, int origin) {
- //LLOGD("fseek %p %p %d %d", userdata, stream, offset, origin);
- luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
- if (origin == SEEK_CUR) {
- fd->offset += offset;
- return 0;
- }
- else if (origin == SEEK_SET) {
- fd->offset = offset;
- return 0;
- }
- else {
- fd->offset = fd->size - offset;
- return 0;
- }
- }
- int luat_vfs_onefile_ftell(void* userdata, FILE* stream) {
- luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
- //LLOGD("tell %p %p %d %d", userdata, stream, fd->size, fd->offset);
- return fd->offset;
- }
- int luat_vfs_onefile_fclose(void* userdata, FILE* stream) {
- luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
- //LLOGD("fclose %p %p %d %d", userdata, stream, fd->size, fd->offset);
- luat_heap_free(fd);
- return 0;
- }
- int luat_vfs_onefile_feof(void* userdata, FILE* stream) {
- luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
- //LLOGD("feof %p %p %d %d", userdata, stream, fd->size, fd->offset);
- return fd->offset >= fd->size ? 1 : 0;
- }
- int luat_vfs_onefile_ferror(void* userdata, FILE *stream) {
- return 0;
- }
- size_t luat_vfs_onefile_fread(void* userdata, void *ptr, size_t size, size_t nmemb, FILE *stream) {
- luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
- //LLOGD("fread %p %p %d %d", userdata, stream, fd->size, fd->offset);
- //LLOGD("fread2 %p %p %d %d", userdata, stream, size * nmemb, fd->offset);
- size_t read_size = size*nmemb;
- if (fd->offset + read_size > fd->size) {
- read_size = fd->size - fd->offset;
- }
- memcpy(ptr, fd->ptr + fd->offset, read_size);
- fd->offset += read_size;
- return read_size;
- }
- size_t luat_vfs_onefile_fwrite(void* userdata, const void *ptr, size_t size, size_t nmemb, FILE *stream) {
- return 0;
- }
- int luat_vfs_onefile_remove(void* userdata, const char *filename) {
- return -1;
- }
- int luat_vfs_onefile_rename(void* userdata, const char *old_filename, const char *new_filename) {
- return -1;
- }
- int luat_vfs_onefile_fexist(void* userdata, const char *filename) {
- return 1;
- }
- size_t luat_vfs_onefile_fsize(void* userdata, const char *filename) {
- luat_fs_onefile_t *fd = (luat_fs_onefile_t*)(userdata);
- //LLOGD("fsize %p %p %d %d", userdata, fd);
- return fd->size;
- }
- int luat_vfs_onefile_mkfs(void* userdata, luat_fs_conf_t *conf) {
- return -1;
- }
- int luat_vfs_onefile_mount(void** userdata, luat_fs_conf_t *conf) {
- *userdata = (luat_fs_onefile_t*)conf->busname;
- return 0;
- }
- int luat_vfs_onefile_umount(void* userdata, luat_fs_conf_t *conf) {
- return 0;
- }
- int luat_vfs_onefile_mkdir(void* userdata, char const* _DirName) {
- return -1;
- }
- int luat_vfs_onefile_rmdir(void* userdata, char const* _DirName) {
- return -1;
- }
- int luat_vfs_onefile_info(void* userdata, const char* path, luat_fs_info_t *conf) {
- memcpy(conf->filesystem, "onefile", strlen("onefile")+1);
- conf->type = 0;
- conf->total_block = 0;
- conf->block_used = 0;
- conf->block_size = 512;
- return 0;
- }
- #define T(name) .name = luat_vfs_onefile_##name
- const struct luat_vfs_filesystem vfs_fs_onefile = {
- .name = "onefile",
- .opts = {
- .mkfs = NULL,
- T(mount),
- T(umount),
- .mkdir = NULL,
- .rmdir = NULL,
- .lsdir = NULL,
- .remove = NULL,
- .rename = NULL,
- T(fsize),
- T(fexist),
- T(info)
- },
- .fopts = {
- T(fopen),
- T(getc),
- T(fseek),
- T(ftell),
- T(fclose),
- T(feof),
- T(ferror),
- T(fread),
- .fwrite = NULL
- }
- };
- #endif
|