|
Packit |
857059 |
/* BEGIN_ICS_COPYRIGHT5 ****************************************
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Copyright (c) 2015, Intel Corporation
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Redistribution and use in source and binary forms, with or without
|
|
Packit |
857059 |
modification, are permitted provided that the following conditions are met:
|
|
Packit |
857059 |
|
|
Packit |
857059 |
* Redistributions of source code must retain the above copyright notice,
|
|
Packit |
857059 |
this list of conditions and the following disclaimer.
|
|
Packit |
857059 |
* Redistributions in binary form must reproduce the above copyright
|
|
Packit |
857059 |
notice, this list of conditions and the following disclaimer in the
|
|
Packit |
857059 |
documentation and/or other materials provided with the distribution.
|
|
Packit |
857059 |
* Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
857059 |
may be used to endorse or promote products derived from this software
|
|
Packit |
857059 |
without specific prior written permission.
|
|
Packit |
857059 |
|
|
Packit |
857059 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
857059 |
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
857059 |
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
Packit |
857059 |
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
Packit |
857059 |
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit |
857059 |
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit |
857059 |
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
Packit |
857059 |
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit |
857059 |
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
Packit |
857059 |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
857059 |
|
|
Packit |
857059 |
** END_ICS_COPYRIGHT5 ****************************************/
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#include <syslog.h>
|
|
Packit |
857059 |
#include <stdarg.h>
|
|
Packit |
857059 |
#include <stdio.h>
|
|
Packit |
857059 |
#include <string.h>
|
|
Packit |
857059 |
#include <unistd.h>
|
|
Packit |
857059 |
#include <limits.h>
|
|
Packit |
857059 |
#include <stdlib.h>
|
|
Packit |
857059 |
#include "datatypes.h"
|
|
Packit |
857059 |
#include "ib_debug.h"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static int use_syslog = 0;
|
|
Packit |
857059 |
/*!
|
|
Packit |
857059 |
Very linux specific way to get the pathname when we
|
|
Packit |
857059 |
don't have access to the arglist.
|
|
Packit |
857059 |
*/
|
|
Packit |
857059 |
void
|
|
Packit |
857059 |
pgmname(char *name, size_t max)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
char procname[64];
|
|
Packit |
857059 |
char buf[PATH_MAX];
|
|
Packit |
857059 |
int len;
|
|
Packit |
857059 |
char *p;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
use_syslog = 1;
|
|
Packit |
857059 |
sprintf(procname,"/proc/%d/exe", getpid());
|
|
Packit |
857059 |
len = readlink(procname, buf, sizeof(buf));
|
|
Packit |
857059 |
if (len > 0)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
buf[len] = '\0';
|
|
Packit |
857059 |
p = strrchr(buf, '/');
|
|
Packit |
857059 |
strncpy(name, p == NULL?buf:p+1, max);
|
|
Packit |
857059 |
name[max-1] = 0;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
else
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
/* reasonable default? */
|
|
Packit |
857059 |
strncpy(name, "ibt", max);
|
|
Packit |
857059 |
name[max-1]=0;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
//static char *default_log_name = "ibt";
|
|
Packit |
857059 |
|
|
Packit |
857059 |
void IbLogPrintf(uint32 level, const char* format, ...)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
va_list args;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
va_start(args, format);
|
|
Packit |
857059 |
if (use_syslog)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
int priority;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (level & _DBG_LVL_FATAL)
|
|
Packit |
857059 |
priority = LOG_CRIT;
|
|
Packit |
857059 |
if (level & _DBG_LVL_ERROR)
|
|
Packit |
857059 |
priority = LOG_ERR;
|
|
Packit |
857059 |
else if (level & (_DBG_LVL_WARN))
|
|
Packit |
857059 |
priority = LOG_WARNING;
|
|
Packit |
857059 |
else if (! level || level & (_DBG_LVL_INFO))
|
|
Packit |
857059 |
priority = LOG_INFO;
|
|
Packit |
857059 |
else
|
|
Packit |
857059 |
priority = LOG_DEBUG;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
vsyslog(priority, format, args);
|
|
Packit |
857059 |
} else
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
vprintf(format, args);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
va_end(args);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
// Only used for direct calls to DbgOut
|
|
Packit |
857059 |
void
|
|
Packit |
857059 |
PrintUDbg(char *Message, ...)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
va_list args;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
va_start(args, Message);
|
|
Packit |
857059 |
if (use_syslog)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
vsyslog(LOG_DEBUG, Message, args);
|
|
Packit |
857059 |
} else
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
vprintf(Message, args);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
va_end(args);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
// only used for direct calls to MsgOut
|
|
Packit |
857059 |
void
|
|
Packit |
857059 |
PrintUMsg(char *Message, ...)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
va_list args;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
va_start(args, Message);
|
|
Packit |
857059 |
if (use_syslog)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
vsyslog(LOG_INFO, Message, args);
|
|
Packit |
857059 |
} else
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
vprintf(Message, args);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
va_end(args);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#include <execinfo.h>
|
|
Packit |
857059 |
void BackTrace(FILE *file)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
void *buffer[100];
|
|
Packit |
857059 |
int size;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (file && ! use_syslog)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
fprintf(file, "Stack Backtrace:\n");
|
|
Packit |
857059 |
fflush(file);
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
syslog(LOG_INFO, "Stack Backtrace:\n");
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
size = backtrace(buffer, 100);
|
|
Packit |
857059 |
if (size <= 0 || size > 100) {
|
|
Packit |
857059 |
fprintf(stderr, "unable to get backtrace\n");
|
|
Packit |
857059 |
return;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if (file && ! use_syslog)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
backtrace_symbols_fd(buffer, size, fileno(file));
|
|
Packit |
857059 |
fprintf(file, "\n");
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
char **symbols = backtrace_symbols(buffer, size);
|
|
Packit |
857059 |
int i;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
for (i=0; i
|
|
Packit |
857059 |
syslog(LOG_INFO, "%s", symbols[i]);
|
|
Packit |
857059 |
free(symbols);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
void DumpStack(void)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
BackTrace(stderr);
|
|
Packit |
857059 |
}
|