gwenhywfar 5.10.1
dbio.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Wed Mar 31 2004
3 copyright : (C) 2004-2010 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#include "dbio_p.h"
33#include <gwenhywfar/gwenhywfar.h>
34#include <gwenhywfar/misc.h>
35#include <gwenhywfar/debug.h>
36#include <gwenhywfar/path.h>
37#include <gwenhywfar/text.h>
38#include <gwenhywfar/directory.h>
39#include <gwenhywfar/syncio.h>
40#include <gwenhywfar/syncio_file.h>
41#include <gwenhywfar/syncio_memory.h>
42#include <gwenhywfar/fslock.h>
43#include <gwenhywfar/pathmanager.h>
44
45
46/* TODO: #include <gwenhywfar/plugin.h> */
47
48#include <stdlib.h>
49#include <assert.h>
50#include <string.h>
51#include <errno.h>
52#include <ctype.h>
53
54#include <sys/types.h>
55#ifdef HAVE_SYS_STAT_H
56# include <sys/stat.h>
57#endif
58#ifdef HAVE_FCNTL_H
59# include <fcntl.h>
60#endif
61#ifdef HAVE_UNISTD_H
62# include <unistd.h>
63#endif
64
65
66#ifdef OS_WIN32
67# define DIRSEP "\\"
68# include <windows.h>
69#else
70# define DIRSEP "/"
71#endif
72
73
74
77
78GWEN_INHERIT(GWEN_PLUGIN, GWEN_DBIO_PLUGIN)
79
80
82{
84 int err;
86
89 if (err) {
90 DBG_ERROR(GWEN_LOGDOMAIN, "Could not register DBIO plugin manager");
91 return err;
92 }
93
94 /* create plugin paths */
96 if (sl) {
98 GWEN_BUFFER *pbuf;
99
100 pbuf=GWEN_Buffer_new(0, 256, 0, 1);
101
103 while (se) {
106 DBG_INFO(GWEN_LOGDOMAIN, "Adding plugin path [%s]",
110 GWEN_Buffer_Reset(pbuf);
112 }
113 GWEN_Buffer_free(pbuf);
115 }
116
117 return 0;
118}
119
120
121
123{
125
127 if (pm) {
128 int rv;
129
131 if (rv) {
133 "Could not unregister DBIO plugin manager (%d)", rv);
134 return rv;
135 }
136 else
138 }
139
140 return 0;
141}
142
143
144
145
146
148 const char *name,
149 const char *fileName)
150{
151 GWEN_PLUGIN *pl;
152 GWEN_DBIO_PLUGIN *pldbio;
153
154 pl=GWEN_Plugin_new(pm, name, fileName);
155 GWEN_NEW_OBJECT(GWEN_DBIO_PLUGIN, pldbio);
156 GWEN_INHERIT_SETDATA(GWEN_PLUGIN, GWEN_DBIO_PLUGIN, pl, pldbio,
158
159 return pl;
160}
161
162
163
165{
166 GWEN_DBIO_PLUGIN *pldbio;
167
168 pldbio=(GWEN_DBIO_PLUGIN *)p;
169 GWEN_FREE_OBJECT(pldbio);
170}
171
172
173
175{
176 GWEN_DBIO_PLUGIN *pldbio;
177
178 assert(pl);
179 pldbio=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_DBIO_PLUGIN, pl);
180 assert(pldbio);
181
182 assert(pldbio->factoryFn);
183 return pldbio->factoryFn(pl);
184}
185
186
187
190{
191 GWEN_DBIO_PLUGIN *pldbio;
192
193 assert(pl);
194 pldbio=GWEN_INHERIT_GETDATA(GWEN_PLUGIN, GWEN_DBIO_PLUGIN, pl);
195 assert(pldbio);
196
197 pldbio->factoryFn=f;
198}
199
200
201
202
203
204
205
206
207GWEN_DBIO *GWEN_DBIO_new(const char *name, const char *descr)
208{
209 GWEN_DBIO *dbio;
210
211 assert(name);
215 dbio->name=strdup(name);
216 if (descr)
217 dbio->descr=strdup(descr);
218
219 dbio->usage=1;
220 return dbio;
221}
222
223
224
226{
227 if (dbio) {
228 assert(dbio->usage);
229 if (--(dbio->usage)==0) {
232
233 free(dbio->name);
234 free(dbio->descr);
235
236 GWEN_FREE_OBJECT(dbio);
237 }
238 }
239}
240
241
242
244{
245 assert(dbio);
246 dbio->usage++;
247}
248
249
250
252 GWEN_SYNCIO *sio,
253 GWEN_DB_NODE *db,
254 GWEN_DB_NODE *params,
255 uint32_t flags)
256{
257 assert(dbio);
258 assert(sio);
259 assert(db);
260
262 DBG_ERROR(GWEN_LOGDOMAIN, "GWEN_SYNCIO %s not connected; did you forget to call GWEN_SyncIo_Connect()?",
264 return -1;
265 }
266
267 if (dbio->importFn)
268 return dbio->importFn(dbio, sio, db, params, flags);
269 else {
270 DBG_INFO(GWEN_LOGDOMAIN, "No import function set");
271 return -1;
272 }
273}
274
275
276
278 GWEN_SYNCIO *sio,
279 GWEN_DB_NODE *db,
280 GWEN_DB_NODE *params,
281 uint32_t flags)
282{
283 assert(dbio);
284 assert(sio);
285 assert(db);
286
287 if (dbio->exportFn)
288 return dbio->exportFn(dbio, sio, db, params, flags);
289 else {
290 DBG_INFO(GWEN_LOGDOMAIN, "No export function set");
291 return -1;
292 }
293}
294
295
296
298 const char *fname)
299{
300 assert(dbio);
301 assert(fname);
302
303 if (dbio->checkFileFn)
304 return dbio->checkFileFn(dbio, fname);
305 else {
306 DBG_INFO(GWEN_LOGDOMAIN, "No checkFile function set");
308 }
309}
310
311
312
313const char *GWEN_DBIO_GetName(const GWEN_DBIO *dbio)
314{
315 assert(dbio);
316 return dbio->name;
317}
318
319
320
321const char *GWEN_DBIO_GetDescription(const GWEN_DBIO *dbio)
322{
323 assert(dbio);
324 return dbio->descr;
325}
326
327
328
330{
331 assert(dbio);
332 dbio->importFn=f;
333}
334
335
336
338{
339 assert(dbio);
340 dbio->exportFn=f;
341}
342
343
345{
346 assert(dbio);
347 dbio->checkFileFn=f;
348}
349
350
351
352GWEN_DBIO *GWEN_DBIO_GetPlugin(const char *modname)
353{
355 GWEN_PLUGIN *pl;
356 GWEN_DBIO *dbio;
357
359 if (!pm) {
360 DBG_ERROR(GWEN_LOGDOMAIN, "No plugin manager for \"dbio\" found");
361 return 0;
362 }
363
364 pl=GWEN_PluginManager_GetPlugin(pm, modname);
365 if (!pl) {
366 DBG_INFO(GWEN_LOGDOMAIN, "DBIO-Plugin \"%s\" not found", modname);
367 return 0;
368 }
369
371 if (!dbio) {
373 "Plugin did not create a GWEN_DBIO");
374 }
375 return dbio;
376}
377
378
379
381 const char *fname,
382 GWEN_DB_NODE *db,
383 GWEN_DB_NODE *params,
384 uint32_t dbflags)
385{
386 int rv;
387 GWEN_FSLOCK *lck=0;
388 GWEN_SYNCIO *sio;
389
390 /* if locking requested */
391 if (dbflags & GWEN_DB_FLAGS_LOCKFILE) {
393
395 assert(lck);
397 if (res!=GWEN_FSLock_ResultOk) {
399 "Could not apply lock to file \"%s\" (%d)",
400 fname, res);
401 GWEN_FSLock_free(lck);
402 return -1;
403 }
404 }
405
406 /* open file */
408 if (dbflags & GWEN_DB_FLAGS_APPEND_FILE)
415 rv=GWEN_SyncIo_Connect(sio);
416 if (rv<0) {
417 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
418 GWEN_SyncIo_free(sio);
419 if (lck) {
421 GWEN_FSLock_free(lck);
422 }
423 return rv;
424 }
425
426 rv=GWEN_DBIO_Export(dbio, sio, db, params, dbflags);
427 if (rv<0) {
428 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
430 GWEN_SyncIo_free(sio);
431 if (lck) {
433 GWEN_FSLock_free(lck);
434 }
435 return rv;
436 }
437
439 if (rv<0) {
440 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
441 GWEN_SyncIo_free(sio);
442 if (lck) {
444 GWEN_FSLock_free(lck);
445 }
446 return rv;
447 }
448 GWEN_SyncIo_free(sio);
449
450 /* remove lock, if any */
451 if (lck) {
453
454 res=GWEN_FSLock_Unlock(lck);
455 if (res!=GWEN_FSLock_ResultOk) {
457 "Could not remove lock on file \"%s\" (%d)",
458 fname, res);
459 }
460 GWEN_FSLock_free(lck);
461 }
462
463 return 0;
464}
465
466
467
469 GWEN_BUFFER *buf,
470 GWEN_DB_NODE *db,
471 GWEN_DB_NODE *params,
472 uint32_t flags)
473{
474 GWEN_SYNCIO *sio;
475 int rv;
476
477 /* create SyncIO, don't take over buf */
478 sio=GWEN_SyncIo_Memory_new(buf, 0);
479 rv=GWEN_DBIO_Export(dbio, sio, db, params, flags);
480 if (rv<0) {
481 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
482 GWEN_SyncIo_free(sio);
483 return rv;
484 }
485
486 GWEN_SyncIo_free(sio);
487 return 0;
488}
489
490
491
493 const char *fname,
494 GWEN_DB_NODE *db,
495 GWEN_DB_NODE *params,
496 uint32_t dbflags)
497{
498 GWEN_SYNCIO *sio;
499 int rv;
500 GWEN_FSLOCK *lck=0;
501
502 /* if locking requested */
503 if (dbflags & GWEN_DB_FLAGS_LOCKFILE) {
505
507 assert(lck);
509 if (res!=GWEN_FSLock_ResultOk) {
511 "Could not apply lock to file \"%s\" (%d)",
512 fname, res);
513 GWEN_FSLock_free(lck);
514 return GWEN_ERROR_IO;
515 }
516 }
517
520 rv=GWEN_SyncIo_Connect(sio);
521 if (rv<0) {
522 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
523 GWEN_SyncIo_free(sio);
524 if (lck) {
526 GWEN_FSLock_free(lck);
527 }
528 return rv;
529 }
530
531 /* read from file */
532 rv=GWEN_DBIO_Import(dbio, sio, db, params, dbflags);
533 if (rv<0) {
534 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
536 GWEN_SyncIo_free(sio);
537 if (lck) {
539 GWEN_FSLock_free(lck);
540 }
541 return rv;
542 }
543
544 /* close io layer */
546 GWEN_SyncIo_free(sio);
547
548 /* remove lock, if any */
549 if (lck) {
551
552 res=GWEN_FSLock_Unlock(lck);
553 if (res!=GWEN_FSLock_ResultOk) {
555 "Could not remove lock on file \"%s\" (%d)",
556 fname, res);
557 }
558 GWEN_FSLock_free(lck);
559 }
560
561 return 0;
562}
563
564
565
566
567
568
569
570
571
572
573
574
575
576
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
#define GWEN_DB_DEFAULT_LOCK_TIMEOUT
Definition: db.h:218
#define GWEN_DB_FLAGS_LOCKFILE
Definition: db.h:155
#define GWEN_DB_FLAGS_APPEND_FILE
Definition: db.h:147
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
int GWEN_DBIO_ExportToBuffer(GWEN_DBIO *dbio, GWEN_BUFFER *buf, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio.c:468
int GWEN_DBIO_ExportToFile(GWEN_DBIO *dbio, const char *fname, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t dbflags)
Definition: dbio.c:380
GWEN_PLUGIN * GWEN_DBIO_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
Definition: dbio.c:147
int GWEN_DBIO_ModuleInit(void)
Definition: dbio.c:81
#define DIRSEP
Definition: dbio.c:70
int GWEN_DBIO_ImportFromFile(GWEN_DBIO *dbio, const char *fname, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t dbflags)
Definition: dbio.c:492
void GWEN_DBIO_SetCheckFileFn(GWEN_DBIO *dbio, GWEN_DBIO_CHECKFILEFN f)
Definition: dbio.c:344
void GWEN_DBIO_free(GWEN_DBIO *dbio)
Definition: dbio.c:225
void GWEN_DBIO_SetImportFn(GWEN_DBIO *dbio, GWEN_DBIO_IMPORTFN f)
Definition: dbio.c:329
int GWEN_DBIO_Import(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio.c:251
const char * GWEN_DBIO_GetDescription(const GWEN_DBIO *dbio)
Definition: dbio.c:321
void GWEN_DBIO_Attach(GWEN_DBIO *dbio)
Definition: dbio.c:243
GWEN_DBIO * GWEN_DBIO_GetPlugin(const char *modname)
Definition: dbio.c:352
GWEN_DBIO * GWEN_DBIO_new(const char *name, const char *descr)
Definition: dbio.c:207
void GWEN_DBIO_Plugin_SetFactoryFn(GWEN_PLUGIN *pl, GWEN_DBIO_PLUGIN_FACTORYFN f)
Definition: dbio.c:188
const char * GWEN_DBIO_GetName(const GWEN_DBIO *dbio)
Definition: dbio.c:313
void GWENHYWFAR_CB GWEN_DBIO_Plugin_FreeData(GWEN_UNUSED void *bp, void *p)
Definition: dbio.c:164
GWEN_DBIO_CHECKFILE_RESULT GWEN_DBIO_CheckFile(GWEN_DBIO *dbio, const char *fname)
Definition: dbio.c:297
int GWEN_DBIO_ModuleFini(void)
Definition: dbio.c:122
int GWEN_DBIO_Export(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio.c:277
GWEN_DBIO * GWEN_DBIO_Plugin_Factory(GWEN_PLUGIN *pl)
Definition: dbio.c:174
void GWEN_DBIO_SetExportFn(GWEN_DBIO *dbio, GWEN_DBIO_EXPORTFN f)
Definition: dbio.c:337
#define GWEN_DBIO_FOLDER
Definition: dbio.h:56
GWEN_DBIO_CHECKFILE_RESULT
Definition: dbio.h:79
@ GWEN_DBIO_CheckFileResultUnknown
Definition: dbio.h:82
struct GWEN_DBIO GWEN_DBIO
Definition: dbio.h:43
GWEN_DBIO *(* GWEN_DBIO_PLUGIN_FACTORYFN)(GWEN_PLUGIN *pl)
Definition: dbio.h:92
int(* GWEN_DBIO_IMPORTFN)(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio_be.h:40
GWEN_DBIO_CHECKFILE_RESULT(* GWEN_DBIO_CHECKFILEFN)(GWEN_DBIO *dbio, const char *fname)
Definition: dbio_be.h:52
int(* GWEN_DBIO_EXPORTFN)(GWEN_DBIO *dbio, GWEN_SYNCIO *sio, GWEN_DB_NODE *db, GWEN_DB_NODE *params, uint32_t flags)
Definition: dbio_be.h:46
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:125
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_ERROR_IO
Definition: error.h:123
GWENHYWFAR_API void GWEN_FSLock_free(GWEN_FSLOCK *fl)
struct GWEN_FSLOCK GWEN_FSLOCK
Definition: fslock.h:59
GWENHYWFAR_API GWEN_FSLOCK * GWEN_FSLock_new(const char *fname, GWEN_FSLOCK_TYPE t)
GWEN_FSLOCK_RESULT
Definition: fslock.h:71
@ GWEN_FSLock_ResultOk
Definition: fslock.h:72
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Lock(GWEN_FSLOCK *fl, int timeout, uint32_t gid)
@ GWEN_FSLock_TypeFile
Definition: fslock.h:66
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Unlock(GWEN_FSLOCK *fl)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
#define GWEN_PM_PLUGINDIR
Definition: gwenhywfar.h:53
#define GWEN_PM_LIBNAME
Definition: gwenhywfar.h:42
#define GWEN_UNUSED
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
#define GWEN_INHERIT(bt, t)
Definition: inherit.h:264
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
#define GWEN_LOGDOMAIN
Definition: logger.h:35
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
GWEN_STRINGLIST * GWEN_PathManager_GetPaths(const char *destLib, const char *pathName)
Definition: pathmanager.c:494
GWEN_PLUGIN_MANAGER * GWEN_PluginManager_new(const char *name, const char *destLib)
Definition: plugin.c:180
void GWEN_PluginManager_free(GWEN_PLUGIN_MANAGER *pm)
Definition: plugin.c:200
int GWEN_PluginManager_AddPath(GWEN_PLUGIN_MANAGER *pm, const char *callingLib, const char *s)
Definition: plugin.c:223
GWEN_PLUGIN_MANAGER * GWEN_PluginManager_FindPluginManager(const char *s)
Definition: plugin.c:548
int GWEN_PluginManager_Unregister(GWEN_PLUGIN_MANAGER *pm)
Definition: plugin.c:595
GWEN_PLUGIN * GWEN_PluginManager_GetPlugin(GWEN_PLUGIN_MANAGER *pm, const char *s)
Definition: plugin.c:529
GWEN_PLUGIN * GWEN_Plugin_new(GWEN_PLUGIN_MANAGER *pm, const char *name, const char *fileName)
Definition: plugin.c:81
int GWEN_PluginManager_Register(GWEN_PLUGIN_MANAGER *pm)
Definition: plugin.c:564
struct GWEN_PLUGIN_MANAGER GWEN_PLUGIN_MANAGER
Definition: plugin.h:40
struct GWEN_PLUGIN GWEN_PLUGIN
Definition: plugin.h:39
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
int GWEN_SyncIo_Connect(GWEN_SYNCIO *sio)
Definition: syncio.c:97
void GWEN_SyncIo_AddFlags(GWEN_SYNCIO *sio, uint32_t fl)
Definition: syncio.c:179
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:78
GWEN_SYNCIO_STATUS GWEN_SyncIo_GetStatus(const GWEN_SYNCIO *sio)
Definition: syncio.c:197
const char * GWEN_SyncIo_GetTypeName(const GWEN_SYNCIO *sio)
Definition: syncio.c:215
int GWEN_SyncIo_Disconnect(GWEN_SYNCIO *sio)
Definition: syncio.c:109
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
@ GWEN_SyncIo_Status_Connected
Definition: syncio.h:49
@ GWEN_SyncIo_File_CreationMode_CreateAlways
Definition: syncio_file.h:40
@ GWEN_SyncIo_File_CreationMode_OpenExisting
Definition: syncio_file.h:38
#define GWEN_SYNCIO_FILE_FLAGS_UWRITE
Definition: syncio_file.h:59
GWENHYWFAR_API GWEN_SYNCIO * GWEN_SyncIo_File_new(const char *path, GWEN_SYNCIO_FILE_CREATIONMODE cm)
#define GWEN_SYNCIO_FILE_FLAGS_READ
Definition: syncio_file.h:53
#define GWEN_SYNCIO_FILE_FLAGS_UREAD
Definition: syncio_file.h:58
#define GWEN_SYNCIO_FILE_FLAGS_APPEND
Definition: syncio_file.h:55
#define GWEN_SYNCIO_FILE_FLAGS_WRITE
Definition: syncio_file.h:54
GWEN_SYNCIO * GWEN_SyncIo_Memory_new(GWEN_BUFFER *buffer, int take)
Definition: syncio_memory.c:50