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