gwenhywfar  5.10.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 
55 static 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 
94 GWEN_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 
106 void GWEN_LoggerDomain_free(GWEN_LOGGER_DOMAIN *ld)
107 {
108  if (ld) {
109  free(ld->name);
110  GWEN_Logger_free(ld->logger);
111  GWEN_FREE_OBJECT(ld);
112  }
113 }
114 
115 
116 GWEN_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 
133 void 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 
141 void 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 
149 GWEN_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 
169 GWEN_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 
184 void 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);
191  GWEN_FREE_OBJECT(lg);
192  }
193  }
194 }
195 
196 
197 
198 void GWEN_Logger_Attach(GWEN_LOGGER *lg)
199 {
200  assert(lg);
201  lg->usage++;
202 }
203 
204 
205 
206 void 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 
225 int 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 
298 void 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 
318 int 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 
331 int 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);
403  GWEN_Buffer_AppendString(mbuf, s);
404  GWEN_Buffer_AppendByte(mbuf, '\n');
405  return 0;
406 }
407 
408 
409 
410 int 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 
424 int 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 
553 void 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 
605 void 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 
616 int 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 
627 void 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 
638 int 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 
650 void 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 
666 void 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)
702  return GWEN_LoggerLevel_Alert;
703  else if (strcasecmp(name, "critical")==0)
705  else if (strcasecmp(name, "error")==0)
706  return GWEN_LoggerLevel_Error;
707  else if (strcasecmp(name, "warning")==0)
709  else if (strcasecmp(name, "notice")==0)
711  else if (strcasecmp(name, "info")==0)
712  return GWEN_LoggerLevel_Info;
713  else if (strcasecmp(name, "debug")==0)
714  return GWEN_LoggerLevel_Debug;
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)
772  return GWEN_LoggerType_File;
773  else if (strcasecmp(name, "syslog")==0)
774  return GWEN_LoggerType_Syslog;
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 
811 int 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 
void GWEN_Logger_SetDefaultLogger(GWEN_UNUSED GWEN_LOGGER *lg)
Definition: logger.c:217
void GWEN_Logger_AddLogger(GWEN_LOGGER *oldLogger, GWEN_LOGGER *newLogger)
Definition: logger.c:206
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
GWEN_LOGGER_FACILITY
Definition: logger.h:53
void GWENHYWFAR_CB(* GWEN_LOGGERFUNCTIONLOG)(const char *s)
Definition: logger.h:41
GWENHYWFAR_API int GWEN_Gui_LogHook(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition: gui_virtual.c:508
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
void GWEN_Logger_Attach(GWEN_LOGGER *lg)
Definition: logger.c:198
void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
Definition: logger.c:627
GWEN_LOGGER_DOMAIN * GWEN_LoggerDomain_Find(const char *name)
Definition: logger.c:116
GWEN_LOGGER_LEVEL
Definition: logger.h:64
GWEN_LOGGERFUNCTIONLOG GWEN_Logger_SetLogFunction(const char *logDomain, GWEN_LOGGERFUNCTIONLOG fn)
Definition: logger.c:682
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
const char * GWEN_Logger_Logtype2Name(GWEN_LOGGER_LOGTYPE lt)
Definition: logger.c:784
int GWEN_Logger_CreateLogMessage(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition: logger.c:410
int GWEN_Logger_IsEnabled(const char *logDomain)
Definition: logger.c:616
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_LOGGER_LEVEL GWEN_Logger_Name2Level(const char *name)
Definition: logger.c:697
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
#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:94
int GWEN_Logger_ModuleFini(void)
Definition: logger.c:81
GWEN_LOGGER * GWEN_Logger_new(GWEN_LOGGER_DOMAIN *domain)
Definition: logger.c:169
const char * GWEN_Logger_Level2Name(GWEN_LOGGER_LEVEL level)
Definition: logger.c:724
int GWEN_Logger__CreateMessage(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s, GWEN_BUFFER *mbuf)
Definition: logger.c:331
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
void GWEN_Logger_Log(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition: logger.c:553
int GWEN_Logger_Exists(const char *logDomain)
Definition: logger.c:811
void GWEN_Logger_SetFilename(const char *logDomain, const char *name)
Definition: logger.c:666
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWEN_LOGGER * GWEN_LoggerDomain_GetLogger(const char *name)
Definition: logger.c:149
GWEN_LOGGER_LOGTYPE GWEN_Logger_Name2Logtype(const char *name)
Definition: logger.c:767
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
#define GWEN_LIST_INSERT(typ, sr, head)
Definition: misc.h:100
void GWEN_Logger_Enable(const char *logDomain, int f)
Definition: logger.c:605
void GWEN_Logger_free(GWEN_LOGGER *lg)
Definition: logger.c:184
int GWEN_Logger_IsOpen(const char *logDomain)
Definition: logger.c:318
void GWEN_LoggerDomain_Del(GWEN_LOGGER_DOMAIN *ld)
Definition: logger.c:141
void GWEN_LoggerDomain_free(GWEN_LOGGER_DOMAIN *ld)
Definition: logger.c:106
int GWEN_Logger__Log(GWEN_LOGGER *lg, GWEN_LOGGER_LEVEL priority, const char *s)
Definition: logger.c:424
static GWEN_LOGGER_DOMAIN * gwen_loggerdomains
Definition: logger.c:55
int GWEN_Logger_GetLevel(const char *logDomain)
Definition: logger.c:638
#define GWEN_LIST_ADD(typ, sr, head)
Definition: misc.h:82
void GWEN_LoggerDomain_Add(GWEN_LOGGER_DOMAIN *ld)
Definition: logger.c:133
void GWEN_Logger_Close(const char *logDomain)
Definition: logger.c:298
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
int GWEN_Logger_ModuleInit(void)
Definition: logger.c:59
void GWEN_Logger_SetIdent(const char *logDomain, const char *id)
Definition: logger.c:650