gwenhywfar 5.12.0
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 lg->logType=logtype;
236
237 GWEN_Logger_SetIdent(logDomain, ident);
238 GWEN_Logger_SetFilename(logDomain, file);
239
240 if (logtype==GWEN_LoggerType_File) {
241 /* logging to a file */
242 if (file==0) {
243 lg->logType=GWEN_LoggerType_Console;
244 lg->enabled=1;
245 fprintf(stderr, "LOGGER: No filename given, will log to console.\n");
246 }
247 else {
248 lg->logType=GWEN_LoggerType_File;
249 lg->enabled=1;
250 }
251 }
252#ifdef HAVE_SYSLOG_H
253 else if (logtype==GWEN_LoggerType_Syslog) {
254 /* caller wants to log via syslog */
255 int fac;
256
257 switch (facility) {
259 fac=LOG_AUTH;
260 break;
262 fac=LOG_DAEMON;
263 break;
265 fac=LOG_MAIL;
266 break;
268 fac=LOG_NEWS;
269 break;
272 default:
273 fac=LOG_USER;
274 break;
275 }
276
277 openlog(ident,
278 LOG_CONS |
279 LOG_PID,
280 fac);
281 lg->enabled=1;
282 } /* if syslog */
283#endif /* ifdef HAVE_SYSLOG_H */
284
285 else {
286 /* console or function */
287 lg->enabled=1;
288 }
289
290 lg->open=1;
291
292 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "started");
293 return 0;
294}
295
296
297
298void GWEN_Logger_Close(const char *logDomain)
299{
300 GWEN_LOGGER *lg;
301
302 lg=GWEN_LoggerDomain_GetLogger(logDomain);
303 assert(lg);
304 GWEN_Logger_Log(logDomain, GWEN_LoggerLevel_Debug, "stopped");
305 lg->logType=GWEN_LoggerType_Console;
306 lg->enabled=0;
307#ifdef HAVE_SYSLOG_H
308 closelog();
309#endif
310 lg->open=0;
311 /* remove logdomain after it has been closed */
312 GWEN_LoggerDomain_Del(lg->domain);
313 GWEN_LoggerDomain_free(lg->domain);
314}
315
316
317
318int GWEN_Logger_IsOpen(const char *logDomain)
319{
320 GWEN_LOGGER_DOMAIN *ld;
321
322 if (!logDomain)
323 logDomain="default";
324 ld=GWEN_LoggerDomain_Find(logDomain);
325 if (ld)
326 return ld->logger->open;
327 return 0;
328}
329
330
331int GWEN_Logger__CreateMessage(GWEN_LOGGER *lg,
332 GWEN_LOGGER_LEVEL priority, const char *s,
333 GWEN_BUFFER *mbuf)
334{
335#ifdef HAVE_SNPRINTF
336 unsigned int i;
337#endif /* HAVE_SNPRINTF */
338#ifdef HAVE_TIME_H
339 struct tm *t;
340 time_t tt;
341#endif /* HAVE_TIME_H */
342 char buffer[256];
343
344 assert(lg);
345 if (lg->logIdent) {
346 if (strlen(lg->logIdent)+32>=sizeof(buffer)) {
347 fprintf(stderr, " LOGGER: Logbuffer too small (1).\n");
348 return 1;
349 }
350 }
351
352#ifdef HAVE_TIME_H
353 tt=time(0);
354 t=localtime(&tt);
355
356# ifdef HAVE_SNPRINTF
357# ifdef HAVE_GETPID
358 i=snprintf(buffer, sizeof(buffer)-1,
359 "%d:%04d/%02d/%02d %02d-%02d-%02d:%s(%d):", priority,
360 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
361 t->tm_hour, t->tm_min, t->tm_sec,
362 lg->logIdent, (int)getpid());
363# else
364 i=snprintf(buffer, sizeof(buffer)-1,
365 "%d:%04d/%02d/%02d %02d-%02d-%02d:%s:", 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);
369# endif /* HAVE_GETPID */
370 if (i>=sizeof(buffer)) {
371 fprintf(stderr, " LOGGER: Logbuffer too small (2).\n");
372 return 1;
373 }
374# else /* HAVE_SNPRINTF */
375# ifdef HAVE_GETPID
376 sprintf(buffer, "%d:%04d/%02d/%02d %02d-%02d-%02d:%s(%d):", priority,
377 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
378 t->tm_hour, t->tm_min, t->tm_sec,
379 lg->logIdent, (int)getpid());
380# else
381 sprintf(buffer, "%d:%04d/%02d/%02d %02d-%02d-%02d:%s:", priority,
382 t->tm_year+1900, t->tm_mon+1, t->tm_mday,
383 t->tm_hour, t->tm_min, t->tm_sec,
384 lg->logIdent);
385# endif /* HAVE_GETPID */
386# endif /* HAVE_SNPRINTF */
387#else /* HAVE_TIME_H */
388# ifdef HAVE_SNPRINTF
389 buffer[sizeof(buffer)-1]=0;
390 i=snprintf(buffer, sizeof(buffer)-1,
391 "%d:%s:", priority,
392 lg->logIdent);
393 if (i>=sizeof(buffer)) {
394 fprintf(stderr, " LOGGER: Logbuffer too small (3).\n");
395 return 1;
396 }
397# else /* HAVE_SNPRINTF */
398 sprintf(buffer, "%d:%s:", priority,
399 lg->logIdent);
400# endif /* HAVE_SNPRINTF */
401#endif /* HAVE_TIME_H */
402 GWEN_Buffer_AppendString(mbuf, buffer);
404 GWEN_Buffer_AppendByte(mbuf, '\n');
405 return 0;
406}
407
408
409
410int GWEN_Logger_CreateLogMessage(const char *logDomain,
411 GWEN_LOGGER_LEVEL priority, const char *s,
412 GWEN_BUFFER *mbuf)
413{
414 GWEN_LOGGER *lg;
415
416 lg=GWEN_LoggerDomain_GetLogger(logDomain);
417 assert(lg);
418
419 return GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
420}
421
422
423
424int GWEN_Logger__Log(GWEN_LOGGER *lg,
425 GWEN_LOGGER_LEVEL priority, const char *s)
426{
427 while (lg) {
428 FILE *f;
429#ifdef HAVE_SYSLOG_H
430 int pri;
431#endif /* HAVE_SYSLOG_H */
432 GWEN_BUFFER *mbuf;
433 int rv;
434
435 assert(lg);
436 if (priority>lg->logLevel)
437 /* priority too low, don't log */
438 return 0;
439
440 mbuf=GWEN_Buffer_new(0, 256, 0, 1);
441 switch (lg->logType) {
443 rv=GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
444 if (rv) {
445 GWEN_Buffer_free(mbuf);
446 return rv;
447 }
448
449 f=fopen(lg->logFile, "a+");
450 if (f==0) {
451 fprintf(stderr,
452 "LOGGER: Unable to open file \"%s\" (%s)\n",
453 lg->logFile,
454 strerror(errno));
455 lg->logType=GWEN_LoggerType_Console;
456 GWEN_Buffer_free(mbuf);
457 return 1;
458 }
459
460 if (fwrite(GWEN_Buffer_GetStart(mbuf),
461 GWEN_Buffer_GetUsedBytes(mbuf), 1, f)!=1) {
462 fprintf(stderr,
463 "LOGGER: Unable to write to file \"%s\" (%s)\n",
464 lg->logFile,
465 strerror(errno));
466 fclose(f);
467 lg->logType=GWEN_LoggerType_Console;
468 GWEN_Buffer_free(mbuf);
469 return 1;
470 }
471 if (fclose(f)) {
472 fprintf(stderr,
473 "LOGGER: Unable to close file \"%s\" (%s)\n",
474 lg->logFile,
475 strerror(errno));
476 lg->logType=GWEN_LoggerType_Console;
477 GWEN_Buffer_free(mbuf);
478 return 1;
479 }
480 break;
481
482#ifdef HAVE_SYSLOG_H
484 switch (priority) {
486 pri=LOG_EMERG;
487 break;
489 pri=LOG_ALERT;
490 break;
492 pri=LOG_CRIT;
493 break;
495 pri=LOG_ERR;
496 break;
498 pri=LOG_WARNING;
499 break;
501 pri=LOG_NOTICE;
502 break;
504 pri=LOG_NOTICE;
505 break;
506
510 default:
511 pri=LOG_DEBUG;
512 break;
513 } /* switch */
514 syslog(pri, "%s", s);
515 break;
516#endif /* HAVE_SYSLOG_H */
517
519 if (lg->logFunction==0) {
520 fprintf(stderr,
521 "LOGGER: Logtype is \"Function\", but no function is set.\n");
522 GWEN_Buffer_free(mbuf);
523 return 1;
524 }
525 rv=GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
526 if (rv) {
527 GWEN_Buffer_free(mbuf);
528 return rv;
529 }
530 (lg->logFunction)(GWEN_Buffer_GetStart(mbuf));
531 break;
532
535 default:
536 rv=GWEN_Logger__CreateMessage(lg, priority, s, mbuf);
537 if (rv) {
538 GWEN_Buffer_free(mbuf);
539 return rv;
540 }
541
542 fprintf(stderr, "%s", GWEN_Buffer_GetStart(mbuf));
543 break;
544 } /* switch */
545 lg=lg->next;
546 GWEN_Buffer_free(mbuf);
547 } /* while lg */
548 return 0;
549}
550
551
552
553void GWEN_Logger_Log(const char *logDomain,
554 GWEN_LOGGER_LEVEL priority, const char *s)
555{
556 if (!GWEN_Gui_LogHook(logDomain, priority, s)) {
557 const char *p;
558 /*int rv;*/
559 unsigned int i;
560 GWEN_BUFFER *mbuf;
561 GWEN_LOGGER *lg;
562
563 lg=GWEN_LoggerDomain_GetLogger(logDomain);
564 assert(lg);
565
566 if (!lg->enabled)
567 return /*1*/;
568
569 if (priority>lg->logLevel)
570 /* priority too low, don't log */
571 return /*0*/;
572
573 /* temporarily disable logging to avoid endless loops */
574 lg->enabled=0;
575 /* copy buffer, exchange all newlines by 0 */
576 mbuf=GWEN_Buffer_new(0, strlen(s)+1, 0, 1);
577 for (i=0; i<strlen(s)+1; i++) {
578 if (s[i]=='\n') {
579 GWEN_Buffer_AppendByte(mbuf, 0);
580 }
581 else
582 GWEN_Buffer_AppendByte(mbuf, s[i]);
583 }
584
585 /* now log each line */
586 /*rv=0;*/
587 p=GWEN_Buffer_GetStart(mbuf);
588 while (*p) {
589 GWEN_Logger__Log(lg, priority, p);
590 while (*p)
591 p++;
592 p++;
593 }
594 GWEN_Buffer_free(mbuf);
595 /* reenable logging */
596 lg->enabled=1;
597 return /*rv*/;
598 }
599 else
600 return /*0*/;
601}
602
603
604
605void GWEN_Logger_Enable(const char *logDomain, int f)
606{
607 GWEN_LOGGER *lg;
608
609 lg=GWEN_LoggerDomain_GetLogger(logDomain);
610 assert(lg);
611 lg->enabled=f;
612}
613
614
615
616int GWEN_Logger_IsEnabled(const char *logDomain)
617{
618 GWEN_LOGGER *lg;
619
620 lg=GWEN_LoggerDomain_GetLogger(logDomain);
621 assert(lg);
622 return lg->enabled;
623}
624
625
626
627void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
628{
629 GWEN_LOGGER *lg;
630
631 lg=GWEN_LoggerDomain_GetLogger(logDomain);
632 assert(lg);
633 lg->logLevel=l;
634}
635
636
637
638int GWEN_Logger_GetLevel(const char *logDomain)
639{
640 GWEN_LOGGER *lg;
641
642 lg=GWEN_LoggerDomain_GetLogger(logDomain);
643 assert(lg);
644
645 return lg->logLevel;
646}
647
648
649
650void GWEN_Logger_SetIdent(const char *logDomain, const char *id)
651{
652 GWEN_LOGGER *lg;
653
654 lg=GWEN_LoggerDomain_GetLogger(logDomain);
655 assert(lg);
656
657 free(lg->logIdent);
658 if (id)
659 lg->logIdent=strdup(id);
660 else
661 lg->logIdent=strdup("No ident, please adjust your program");
662}
663
664
665
666void GWEN_Logger_SetFilename(const char *logDomain, const char *name)
667{
668 GWEN_LOGGER *lg;
669
670 lg=GWEN_LoggerDomain_GetLogger(logDomain);
671 assert(lg);
672
673 free(lg->logFile);
674 if (name)
675 lg->logFile=strdup(name);
676 else
677 lg->logFile=strdup("");
678}
679
680
681
684{
685 GWEN_LOGGER *lg;
687
688 lg=GWEN_LoggerDomain_GetLogger(logDomain);
689 assert(lg);
690 oldFn=lg->logFunction;
691 lg->logFunction=fn;
692 return oldFn;
693}
694
695
696
698{
699 if (strcasecmp(name, "emergency")==0)
701 else if (strcasecmp(name, "alert")==0)
703 else if (strcasecmp(name, "critical")==0)
705 else if (strcasecmp(name, "error")==0)
707 else if (strcasecmp(name, "warning")==0)
709 else if (strcasecmp(name, "notice")==0)
711 else if (strcasecmp(name, "info")==0)
713 else if (strcasecmp(name, "debug")==0)
715 else if (strcasecmp(name, "verbous")==0 || strcasecmp(name, "verbose")==0)
717 else {
719 }
720}
721
722
723
725{
726 const char *s;
727
728 switch (level) {
730 s="emergency";
731 break;
733 s="alert";
734 break;
736 s="critical";
737 break;
739 s="error";
740 break;
742 s="warning";
743 break;
745 s="notice";
746 break;
748 s="info";
749 break;
751 s="debug";
752 break;
754 /* yes, we know the spelling is wrong. But it's a historic bug, fixing it would make Gwen incompatible with previous versions. */
755 s="verbous";
756 break;
758 default:
759 s="unknown";
760 break;
761 } /* switch */
762 return s;
763}
764
765
766
768{
769 if (strcasecmp(name, "console")==0)
771 else if (strcasecmp(name, "file")==0)
773 else if (strcasecmp(name, "syslog")==0)
775 else if (strcasecmp(name, "function")==0)
777 else {
779 }
780}
781
782
783
785{
786 const char *s;
787
788 switch (lt) {
790 s="console";
791 break;
793 s="file";
794 break;
796 s="syslog";
797 break;
799 s="function";
800 break;
802 default:
803 s="unknown";
804 break;
805 } /* switch */
806 return s;
807}
808
809
810
811int GWEN_Logger_Exists(const char *logDomain)
812{
813 assert(logDomain);
814 return (GWEN_LoggerDomain_Find(logDomain)!=0);
815}
816
817
818
819
820
821
822
823
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:784
const char * GWEN_Logger_Level2Name(GWEN_LOGGER_LEVEL level)
Definition logger.c:724
void GWEN_Logger_SetIdent(const char *logDomain, const char *id)
Definition logger.c:650
GWEN_LOGGER_LOGTYPE GWEN_Logger_Name2Logtype(const char *name)
Definition logger.c:767
int GWEN_Logger_ModuleFini(void)
Definition logger.c:81
GWEN_LOGGER_LEVEL GWEN_Logger_Name2Level(const char *name)
Definition logger.c:697
void GWEN_Logger_SetFilename(const char *logDomain, const char *name)
Definition logger.c:666
int GWEN_Logger_IsEnabled(const char *logDomain)
Definition logger.c:616
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:424
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:331
GWEN_LOGGERFUNCTIONLOG GWEN_Logger_SetLogFunction(const char *logDomain, GWEN_LOGGERFUNCTIONLOG fn)
Definition logger.c:682
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:410
void GWEN_Logger_Log(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition logger.c:553
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:638
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:605
void GWEN_Logger_Attach(GWEN_LOGGER *lg)
Definition logger.c:198
int GWEN_Logger_Exists(const char *logDomain)
Definition logger.c:811
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:627
void GWEN_Logger_AddLogger(GWEN_LOGGER *oldLogger, GWEN_LOGGER *newLogger)
Definition logger.c:206
int GWEN_Logger_IsOpen(const char *logDomain)
Definition logger.c:318
void GWEN_Logger_Close(const char *logDomain)
Definition logger.c:298
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