|
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 |
}
|