Blame libopensm/osm_log.c

Packit 13e616
/*
Packit 13e616
 * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
Packit 13e616
 * Copyright (c) 2002-2007 Mellanox Technologies LTD. All rights reserved.
Packit 13e616
 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
Packit 13e616
 *
Packit 13e616
 * This software is available to you under a choice of one of two
Packit 13e616
 * licenses.  You may choose to be licensed under the terms of the GNU
Packit 13e616
 * General Public License (GPL) Version 2, available from the file
Packit 13e616
 * COPYING in the main directory of this source tree, or the
Packit 13e616
 * OpenIB.org BSD license below:
Packit 13e616
 *
Packit 13e616
 *     Redistribution and use in source and binary forms, with or
Packit 13e616
 *     without modification, are permitted provided that the following
Packit 13e616
 *     conditions are met:
Packit 13e616
 *
Packit 13e616
 *      - Redistributions of source code must retain the above
Packit 13e616
 *        copyright notice, this list of conditions and the following
Packit 13e616
 *        disclaimer.
Packit 13e616
 *
Packit 13e616
 *      - Redistributions in binary form must reproduce the above
Packit 13e616
 *        copyright notice, this list of conditions and the following
Packit 13e616
 *        disclaimer in the documentation and/or other materials
Packit 13e616
 *        provided with the distribution.
Packit 13e616
 *
Packit 13e616
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit 13e616
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit 13e616
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit 13e616
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit 13e616
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit 13e616
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit 13e616
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit 13e616
 * SOFTWARE.
Packit 13e616
 *
Packit 13e616
 */
Packit 13e616
Packit 13e616
/*
Packit 13e616
 * Abstract:
Packit 13e616
 *    Implementation of osm_log_t.
Packit 13e616
 * This object represents the log file.
Packit 13e616
 * This object is part of the opensm family of objects.
Packit 13e616
 */
Packit 13e616
Packit 13e616
#if HAVE_CONFIG_H
Packit 13e616
#  include <config.h>
Packit 13e616
#endif				/* HAVE_CONFIG_H */
Packit 13e616
Packit 13e616
#include <opensm/osm_file_ids.h>
Packit 13e616
#define FILE_ID OSM_FILE_LOG_C
Packit 13e616
#include <opensm/osm_log.h>
Packit 13e616
#include <stdlib.h>
Packit 13e616
#include <stdio.h>
Packit 13e616
#include <stdarg.h>
Packit 13e616
#include <fcntl.h>
Packit 13e616
#include <sys/types.h>
Packit 13e616
#include <sys/stat.h>
Packit 13e616
#include <errno.h>
Packit 13e616
Packit 13e616
static int log_exit_count = 0;
Packit 13e616
Packit 13e616
#ifndef __WIN__
Packit 13e616
#include <sys/time.h>
Packit 13e616
#include <unistd.h>
Packit 13e616
#include <complib/cl_timer.h>
Packit 13e616
Packit 13e616
static const char *month_str[] = {
Packit 13e616
	"Jan",
Packit 13e616
	"Feb",
Packit 13e616
	"Mar",
Packit 13e616
	"Apr",
Packit 13e616
	"May",
Packit 13e616
	"Jun",
Packit 13e616
	"Jul",
Packit 13e616
	"Aug",
Packit 13e616
	"Sep",
Packit 13e616
	"Oct",
Packit 13e616
	"Nov",
Packit 13e616
	"Dec"
Packit 13e616
};
Packit 13e616
#else
Packit 13e616
void OsmReportState(IN const char *p_str);
Packit 13e616
#endif				/* ndef __WIN__ */
Packit 13e616
Packit 13e616
#ifndef __WIN__
Packit 13e616
Packit 13e616
static void truncate_log_file(osm_log_t * p_log)
Packit 13e616
{
Packit 13e616
	int fd = fileno(p_log->out_port);
Packit 13e616
	if (ftruncate(fd, 0) < 0)
Packit 13e616
		fprintf(stderr, "truncate_log_file: cannot truncate: %s\n",
Packit 13e616
			strerror(errno));
Packit 13e616
	if (lseek(fd, 0, SEEK_SET) < 0)
Packit 13e616
		fprintf(stderr, "truncate_log_file: cannot rewind: %s\n",
Packit 13e616
			strerror(errno));
Packit 13e616
	p_log->count = 0;
Packit 13e616
}
Packit 13e616
Packit 13e616
#else				/* Windows */
Packit 13e616
Packit 13e616
static void truncate_log_file(osm_log_t * p_log)
Packit 13e616
{
Packit 13e616
	int fd = _fileno(p_log->out_port);
Packit 13e616
	HANDLE hFile = (HANDLE) _get_osfhandle(fd);
Packit 13e616
Packit 13e616
	if (_lseek(fd, 0, SEEK_SET) < 0)
Packit 13e616
		fprintf(stderr, "truncate_log_file: cannot rewind: %s\n",
Packit 13e616
			strerror(errno));
Packit 13e616
	SetEndOfFile(hFile);
Packit 13e616
	p_log->count = 0;
Packit 13e616
}
Packit 13e616
#endif				/* ndef __WIN__ */
Packit 13e616
Packit 13e616
void osm_log(IN osm_log_t * p_log, IN osm_log_level_t verbosity,
Packit 13e616
	     IN const char *p_str, ...)
