1/*
2 *	Beceem WiMax USB Driver
3 *	Copyright 2010-2011 Haiku, Inc. All rights reserved.
4 *	Distributed under the terms of the MIT license.
5 *
6 *	Authors:
7 *		Alexander von Gluck, <kallisti5@unixzen.com>
8 *
9 *	Partially using:
10 *		USB Ethernet Control Model devices
11 *			(c) 2008 by Michael Lotz, <mmlr@mlotz.ch>
12 *		ASIX AX88172/AX88772/AX88178 USB 2.0 Ethernet Driver
13 *			(c) 2008 by S.Zharski, <imker@gmx.li>
14 */
15
16
17#include <lock.h> // for mutex
18
19#include "Settings.h"
20
21
22bool gTraceOn = false;
23bool gTruncateLogFile = false;
24bool gAddTimeStamp = true;
25bool gTraceFlow = false;
26static char *gLogFilePath = NULL;
27mutex gLogLock;
28
29
30static
31void create_log()
32{
33	if (gLogFilePath == NULL)
34		return;
35
36	int flags = O_WRONLY | O_CREAT | ((gTruncateLogFile) ? O_TRUNC : 0);
37	int filehandle = open(gLogFilePath, flags, 0666);
38
39	if (filehandle >= 0)
40		close(filehandle);
41
42	mutex_init(&gLogLock, DRIVER_NAME"-logging");
43}
44
45
46void load_settings()
47{
48	void *handle = load_driver_settings(DRIVER_NAME);
49	if (handle == 0)
50		return;
51
52	gTraceOn = get_driver_boolean_parameter(handle, "trace", gTraceOn, true);
53	gTraceFlow = get_driver_boolean_parameter(handle, "trace_flow",
54		gTraceFlow, true);
55	gTruncateLogFile = get_driver_boolean_parameter(handle,	"truncate_logfile",
56		gTruncateLogFile, true);
57	gAddTimeStamp = get_driver_boolean_parameter(handle, "add_timestamp",
58		gAddTimeStamp, true);
59	const char * logFilePath = get_driver_parameter(handle, "logfile",
60		NULL, "/var/log/"DRIVER_NAME".log");
61
62	if (logFilePath != NULL) {
63		gLogFilePath = strdup(logFilePath);
64	}
65
66	unload_driver_settings(handle);
67
68	create_log();
69}
70
71
72void release_settings()
73{
74	if (gLogFilePath != NULL) {
75		mutex_destroy(&gLogLock);
76		free(gLogFilePath);
77	}
78}
79
80
81void usb_beceem_trace(bool force, const char* func, const char *fmt, ...)
82{
83	if (!(force || gTraceOn)) {
84//		return;
85	}
86
87	va_list arg_list;
88	static const char *prefix = "\33[33m"DRIVER_NAME":\33[0m";
89	static char buffer[1024];
90	char *buf_ptr = buffer;
91	if (gLogFilePath == NULL) {
92		strcpy(buffer, prefix);
93		buf_ptr += strlen(prefix);
94	}
95
96	if (gAddTimeStamp) {
97		bigtime_t time = system_time();
98		uint32 msec = time / 1000;
99		uint32 sec  = msec / 1000;
100		sprintf(buf_ptr, "%02ld.%02ld.%03ld:",
101			sec / 60, sec % 60, msec % 1000);
102		buf_ptr += strlen(buf_ptr);
103	}
104
105	if (func	!= NULL) {
106		sprintf(buf_ptr, "%s::", func);
107		buf_ptr += strlen(buf_ptr);
108	}
109
110	va_start(arg_list, fmt);
111	vsprintf(buf_ptr, fmt, arg_list);
112	va_end(arg_list);
113
114	if (gLogFilePath == NULL) {
115		dprintf(buffer);
116		return;
117	}
118
119	mutex_lock(&gLogLock);
120	int filehandle = open(gLogFilePath, O_WRONLY | O_APPEND);
121
122	if (filehandle >= 0) {
123		write(filehandle, buffer, strlen(buffer));
124		close(filehandle);
125	}
126
127	mutex_unlock(&gLogLock);
128}
129
130