blob: 6ce9454b650f25ce7e4813d28a0bdd4cbf28dfcc [file] [log] [blame]
Martin Minarik19e6f262012-06-07 13:08:46 +02001/*
2 * Copyright © 2012 Martin Minarik
3 *
Bryce Harringtona0bbfea2015-06-11 15:35:43 -07004 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
Martin Minarik19e6f262012-06-07 13:08:46 +020011 *
Bryce Harringtona0bbfea2015-06-11 15:35:43 -070012 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial
14 * portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
Martin Minarik19e6f262012-06-07 13:08:46 +020024 */
25
Daniel Stonec228e232013-05-22 18:03:19 +030026#include "config.h"
27
Martin Minarik19e6f262012-06-07 13:08:46 +020028#include <stdio.h>
29#include <stdarg.h>
30#include <stdlib.h>
31#include <string.h>
Martin Minarikeb587652012-06-08 20:59:53 +020032#include <sys/time.h>
Martin Minarik19e6f262012-06-07 13:08:46 +020033#include <time.h>
34
Martin Minarik19e6f262012-06-07 13:08:46 +020035#include <wayland-util.h>
36
Pekka Paalanen3d5d9472019-03-28 16:28:47 +020037#include <libweston/libweston.h>
Martin Minarik19e6f262012-06-07 13:08:46 +020038
Marius Vlad35ff4a82019-06-28 14:08:24 +030039/**
40 * \defgroup wlog weston-logging
41 */
42
Matt Hoosier74742e02018-05-04 09:26:34 -050043static int
44default_log_handler(const char *fmt, va_list ap);
45
Marius Vlad35ff4a82019-06-28 14:08:24 +030046/** Needs to be set, defaults to default_log_handler
47 *
48 * \ingroup wlog
49 */
Matt Hoosier74742e02018-05-04 09:26:34 -050050static log_func_t log_handler = default_log_handler;
Marius Vlad35ff4a82019-06-28 14:08:24 +030051
52/** Needs to be set, defaults to default_log_handler
53 *
54 * \ingroup wlog
55 */
Matt Hoosier74742e02018-05-04 09:26:34 -050056static log_func_t log_continue_handler = default_log_handler;
57
58/** Sentinel log message handler
59 *
60 * This function is used as the default handler for log messages. It
61 * exists only to issue a noisy reminder to the user that a real handler
62 * must be installed prior to issuing logging calls. The process is
63 * immediately aborted after the reminder is printed.
64 *
65 * \param fmt The format string. Ignored.
Marius Vlada2dace22019-06-12 16:05:44 +030066 * \param ap The variadic argument list. Ignored.
Marius Vlad35ff4a82019-06-28 14:08:24 +030067 *
68 * \ingroup wlog
Matt Hoosier74742e02018-05-04 09:26:34 -050069 */
70static int
71default_log_handler(const char *fmt, va_list ap)
72{
73 fprintf(stderr, "weston_log_set_handler() must be called before using of weston_log().\n");
74 abort();
75}
Derek Foreman6bc33d62015-06-08 11:37:31 -050076
Giulio Camuffobe2b11a2016-06-02 21:48:13 +030077/** Install the log handler
78 *
79 * The given functions will be called to output text as passed to the
80 * \a weston_log and \a weston_log_continue functions.
81 *
82 * \param log The log function. This function will be called when
83 * \a weston_log is called, and should begin a new line,
84 * with user defined line headers, if any.
85 * \param cont The continue log function. This function will be called
86 * when \a weston_log_continue is called, and should append
87 * its output to the current line, without any header or
88 * other content in between.
Marius Vlad35ff4a82019-06-28 14:08:24 +030089 *
90 * \ingroup wlog
Giulio Camuffobe2b11a2016-06-02 21:48:13 +030091 */
92WL_EXPORT void
93weston_log_set_handler(log_func_t log, log_func_t cont)
Martin Minarik19e6f262012-06-07 13:08:46 +020094{
Giulio Camuffobe2b11a2016-06-02 21:48:13 +030095 log_handler = log;
96 log_continue_handler = cont;
Martin Minarik19e6f262012-06-07 13:08:46 +020097}
98
Marius Vlad35ff4a82019-06-28 14:08:24 +030099/** weston_vlog calls log_handler
100 * \ingroup wlog
101 */
Martin Minarik19e6f262012-06-07 13:08:46 +0200102WL_EXPORT int
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400103weston_vlog(const char *fmt, va_list ap)
104{
Giulio Camuffobe2b11a2016-06-02 21:48:13 +0300105 return log_handler(fmt, ap);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400106}
107
Marius Vlad35ff4a82019-06-28 14:08:24 +0300108/** printf() equivalent in weston compositor.
109 *
110 * \rststar
111 * .. note::
112 *
113 * Needs :var:`log_handler` to be set-up!
114 * \endrststar
115 *
116 * \ingroup wlog
117 */
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400118WL_EXPORT int
Martin Minarik19e6f262012-06-07 13:08:46 +0200119weston_log(const char *fmt, ...)
120{
121 int l;
122 va_list argp;
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400123
Martin Minarik19e6f262012-06-07 13:08:46 +0200124 va_start(argp, fmt);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400125 l = weston_vlog(fmt, argp);
Martin Minarik19e6f262012-06-07 13:08:46 +0200126 va_end(argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400127
Martin Minarik19e6f262012-06-07 13:08:46 +0200128 return l;
129}
130
Marius Vlad35ff4a82019-06-28 14:08:24 +0300131/** weston_vlog_continue calls log_continue_handler
132 *
133 * \ingroup wlog
134 */
Martin Minarik19e6f262012-06-07 13:08:46 +0200135WL_EXPORT int
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400136weston_vlog_continue(const char *fmt, va_list argp)
137{
Giulio Camuffobe2b11a2016-06-02 21:48:13 +0300138 return log_continue_handler(fmt, argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400139}
140
Marius Vlad35ff4a82019-06-28 14:08:24 +0300141/** weston_log_continue
142 *
143 * \ingroup wlog
144 */
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400145WL_EXPORT int
Martin Minarik19e6f262012-06-07 13:08:46 +0200146weston_log_continue(const char *fmt, ...)
147{
148 int l;
149 va_list argp;
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400150
Martin Minarik19e6f262012-06-07 13:08:46 +0200151 va_start(argp, fmt);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400152 l = weston_vlog_continue(fmt, argp);
Martin Minarik19e6f262012-06-07 13:08:46 +0200153 va_end(argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400154
Martin Minarik19e6f262012-06-07 13:08:46 +0200155 return l;
156}