Packit 13e616
{
Packit 13e616
	char buffer[LOG_ENTRY_SIZE_MAX];
Packit 13e616
	va_list args;
Packit 13e616
	int ret;
Packit 13e616
#ifdef __WIN__
Packit 13e616
	SYSTEMTIME st;
Packit 13e616
	uint32_t pid = GetCurrentThreadId();
Packit 13e616
#else
Packit 13e616
	pid_t pid;
Packit 13e616
	time_t tim;
Packit 13e616
	struct tm result;
Packit 13e616
	uint64_t time_usecs;
Packit 13e616
	uint32_t usecs;
Packit 13e616
#endif				/* __WIN__ */
Packit 13e616
Packit 13e616
	/* If this is a call to syslog - always print it */
Packit 13e616
	if (!(verbosity & p_log->level))
Packit 13e616
		return;
Packit 13e616
Packit 13e616
	va_start(args, p_str);
Packit 13e616
#ifndef __WIN__
Packit 13e616
	if (p_log->log_prefix == NULL)
Packit 13e616
		vsprintf(buffer, p_str, args);
Packit 13e616
	else {
Packit 13e616
		int n = snprintf(buffer, sizeof(buffer), "%s: ", p_log->log_prefix);
Packit 13e616
		vsprintf(buffer + n, p_str, args);
Packit 13e616
	}
Packit 13e616
#else
Packit 13e616
	if (p_log->log_prefix == NULL)
Packit 13e616
		_vsnprintf(buffer, 1024, (LPSTR)p_str, args);
Packit 13e616
	else {
Packit 13e616
		int n = snprintf(buffer, sizeof(buffer), "%s: ", p_log->log_prefix);
Packit 13e616
		_vsnprintf(buffer + n, (1024 - n), (LPSTR)p_str, args);
Packit 13e616
	}
Packit 13e616
#endif
Packit 13e616
	va_end(args);
Packit 13e616
Packit 13e616
	/* this is a call to the syslog */
Packit 13e616
	if (verbosity & OSM_LOG_SYS) {
Packit 13e616
		syslog(LOG_INFO, "%s\n", buffer);
Packit 13e616
Packit 13e616
		/* SYSLOG should go to stdout too */
Packit 13e616
		if (p_log->out_port != stdout) {
Packit 13e616
			printf("%s\n", buffer);
Packit 13e616
			fflush(stdout);
Packit 13e616
		}
Packit 13e616
#ifdef __WIN__
Packit 13e616
		OsmReportState(buffer);
Packit 13e616
#endif				/* __WIN__ */
Packit 13e616
	}
Packit 13e616
Packit 13e616
	/* regular log to default out_port */
Packit 13e616
	cl_spinlock_acquire(&p_log->lock);
Packit 13e616
Packit 13e616
	if (p_log->max_size && p_log->count > p_log->max_size) {
Packit 13e616
		/* truncate here */
Packit 13e616
		fprintf(stderr,
Packit 13e616
			"osm_log: log file exceeds the limit %lu. Truncating.\n",
Packit 13e616
			p_log->max_size);
Packit 13e616
		truncate_log_file(p_log);
Packit 13e616
	}
Packit 13e616
#ifdef __WIN__
Packit 13e616
	GetLocalTime(&st);
Packit 13e616
_retry:
Packit 13e616
	ret =
Packit 13e616
	    fprintf(p_log->out_port,
Packit 13e616
		    "[%02d:%02d:%02d:%03d][%04X] 0x%02x -> %s",
Packit 13e616
		    st.wHour, st.wMinute, st.wSecond, st.wMilliseconds,
Packit 13e616
		    pid, verbosity, buffer);
Packit 13e616
#else
Packit 13e616
	time_usecs = cl_get_time_stamp();
Packit 13e616
	tim = time_usecs / 1000000;
Packit 13e616
	usecs = time_usecs % 1000000;
Packit 13e616
	localtime_r(&tim, &result);
Packit 13e616
	pid = pthread_self();
Packit 13e616
_retry:
Packit 13e616
	ret =
Packit 13e616
	    fprintf(p_log->out_port,
Packit 13e616
		    "%s %02d %02d:%02d:%02d %06d [%04X] 0x%02x -> %s",
Packit 13e616
		    (result.tm_mon <
Packit 13e616
		     12 ? month_str[result.tm_mon] : "???"),
Packit 13e616
		    result.tm_mday, result.tm_hour, result.tm_min,
Packit 13e616
		    result.tm_sec, usecs, pid, verbosity, buffer);
Packit 13e616
#endif
Packit 13e616
Packit 13e616
	/*  flush log */
Packit 13e616
	if (ret > 0 &&
Packit 13e616
	    (p_log->flush || (verbosity & (OSM_LOG_ERROR | OSM_LOG_SYS)))
Packit 13e616
	    && fflush(p_log->out_port) < 0)
Packit 13e616
		ret = -1;
Packit 13e616
Packit 13e616
	if (ret >= 0) {
Packit 13e616
		log_exit_count = 0;
Packit 13e616
		p_log->count += ret;
Packit 13e616
	} else if (log_exit_count < 3) {
Packit 13e616
		log_exit_count++;
Packit 13e616
		if (errno == ENOSPC && p_log->max_size) {
Packit 13e616
			fprintf(stderr,
Packit 13e616
				"osm_log: write failed: %s. Truncating log file.\n",
Packit 13e616
				strerror(errno));
Packit 13e616
			truncate_log_file(p_log);
Packit 13e616
			goto _retry;
Packit 13e616
		}
Packit 13e616
		fprintf(stderr, "osm_log: write failed: %s\n", strerror(errno));
Packit 13e616
	}
Packit 13e616
Packit 13e616
	cl_spinlock_release(&p_log->lock);
Packit 13e616
}
Packit 13e616
Packit 13e616
void osm_log_v2(IN osm_log_t * p_log, IN osm_log_level_t verbosity,
Packit 13e616
		IN const int file_id, IN const char *p_str, ...)
