diff -r 570026d3a685 -r 47bc686fafe4 src/server/daemon/vfs.c --- a/src/server/daemon/vfs.c Sun May 15 08:56:00 2022 +0200 +++ b/src/server/daemon/vfs.c Sun Aug 07 13:46:43 2022 +0200 @@ -87,7 +87,7 @@ return 0; } -int vfs_register_type(const char *name, vfs_create_func vfsCreate) { +int vfs_register_type(const char *name, vfs_init_func vfsInit, vfs_create_func vfsCreate) { WS_ASSERT(name); if(!vfs_type_map) { @@ -95,18 +95,42 @@ return 1; } } - return ucx_map_cstr_put(vfs_type_map, name, vfsCreate); + + VfsType *vfsType = malloc(sizeof(VfsType)); + if(!vfsType) { + return 1; + } + vfsType->init = vfsInit; + vfsType->create = vfsCreate; + + return ucx_map_cstr_put(vfs_type_map, name, vfsType); +} + +VfsType* vfs_get_type(scstr_t vfs_class) { + return ucx_map_sstr_get(vfs_type_map, vfs_class); } +void* vfs_init_backend(ServerConfiguration *cfg, pool_handle_t *pool, VfsType *vfs_class, WSConfigNode *config, int *error) { + *error = 0; + if(vfs_class->init) { + void *initData = vfs_class->init(cfg, pool, config); + if(!initData) { + *error = 1; + } + return initData; + } else { + return NULL; + } +} -VFS* vfs_create(Session *sn, Request *rq, const char *vfs_class, pblock *pb) { - vfs_create_func createVFS = ucx_map_cstr_get(vfs_type_map, vfs_class); - if(!createVFS) { +VFS* vfs_create(Session *sn, Request *rq, const char *vfs_class, pblock *pb, void *initData) { + VfsType *vfsType = ucx_map_cstr_get(vfs_type_map, vfs_class); + if(!vfsType) { log_ereport(LOG_MISCONFIG, "vfs_create: unkown VFS type %s", vfs_class); return NULL; } - return createVFS(sn, rq, pb); + return vfsType->create(sn, rq, pb, initData); } VFSContext* vfs_request_context(Session *sn, Request *rq) {