diff -r 570026d3a685 -r 47bc686fafe4 src/server/webdav/webdav.c --- a/src/server/webdav/webdav.c Sun May 15 08:56:00 2022 +0200 +++ b/src/server/webdav/webdav.c Sun Aug 07 13:46:43 2022 +0200 @@ -85,19 +85,38 @@ default_backend.instance = NULL; } -int webdav_register_backend(const char *name, webdav_create_func webdavCreate) { - return ucx_map_cstr_put(webdav_type_map, name, webdavCreate); +int webdav_register_backend(const char *name, webdav_init_func webdavInit, webdav_create_func webdavCreate) { + WebdavType *webdavType = malloc(sizeof(WebdavType)); + webdavType->init = webdavInit; + webdavType->create = webdavCreate; + return ucx_map_cstr_put(webdav_type_map, name, webdavType); +} + +WebdavType* webdav_get_type(scstr_t dav_class) { + return ucx_map_sstr_get(webdav_type_map, dav_class); } +void* webdav_init_backend(ServerConfiguration *cfg, pool_handle_t *pool, WebdavType *dav_class, WSConfigNode *config, int *error) { + *error = 0; + if(dav_class->init) { + void *initData = dav_class->init(cfg, pool, config); + if(!initData) { + *error = 1; + } + return initData; + } else { + return NULL; + } +} -WebdavBackend* webdav_create(Session *sn, Request *rq, const char *dav_class, pblock *pb) { - webdav_create_func createDav = ucx_map_cstr_get(webdav_type_map, dav_class); - if(!createDav) { +WebdavBackend* webdav_create(Session *sn, Request *rq, const char *dav_class, pblock *pb, void *initData) { + WebdavType *webdavType = ucx_map_cstr_get(webdav_type_map, dav_class); + if(!webdavType) { log_ereport(LOG_MISCONFIG, "webdav_create: unkown dav type %s", dav_class); return NULL; } - return createDav(sn, rq, pb); + return webdavType->create(sn, rq, pb, initData); } static WSBool webdav_is_initialized = FALSE;