Packit 13e616
{
Packit 13e616
	char buffer[LOG_ENTRY_SIZE_MAX];
Packit 13e616
	va_list args;
Packit 13e616
	int ret;
Packit 13e616
#ifdef __WIN__
Packit 13e616
	SYSTEMTIME st;
Packit 13e616
	uint32_t pid = GetCurrentThreadId();
Packit 13e616
#else
Packit 13e616
	struct timeval tv;
Packit 13e616
	pid_t pid = 0;
Packit 13e616
	time_t tim;
Packit 13e616
	struct tm result;
Packit 13e616
	uint64_t time_usecs;
Packit 13e616
	uint32_t usecs;
Packit 13e616
#endif				/* __WIN__ */
Packit 13e616
Packit 13e616
	/* If this is a call to syslog - always print it */
Packit 13e616
	if (!(verbosity & p_log->level)) {
Packit 13e616
		if (!(verbosity & p_log->per_mod_log_tbl[file_id]))
Packit 13e616
			return;
Packit 13e616
	}
Packit 13e616
Packit 13e616
	va_start(args, p_str);
Packit 13e616
#ifndef __WIN__
Packit 13e616
	if (p_log->log_prefix == NULL)
Packit 13e616
		vsprintf(buffer, p_str, args);
Packit 13e616
	else {
Packit 13e616
		int n = snprintf(buffer, sizeof(buffer), "%s: ", p_log->log_prefix);
Packit 13e616
		vsprintf(buffer + n, p_str, args);
Packit 13e616
	}
Packit 13e616
#else
Packit 13e616
	if (p_log->log_prefix == NULL)
Packit 13e616
		_vsnprintf(buffer, 1024, (LPSTR)p_str, args);
Packit 13e616
	else {
Packit 13e616
		int n = snprintf(buffer, sizeof(buffer), "%s: ", p_log->log_prefix);
Packit 13e616
		_vsnprintf(buffer + n, (1024 - n), (LPSTR)p_str, args);
Packit 13e616
	}
Packit 13e616
#endif
Packit 13e616
	va_end(args);
Packit 13e616
Packit 13e616
	/* this is a call to the syslog */
Packit 13e616
	if (verbosity & OSM_LOG_SYS) {
Packit 13e616
		syslog(LOG_INFO, "%s\n", buffer);
Packit 13e616
Packit 13e616
		/* SYSLOG should go to stdout too */
Packit 13e616
		if (p_log->out_port != stdout) {
Packit 13e616
			printf("%s\n", buffer);
Packit 13e616
			fflush(stdout);
Packit 13e616
		}
Packit 13e616
#ifdef __WIN__
Packit 13e616
		OsmReportState(buffer);
Packit 13e616
#endif				/* __WIN__ */
Packit 13e616
	}
Packit 13e616
Packit 13e616
	/* regular log to default out_port */
Packit 13e616
	cl_spinlock_acquire(&p_log->lock);
Packit 13e616
Packit 13e616
	if (p_log->max_size && p_log->count > p_log->max_size) {
Packit 13e616
		/* truncate here */
Packit 13e616
		fprintf(stderr,
Packit 13e616
			"osm_log: log file exceeds the limit %lu. Truncating.\n",
Packit 13e616
			p_log->max_size);
Packit 13e616
		truncate_log_file(p_log);
Packit 13e616
	}
Packit 13e616
#ifdef __WIN__
Packit 13e616
	GetLocalTime(&st);
Packit 13e616
_retry:
Packit 13e616
	ret =
Packit 13e616
	    fprintf(p_log->out_port,
Packit 13e616
		    "[%02d:%02d:%02d:%03d][%04X] 0x%02x -> %s",
Packit 13e616
		    st.wHour, st.wMinute, st.wSecond, st.wMilliseconds,
Packit 13e616
		    pid, verbosity, buffer);
Packit 13e616
#else
Packit 13e616
	gettimeofday(&tv, NULL);
Packit 13e616
	/* Convert the time of day into a microsecond timestamp */
Packit 13e616
	time_usecs = ((uint64_t) tv.tv_sec * 1000000) + (uint64_t) tv.tv_usec;
Packit 13e616
	tim = time_usecs / 1000000;
Packit 13e616
	usecs = time_usecs % 1000000;
Packit 13e616
	localtime_r(&tim, &result);
Packit 13e616
	pid = pthread_self();
Packit 13e616
_retry:
Packit 13e616
	ret =
Packit 13e616
	    fprintf(p_log->out_port,
Packit 13e616
		    "%s %02d %02d:%02d:%02d %06d [%04X] 0x%02x -> %s",
Packit 13e616
		    (result.tm_mon <
Packit 13e616
		     12 ? month_str[result.tm_mon] : "???"),
Packit 13e616
		    result.tm_mday, result.tm_hour, result.tm_min,
Packit 13e616
		    result.tm_sec, usecs, pid, verbosity, buffer);
Packit 13e616
#endif
Packit 13e616
Packit 13e616
	/*  flush log */
Packit 13e616
	if (ret > 0 &&
Packit 13e616
	    (p_log->flush || (verbosity & (OSM_LOG_ERROR | OSM_LOG_SYS)))
Packit 13e616
	    && fflush(p_log->out_port) < 0)
Packit 13e616
		ret = -1;
Packit 13e616
Packit 13e616
	if (ret >= 0) {
Packit 13e616
		log_exit_count = 0;
Packit 13e616
		p_log->count += ret;
Packit 13e616
	} else if (log_exit_count < 3) {
Packit 13e616
		log_exit_count++;
Packit 13e616
		if (errno == ENOSPC && p_log->max_size) {
Packit 13e616
			fprintf(stderr,
Packit 13e616
				"osm_log: write failed: %s. Truncating log file.\n",
Packit 13e616
				strerror(errno));
Packit 13e616
			truncate_log_file(p_log);
Packit 13e616
			goto _retry;
Packit 13e616
		}
Packit 13e616
		fprintf(stderr, "osm_log: write failed: %s\n", strerror(errno));
Packit 13e616
	}
Packit 13e616
Packit 13e616
	cl_spinlock_release(&p_log->lock);
Packit 13e616
}
Packit 13e616
Packit 13e616
void osm_log_raw(IN osm_log_t * p_log, IN osm_log_level_t verbosity,
Packit 13e616
		 IN const char *p_buf)
