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 58void 59cl_log_event(IN const char *const name, 60 IN const cl_log_type_t type, 61 IN const char *const message, 62 IN const void *const p_data OPTIONAL, IN const uint32_t data_len) 63{ 64 int priority, i; 65 char data[CL_LOG_DATA_SIZE]; 66 char *p_buf; 67 uint8_t *p_int_data = (uint8_t *) p_data; 68 69 CL_ASSERT(name); 70 CL_ASSERT(message); 71 72 openlog(name, LOG_NDELAY | LOG_PID, LOG_USER); 73 switch (type) { 74 case CL_LOG_ERROR: 75 priority = LOG_ERR; 76 break; 77 78 case CL_LOG_WARN: 79 priority = LOG_WARNING; 80 break; 81 82 case CL_LOG_INFO: 83 default: 84 priority = LOG_INFO; 85 break; 86 } 87 88 if (p_data) { 89 CL_ASSERT(data_len); 90 if (data_len < CL_MAX_LOG_DATA) { 91 p_buf = data; 92 /* Format the data into ASCII. */ 93 for (i = 0; i < data_len; i++) { 94 sprintf(p_buf, "%02x", *p_int_data++); 95 p_buf += 2; 96 97 /* Add line break after 8 DWORDS. */ 98 if (i % 32) { 99 sprintf(p_buf++, "\n"); 100 continue; 101 } 102 103 /* Add a space between DWORDS. */ 104 if (i % 4) 105 sprintf(p_buf++, " "); 106 } 107 syslog(priority, "%s data:\n%s\n", message, p_buf); 108 } else { 109 /* The data portion is too large to log. */ 110 cl_msg_out 111 ("cl_log() - WARNING: data too large to log.\n"); 112 syslog(priority, "%s\n", message); 113 } 114 } else { 115 syslog(priority, "%s\n", message); 116 } 117 closelog(); 118} 119