1 /***************************************************************************
2 begin : Mon Aug 11 2008
3 copyright : (C) 2008,2017 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * *
8 * This library is free software; you can redistribute it and/or *
9 * modify it under the terms of the GNU Lesser General Public *
10 * License as published by the Free Software Foundation; either *
11 * version 2.1 of the License, or (at your option) any later version. *
12 * *
13 * This library is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16 * Lesser General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU Lesser General Public *
19 * License along with this library; if not, write to the Free Software *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21 * MA 02111-1307 USA *
22 * *
23 ***************************************************************************/
24
25
26 #ifdef HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29
30 #define DISABLE_DEBUGLOG
31
32
33 #include "configmgr_p.h"
34
35 #include <gwenhywfar/gwenhywfar.h>
36 #include <gwenhywfar/misc.h>
37 #include <gwenhywfar/url.h>
38 #include <gwenhywfar/debug.h>
39
40
41 #include <stdlib.h>
42 #include <assert.h>
43 #include <string.h>
44 #include <errno.h>
45 #include <ctype.h>
46
47
48
49 GWEN_INHERIT_FUNCTIONS(GWEN_CONFIGMGR)
50
GWEN_INHERIT(GWEN_PLUGIN,GWEN_CONFIGMGR_PLUGIN)51 GWEN_INHERIT(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN)
52
53
54
55 int GWEN_ConfigMgr_ModuleInit(void)
56 {
57 GWEN_PLUGIN_MANAGER *pm;
58 int err;
59 GWEN_STRINGLIST *sl;
60
61 pm=GWEN_PluginManager_new(GWEN_CONFIGMGR_PLUGIN_NAME, GWEN_PM_LIBNAME);
62 err=GWEN_PluginManager_Register(pm);
63 if (err) {
64 DBG_ERROR(GWEN_LOGDOMAIN, "Could not register ConfigMgr plugin manager");
65 return err;
66 }
67
68 /* create plugin paths */
69 sl=GWEN_PathManager_GetPaths(GWEN_PM_LIBNAME, GWEN_PM_PLUGINDIR);
70 if (sl) {
71 GWEN_STRINGLISTENTRY *se;
72 GWEN_BUFFER *pbuf;
73
74 pbuf=GWEN_Buffer_new(0, 256, 0, 1);
75
76 se=GWEN_StringList_FirstEntry(sl);
77 while (se) {
78 GWEN_Buffer_AppendString(pbuf, GWEN_StringListEntry_Data(se));
79 GWEN_Buffer_AppendString(pbuf, GWEN_DIR_SEPARATOR_S GWEN_CONFIGMGR_FOLDER);
80 DBG_INFO(GWEN_LOGDOMAIN, "Adding plugin path [%s]",
81 GWEN_Buffer_GetStart(pbuf));
82 GWEN_PluginManager_AddPath(pm, GWEN_PM_LIBNAME,
83 GWEN_Buffer_GetStart(pbuf));
84 GWEN_Buffer_Reset(pbuf);
85 se=GWEN_StringListEntry_Next(se);
86 }
87 GWEN_Buffer_free(pbuf);
88 GWEN_StringList_free(sl);
89 }
90
91 return 0;
92 }
93
94
95
GWEN_ConfigMgr_ModuleFini(void)96 int GWEN_ConfigMgr_ModuleFini(void)
97 {
98 GWEN_PLUGIN_MANAGER *pm;
99
100 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME);
101 if (pm) {
102 int rv;
103
104 rv=GWEN_PluginManager_Unregister(pm);
105 if (rv) {
106 DBG_ERROR(GWEN_LOGDOMAIN,
107 "Could not unregister ConfigMgr plugin manager (%d)", rv);
108 return rv;
109 }
110 else
111 GWEN_PluginManager_free(pm);
112 }
113
114 return 0;
115 }
116
117
118
119
GWEN_ConfigMgr_new(const char * url)120 GWEN_CONFIGMGR *GWEN_ConfigMgr_new(const char *url)
121 {
122 GWEN_CONFIGMGR *mgr;
123
124 GWEN_NEW_OBJECT(GWEN_CONFIGMGR, mgr);
125 GWEN_INHERIT_INIT(GWEN_CONFIGMGR, mgr);
126
127 if (url)
128 mgr->url=strdup(url);
129
130 return mgr;
131 }
132
133
134
GWEN_ConfigMgr_free(GWEN_CONFIGMGR * mgr)135 void GWEN_ConfigMgr_free(GWEN_CONFIGMGR *mgr)
136 {
137 if (mgr) {
138 GWEN_INHERIT_FINI(GWEN_CONFIGMGR, mgr);
139 free(mgr->url);
140 GWEN_FREE_OBJECT(mgr);
141 }
142 }
143
144
145
GWEN_ConfigMgr_SetGetGroupFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_GETGROUP_FN f)146 GWEN_CONFIGMGR_GETGROUP_FN GWEN_ConfigMgr_SetGetGroupFn(GWEN_CONFIGMGR *mgr,
147 GWEN_CONFIGMGR_GETGROUP_FN f)
148 {
149 GWEN_CONFIGMGR_GETGROUP_FN of;
150
151 assert(mgr);
152 of=mgr->getGroupFn;
153 mgr->getGroupFn=f;
154
155 return of;
156 }
157
158
159
GWEN_ConfigMgr_SetSetGroupFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_SETGROUP_FN f)160 GWEN_CONFIGMGR_SETGROUP_FN GWEN_ConfigMgr_SetSetGroupFn(GWEN_CONFIGMGR *mgr,
161 GWEN_CONFIGMGR_SETGROUP_FN f)
162 {
163 GWEN_CONFIGMGR_SETGROUP_FN of;
164
165 assert(mgr);
166 of=mgr->setGroupFn;
167 mgr->setGroupFn=f;
168
169 return of;
170 }
171
172
173
GWEN_ConfigMgr_SetHasGroupFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_HASGROUP_FN f)174 GWEN_CONFIGMGR_HASGROUP_FN GWEN_ConfigMgr_SetHasGroupFn(GWEN_CONFIGMGR *mgr,
175 GWEN_CONFIGMGR_HASGROUP_FN f)
176 {
177 GWEN_CONFIGMGR_HASGROUP_FN of;
178
179 assert(mgr);
180 of=mgr->hasGroupFn;
181 mgr->hasGroupFn=f;
182
183 return of;
184
185 }
186
187
188
GWEN_ConfigMgr_SetLockGroupFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_LOCKGROUP_FN f)189 GWEN_CONFIGMGR_LOCKGROUP_FN GWEN_ConfigMgr_SetLockGroupFn(GWEN_CONFIGMGR *mgr,
190 GWEN_CONFIGMGR_LOCKGROUP_FN f)
191 {
192 GWEN_CONFIGMGR_LOCKGROUP_FN of;
193
194 assert(mgr);
195 of=mgr->lockGroupFn;
196 mgr->lockGroupFn=f;
197
198 return of;
199 }
200
201
202
GWEN_ConfigMgr_SetUnlockGroupFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_UNLOCKGROUP_FN f)203 GWEN_CONFIGMGR_UNLOCKGROUP_FN GWEN_ConfigMgr_SetUnlockGroupFn(GWEN_CONFIGMGR *mgr,
204 GWEN_CONFIGMGR_UNLOCKGROUP_FN f)
205 {
206 GWEN_CONFIGMGR_UNLOCKGROUP_FN of;
207
208 assert(mgr);
209 of=mgr->unlockGroupFn;
210 mgr->unlockGroupFn=f;
211
212 return of;
213 }
214
215
216
GWEN_ConfigMgr_SetGetUniqueIdFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_GETUNIQUEID_FN f)217 GWEN_CONFIGMGR_GETUNIQUEID_FN GWEN_ConfigMgr_SetGetUniqueIdFn(GWEN_CONFIGMGR *mgr,
218 GWEN_CONFIGMGR_GETUNIQUEID_FN f)
219 {
220 GWEN_CONFIGMGR_GETUNIQUEID_FN of;
221
222 assert(mgr);
223 of=mgr->getUniqueIdFn;
224 mgr->getUniqueIdFn=f;
225
226 return of;
227 }
228
229
230
GWEN_ConfigMgr_SetMkUniqueIdFromIdFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_MKUNIQUEIDFROMID_FN f)231 GWEN_CONFIGMGR_MKUNIQUEIDFROMID_FN GWEN_ConfigMgr_SetMkUniqueIdFromIdFn(GWEN_CONFIGMGR *mgr,
232 GWEN_CONFIGMGR_MKUNIQUEIDFROMID_FN f)
233 {
234 GWEN_CONFIGMGR_MKUNIQUEIDFROMID_FN of;
235
236 assert(mgr);
237 of=mgr->mkUniqueIdFromIdFn;
238 mgr->mkUniqueIdFromIdFn=f;
239
240 return of;
241 }
242
243
244
GWEN_ConfigMgr_SetDeleteGroupFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_DELETEGROUP_FN f)245 GWEN_CONFIGMGR_DELETEGROUP_FN GWEN_ConfigMgr_SetDeleteGroupFn(GWEN_CONFIGMGR *mgr,
246 GWEN_CONFIGMGR_DELETEGROUP_FN f)
247 {
248 GWEN_CONFIGMGR_DELETEGROUP_FN of;
249
250 assert(mgr);
251 of=mgr->deleteGroupFn;
252 mgr->deleteGroupFn=f;
253
254 return of;
255 }
256
257
258
GWEN_ConfigMgr_SetListGroupsFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_LISTGROUPS_FN f)259 GWEN_CONFIGMGR_LISTGROUPS_FN GWEN_ConfigMgr_SetListGroupsFn(GWEN_CONFIGMGR *mgr,
260 GWEN_CONFIGMGR_LISTGROUPS_FN f)
261 {
262 GWEN_CONFIGMGR_LISTGROUPS_FN of;
263
264 assert(mgr);
265 of=mgr->listGroupsFn;
266 mgr->listGroupsFn=f;
267
268 return of;
269 }
270
271
272
GWEN_ConfigMgr_SetListSubGroupsFn(GWEN_CONFIGMGR * mgr,GWEN_CONFIGMGR_LISTSUBGROUPS_FN f)273 GWEN_CONFIGMGR_LISTSUBGROUPS_FN GWEN_ConfigMgr_SetListSubGroupsFn(GWEN_CONFIGMGR *mgr,
274 GWEN_CONFIGMGR_LISTSUBGROUPS_FN f)
275 {
276 GWEN_CONFIGMGR_LISTSUBGROUPS_FN of;
277
278 assert(mgr);
279 of=mgr->listSubGroupsFn;
280 mgr->listSubGroupsFn=f;
281
282 return of;
283 }
284
285
286
GWEN_ConfigMgr_GetGroup(GWEN_CONFIGMGR * mgr,const char * groupName,const char * subGroupName,GWEN_DB_NODE ** pDb)287 int GWEN_ConfigMgr_GetGroup(GWEN_CONFIGMGR *mgr,
288 const char *groupName,
289 const char *subGroupName,
290 GWEN_DB_NODE **pDb)
291 {
292 assert(mgr);
293 if (mgr->getGroupFn)
294 return mgr->getGroupFn(mgr, groupName, subGroupName, pDb);
295 else
296 return GWEN_ERROR_NOT_IMPLEMENTED;
297 }
298
299
300
GWEN_ConfigMgr_SetGroup(GWEN_CONFIGMGR * mgr,const char * groupName,const char * subGroupName,GWEN_DB_NODE * db)301 int GWEN_ConfigMgr_SetGroup(GWEN_CONFIGMGR *mgr,
302 const char *groupName,
303 const char *subGroupName,
304 GWEN_DB_NODE *db)
305 {
306 assert(mgr);
307 if (mgr->setGroupFn)
308 return mgr->setGroupFn(mgr, groupName, subGroupName, db);
309 else
310 return GWEN_ERROR_NOT_IMPLEMENTED;
311 }
312
313
314
GWEN_ConfigMgr_HasGroup(GWEN_CONFIGMGR * mgr,const char * groupName,const char * subGroupName)315 int GWEN_ConfigMgr_HasGroup(GWEN_CONFIGMGR *mgr,
316 const char *groupName,
317 const char *subGroupName)
318 {
319 assert(mgr);
320 if (mgr->hasGroupFn)
321 return mgr->hasGroupFn(mgr, groupName, subGroupName);
322 else
323 return GWEN_ERROR_NOT_IMPLEMENTED;
324 }
325
326
327
GWEN_ConfigMgr_LockGroup(GWEN_CONFIGMGR * mgr,const char * groupName,const char * subGroupName)328 int GWEN_ConfigMgr_LockGroup(GWEN_CONFIGMGR *mgr,
329 const char *groupName,
330 const char *subGroupName)
331 {
332 assert(mgr);
333 if (mgr->lockGroupFn)
334 return mgr->lockGroupFn(mgr, groupName, subGroupName);
335 else
336 return GWEN_ERROR_NOT_IMPLEMENTED;
337 }
338
339
340
GWEN_ConfigMgr_UnlockGroup(GWEN_CONFIGMGR * mgr,const char * groupName,const char * subGroupName)341 int GWEN_ConfigMgr_UnlockGroup(GWEN_CONFIGMGR *mgr,
342 const char *groupName,
343 const char *subGroupName)
344 {
345 assert(mgr);
346 if (mgr->unlockGroupFn)
347 return mgr->unlockGroupFn(mgr, groupName, subGroupName);
348 else
349 return GWEN_ERROR_NOT_IMPLEMENTED;
350 }
351
352
353
GWEN_ConfigMgr_GetUniqueId(GWEN_CONFIGMGR * mgr,const char * groupName,char * buffer,uint32_t bufferLen)354 int GWEN_ConfigMgr_GetUniqueId(GWEN_CONFIGMGR *mgr,
355 const char *groupName,
356 char *buffer,
357 uint32_t bufferLen)
358 {
359 assert(mgr);
360 if (mgr->getUniqueIdFn)
361 return mgr->getUniqueIdFn(mgr, groupName, buffer, bufferLen);
362 else
363 return GWEN_ERROR_NOT_IMPLEMENTED;
364 }
365
366
367
GWEN_ConfigMgr_MkUniqueIdFromId(GWEN_CONFIGMGR * mgr,const char * groupName,uint32_t uid,int doCheck,char * buffer,uint32_t bufferLen)368 int GWEN_ConfigMgr_MkUniqueIdFromId(GWEN_CONFIGMGR *mgr,
369 const char *groupName,
370 uint32_t uid,
371 int doCheck,
372 char *buffer,
373 uint32_t bufferLen)
374 {
375 assert(mgr);
376 if (mgr->mkUniqueIdFromIdFn)
377 return mgr->mkUniqueIdFromIdFn(mgr, groupName, uid, doCheck, buffer, bufferLen);
378 else
379 return GWEN_ERROR_NOT_IMPLEMENTED;
380 }
381
382
383
GWEN_ConfigMgr_DeleteGroup(GWEN_CONFIGMGR * mgr,const char * groupName,const char * subGroupName)384 int GWEN_ConfigMgr_DeleteGroup(GWEN_CONFIGMGR *mgr,
385 const char *groupName,
386 const char *subGroupName)
387 {
388 assert(mgr);
389 if (mgr->deleteGroupFn)
390 return mgr->deleteGroupFn(mgr, groupName, subGroupName);
391 else
392 return GWEN_ERROR_NOT_IMPLEMENTED;
393 }
394
395
396
GWEN_ConfigMgr_ListGroups(GWEN_CONFIGMGR * mgr,GWEN_STRINGLIST * sl)397 int GWEN_ConfigMgr_ListGroups(GWEN_CONFIGMGR *mgr,
398 GWEN_STRINGLIST *sl)
399 {
400 assert(mgr);
401 if (mgr->listGroupsFn)
402 return mgr->listGroupsFn(mgr, sl);
403 else
404 return GWEN_ERROR_NOT_IMPLEMENTED;
405 }
406
407
GWEN_ConfigMgr_ListSubGroups(GWEN_CONFIGMGR * mgr,const char * groupName,GWEN_STRINGLIST * sl)408 int GWEN_ConfigMgr_ListSubGroups(GWEN_CONFIGMGR *mgr,
409 const char *groupName,
410 GWEN_STRINGLIST *sl)
411 {
412 assert(mgr);
413 if (mgr->listSubGroupsFn)
414 return mgr->listSubGroupsFn(mgr, groupName, sl);
415 else
416 return GWEN_ERROR_NOT_IMPLEMENTED;
417 }
418
419
420
421
422
423
424
425
426
GWEN_ConfigMgr_Plugin_new(GWEN_PLUGIN_MANAGER * pm,const char * name,const char * fileName)427 GWEN_PLUGIN *GWEN_ConfigMgr_Plugin_new(GWEN_PLUGIN_MANAGER *pm,
428 const char *name,
429 const char *fileName)
430 {
431 GWEN_PLUGIN *pl;
432 GWEN_CONFIGMGR_PLUGIN *xpl;
433
434 pl=GWEN_Plugin_new(pm, name, fileName);
435 GWEN_NEW_OBJECT(GWEN_CONFIGMGR_PLUGIN, xpl);
436 GWEN_INHERIT_SETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl, xpl,
437 GWEN_ConfigMgr_Plugin_FreeData);
438
439 return pl;
440 }
441
442
443
GWEN_ConfigMgr_Plugin_FreeData(GWEN_UNUSED void * bp,void * p)444 void GWENHYWFAR_CB GWEN_ConfigMgr_Plugin_FreeData(GWEN_UNUSED void *bp, void *p)
445 {
446 GWEN_CONFIGMGR_PLUGIN *xpl;
447
448 xpl=(GWEN_CONFIGMGR_PLUGIN *)p;
449 GWEN_FREE_OBJECT(xpl);
450 }
451
452
453
GWEN_ConfigMgr_Plugin_SetFactoryFn(GWEN_PLUGIN * pl,GWEN_CONFIGMGR_PLUGIN_FACTORYFN f)454 void GWEN_ConfigMgr_Plugin_SetFactoryFn(GWEN_PLUGIN *pl,
455 GWEN_CONFIGMGR_PLUGIN_FACTORYFN f)
456 {
457 GWEN_CONFIGMGR_PLUGIN *xpl;
458
459 assert(pl);
460 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl);
461 assert(xpl);
462
463 xpl->factoryFn=f;
464 }
465
466
467
GWEN_ConfigMgr_Plugin_Factory(GWEN_PLUGIN * pl,const char * url)468 GWEN_CONFIGMGR *GWEN_ConfigMgr_Plugin_Factory(GWEN_PLUGIN *pl,
469 const char *url)
470 {
471 GWEN_CONFIGMGR_PLUGIN *xpl;
472
473 assert(pl);
474 xpl=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_CONFIGMGR_PLUGIN, pl);
475 assert(xpl);
476
477 assert(xpl->factoryFn);
478 return xpl->factoryFn(pl, url);
479 }
480
481
482
GWEN_ConfigMgr_Factory(const char * url)483 GWEN_CONFIGMGR *GWEN_ConfigMgr_Factory(const char *url)
484 {
485 GWEN_PLUGIN_MANAGER *pm;
486 GWEN_PLUGIN *pl;
487 GWEN_CONFIGMGR *mgr=NULL;
488 GWEN_URL *purl;
489 const char *modname;
490
491 pm=GWEN_PluginManager_FindPluginManager(GWEN_CONFIGMGR_PLUGIN_NAME);
492 if (!pm) {
493 DBG_ERROR(GWEN_LOGDOMAIN, "No plugin manager for \"ConfigMgr\" found");
494 return 0;
495 }
496
497 purl=GWEN_Url_fromString(url);
498 if (purl==NULL) {
499 DBG_INFO(GWEN_LOGDOMAIN, "Invalid url [%s]", url);
500 return NULL;
501 }
502
503 modname=GWEN_Url_GetProtocol(purl);
504 if (modname==NULL)
505 modname="file";
506
507 pl=GWEN_PluginManager_GetPlugin(pm, modname);
508 if (!pl) {
509 DBG_INFO(GWEN_LOGDOMAIN, "ConfigMgr-Plugin \"%s\" not found", modname);
510 GWEN_Url_free(purl);
511 return 0;
512 }
513 GWEN_Url_free(purl);
514
515 mgr=GWEN_ConfigMgr_Plugin_Factory(pl, url);
516 if (mgr==NULL) {
517 DBG_INFO(GWEN_LOGDOMAIN,
518 "Plugin did not create a GWEN_CONFIGMGR");
519 }
520
521 return mgr;
522 }
523
524
525
526
527
528
529
530
531
532