Packit 13e616
{
Packit 13e616
	if (p_log->level & verbosity) {
Packit 13e616
		cl_spinlock_acquire(&p_log->lock);
Packit 13e616
		printf("%s", p_buf);
Packit 13e616
		cl_spinlock_release(&p_log->lock);
Packit 13e616
Packit 13e616
		/*
Packit 13e616
		   Flush log on errors too.
Packit 13e616
		 */
Packit 13e616
		if (p_log->flush || (verbosity & OSM_LOG_ERROR))
Packit 13e616
			fflush(stdout);
Packit 13e616
	}
Packit 13e616
}
Packit 13e616
Packit 13e616
void osm_log_msg_box(IN osm_log_t * log, osm_log_level_t level,
Packit 13e616
		     const char *func_name, const char *msg)
Packit 13e616
{
Packit 13e616
#define MSG_BOX_LENGTH 66
Packit 13e616
	char buf[MSG_BOX_LENGTH + 1];
Packit 13e616
	int i, n;
Packit 13e616
Packit 13e616
	if (!osm_log_is_active(log, level))
Packit 13e616
		return;
Packit 13e616
Packit 13e616
	n = (MSG_BOX_LENGTH - strlen(msg)) / 2 - 1;
Packit 13e616
	if (n < 0)
Packit 13e616
		n = 0;
Packit 13e616
	for (i = 0; i < n; i++)
Packit 13e616
		sprintf(buf + i, "*");
Packit 13e616
	n += snprintf(buf + n, sizeof(buf) - n, " %s ", msg);
Packit 13e616
	for (i = n; i < MSG_BOX_LENGTH; i++)
Packit 13e616
		buf[i] = '*';
Packit 13e616
	buf[i] = '\0';
Packit 13e616
Packit 13e616
	osm_log(log, level, "%s:\n\n\n"
Packit 13e616
		"*********************************************"
Packit 13e616
		"*********************\n%s\n"
Packit 13e616
		"*********************************************"
Packit 13e616
		"*********************\n\n\n", func_name, buf);
Packit 13e616
}
Packit 13e616
Packit 13e616
void osm_log_msg_box_v2(IN osm_log_t * log, osm_log_level_t level,
Packit 13e616
			const int file_id, const char *func_name,
Packit 13e616
			const char *msg)
