Blame source/vdo/kernel/logger.c

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
}