blob: 911feae4ebf56f4966dedd2992c7e2a1051a130a [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>
Guillaume Champagnef1e8fc92020-01-27 20:14:29 -050038#include "weston-log-internal.h"
Martin Minarik19e6f262012-06-07 13:08:46 +020039
Marius Vlad35ff4a82019-06-28 14:08:24 +030040/**
41 * \defgroup wlog weston-logging
42 */
43
Matt Hoosier74742e02018-05-04 09:26:34 -050044static int
45default_log_handler(const char *fmt, va_list ap);
46
Marius Vlad35ff4a82019-06-28 14:08:24 +030047/** Needs to be set, defaults to default_log_handler
48 *
49 * \ingroup wlog
50 */
Matt Hoosier74742e02018-05-04 09:26:34 -050051static log_func_t log_handler = default_log_handler;
Marius Vlad35ff4a82019-06-28 14:08:24 +030052
53/** Needs to be set, defaults to default_log_handler
54 *
55 * \ingroup wlog
56 */
Matt Hoosier74742e02018-05-04 09:26:34 -050057static log_func_t log_continue_handler = default_log_handler;
58
59/** Sentinel log message handler
60 *
61 * This function is used as the default handler for log messages. It
62 * exists only to issue a noisy reminder to the user that a real handler
63 * must be installed prior to issuing logging calls. The process is
64 * immediately aborted after the reminder is printed.
65 *
66 * \param fmt The format string. Ignored.
Marius Vlada2dace22019-06-12 16:05:44 +030067 * \param ap The variadic argument list. Ignored.
Marius Vlad35ff4a82019-06-28 14:08:24 +030068 *
69 * \ingroup wlog
Matt Hoosier74742e02018-05-04 09:26:34 -050070 */
71static int
72default_log_handler(const char *fmt, va_list ap)
73{
Emmanuel Gil Peyroteff793a2021-07-31 17:25:41 +020074 fprintf(stderr, "weston_log_set_handler() must be called before using of weston_log().\n");
75 abort();
Matt Hoosier74742e02018-05-04 09:26:34 -050076}
Derek Foreman6bc33d62015-06-08 11:37:31 -050077
Giulio Camuffobe2b11a2016-06-02 21:48:13 +030078/** Install the log handler
79 *
80 * The given functions will be called to output text as passed to the
81 * \a weston_log and \a weston_log_continue functions.
82 *
83 * \param log The log function. This function will be called when
84 * \a weston_log is called, and should begin a new line,
85 * with user defined line headers, if any.
86 * \param cont The continue log function. This function will be called
87 * when \a weston_log_continue is called, and should append
88 * its output to the current line, without any header or
89 * other content in between.
Marius Vlad35ff4a82019-06-28 14:08:24 +030090 *
91 * \ingroup wlog
Giulio Camuffobe2b11a2016-06-02 21:48:13 +030092 */
93WL_EXPORT void
94weston_log_set_handler(log_func_t log, log_func_t cont)
Martin Minarik19e6f262012-06-07 13:08:46 +020095{
Giulio Camuffobe2b11a2016-06-02 21:48:13 +030096 log_handler = log;
97 log_continue_handler = cont;
Martin Minarik19e6f262012-06-07 13:08:46 +020098}
99
Marius Vlad35ff4a82019-06-28 14:08:24 +0300100/** weston_vlog calls log_handler
101 * \ingroup wlog
102 */
Martin Minarik19e6f262012-06-07 13:08:46 +0200103WL_EXPORT int
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400104weston_vlog(const char *fmt, va_list ap)
105{
Giulio Camuffobe2b11a2016-06-02 21:48:13 +0300106 return log_handler(fmt, ap);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400107}
108
Marius Vlad35ff4a82019-06-28 14:08:24 +0300109/** printf() equivalent in weston compositor.
110 *
111 * \rststar
112 * .. note::
113 *
114 * Needs :var:`log_handler` to be set-up!
115 * \endrststar
116 *
117 * \ingroup wlog
118 */
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400119WL_EXPORT int
Martin Minarik19e6f262012-06-07 13:08:46 +0200120weston_log(const char *fmt, ...)
121{
122 int l;
123 va_list argp;
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400124
Martin Minarik19e6f262012-06-07 13:08:46 +0200125 va_start(argp, fmt);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400126 l = weston_vlog(fmt, argp);
Martin Minarik19e6f262012-06-07 13:08:46 +0200127 va_end(argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400128
Martin Minarik19e6f262012-06-07 13:08:46 +0200129 return l;
130}
131
Marius Vlad35ff4a82019-06-28 14:08:24 +0300132/** weston_vlog_continue calls log_continue_handler
133 *
134 * \ingroup wlog
135 */
Martin Minarik19e6f262012-06-07 13:08:46 +0200136WL_EXPORT int
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400137weston_vlog_continue(const char *fmt, va_list argp)
138{
Giulio Camuffobe2b11a2016-06-02 21:48:13 +0300139 return log_continue_handler(fmt, argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400140}
141
Marius Vlad35ff4a82019-06-28 14:08:24 +0300142/** weston_log_continue
143 *
144 * \ingroup wlog
145 */
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400146WL_EXPORT int
Martin Minarik19e6f262012-06-07 13:08:46 +0200147weston_log_continue(const char *fmt, ...)
148{
149 int l;
150 va_list argp;
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400151
Martin Minarik19e6f262012-06-07 13:08:46 +0200152 va_start(argp, fmt);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400153 l = weston_vlog_continue(fmt, argp);
Martin Minarik19e6f262012-06-07 13:08:46 +0200154 va_end(argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400155
Martin Minarik19e6f262012-06-07 13:08:46 +0200156 return l;
157}