Packit 13e616
{
Packit 13e616
#define MSG_BOX_LENGTH 66
Packit 13e616
	char buf[MSG_BOX_LENGTH + 1];
Packit 13e616
	int i, n;
Packit 13e616
Packit 13e616
	if (!osm_log_is_active_v2(log, level, file_id))
Packit 13e616
		return;
Packit 13e616
Packit 13e616
	n = (MSG_BOX_LENGTH - strlen(msg)) / 2 - 1;
Packit 13e616
	if (n < 0)
Packit 13e616
		n = 0;
Packit 13e616
	for (i = 0; i < n; i++)
Packit 13e616
		sprintf(buf + i, "*");
Packit 13e616
	n += snprintf(buf + n, sizeof(buf) - n, " %s ", msg);
Packit 13e616
	for (i = n; i < MSG_BOX_LENGTH; i++)
Packit 13e616
		buf[i] = '*';
Packit 13e616
	buf[i] = '\0';
Packit 13e616
Packit 13e616
	osm_log_v2(log, level, file_id, "%s:\n\n\n"
Packit 13e616
		   "*********************************************"
Packit 13e616
		   "*********************\n%s\n"
Packit 13e616
		   "*********************************************"
Packit 13e616
		   "*********************\n\n\n", func_name, buf);
Packit 13e616
}
Packit 13e616
Packit 13e616
boolean_t osm_is_debug(void)
Packit 13e616
{
Packit 13e616
#if defined( _DEBUG_ )
Packit 13e616
	return TRUE;
Packit 13e616
#else
Packit 13e616
	return FALSE;
Packit 13e616
#endif				/* defined( _DEBUG_ ) */
Packit 13e616
}
Packit 13e616
Packit 13e616
static int open_out_port(IN osm_log_t * p_log)
Packit 13e616
{
Packit 13e616
	struct stat st;
Packit 13e616
Packit 13e616
	if (p_log->accum_log_file)
Packit 13e616
		p_log->out_port = fopen(p_log->log_file_name, "a+");
Packit 13e616
	else
Packit 13e616
		p_log->out_port = fopen(p_log->log_file_name, "w+");
Packit 13e616
Packit 13e616
	if (!p_log->out_port) {
Packit 13e616
		syslog(LOG_CRIT, "Cannot open file \'%s\' for %s: %s\n",
Packit 13e616
		       p_log->log_file_name,
Packit 13e616
		       p_log->accum_log_file ? "appending" : "writing",
Packit 13e616
		       strerror(errno));
Packit 13e616
		fprintf(stderr, "Cannot open file \'%s\': %s\n",
Packit 13e616
			p_log->log_file_name, strerror(errno));
Packit 13e616
		return -1;
Packit 13e616
	}
Packit 13e616
Packit 13e616
	if (fstat(fileno(p_log->out_port), &st) == 0)
Packit 13e616
		p_log->count = st.st_size;
Packit 13e616
Packit 13e616
	syslog(LOG_NOTICE, "%s log file opened\n", p_log->log_file_name);
Packit 13e616
Packit 13e616
	if (p_log->daemon) {
Packit 13e616
		dup2(fileno(p_log->out_port), 0);
Packit 13e616
		dup2(fileno(p_log->out_port), 1);
Packit 13e616
		dup2(fileno(p_log->out_port), 2);
Packit 13e616
	}
Packit 13e616
Packit 13e616
	return 0;
Packit 13e616
}
Packit 13e616
Packit 13e616
int osm_log_reopen_file(osm_log_t * p_log)
Packit 13e616
{
Packit 13e616
	int ret;
Packit 13e616
Packit 13e616
	if (p_log->out_port == stdout || p_log->out_port == stderr)
Packit 13e616
		return 0;
Packit 13e616
	cl_spinlock_acquire(&p_log->lock);
Packit 13e616
	fclose(p_log->out_port);
Packit 13e616
	ret = open_out_port(p_log);
Packit 13e616
	cl_spinlock_release(&p_log->lock);
Packit 13e616
	return ret;
Packit 13e616
}
Packit 13e616
Packit 13e616
ib_api_status_t osm_log_init_v2(IN osm_log_t * p_log, IN boolean_t flush,
Packit 13e616
				IN uint8_t log_flags, IN const char *log_file,
Packit 13e616
				IN unsigned long max_size,
Packit 13e616
				IN boolean_t accum_log_file)
