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