|
Packit Service |
75d76b |
/*
|
|
Packit Service |
75d76b |
* Copyright (c) 2020 Red Hat, Inc.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* This program is free software; you can redistribute it and/or
|
|
Packit Service |
75d76b |
* modify it under the terms of the GNU General Public License
|
|
Packit Service |
75d76b |
* as published by the Free Software Foundation; either version 2
|
|
Packit Service |
75d76b |
* of the License, or (at your option) any later version.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
75d76b |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
75d76b |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
75d76b |
* GNU General Public License for more details.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
75d76b |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
75d76b |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
75d76b |
* 02110-1301, USA.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* $Id: //eng/vdo-releases/aluminum/src/c++/vdo/kernel/logger.c#4 $
|
|
Packit Service |
75d76b |
*/
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
#include "logger.h"
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
#include <linux/delay.h>
|
|
Packit Service |
75d76b |
#include <linux/hardirq.h>
|
|
Packit Service |
75d76b |
#include <linux/module.h>
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
#include "errors.h"
|
|
Packit Service |
75d76b |
#include "threadDevice.h"
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
static const int DEFAULT_PRIORITY = LOG_INFO;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
typedef struct {
|
|
Packit Service |
75d76b |
const char *name;
|
|
Packit Service |
75d76b |
const int priority;
|
|
Packit Service |
75d76b |
} PRIORITY_NAMES;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
static const PRIORITY_NAMES PRIORITIES[] = {
|
|
Packit Service |
75d76b |
{ "ALERT", LOG_ALERT },
|
|
Packit Service |
75d76b |
{ "CRIT", LOG_CRIT },
|
|
Packit Service |
75d76b |
{ "CRITICAL", LOG_CRIT },
|
|
Packit Service |
75d76b |
{ "DEBUG", LOG_DEBUG },
|
|
Packit Service |
75d76b |
{ "EMERG", LOG_EMERG },
|
|
Packit Service |
75d76b |
{ "EMERGENCY", LOG_EMERG },
|
|
Packit Service |
75d76b |
{ "ERR", LOG_ERR },
|
|
Packit Service |
75d76b |
{ "ERROR", LOG_ERR },
|
|
Packit Service |
75d76b |
{ "INFO", LOG_INFO },
|
|
Packit Service |
75d76b |
{ "NOTICE", LOG_NOTICE },
|
|
Packit Service |
75d76b |
{ "PANIC", LOG_EMERG },
|
|
Packit Service |
75d76b |
{ "WARN", LOG_WARNING },
|
|
Packit Service |
75d76b |
{ "WARNING", LOG_WARNING },
|
|
Packit Service |
75d76b |
{ NULL, -1 },
|
|
Packit Service |
75d76b |
};
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
enum {
|
|
Packit Service |
75d76b |
PRIORITY_COUNT = 8
|
|
Packit Service |
75d76b |
};
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
static const char *PRIORITY_STRINGS[] = {
|
|
Packit Service |
75d76b |
"EMERGENCY",
|
|
Packit Service |
75d76b |
"ALERT",
|
|
Packit Service |
75d76b |
"CRITICAL",
|
|
Packit Service |
75d76b |
"ERROR",
|
|
Packit Service |
75d76b |
"WARN",
|
|
Packit Service |
75d76b |
"NOTICE",
|
|
Packit Service |
75d76b |
"INFO",
|
|
Packit Service |
75d76b |
"DEBUG",
|
|
Packit Service |
75d76b |
};
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
static int logLevel = LOG_INFO;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int stringToPriority(const char *string)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
for (int i = 0; PRIORITIES[i].name != NULL; i++) {
|
|
Packit Service |
75d76b |
if (strcasecmp(string, PRIORITIES[i].name) == 0) {
|
|
Packit Service |
75d76b |
return PRIORITIES[i].priority;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
return DEFAULT_PRIORITY;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int getLogLevel(void)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
return logLevel;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void setLogLevel(int newLogLevel)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
logLevel = newLogLevel;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
const char *priorityToString(int priority)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
if ((priority < 0) || (priority >= PRIORITY_COUNT)) {
|
|
Packit Service |
75d76b |
return "unknown";
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
return PRIORITY_STRINGS[priority];
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
static const char *priorityToLogLevel(int priority)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
switch (priority) {
|
|
Packit Service |
75d76b |
case LOG_EMERG:
|
|
Packit Service |
75d76b |
case LOG_ALERT:
|
|
Packit Service |
75d76b |
case LOG_CRIT:
|
|
Packit Service |
75d76b |
return KERN_CRIT;
|
|
Packit Service |
75d76b |
case LOG_ERR:
|
|
Packit Service |
75d76b |
return KERN_ERR;
|
|
Packit Service |
75d76b |
case LOG_WARNING:
|
|
Packit Service |
75d76b |
return KERN_WARNING;
|
|
Packit Service |
75d76b |
case LOG_NOTICE:
|
|
Packit Service |
75d76b |
return KERN_NOTICE;
|
|
Packit Service |
75d76b |
case LOG_INFO:
|
|
Packit Service |
75d76b |
return KERN_INFO;
|
|
Packit Service |
75d76b |
case LOG_DEBUG:
|
|
Packit Service |
75d76b |
return KERN_DEBUG;
|
|
Packit Service |
75d76b |
default:
|
|
Packit Service |
75d76b |
return "";
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
static const char *getCurrentInterruptType(void)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
if (in_nmi()) {
|
|
Packit Service |
75d76b |
return "NMI";
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
if (in_irq()) {
|
|
Packit Service |
75d76b |
return "HI";
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
if (in_softirq()) {
|
|
Packit Service |
75d76b |
return "SI";
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
return "INTR";
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**
|
|
Packit Service |
75d76b |
* Emit a log message to the kernel log in a format suited to the current
|
|
Packit Service |
75d76b |
* thread context. Context info formats:
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* interrupt: kvdo[NMI]: blah
|
|
Packit Service |
75d76b |
* thread w/dev id: kvdo12:myprog: blah
|
|
Packit Service |
75d76b |
* kvdo thread: kvdo12:foobarQ: blah
|
|
Packit Service |
75d76b |
* other thread: kvdo: myprog: blah
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* Fields: module name, interrupt level, process name, device ID.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @param level A string describing the logging level
|
|
Packit Service |
75d76b |
* @param moduleName The name of the module doing the logging
|
|
Packit Service |
75d76b |
* @param prefix The prefix of the log message
|
|
Packit Service |
75d76b |
* @param vaf1 The first message format descriptor
|
|
Packit Service |
75d76b |
* @param vaf2 The second message format descriptor
|
|
Packit Service |
75d76b |
**/
|
|
Packit Service |
75d76b |
static void emitLogMessage(const char *level,
|
|
Packit Service |
75d76b |
const char *moduleName,
|
|
Packit Service |
75d76b |
const char *prefix,
|
|
Packit Service |
75d76b |
const struct va_format *vaf1,
|
|
Packit Service |
75d76b |
const struct va_format *vaf2)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
if (in_interrupt()) {
|
|
Packit Service |
75d76b |
printk("%s%s[%s]: %s%pV%pV\n",
|
|
Packit Service |
75d76b |
level, moduleName, getCurrentInterruptType(),
|
|
Packit Service |
75d76b |
prefix, vaf1, vaf2);
|
|
Packit Service |
75d76b |
return;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
// Not at interrupt level; we have a process we can look at, and
|
|
Packit Service |
75d76b |
// might have a device ID.
|
|
Packit Service |
75d76b |
int deviceInstance = getThreadDeviceID();
|
|
Packit Service |
75d76b |
if (deviceInstance != -1) {
|
|
Packit Service |
75d76b |
printk("%s%s%u:%s: %s%pV%pV\n",
|
|
Packit Service |
75d76b |
level, moduleName, deviceInstance, current->comm,
|
|
Packit Service |
75d76b |
prefix, vaf1, vaf2);
|
|
Packit Service |
75d76b |
return;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
if (((current->flags & PF_KTHREAD) != 0)
|
|
Packit Service |
75d76b |
&& (strncmp(moduleName, current->comm, strlen(moduleName)) == 0)) {
|
|
Packit Service |
75d76b |
/*
|
|
Packit Service |
75d76b |
* It's a kernel thread starting with "kvdo" (or whatever). Assume it's
|
|
Packit Service |
75d76b |
* ours and that its name is sufficient.
|
|
Packit Service |
75d76b |
*/
|
|
Packit Service |
75d76b |
printk("%s%s: %s%pV%pV\n",
|
|
Packit Service |
75d76b |
level, current->comm,
|
|
Packit Service |
75d76b |
prefix, vaf1, vaf2);
|
|
Packit Service |
75d76b |
return;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
// Identify the module and the process.
|
|
Packit Service |
75d76b |
printk("%s%s: %s: %s%pV%pV\n",
|
|
Packit Service |
75d76b |
level, moduleName, current->comm,
|
|
Packit Service |
75d76b |
prefix, vaf1, vaf2);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logMessagePack(int priority,
|
|
Packit Service |
75d76b |
const char *prefix,
|
|
Packit Service |
75d76b |
const char *fmt1,
|
|
Packit Service |
75d76b |
va_list args1,
|
|
Packit Service |
75d76b |
const char *fmt2,
|
|
Packit Service |
75d76b |
va_list args2)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
if (priority > getLogLevel()) {
|
|
Packit Service |
75d76b |
return;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/*
|
|
Packit Service |
75d76b |
* The kernel's printk has some magic for indirection to a secondary
|
|
Packit Service |
75d76b |
* va_list. It wants us to supply a pointer to the va_list.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* However, va_list varies across platforms and can be an array
|
|
Packit Service |
75d76b |
* type, which makes passing it around as an argument kind of
|
|
Packit Service |
75d76b |
* tricky, due to the automatic conversion to a pointer. This makes
|
|
Packit Service |
75d76b |
* taking the address of the argument a dicey thing; if we use "&a"
|
|
Packit Service |
75d76b |
* it works fine for non-array types, but for array types we get the
|
|
Packit Service |
75d76b |
* address of a pointer. Functions like va_copy and sprintf don't
|
|
Packit Service |
75d76b |
* care as they get "va_list" values passed and are written to do
|
|
Packit Service |
75d76b |
* the right thing, but printk explicitly wants the address of the
|
|
Packit Service |
75d76b |
* va_list.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* So, we copy the va_list values to ensure that "&" consistently
|
|
Packit Service |
75d76b |
* works the way we want.
|
|
Packit Service |
75d76b |
*/
|
|
Packit Service |
75d76b |
va_list args1Copy;
|
|
Packit Service |
75d76b |
va_copy(args1Copy, args1);
|
|
Packit Service |
75d76b |
va_list args2Copy;
|
|
Packit Service |
75d76b |
va_copy(args2Copy, args2);
|
|
Packit Service |
75d76b |
struct va_format vaf1 = {
|
|
Packit Service |
75d76b |
.fmt = (fmt1 != NULL) ? fmt1 : "",
|
|
Packit Service |
75d76b |
.va = &args1Copy,
|
|
Packit Service |
75d76b |
};
|
|
Packit Service |
75d76b |
struct va_format vaf2 = {
|
|
Packit Service |
75d76b |
.fmt = (fmt2 != NULL) ? fmt2 : "",
|
|
Packit Service |
75d76b |
.va = &args2Copy,
|
|
Packit Service |
75d76b |
};
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
if (prefix == NULL) {
|
|
Packit Service |
75d76b |
prefix = "";
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
emitLogMessage(priorityToLogLevel(priority), THIS_MODULE->name,
|
|
Packit Service |
75d76b |
prefix, &vaf1, &vaf2);
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_end(args1Copy);
|
|
Packit Service |
75d76b |
va_end(args2Copy);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logEmbeddedMessage(int priority,
|
|
Packit Service |
75d76b |
const char *prefix,
|
|
Packit Service |
75d76b |
const char *fmt1,
|
|
Packit Service |
75d76b |
va_list args1,
|
|
Packit Service |
75d76b |
const char *fmt2,
|
|
Packit Service |
75d76b |
...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list ap;
|
|
Packit Service |
75d76b |
va_start(ap, fmt2);
|
|
Packit Service |
75d76b |
logMessagePack(priority, prefix, fmt1, args1, fmt2, ap);
|
|
Packit Service |
75d76b |
va_end(ap);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
#pragma GCC diagnostic push
|
|
Packit Service |
75d76b |
/*
|
|
Packit Service |
75d76b |
* GCC (version 8.1.1 20180502 (Red Hat 8.1.1-1)) on Fedora 28 seems
|
|
Packit Service |
75d76b |
* to think that this function should get a printf format
|
|
Packit Service |
75d76b |
* attribute. But we have no second format string, and no additional
|
|
Packit Service |
75d76b |
* arguments at the call site, and GCC also gets unhappy trying to
|
|
Packit Service |
75d76b |
* analyze the format and values when there are none. So we'll just
|
|
Packit Service |
75d76b |
* shut it up.
|
|
Packit Service |
75d76b |
*/
|
|
Packit Service |
75d76b |
#pragma GCC diagnostic ignored "-Wsuggest-attribute=format"
|
|
Packit Service |
75d76b |
/**
|
|
Packit Service |
75d76b |
* Log a message.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* This helper function exists solely to create a valid va_list with
|
|
Packit Service |
75d76b |
* no useful info. It does the real work of vLogMessage, which wants a
|
|
Packit Service |
75d76b |
* second va_list object to pass down.
|
|
Packit Service |
75d76b |
*
|
|
Packit Service |
75d76b |
* @param priority The syslog priority value for the message.
|
|
Packit Service |
75d76b |
* @param format The format of the message (a printf style format)
|
|
Packit Service |
75d76b |
* @param args The variadic argument list of format parameters.
|
|
Packit Service |
75d76b |
**/
|
|
Packit Service |
75d76b |
static void vLogMessageHelper(int priority,
|
|
Packit Service |
75d76b |
const char *format,
|
|
Packit Service |
75d76b |
va_list args,
|
|
Packit Service |
75d76b |
...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list dummy;
|
|
Packit Service |
75d76b |
va_start(dummy, args);
|
|
Packit Service |
75d76b |
logMessagePack(priority, NULL, format, args, NULL, dummy);
|
|
Packit Service |
75d76b |
va_end(dummy);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
#pragma GCC diagnostic pop
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/*****************************************************************************/
|
|
Packit Service |
75d76b |
void vLogMessage(int priority, const char *format, va_list args)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
vLogMessageHelper(priority, format, args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logMessage(int priority, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(priority, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
__attribute__((format(printf, 2, 3)))
|
|
Packit Service |
75d76b |
static void logAtLevel(int priority, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(priority, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logDebug(const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(LOG_DEBUG, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logInfo(const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(LOG_INFO, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logNotice(const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(LOG_NOTICE, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logWarning(const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(LOG_WARNING, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logError(const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(LOG_ERR, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void vLogError(const char *format, va_list args)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
vLogMessage(LOG_ERR, format, args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logBacktrace(int priority)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
logAtLevel(priority, "[backtrace]");
|
|
Packit Service |
75d76b |
if (priority > logLevel) {
|
|
Packit Service |
75d76b |
return;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
dump_stack();
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int vLogWithStringError(int priority,
|
|
Packit Service |
75d76b |
int errnum,
|
|
Packit Service |
75d76b |
const char *format,
|
|
Packit Service |
75d76b |
va_list args)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
char errbuf[ERRBUF_SIZE] = "";
|
|
Packit Service |
75d76b |
logEmbeddedMessage(priority, NULL, format, args, ": %s (%d)",
|
|
Packit Service |
75d76b |
stringError(errnum, errbuf, sizeof(errbuf)),
|
|
Packit Service |
75d76b |
errnum);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logWithStringError(int priority, int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(priority, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logErrorWithStringError(int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_ERR, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int vLogErrorWithStringError(int errnum, const char *format, va_list args)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_ERR, errnum, format, args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logWarningWithStringError(int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_WARNING, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logDebugWithStringError(int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_DEBUG, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logInfoWithStringError(int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_INFO, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logNoticeWithStringError(int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_NOTICE, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logFatalWithStringError(int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_CRIT, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
int logUnrecoverable(int errnum, const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
if ((errnum == UDS_SUCCESS || errnum == UDS_QUEUED) || (errnum == 0)) {
|
|
Packit Service |
75d76b |
return errnum;
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogWithStringError(LOG_CRIT, errnum, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
return makeUnrecoverable(errnum);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void logFatal(const char *format, ...)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
va_list args;
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
va_start(args, format);
|
|
Packit Service |
75d76b |
vLogMessage(LOG_CRIT, format, args);
|
|
Packit Service |
75d76b |
va_end(args);
|
|
Packit Service |
75d76b |
}
|
|
Packit Service |
75d76b |
|
|
Packit Service |
75d76b |
/**********************************************************************/
|
|
Packit Service |
75d76b |
void pauseForLogger(void)
|
|
Packit Service |
75d76b |
{
|
|
Packit Service |
75d76b |
// Hopefully, a few milliseconds of sleep will be large enough
|
|
Packit Service |
75d76b |
// for the kernel log buffer to be flushed.
|
|
Packit Service |
75d76b |
msleep(4);
|
|
Packit Service |
75d76b |
}
|