Packit 13e616
{
Packit 13e616
	p_log->level = log_flags | OSM_LOG_SYS;
Packit 13e616
	p_log->flush = flush;
Packit 13e616
	p_log->count = 0;
Packit 13e616
	p_log->max_size = max_size << 20; /* convert size in MB to bytes */
Packit 13e616
	p_log->accum_log_file = accum_log_file;
Packit 13e616
	p_log->log_file_name = (char *)log_file;
Packit 13e616
	memset(p_log->per_mod_log_tbl, 0, sizeof(p_log->per_mod_log_tbl));
Packit 13e616
Packit 13e616
	openlog("OpenSM", LOG_CONS | LOG_PID, LOG_USER);
Packit 13e616
Packit 13e616
	if (log_file == NULL || !strcmp(log_file, "-") ||
Packit 13e616
	    !strcmp(log_file, "stdout"))
Packit 13e616
		p_log->out_port = stdout;
Packit 13e616
	else if (!strcmp(log_file, "stderr"))
Packit 13e616
		p_log->out_port = stderr;
Packit 13e616
	else if (open_out_port(p_log))
Packit 13e616
		return IB_ERROR;
Packit 13e616
Packit 13e616
	if (cl_spinlock_init(&p_log->lock) == CL_SUCCESS)
Packit 13e616
		return IB_SUCCESS;
Packit 13e616
	else
Packit 13e616
		return IB_ERROR;
Packit 13e616
}
Packit 13e616
Packit 13e616
ib_api_status_t osm_log_init(IN osm_log_t * p_log, IN boolean_t flush,
Packit 13e616
			     IN uint8_t log_flags, IN const char *log_file,
Packit 13e616
			     IN boolean_t accum_log_file)
Packit 13e616
{
Packit 13e616
	return osm_log_init_v2(p_log, flush, log_flags, log_file, 0,
Packit 13e616
			       accum_log_file);
Packit 13e616
}
Packit 13e616
Packit 13e616
osm_log_level_t osm_get_log_per_module(IN osm_log_t * p_log,
Packit 13e616
				       IN const int file_id)
Packit 13e616
{
Packit 13e616
	return p_log->per_mod_log_tbl[file_id];
Packit 13e616
}
Packit 13e616
Packit 13e616
void osm_set_log_per_module(IN osm_log_t * p_log, IN const int file_id,
Packit 13e616
			    IN osm_log_level_t level)
Packit 13e616
{
Packit 13e616
	p_log->per_mod_log_tbl[file_id] = level;
Packit 13e616
}
Packit 13e616
Packit 13e616
void osm_reset_log_per_module(IN osm_log_t * p_log)
Packit 13e616
{
Packit 13e616
	memset(p_log->per_mod_log_tbl, 0, sizeof(p_log->per_mod_log_tbl));
Packit 13e616
}