1/*
2 *	Driver for USB Audio Device Class devices.
3 *	Copyright (c) 2009-13 S.Zharski <imker@gmx.li>
4 *	Distributed under the terms of the MIT license.
5 *
6 */
7
8
9#include "Settings.h"
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14
15#include <driver_settings.h>
16#include <lock.h>
17
18#include "Driver.h"
19
20
21uint32 gTraceMask = ERR;
22bool gTruncateLogFile = false;
23bool gAddTimeStamp = true;
24static char* gLogFilePath = NULL;
25mutex gLogLock;
26
27static
28void create_log()
29{
30	if (gLogFilePath == NULL)
31		return;
32
33	int flags = O_WRONLY | O_CREAT | ((gTruncateLogFile) ? O_TRUNC : 0);
34	int fd = open(gLogFilePath, flags, 0666);
35	if (fd >= 0)
36		close(fd);
37
38	mutex_init(&gLogLock, DRIVER_NAME"-logging");
39}
40
41
42void load_settings()
43{
44	void* handle = load_driver_settings(DRIVER_NAME);
45	if (handle == 0)
46		return;
47
48	gTraceMask = strtoul(get_driver_parameter(handle, "trace", "1", "0"), 0, 0);
49	gTruncateLogFile = get_driver_boolean_parameter(handle,	"truncate_logfile",
50						gTruncateLogFile, true);
51	gAddTimeStamp = get_driver_boolean_parameter(handle, "add_timestamp",
52						gAddTimeStamp, true);
53	const char* logFilePath = get_driver_parameter(handle, "logfile",
54						NULL, "/var/log/" DRIVER_NAME ".log");
55	if (logFilePath != NULL)
56		gLogFilePath = strdup(logFilePath);
57
58	unload_driver_settings(handle);
59
60	create_log();
61}
62
63
64void release_settings()
65{
66	if (gLogFilePath != NULL) {
67		mutex_destroy(&gLogLock);
68		free(gLogFilePath);
69	}
70}
71
72
73void usb_audio_trace(uint32 bits, const char* func, const char* fmt, ...)
74{
75	if ((gTraceMask & bits) == 0)
76		return;
77
78	va_list arg_list;
79	static const char* prefix = DRIVER_NAME":";
80	static char buffer[1024];
81	char* buf_ptr = buffer;
82	if (gLogFilePath == NULL) {
83		strlcpy(buffer, prefix, sizeof(buffer));
84		buf_ptr += strlen(prefix);
85	}
86
87	if (gAddTimeStamp) {
88		bigtime_t time = system_time();
89		uint32 msec = time / 1000;
90		uint32 sec = msec / 1000;
91		sprintf(buf_ptr, "%02" B_PRIu32 ".%02" B_PRIu32 ".%03" B_PRIu32 ":",
92				sec / 60, sec % 60, msec % 1000);
93		buf_ptr += strlen(buf_ptr);
94	}
95
96	if (func	!= NULL) {
97		sprintf(buf_ptr, "%s::", func);
98		buf_ptr += strlen(buf_ptr);
99	}
100
101	va_start(arg_list, fmt);
102	vsprintf(buf_ptr, fmt, arg_list);
103	va_end(arg_list);
104
105	if (gLogFilePath == NULL) {
106		dprintf("%s", buffer);
107		return;
108	}
109
110	mutex_lock(&gLogLock);
111	int fd = open(gLogFilePath, O_WRONLY | O_APPEND);
112	if (fd >= 0) {
113		write(fd, buffer, strlen(buffer));
114		close(fd);
115	}
116	mutex_unlock(&gLogLock);
117}
118
119