xref: /haiku/src/add-ons/kernel/drivers/audio/ac97/sis7018/Settings.cpp (revision 13581b3d2a71545960b98fefebc5225b5bf29072)
1 /*
2  *	SiS 7018, Trident 4D Wave DX/NX, Acer Lab M5451 Sound Driver.
3  *	Copyright (c) 2002, 2008-2011 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 <lock.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 
16 
17 bool gTraceOn = false;
18 bool gTruncateLogFile = false;
19 bool gAddTimeStamp = true;
20 static char *gLogFilePath = NULL;
21 mutex gLogLock;
22 
23 
24 static
25 void create_log()
26 {
27 	if (gLogFilePath == NULL)
28 		return;
29 
30 	int flags = O_WRONLY | O_CREAT | ((gTruncateLogFile) ? O_TRUNC : 0);
31 	int fd = open(gLogFilePath, flags, 0666);
32 	if (fd >= 0)
33 		close(fd);
34 
35 	mutex_init(&gLogLock, DRIVER_NAME"-logging");
36 }
37 
38 
39 void load_settings()
40 {
41 	void *handle = load_driver_settings(DRIVER_NAME);
42 	if (handle == 0)
43 		return;
44 
45 	gTraceOn = get_driver_boolean_parameter(handle, "trace", gTraceOn, true);
46 	gTruncateLogFile = get_driver_boolean_parameter(handle,	"truncate_logfile",
47 						gTruncateLogFile, true);
48 	gAddTimeStamp = get_driver_boolean_parameter(handle, "add_timestamp",
49 						gAddTimeStamp, true);
50 	const char * logFilePath = get_driver_parameter(handle, "logfile",
51 						NULL, "/var/log/" DRIVER_NAME ".log");
52 	if (logFilePath != NULL) {
53 		gLogFilePath = strdup(logFilePath);
54 	}
55 
56 	unload_driver_settings(handle);
57 
58 	create_log();
59 }
60 
61 
62 void release_settings()
63 {
64 	if (gLogFilePath != NULL) {
65 		mutex_destroy(&gLogLock);
66 		free(gLogFilePath);
67 	}
68 }
69 
70 
71 void SiS7018_trace(bool force, const char* func, const char *fmt, ...)
72 {
73 	if (!(force || gTraceOn)) {
74 		return;
75 	}
76 
77 	va_list arg_list;
78 	static const char *prefix = DRIVER_NAME":";
79 	static char buffer[1024];
80 	char *buf_ptr = buffer;
81 	if (gLogFilePath == NULL) {
82 		strlcpy(buffer, prefix, sizeof(buffer));
83 		buf_ptr += strlen(prefix);
84 	}
85 
86 	if (gAddTimeStamp) {
87 		bigtime_t time	= system_time();
88 		uint32 msec		= time / 1000;
89 		uint32 sec		= msec / 1000;
90 		sprintf(buf_ptr, "%02" B_PRIu32 ".%02" B_PRIu32 ".%03" B_PRIu32 ":",
91 				sec / 60, sec % 60, msec % 1000);
92 		buf_ptr += strlen(buf_ptr);
93 	}
94 
95 	if (func	!= NULL) {
96 		sprintf(buf_ptr, "%s::", func);
97 		buf_ptr += strlen(buf_ptr);
98 	}
99 
100 	va_start(arg_list, fmt);
101 	vsprintf(buf_ptr, fmt, arg_list);
102 	va_end(arg_list);
103 
104 	if (gLogFilePath == NULL) {
105 		dprintf("%s", buffer);
106 		return;
107 	}
108 
109 	mutex_lock(&gLogLock);
110 	int fd = open(gLogFilePath, O_WRONLY | O_APPEND);
111 	if (fd >= 0) {
112 		write(fd, buffer, strlen(buffer));
113 		close(fd);
114 	}
115 	mutex_unlock(&gLogLock);
116 }
117 
118