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