]> rtime.felk.cvut.cz Git - ulut.git/blob - ulut/ul_logbase.c
added support for logging, conditional compilation of ulcintf
[ulut.git] / ulut / ul_logbase.c
1 /*******************************************************************
2   uLan Utilities Library - C library of basic reusable constructions
3
4   ul_logbase.c  - base of standard logging facility
5
6   (C) Copyright 2003 by Pavel Pisa - Originator
7
8   The uLan utilities library can be used, copied and modified under
9   next licenses
10     - GPL - GNU General Public License
11     - LGPL - GNU Lesser General Public License
12     - MPL - Mozilla Public License
13     - and other licenses added by project originators
14   Code can be modified and re-distributed under any combination
15   of the above listed licenses. If contributor does not agree with
16   some of the licenses, he/she can delete appropriate line.
17   Warning, if you delete all lines, you are not allowed to
18   distribute source code and/or binaries utilizing code.
19   
20   See files COPYING and README for details.
21
22  *******************************************************************/
23
24 #ifndef __RTL__
25
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <sys/types.h>
29 #include <stdarg.h>
30
31 #else /*__RTL__*/
32
33 #include <rtl.h>
34 #include <string.h>
35 #include <signal.h>
36 #include <posix/unistd.h>
37
38 #endif /*__RTL__*/
39
40 #include "ul_utdefs.h"
41 #include "ul_logbase.h"
42
43
44 int ul_debug_flg;
45 int ul_log_cutoff_level;   
46
47 #ifdef UL_LOG_NOINLINE
48
49 int ul_log_cond(ul_log_domain_t *domain, int level)
50 {
51   if(!domain || (level > UL_LOGL_MAX))
52     return 0;
53   return level <= domain->level;
54 }
55
56 void ul_vlog(ul_log_domain_t *domain, int level,
57         const char *format, va_list ap)
58 {
59   if(!ul_log_cond(domain,level))
60     return;
61   ul_vlog1(domain, level, format, ap);
62 }
63
64 void ul_log(ul_log_domain_t *domain, int level,
65         const char *format, ...)
66 {
67   va_list ap;
68
69   if(!ul_log_cond(domain,level))
70     return;
71   va_start (ap, format);
72   ul_vlog1(domain, level, format, ap);
73   va_end (ap);
74 }
75
76 #endif /*UL_LOG_NOINLINE*/
77
78
79 void
80 ul_log_fnc_default(ul_log_domain_t *domain, int level,
81         const char *format, va_list ap);
82
83 ul_log_fnc_t *ul_log_output;
84 #ifndef __RTL__
85 FILE *ul_log_default_file;
86 #endif /*__RTL__*/
87
88 /**
89  * ul_log - generic logging facility for ULUT library
90  * @domain: pointer to domain of debugging messages
91  * @level:  severity level
92  * @format: printf style format followed by arguments
93  *
94  * This functions is used for logging of various events.
95  * If not overridden by application, logged messages goes to the stderr.
96  * Environment variable %UL_LOG_FILENAME can be used to redirect 
97  * output to file. Environment variable %UL_DEBUG_FLG can be used
98  * to select different set of logged events through ul_debug_flg.
99  *
100  * Note: There is a global variable %ul_log_cutoff_level. 
101  * Only the messages with %level <= %ul_log_cutoff_level will be logged.
102  */           
103
104 void
105 ul_log1(ul_log_domain_t *domain, int level,
106        const char *format, ...)
107 {
108   va_list ap;
109   va_start(ap, format);
110   ul_vlog1(domain,level,format,ap);
111   va_end(ap); 
112 }
113
114 void
115 ul_vlog1(ul_log_domain_t *domain, int level,
116        const char *format, va_list ap)
117 {
118  #ifndef __RTL__
119   char *s;
120   char *log_fname;
121  #endif /*__RTL__*/
122   if(ul_log_cutoff_level) {
123       if((level & UL_LOGL_MASK) > ul_log_cutoff_level) return;
124   }
125   if(ul_log_output==NULL) {
126     ul_log_output=ul_log_fnc_default;
127    #ifndef __RTL__
128     if((log_fname=getenv("UL_LOG_FILENAME"))!=NULL){
129       ul_log_default_file=fopen(log_fname,"a");
130     }
131     if(ul_log_default_file==NULL)
132       ul_log_default_file=stderr;
133     if(!ul_debug_flg&&((s=getenv("UL_DEBUG_FLG"))!=NULL)){
134       ul_debug_flg=atoi(s);
135     }
136     if((s = getenv("UL_LOG_CUTTOFF")) != NULL) {
137         ul_log_cutoff_level = atoi(s);
138     }
139    #endif /*__RTL__*/
140   }
141   (*ul_log_output)(domain,level,format,ap);
142 }
143
144 /**
145  * ul_log_redir - redirects default log output function
146  * @log_fnc: new log output function. Value NULL resets
147  *           to default function
148  * @add_flags: some more flags
149  */
150
151 void
152 ul_log_redir(ul_log_fnc_t *log_fnc, int add_flags)
153 {
154   if(log_fnc==NULL) log_fnc=ul_log_fnc_default;
155   ul_log_output=log_fnc;
156 }
157
158 #ifndef __RTL__
159 void
160 ul_log_fnc_default(ul_log_domain_t *domain, int level,
161         const char *format, va_list ap)
162 {
163   if(!(level&UL_LOGL_CONT)) {
164     level&=UL_LOGL_MASK;
165     if(level)
166       fprintf(ul_log_default_file,"<%d>",level);
167     if(domain && domain->name)
168       fprintf(ul_log_default_file,"%s: ",domain->name);
169   }
170   vfprintf(ul_log_default_file, format, ap);
171   fflush(ul_log_default_file);
172 }
173
174
175 #else /*__RTL__*/
176 void
177 ul_log_fnc_default(ul_log_domain_t *domain, int level,
178         const char *format, va_list ap)
179 {
180   if(!(level&UL_LOGL_CONT)) {
181     level&=UL_LOGL_MASK;
182     if(level)
183       rtl_printf("<%d>",level);
184     if(domain && domain->name)
185       rtl_printf("%s: ",domain->name);
186   }
187   rtl_vprintf(format, ap);
188 }
189
190 #endif /*__RTL__*/
191