1 /* 2 * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. 3 * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. 4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 5 * 6 * This software is available to you under a choice of one of two 7 * licenses. You may choose to be licensed under the terms of the GNU 8 * General Public License (GPL) Version 2, available from the file 9 * COPYING in the main directory of this source tree, or the 10 * OpenIB.org BSD license below: 11 * 12 * Redistribution and use in source and binary forms, with or 13 * without modification, are permitted provided that the following 14 * conditions are met: 15 * 16 * - Redistributions of source code must retain the above 17 * copyright notice, this list of conditions and the following 18 * disclaimer. 19 * 20 * - Redistributions in binary form must reproduce the above 21 * copyright notice, this list of conditions and the following 22 * disclaimer in the documentation and/or other materials 23 * provided with the distribution. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 * SOFTWARE. 33 * 34 */ 35 36 #ifdef __WIN__ 37 #pragma warning(disable : 4996) 38 #endif 39 40 #if HAVE_CONFIG_H 41 # include <config.h> 42 #endif /* HAVE_CONFIG_H */ 43 44 #include <complib/cl_log.h> 45 #include <complib/cl_debug.h> 46 #include <syslog.h> 47 48 /* Maximum number of bytes that can be logged. */ 49 #define CL_MAX_LOG_DATA (256) 50 51 /* 52 * Size of the character buffer to allow logging the above 53 * number of bytes. A space is added after every DWORD, and 54 * a new line is added after 8 DWORDS (for a line length less than 80). 55 */ 56 #define CL_LOG_DATA_SIZE (CL_MAX_LOG_DATA + (CL_MAX_LOG_DATA/4)) 57 58 void cl_log_event(IN const char *const name, IN const cl_log_type_t type, 59 IN const char *const message, 60 IN const void *const p_data OPTIONAL, 61 IN const uint32_t data_len) 62 { 63 int priority, i; 64 char data[CL_LOG_DATA_SIZE]; 65 char *p_buf; 66 uint8_t *p_int_data = (uint8_t *) p_data; 67 68 CL_ASSERT(name); 69 CL_ASSERT(message); 70 71 openlog(name, LOG_NDELAY | LOG_PID, LOG_USER); 72 switch (type) { 73 case CL_LOG_ERROR: 74 priority = LOG_ERR; 75 break; 76 77 case CL_LOG_WARN: 78 priority = LOG_WARNING; 79 break; 80 81 case CL_LOG_INFO: 82 default: 83 priority = LOG_INFO; 84 break; 85 } 86 87 if (p_data) { 88 CL_ASSERT(data_len); 89 if (data_len < CL_MAX_LOG_DATA) { 90 p_buf = data; 91 /* Format the data into ASCII. */ 92 for (i = 0; i < data_len; i++) { 93 sprintf(p_buf, "%02x", *p_int_data++); 94 p_buf += 2; 95 96 /* Add line break after 8 DWORDS. */ 97 if (i % 32) { 98 sprintf(p_buf++, "\n"); 99 continue; 100 } 101 102 /* Add a space between DWORDS. */ 103 if (i % 4) 104 sprintf(p_buf++, " "); 105 } 106 syslog(priority, "%s data:\n%s\n", message, p_buf); 107 } else { 108 /* The data portion is too large to log. */ 109 cl_msg_out 110 ("cl_log() - WARNING: data too large to log.\n"); 111 syslog(priority, "%s\n", message); 112 } 113 } else { 114 syslog(priority, "%s\n", message); 115 } 116 closelog(); 117 } 118