gwenhywfar 5.12.1
logger.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Sun Dec 05 2003
3 copyright : (C) 2003 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#include <gwenhywfar/gwenhywfarapi.h>
31#include <gwenhywfar/misc.h>
32#include <gwenhywfar/buffer.h>
33#include <gwenhywfar/gui.h>
34
35#include "logger_p.h"
36
37#include <stdlib.h>
38#include <stdio.h>
39#include <errno.h>
40#ifdef HAVE_SYSLOG_H
41# include <syslog.h>
42#endif
43#include <string.h>
44#ifdef HAVE_STRINGS_H
45# include <strings.h>
46#endif
47#ifdef HAVE_TIME_H
48# include <time.h>
49#endif
50#ifdef HAVE_UNISTD_H
51# include <unistd.h>
52#endif
53
54
55static GWEN_LOGGER_DOMAIN *gwen_loggerdomains=0;
56
57
58
60{
61 const char *s;
63
65 "gwen",
66 0,
69 s=getenv("GWEN_LOGLEVEL");
70 if (s) {
74 }
76 return 0;
77}
78
79
80
82{
83 GWEN_LOGGER_DOMAIN *ld;
84
85 while ((ld=gwen_loggerdomains)) {
88 }
89 return 0;
90}
91
92
93
94GWEN_LOGGER_DOMAIN *GWEN_LoggerDomain_new(const char *name)
95{
96 GWEN_LOGGER_DOMAIN *ld;
97
98 assert(name);
99 GWEN_NEW_OBJECT(GWEN_LOGGER_DOMAIN, ld);
100 ld->name=strdup(name);
101 return ld;
102}
103
104
105
106void GWEN_LoggerDomain_free(GWEN_LOGGER_DOMAIN *ld)
107{
108 if (ld) {
109 free(ld->name);
110 GWEN_Logger_free(ld->logger);
112 }
113}
114
115
116GWEN_LOGGER_DOMAIN *GWEN_LoggerDomain_Find(const char *name)
117{
118 GWEN_LOGGER_DOMAIN *ld;
119
120 assert(name);
122 while (ld) {
123 if (strcasecmp(ld->name, name)==0)
124 break;
125 ld=ld->next;
126 }
127
128 return ld;
129}
130
131
132
133void GWEN_LoggerDomain_Add(GWEN_LOGGER_DOMAIN *ld)
134{
135 assert(ld);
136 GWEN_LIST_INSERT(GWEN_LOGGER_DOMAIN, ld, &gwen_loggerdomains);
137}
138
139
140
141void GWEN_LoggerDomain_Del(GWEN_LOGGER_DOMAIN *ld)
142{
143 assert(ld);
144 GWEN_LIST_DEL(GWEN_LOGGER_DOMAIN, ld, &gwen_loggerdomains);
145}
146
147
148
149GWEN_LOGGER *GWEN_LoggerDomain_GetLogger(const char *name)
150{
151 GWEN_LOGGER_DOMAIN *ld;
152
153 if (!name)
154 name="default";
155
156 ld=GWEN_LoggerDomain_Find(name);
157 if (ld) {
158 return ld->logger;
159 }
160 ld=GWEN_LoggerDomain_new(name);
161 ld->logger=GWEN_Logger_new(ld);
162
164 return ld->logger;
165}
166
167
168
169GWEN_LOGGER *GWEN_Logger_new(GWEN_LOGGER_DOMAIN *domain)
170{
171 GWEN_LOGGER *lg;
172
173 GWEN_NEW_OBJECT(GWEN_LOGGER, lg);
174 lg->usage=1;
175 lg->enabled=1;
176 lg->logType=GWEN_LoggerType_Console;
177 lg->logLevel=GWEN_LoggerLevel_Error;
178 lg->domain=domain;
179 return lg;
180}
181
182
183
184void GWEN_Logger_free(GWEN_LOGGER *lg)
185{
186 if (lg) {
187 assert(lg->usage);
188 if (--(lg->usage)==0) {
189 free(lg->logFile);
190 free(lg->logIdent);
192 }
193 }
194}
195
196
197
198void GWEN_Logger_Attach(GWEN_LOGGER *lg)
199{
200 assert(lg);
201 lg->usage++;
202}
203
204
205
206void GWEN_Logger_AddLogger(GWEN_LOGGER *oldLogger, GWEN_LOGGER *newLogger)
207{
208 assert(newLogger);
209
210 assert(oldLogger);
211 GWEN_LIST_ADD(GWEN_LOGGER, newLogger, &(oldLogger->next));
212}
213
214
215
216#ifndef NO_DEPRECATED_SYMBOLS
218{
219 fprintf(stderr, "GWEN_Logger_SetDefaultLogger: Deprecated function\n");
220}
221#endif // ifndef NO_DEPRECATED_SYMBOLS
222
223
224
225int GWEN_Logger_Open(const char *logDomain,
226 const char *ident,
227 const char *file,
228 GWEN_LOGGER_LOGTYPE logtype,
229 GWEN_LOGGER_FACILITY facility)
230{
231 GWEN_LOGGER *lg;
232
233 lg=GWEN_LoggerDomain_GetLogger(logDomain);
234 assert(lg);
235
236 if (lg->open) {
237 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "Already open");
238 return 0;
239 }
240
241 lg->logType=logtype;
242
243 GWEN_Logger_SetIdent(logDomain, ident);
244 GWEN_Logger_SetFilename(logDomain, file);
245
246 if (logtype==GWEN_LoggerType_File) {
247 /* logging to a file */
248 if (file==0) {
249 lg->logType=GWEN_LoggerType_Console;
250 lg->enabled=1;
251 fprintf(stderr, "LOGGER: No filename given, will log to console.\n");
252 }
253 else {
254 lg->logType=GWEN_LoggerType_File;
255 lg->enabled=1;
256 }
257 }
258#ifdef HAVE_SYSLOG_H
259 else if (logtype==GWEN_LoggerType_Syslog) {
260 /* caller wants to log via syslog */
261 int fac;
262
263 switch (facility) {
265 fac=LOG_AUTH;
266 break;
268 fac=LOG_DAEMON;
269 break;
271 fac=LOG_MAIL;
272 break;
274 fac=LOG_NEWS;
275 break;
278 default:
279 fac=LOG_USER;
280 break;
281 }
282
283 openlog(ident,
284 LOG_CONS |
285 LOG_PID,
286 fac);
287 lg->enabled=1;
288 } /* if syslog */
289#endif /* ifdef HAVE_SYSLOG_H */
290
291 else {
292 /* console or function */
293 lg->enabled=1;
294 }
295
296 lg->open=1;
297
298 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "started");
299 return 0;
300}
301
302
303
304void GWEN_Logger_Close(const char *logDomain)
305{
306 GWEN_LOGGER *lg;
307
308 lg=GWEN_LoggerDomain_GetLogger(logDomain);
309 assert(lg);
310 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "stopped");
311 lg->logType=GWEN_LoggerType_Console;
312 lg->enabled=0;
313#ifdef HAVE_SYSLOG_H
314 closelog();
315#endif
316 lg->open=0;
317 /* remove logdomain after it has been closed */
318 GWEN_LoggerDomain_Del(lg->domain);
319 GWEN_LoggerDomain_free(lg->domain);
320}
321
322
323
324int GWEN_Logger_IsOpen(const char *logDomain)
325{
326 GWEN_LOGGER_DOMAIN *ld;
327
328 if (!logDomain)
329 logDomain="default";
330 ld=GWEN_LoggerDomain_Find(logDomain);
331 if (ld)
332 return ld->logger->open;
333 return 0;
334}
335
336
337int GWEN_Logger__CreateMessage(GWEN_LOGGER *lg,
338 GWEN_LOGGER_LEVEL priority, const char *s,
339 GWEN_BUFFER *mbuf)
340{
341#ifdef HAVE_SNPRINTF
342 unsigned int i;
343#endif /* HAVE_SNPRINTF */
344#ifdef HAVE_TIME_H
345 struct tm *t;
346 time_t tt;
347#endif /* HAVE_TIME_H */
348 char buffer[256];
349
350 assert(lg);
351 if (lg->logIdent) {
352 if (strlen(lg->logIdent)+32>=sizeof(buffer)) {
353 fprintf(stderr, " LOGGER: Logbuffer too small (1).\n");
354 return 1;
355 }
356 }
357
358#ifdef HAVE_TIME_H
359 tt=time(0);
360 t=localtime(&tt);
361
362# ifdef HAVE_SNPRINTF
363# ifdef HAVE_GETPID
364 i=snprintf(buffer, sizeof(buffer)-1,
365 "%d:%04d/%02d/%02d %02d-%02d-%02d:%s(%d):", priority,
366 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
367 t->tm_hour, t->tm_min, t->tm_sec,
368 lg->logIdent, (int)getpid());
369# else
370 i=snprintf(buffer, sizeof(buffer)-1,
371 "%d:%04d/%02d/%02d %02d-%02d-%02d:%s:", priority,
372 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
373 t->tm_hour, t->tm_min, t->tm_sec,
374 lg->logIdent);
375# endif /* HAVE_GETPID */
376 if (i>=sizeof(buffer)) {
377 fprintf(stderr, " LOGGER: Logbuffer too small (2).\n");
378 return 1;
379 }
380# else /* HAVE_SNPRINTF */
381# ifdef HAVE_GETPID
382 sprintf(buffer, "%d:%04d/%02d/%02d %02d-%02d-%02d:%s(%d):", priority,
383 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
384 t->tm_hour, t->tm_min, t->tm_sec,
385 lg->logIdent, (int)getpid());
386# else
387 sprintf(buffer, "%d:%04d/%02d/%02d %02d-%02d-%02d:%s:", priority,
388 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
389 t->tm_hour, t->tm_min, t->tm_sec,
390 lg->logIdent);
391# endif /* HAVE_GETPID */
392# endif /* HAVE_SNPRINTF */
393#else /* HAVE_TIME_H */
394# ifdef HAVE_SNPRINTF
395 buffer[sizeof(buffer)-1]=0;
396 i=snprintf(buffer, sizeof(buffer)-1,
397 "%d:%s:", priority,
398 lg->logIdent);
399 if (i>=sizeof(buffer)) {
400 fprintf(stderr, " LOGGER: Logbuffer too small (3).\n");
401 return 1;
402 }
403# else /* HAVE_SNPRINTF */
404 sprintf(buffer, "%d:%s:", priority,
405 lg->logIdent);
406# endif /* HAVE_SNPRINTF */
407#endif /* HAVE_TIME_H */
408 GWEN_Buffer_AppendString(mbuf, buffer);
410 GWEN_Buffer_AppendByte(mbuf, '\n');
411 return 0;
412}
413
414
415
416int GWEN_Logger_CreateLogMessage(const char *logDomain,
417 GWEN_LOGGER_LEVEL priority, const char *s,
418 GWEN_BUFFER *mbuf)
419{
420 GWEN_LOGGER *lg;
421
422 lg=GWEN_LoggerDomain_GetLogger(logDomain);
423 assert(lg);
424
425 return GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
426}
427
428
429
430int GWEN_Logger__Log(GWEN_LOGGER *lg,
431 GWEN_LOGGER_LEVEL priority, const char *s)
432{
433 while (lg) {
434 FILE *f;
435#ifdef HAVE_SYSLOG_H
436 int pri;
437#endif /* HAVE_SYSLOG_H */
438 GWEN_BUFFER *mbuf;
439 int rv;
440
441 assert(lg);
442 if (priority>lg->logLevel)
443 /* priority too low, don't log */
444 return 0;
445
446 mbuf=GWEN_Buffer_new(0, 256, 0, 1);
447 switch (lg->logType) {
449 rv=GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
450 if (rv) {
451 GWEN_Buffer_free(mbuf);
452 return rv;
453 }
454
455 f=fopen(lg->logFile, "a+");
456 if (f==0) {
457 fprintf(stderr,
458 "LOGGER: Unable to open file \"%s\" (%s)\n",
459 lg->logFile,
460 strerror(errno));
461 lg->logType=GWEN_LoggerType_Console;
462 GWEN_Buffer_free(mbuf);
463 return 1;
464 }
465
466 if (fwrite(GWEN_Buffer_GetStart(mbuf),
467 GWEN_Buffer_GetUsedBytes(mbuf), 1, f)!=1) {
468 fprintf(stderr,
469 "LOGGER: Unable to write to file \"%s\" (%s)\n",
470 lg->logFile,
471 strerror(errno));
472 fclose(f);
473 lg->logType=GWEN_LoggerType_Console;
474 GWEN_Buffer_free(mbuf);
475 return 1;
476 }
477 if (fclose(f)) {
478 fprintf(stderr,
479 "LOGGER: Unable to close file \"%s\" (%s)\n",
480 lg->logFile,
481 strerror(errno));
482 lg->logType=GWEN_LoggerType_Console;
483 GWEN_Buffer_free(mbuf);
484 return 1;
485 }
486 break;
487
488#ifdef HAVE_SYSLOG_H
490 switch (priority) {
492 pri=LOG_EMERG;
493 break;
495 pri=LOG_ALERT;
496 break;
498 pri=LOG_CRIT;
499 break;
501 pri=LOG_ERR;
502 break;
504 pri=LOG_WARNING;
505 break;
507 pri=LOG_NOTICE;
508 break;
510 pri=LOG_NOTICE;
511 break;
512
516 default:
517 pri=LOG_DEBUG;
518 break;
519 } /* switch */
520 syslog(pri, "%s", s);
521 break;
522#endif /* HAVE_SYSLOG_H */
523
525 if (lg->logFunction==0) {
526 fprintf(stderr,
527 "LOGGER: Logtype is \"Function\", but no function is set.\n");
528 GWEN_Buffer_free(mbuf);
529 return 1;
530 }
531 rv=GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
532 if (rv) {
533 GWEN_Buffer_free(mbuf);
534 return rv;
535 }
536 (lg->logFunction)(GWEN_Buffer_GetStart(mbuf));
537 break;
538
541 default:
542 rv=GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
543 if (rv) {
544 GWEN_Buffer_free(mbuf);
545 return rv;
546 }
547
548 fprintf(stderr, "%s", GWEN_Buffer_GetStart(mbuf));
549 break;
550 } /* switch */
551 lg=lg->next;
552 GWEN_Buffer_free(mbuf);
553 } /* while lg */
554 return 0;
555}
556
557
558
559void GWEN_Logger_Log(const char *logDomain,
560 GWEN_LOGGER_LEVEL priority, const char *s)
561{
562 if (!GWEN_Gui_LogHook(logDomain, priority, s)) {
563 const char *p;
564 /*int rv;*/
565 unsigned int i;
566 GWEN_BUFFER *mbuf;
567 GWEN_LOGGER *lg;
568
569 lg=GWEN_LoggerDomain_GetLogger(logDomain);
570 assert(lg);
571
572 if (!lg->enabled)
573 return /*1*/;
574
575 if (priority>lg->logLevel)
576 /* priority too low, don't log */
577 return /*0*/;
578
579 /* temporarily disable logging to avoid endless loops */
580 lg->enabled=0;
581 /* copy buffer, exchange all newlines by 0 */
582 mbuf=GWEN_Buffer_new(0, strlen(s)+1, 0, 1);
583 for (i=0; i<strlen(s)+1; i++) {
584 if (s[i]=='\n') {
585 GWEN_Buffer_AppendByte(mbuf, 0);
586 }
587 else
588 GWEN_Buffer_AppendByte(mbuf, s[i]);
589 }
590
591 /* now log each line */
592 /*rv=0;*/
593 p=GWEN_Buffer_GetStart(mbuf);
594 while (*p) {
595 GWEN_Logger__Log(lg, priority, p);
596 while (*p)
597 p++;
598 p++;
599 }
600 GWEN_Buffer_free(mbuf);
601 /* reenable logging */
602 lg->enabled=1;
603 return /*rv*/;
604 }
605 else
606 return /*0*/;
607}
608
609
610
611void GWEN_Logger_Enable(const char *logDomain, int f)
612{
613 GWEN_LOGGER *lg;
614
615 lg=GWEN_LoggerDomain_GetLogger(logDomain);
616 assert(lg);
617 lg->enabled=f;
618}
619
620
621
622int GWEN_Logger_IsEnabled(const char *logDomain)
623{
624 GWEN_LOGGER *lg;
625
626 lg=GWEN_LoggerDomain_GetLogger(logDomain);
627 assert(lg);
628 return lg->enabled;
629}
630
631
632
633void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
634{
635 GWEN_LOGGER *lg;
636
637 lg=GWEN_LoggerDomain_GetLogger(logDomain);
638 assert(lg);
639 lg->logLevel=l;
640}
641
642
643
644int GWEN_Logger_GetLevel(const char *logDomain)
645{
646 GWEN_LOGGER *lg;
647
648 lg=GWEN_LoggerDomain_GetLogger(logDomain);
649 assert(lg);
650
651 return lg->logLevel;
652}
653
654
655
656void GWEN_Logger_SetIdent(const char *logDomain, const char *id)
657{
658 GWEN_LOGGER *lg;
659
660 lg=GWEN_LoggerDomain_GetLogger(logDomain);
661 assert(lg);
662
663 free(lg->logIdent);
664 if (id)
665 lg->logIdent=strdup(id);
666 else
667 lg->logIdent=strdup("No ident, please adjust your program");
668}
669
670
671
672void GWEN_Logger_SetFilename(const char *logDomain, const char *name)
673{
674 GWEN_LOGGER *lg;
675
676 lg=GWEN_LoggerDomain_GetLogger(logDomain);
677 assert(lg);
678
679 free(lg->logFile);
680 if (name)
681 lg->logFile=strdup(name);
682 else
683 lg->logFile=strdup("");
684}
685
686
687
690{
691 GWEN_LOGGER *lg;
693
694 lg=GWEN_LoggerDomain_GetLogger(logDomain);
695 assert(lg);
696 oldFn=lg->logFunction;
697 lg->logFunction=fn;
698 return oldFn;
699}
700
701
702
704{
705 if (strcasecmp(name, "emergency")==0)
707 else if (strcasecmp(name, "alert")==0)
709 else if (strcasecmp(name, "critical")==0)
711 else if (strcasecmp(name, "error")==0)
713 else if (strcasecmp(name, "warning")==0)
715 else if (strcasecmp(name, "notice")==0)
717 else if (strcasecmp(name, "info")==0)
719 else if (strcasecmp(name, "debug")==0)
721 else if (strcasecmp(name, "verbous")==0 || strcasecmp(name, "verbose")==0)
723 else {
725 }
726}
727
728
729
731{
732 const char *s;
733
734 switch (level) {
736 s="emergency";
737 break;
739 s="alert";
740 break;
742 s="critical";
743 break;
745 s="error";
746 break;
748 s="warning";
749 break;
751 s="notice";
752 break;
754 s="info";
755 break;
757 s="debug";
758 break;
760 /* yes, we know the spelling is wrong. But it's a historic bug, fixing it would make Gwen incompatible with previous versions. */
761 s="verbous";
762 break;
764 default:
765 s="unknown";
766 break;
767 } /* switch */
768 return s;
769}
770
771
772
774{
775 if (strcasecmp(name, "console")==0)
777 else if (strcasecmp(name, "file")==0)
779 else if (strcasecmp(name, "syslog")==0)
781 else if (strcasecmp(name, "function")==0)
783 else {
785 }
786}
787
788
789
791{
792 const char *s;
793
794 switch (lt) {
796 s="console";
797 break;
799 s="file";
800 break;
802 s="syslog";
803 break;
805 s="function";
806 break;
808 default:
809 s="unknown";
810 break;
811 } /* switch */
812 return s;
813}
814
815
816
817int GWEN_Logger_Exists(const char *logDomain)
818{
819 assert(logDomain);
820 return (GWEN_LoggerDomain_Find(logDomain)!=0);
821}
822
823
824
825
826
827
828
829
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition buffer.c:393
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
GWENHYWFAR_API int GWEN_Gui_LogHook(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
#define GWEN_UNUSED
void GWEN_LoggerDomain_Del(GWEN_LOGGER_DOMAIN *ld)
Definition logger.c:141
GWEN_LOGGER_DOMAIN * GWEN_LoggerDomain_Find(const char *name)
Definition logger.c:116
const char * GWEN_Logger_Logtype2Name(GWEN_LOGGER_LOGTYPE lt)
Definition logger.c:790
const char * GWEN_Logger_Level2Name(GWEN_LOGGER_LEVEL level)
Definition logger.c:730
void GWEN_Logger_SetIdent(const char *logDomain, const char *id)
Definition logger.c:656
GWEN_LOGGER_LOGTYPE GWEN_Logger_Name2Logtype(const char *name)
Definition logger.c:773
int GWEN_Logger_ModuleFini(void)
Definition logger.c:81
GWEN_LOGGER_LEVEL GWEN_Logger_Name2Level(const char *name)
Definition logger.c:703
void GWEN_Logger_SetFilename(const char *logDomain, const char *name)
Definition logger.c:672
int GWEN_Logger_IsEnabled(const char *logDomain)
Definition logger.c:622
void GWEN_Logger_free(GWEN_LOGGER *lg)
Definition logger.c:184
static GWEN_LOGGER_DOMAIN * gwen_loggerdomains
Definition logger.c:55
void GWEN_LoggerDomain_Add(GWEN_LOGGER_DOMAIN *ld)
Definition logger.c:133
int GWEN_Logger__Log(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:430
void GWEN_LoggerDomain_free(GWEN_LOGGER_DOMAIN *ld)
Definition logger.c:106
int GWEN_Logger__CreateMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition logger.c:337
GWEN_LOGGERFUNCTIONLOG GWEN_Logger_SetLogFunction(const char *logDomain, GWEN_LOGGERFUNCTIONLOG fn)
Definition logger.c:688
int GWEN_Logger_ModuleInit(void)
Definition logger.c:59
int GWEN_Logger_CreateLogMessage(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition logger.c:416
void GWEN_Logger_Log(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:559
GWEN_LOGGER * GWEN_LoggerDomain_GetLogger(const char *name)
Definition logger.c:149
GWEN_LOGGER_DOMAIN * GWEN_LoggerDomain_new(const char *name)
Definition logger.c:94
int GWEN_Logger_GetLevel(const char *logDomain)
Definition logger.c:644
void GWEN_Logger_SetDefaultLogger(GWEN_UNUSED GWEN_LOGGER *lg)
Definition logger.c:217
void GWEN_Logger_Enable(const char *logDomain, int f)
Definition logger.c:611
void GWEN_Logger_Attach(GWEN_LOGGER *lg)
Definition logger.c:198
int GWEN_Logger_Exists(const char *logDomain)
Definition logger.c:817
int GWEN_Logger_Open(const char *logDomain, const char *ident, const char *file, GWEN_LOGGER_LOGTYPE logtype, GWEN_LOGGER_FACILITY facility)
Definition logger.c:225
void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
Definition logger.c:633
void GWEN_Logger_AddLogger(GWEN_LOGGER *oldLogger, GWEN_LOGGER *newLogger)
Definition logger.c:206
int GWEN_Logger_IsOpen(const char *logDomain)
Definition logger.c:324
void GWEN_Logger_Close(const char *logDomain)
Definition logger.c:304
GWEN_LOGGER * GWEN_Logger_new(GWEN_LOGGER_DOMAIN *domain)
Definition logger.c:169
#define GWEN_LOGDOMAIN
Definition logger.h:35
GWEN_LOGGER_LOGTYPE
Definition logger.h:43
@ GWEN_LoggerType_File
Definition logger.h:45
@ GWEN_LoggerType_Console
Definition logger.h:44
@ GWEN_LoggerType_Syslog
Definition logger.h:46
@ GWEN_LoggerType_Unknown
Definition logger.h:49
@ GWEN_LoggerType_Function
Definition logger.h:47
GWEN_LOGGER_FACILITY
Definition logger.h:53
@ GWEN_LoggerFacility_Mail
Definition logger.h:56
@ GWEN_LoggerFacility_Unknown
Definition logger.h:60
@ GWEN_LoggerFacility_News
Definition logger.h:57
@ GWEN_LoggerFacility_Daemon
Definition logger.h:55
@ GWEN_LoggerFacility_Auth
Definition logger.h:54
@ GWEN_LoggerFacility_User
Definition logger.h:58
GWEN_LOGGER_LEVEL
Definition logger.h:64
@ GWEN_LoggerLevel_Alert
Definition logger.h:66
@ GWEN_LoggerLevel_Emergency
Definition logger.h:65
@ GWEN_LoggerLevel_Unknown
Definition logger.h:75
@ GWEN_LoggerLevel_Warning
Definition logger.h:69
@ GWEN_LoggerLevel_Notice
Definition logger.h:70
@ GWEN_LoggerLevel_Debug
Definition logger.h:72
@ GWEN_LoggerLevel_Critical
Definition logger.h:67
@ GWEN_LoggerLevel_Verbous
Definition logger.h:73
@ GWEN_LoggerLevel_Info
Definition logger.h:71
@ GWEN_LoggerLevel_Error
Definition logger.h:68
void GWENHYWFAR_CB(* GWEN_LOGGERFUNCTIONLOG)(const char *s)
Definition logger.h:41
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
#define GWEN_LIST_ADD(typ, sr, head)
Definition misc.h:82
#define GWEN_LIST_INSERT(typ, sr, head)
Definition misc.h:100
#define GWEN_LIST_DEL(typ, sr, head)
Definition misc.h:116