blob: 535bcba8b7d63fb51a811fc885ee82ef35ed3717 [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
Kristian Høgsberg64eca892012-08-01 00:00:57 -040037#include "compositor.h"
Martin Minarik19e6f262012-06-07 13:08:46 +020038
39static FILE *weston_logfile = NULL;
40
Martin Minarikbae43512012-06-11 01:00:23 +020041static int cached_tm_mday = -1;
42
Martin Minarik19e6f262012-06-07 13:08:46 +020043static int weston_log_timestamp(void)
44{
Martin Minarikeb587652012-06-08 20:59:53 +020045 struct timeval tv;
46 struct tm *brokendown_time;
47 char string[128];
Martin Minarik19e6f262012-06-07 13:08:46 +020048
Martin Minarikeb587652012-06-08 20:59:53 +020049 gettimeofday(&tv, NULL);
Martin Minarik19e6f262012-06-07 13:08:46 +020050
Martin Minarikeb587652012-06-08 20:59:53 +020051 brokendown_time = localtime(&tv.tv_sec);
U. Artie Eoff1db00722014-01-15 08:24:40 -080052 if (brokendown_time == NULL)
53 return fprintf(weston_logfile, "[(NULL)localtime] ");
54
Martin Minarikbae43512012-06-11 01:00:23 +020055 if (brokendown_time->tm_mday != cached_tm_mday) {
Kristian Høgsberg9ae2f112013-06-19 09:07:28 -040056 strftime(string, sizeof string, "%Y-%m-%d %Z", brokendown_time);
57 fprintf(weston_logfile, "Date: %s\n", string);
Martin Minarikbae43512012-06-11 01:00:23 +020058
59 cached_tm_mday = brokendown_time->tm_mday;
60 }
Martin Minarik19e6f262012-06-07 13:08:46 +020061
Kristian Høgsberg9ae2f112013-06-19 09:07:28 -040062 strftime(string, sizeof string, "%H:%M:%S", brokendown_time);
63
Martin Minarikeb587652012-06-08 20:59:53 +020064 return fprintf(weston_logfile, "[%s.%03li] ", string, tv.tv_usec/1000);
Martin Minarik19e6f262012-06-07 13:08:46 +020065}
66
67static void
68custom_handler(const char *fmt, va_list arg)
69{
70 weston_log_timestamp();
71 fprintf(weston_logfile, "libwayland: ");
Martin Minarikeb587652012-06-08 20:59:53 +020072 vfprintf(weston_logfile, fmt, arg);
Martin Minarik19e6f262012-06-07 13:08:46 +020073}
74
75void
76weston_log_file_open(const char *filename)
77{
78 wl_log_set_handler_server(custom_handler);
79
Martin Minarikeb587652012-06-08 20:59:53 +020080 if (filename != NULL)
81 weston_logfile = fopen(filename, "a");
82
Martin Minarik19e6f262012-06-07 13:08:46 +020083 if (weston_logfile == NULL)
84 weston_logfile = stderr;
Martin Minarikeb587652012-06-08 20:59:53 +020085 else
86 setvbuf(weston_logfile, NULL, _IOLBF, 256);
Martin Minarik19e6f262012-06-07 13:08:46 +020087}
88
89void
90weston_log_file_close()
91{
Martin Minarikeb587652012-06-08 20:59:53 +020092 if ((weston_logfile != stderr) && (weston_logfile != NULL))
Martin Minarik19e6f262012-06-07 13:08:46 +020093 fclose(weston_logfile);
94 weston_logfile = stderr;
95}
96
97WL_EXPORT int
Kristian Høgsberg082d58c2013-06-18 01:00:27 -040098weston_vlog(const char *fmt, va_list ap)
99{
100 int l;
101
102 l = weston_log_timestamp();
103 l += vfprintf(weston_logfile, fmt, ap);
104
105 return l;
106}
107
108WL_EXPORT int
Martin Minarik19e6f262012-06-07 13:08:46 +0200109weston_log(const char *fmt, ...)
110{
111 int l;
112 va_list argp;
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400113
Martin Minarik19e6f262012-06-07 13:08:46 +0200114 va_start(argp, fmt);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400115 l = weston_vlog(fmt, argp);
Martin Minarik19e6f262012-06-07 13:08:46 +0200116 va_end(argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400117
Martin Minarik19e6f262012-06-07 13:08:46 +0200118 return l;
119}
120
121WL_EXPORT int
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400122weston_vlog_continue(const char *fmt, va_list argp)
123{
124 return vfprintf(weston_logfile, fmt, argp);
125}
126
127WL_EXPORT int
Martin Minarik19e6f262012-06-07 13:08:46 +0200128weston_log_continue(const char *fmt, ...)
129{
130 int l;
131 va_list argp;
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400132
Martin Minarik19e6f262012-06-07 13:08:46 +0200133 va_start(argp, fmt);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400134 l = weston_vlog_continue(fmt, argp);
Martin Minarik19e6f262012-06-07 13:08:46 +0200135 va_end(argp);
Kristian Høgsberg082d58c2013-06-18 01:00:27 -0400136
Martin Minarik19e6f262012-06-07 13:08:46 +0200137 return l;
138}