--- a/src/server/test/vfs.c Sun Jun 07 17:18:59 2020 +0200 +++ b/src/server/test/vfs.c Sat Jul 11 17:58:00 2020 +0200 @@ -28,6 +28,7 @@ #include <stdio.h> #include <stdlib.h> +#include <errno.h> #include <ucx/string.h> #include <ucx/list.h> @@ -49,6 +50,7 @@ VFSFile file; sstr_t path; int isdir; + UcxBuffer *content; } TestVFSFile; typedef struct TestVFSDir { @@ -122,6 +124,50 @@ } + ssize_t testvfs_read(SYS_FILE fd, void *buf, size_t nbyte) { + TestVFSFile *file = (TestVFSFile*)fd; + return (ssize_t)ucx_buffer_read(buf, 1, nbyte, file->content); + } + + ssize_t testvfs_write(SYS_FILE fd, const void *buf, size_t nbyte) { + TestVFSFile *file = (TestVFSFile*)fd; + return (ssize_t)ucx_buffer_write(buf, 1, nbyte, file->content); + } + + ssize_t testvfs_pread(SYS_FILE fd, void *buf, size_t nbyte, off_t offset) { + TestVFSFile *file = (TestVFSFile*)fd; + file->content->pos = (size_t)offset; + return testvfs_read(fd, buf, nbyte); + } + + ssize_t testvfs_pwrite(SYS_FILE fd, const void *buf, size_t nbyte, off_t offset) { + TestVFSFile *file = (TestVFSFile*)fd; + file->content->pos = (size_t)offset; + return testvfs_write(fd, buf, nbyte); + } + + off_t testvfs_seek(SYS_FILE fd, off_t offset, int whence) { + TestVFSFile *file = (TestVFSFile*)fd; + ucx_buffer_seek(file->content, offset, whence); + return (off_t)file->content->pos; + } + + void testvfs_close(SYS_FILE fd) { + TestVFSFile *file = (TestVFSFile*)fd; + file->content->pos = 0; + } + +VFS_IO test_file_io = { + testvfs_read, + testvfs_write, + testvfs_pread, + testvfs_pwrite, + testvfs_seek, + testvfs_close, + NULL, /* aio_read */ + NULL /* aio_write */ +}; + VFS_DIRIO test_dir_io = { testvfs_readdir, testvfs_dir_close @@ -145,10 +191,20 @@ file = pool_malloc(ctx->sn->pool, sizeof(TestVFSFile)); ZERO(file, sizeof(TestVFSFile)); file->path = sstrdup_a(session_get_allocator(ctx->sn), s_path); + file->file.io = &test_file_io; + + file->content = pool_calloc(ctx->sn->pool, 1, sizeof(UcxBuffer)); + file->content->capacity = 2048; + file->content->space = pool_malloc(ctx->sn->pool, file->content->capacity); + file->content->flags = 0; + file->content->pos = 0; + file->content->size = 0; ucx_map_sstr_put(vfs->files, s_path, file); + } else { + ctx->vfs_errno = ENOENT; } - } + } return (SYS_FILE)file; } @@ -164,6 +220,7 @@ file = ucx_map_sstr_get(vfs->files, s_path); if(!file) { + ctx->vfs_errno = ENOENT; return 1; } @@ -190,6 +247,7 @@ file = ucx_map_sstr_get(vfs->files, s_path); if(!file) { + ctx->vfs_errno = ENOENT; return NULL; } @@ -258,6 +316,7 @@ TestVFS *vfs = ctx->vfs->instance; TestVFSFile *dir = ucx_map_cstr_get(vfs->files, path); if(!dir) { + ctx->vfs_errno = ENOENT; return 1; }