85 return -1; |
85 return -1; |
86 } |
86 } |
87 return 0; |
87 return 0; |
88 } |
88 } |
89 |
89 |
90 int vfs_register_type(const char *name, vfs_create_func vfsCreate) { |
90 int vfs_register_type(const char *name, vfs_init_func vfsInit, vfs_create_func vfsCreate) { |
91 WS_ASSERT(name); |
91 WS_ASSERT(name); |
92 |
92 |
93 if(!vfs_type_map) { |
93 if(!vfs_type_map) { |
94 if(vfs_init()) { |
94 if(vfs_init()) { |
95 return 1; |
95 return 1; |
96 } |
96 } |
97 } |
97 } |
98 return ucx_map_cstr_put(vfs_type_map, name, vfsCreate); |
98 |
99 } |
99 VfsType *vfsType = malloc(sizeof(VfsType)); |
100 |
100 if(!vfsType) { |
101 |
101 return 1; |
102 VFS* vfs_create(Session *sn, Request *rq, const char *vfs_class, pblock *pb) { |
102 } |
103 vfs_create_func createVFS = ucx_map_cstr_get(vfs_type_map, vfs_class); |
103 vfsType->init = vfsInit; |
104 if(!createVFS) { |
104 vfsType->create = vfsCreate; |
|
105 |
|
106 return ucx_map_cstr_put(vfs_type_map, name, vfsType); |
|
107 } |
|
108 |
|
109 VfsType* vfs_get_type(scstr_t vfs_class) { |
|
110 return ucx_map_sstr_get(vfs_type_map, vfs_class); |
|
111 } |
|
112 |
|
113 void* vfs_init_backend(ServerConfiguration *cfg, pool_handle_t *pool, VfsType *vfs_class, WSConfigNode *config, int *error) { |
|
114 *error = 0; |
|
115 if(vfs_class->init) { |
|
116 void *initData = vfs_class->init(cfg, pool, config); |
|
117 if(!initData) { |
|
118 *error = 1; |
|
119 } |
|
120 return initData; |
|
121 } else { |
|
122 return NULL; |
|
123 } |
|
124 } |
|
125 |
|
126 VFS* vfs_create(Session *sn, Request *rq, const char *vfs_class, pblock *pb, void *initData) { |
|
127 VfsType *vfsType = ucx_map_cstr_get(vfs_type_map, vfs_class); |
|
128 if(!vfsType) { |
105 log_ereport(LOG_MISCONFIG, "vfs_create: unkown VFS type %s", vfs_class); |
129 log_ereport(LOG_MISCONFIG, "vfs_create: unkown VFS type %s", vfs_class); |
106 return NULL; |
130 return NULL; |
107 } |
131 } |
108 |
132 |
109 return createVFS(sn, rq, pb); |
133 return vfsType->create(sn, rq, pb, initData); |
110 } |
134 } |
111 |
135 |
112 VFSContext* vfs_request_context(Session *sn, Request *rq) { |
136 VFSContext* vfs_request_context(Session *sn, Request *rq) { |
113 WS_ASSERT(sn); |
137 WS_ASSERT(sn); |
114 WS_ASSERT(rq); |
138 WS_ASSERT(rq); |