src/server/test/vfs.c

branch
webdav
changeset 251
f727a21497bb
parent 249
3b302093945c
child 323
dc5b0fee49df
--- 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;
     }
     

mercurial