1 /*
2 * xtl_core.c
3 *
4 * core code including functions for generating log messages
5 *
6 * Copyright (c) 2010 Citrix
7 * Part of a generic logging interface used by various dom0 userland libraries.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation;
12 * version 2.1 of the License.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; If not, see <http://www.gnu.org/licenses/>.
21 */
22
23 #include "xentoollog.h"
24
25 #include <assert.h>
26 #include <errno.h>
27 #include <limits.h>
28
29 static const char *level_strings[XTL_NUM_LEVELS]= {
30 "[BUG:XTL_NONE]",
31 "debug", "verbose", "detail", /* normally off by default */
32 "progress", "info", "notice", /* not a problem */
33 "warning", "error", "critical" /* problems and errors */
34 };
35
xtl_level_to_string(xentoollog_level level)36 const char *xtl_level_to_string(xentoollog_level level) {
37 assert(level >= 0 && level < XTL_NUM_LEVELS);
38 return level_strings[level];
39 }
40
xtl_logv(struct xentoollog_logger * logger,xentoollog_level level,int errnoval,const char * context,const char * format,va_list al)41 void xtl_logv(struct xentoollog_logger *logger,
42 xentoollog_level level,
43 int errnoval /* or -1 */,
44 const char *context /* eg "xc", "xenstore", "xl" */,
45 const char *format /* does not contain \n */,
46 va_list al) {
47 int errno_save = errno;
48 assert(level > XTL_NONE && level < XTL_NUM_LEVELS);
49 logger->vmessage(logger,level,errnoval,context,format,al);
50 errno = errno_save;
51 }
52
xtl_log(struct xentoollog_logger * logger,xentoollog_level level,int errnoval,const char * context,const char * format,...)53 void xtl_log(struct xentoollog_logger *logger,
54 xentoollog_level level,
55 int errnoval /* or -1 */,
56 const char *context /* eg "xc", "xenstore", "xl" */,
57 const char *format /* does not contain \n */,
58 ...) {
59 va_list al;
60 va_start(al,format);
61 xtl_logv(logger,level,errnoval,context,format,al);
62 va_end(al);
63 }
64
xtl_progress(struct xentoollog_logger * logger,const char * context,const char * doing_what,unsigned long done,unsigned long total)65 void xtl_progress(struct xentoollog_logger *logger,
66 const char *context, const char *doing_what,
67 unsigned long done, unsigned long total) {
68 int percent = 0;
69
70 if (!logger->progress) return;
71
72 if ( total )
73 percent = (total < LONG_MAX/100)
74 ? (done * 100) / total
75 : done / ((total + 99) / 100);
76
77 logger->progress(logger, context, doing_what, percent, done, total);
78 }
79
xtl_logger_destroy(struct xentoollog_logger * logger)80 void xtl_logger_destroy(struct xentoollog_logger *logger) {
81 if (!logger) return;
82 logger->destroy(logger);
83 }
84
85 /*
86 * Local variables:
87 * mode: C
88 * c-file-style: "BSD"
89 * c-basic-offset: 4
90 * tab-width: 4
91 * indent-tabs-mode: nil
92 * End:
93 */
94