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