Blame libopensm/osm_log.c

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