📄 logging.c
字号:
/** * logging.c - Centralised logging. Part of the Linux-NTFS project. * * Copyright (c) 2005 Richard Russon * Copyright (c) 2005-2006 Szabolcs Szakacsits * * This program/include file is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program/include file is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (in the main directory of the Linux-NTFS * distribution in the file COPYING); if not, write to the Free Software * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef HAVE_STDIO_H#include <stdio.h>#endif#ifdef HAVE_ERRNO_H#include <errno.h>#endif#ifdef HAVE_STDARG_H#include <stdarg.h>#endif#ifdef HAVE_STRING_H#include <string.h>#endif#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#ifdef HAVE_SYSLOG_H#include <syslog.h>#endif#include "logging.h"#include "misc.h"#ifndef PATH_SEP#define PATH_SEP '/'#endif/* Colour prefixes and a suffix */static const char *col_green = "\e[32m";static const char *col_cyan = "\e[36m";static const char *col_yellow = "\e[01;33m";static const char *col_red = "\e[01;31m";static const char *col_redinv = "\e[01;07;31m";static const char *col_end = "\e[0m";/** * struct ntfs_logging - Control info for the logging system * @levels: Bitfield of logging levels * @flags: Flags which affect the output style * @handler: Function to perform the actual logging */struct ntfs_logging { u32 levels; u32 flags; ntfs_log_handler *handler;};/** * ntfs_log * This struct controls all the logging within the library and tools. */static struct ntfs_logging ntfs_log = {#ifdef DEBUG NTFS_LOG_LEVEL_DEBUG | NTFS_LOG_LEVEL_TRACE |#endif NTFS_LOG_LEVEL_INFO | NTFS_LOG_LEVEL_QUIET | NTFS_LOG_LEVEL_WARNING | NTFS_LOG_LEVEL_ERROR | NTFS_LOG_LEVEL_PERROR | NTFS_LOG_LEVEL_CRITICAL | NTFS_LOG_LEVEL_REASON | NTFS_LOG_LEVEL_PROGRESS, NTFS_LOG_FLAG_ONLYNAME,#ifdef DEBUG ntfs_log_handler_outerr#else ntfs_log_handler_null#endif};/** * ntfs_log_get_levels - Get a list of the current logging levels * * Find out which logging levels are enabled. * * Returns: Log levels in a 32-bit field */u32 ntfs_log_get_levels(void){ return ntfs_log.levels;}/** * ntfs_log_set_levels - Enable extra logging levels * @levels: 32-bit field of log levels to set * * Enable one or more logging levels. * The logging levels are named: NTFS_LOG_LEVEL_*. * * Returns: Log levels that were enabled before the call */u32 ntfs_log_set_levels(u32 levels){ u32 old; old = ntfs_log.levels; ntfs_log.levels |= levels; return old;}/** * ntfs_log_clear_levels - Disable some logging levels * @levels: 32-bit field of log levels to clear * * Disable one or more logging levels. * The logging levels are named: NTFS_LOG_LEVEL_*. * * Returns: Log levels that were enabled before the call */u32 ntfs_log_clear_levels(u32 levels){ u32 old; old = ntfs_log.levels; ntfs_log.levels &= (~levels); return old;}/** * ntfs_log_get_flags - Get a list of logging style flags * * Find out which logging flags are enabled. * * Returns: Logging flags in a 32-bit field */u32 ntfs_log_get_flags(void){ return ntfs_log.flags;}/** * ntfs_log_set_flags - Enable extra logging style flags * @flags: 32-bit field of logging flags to set * * Enable one or more logging flags. * The log flags are named: NTFS_LOG_LEVEL_*. * * Returns: Logging flags that were enabled before the call */u32 ntfs_log_set_flags(u32 flags){ u32 old; old = ntfs_log.flags; ntfs_log.flags |= flags; return old;}/** * ntfs_log_clear_flags - Disable some logging styles * @flags: 32-bit field of logging flags to clear * * Disable one or more logging flags. * The log flags are named: NTFS_LOG_LEVEL_*. * * Returns: Logging flags that were enabled before the call */u32 ntfs_log_clear_flags(u32 flags){ u32 old; old = ntfs_log.flags; ntfs_log.flags &= (~flags); return old;}/** * ntfs_log_get_stream - Default output streams for logging levels * @level: Log level * * By default, urgent messages are sent to "stderr". * Other messages are sent to "stdout". * * Returns: "string" Prefix to be used */static FILE * ntfs_log_get_stream(u32 level){ FILE *stream; switch (level) { case NTFS_LOG_LEVEL_INFO: case NTFS_LOG_LEVEL_QUIET: case NTFS_LOG_LEVEL_PROGRESS: case NTFS_LOG_LEVEL_VERBOSE: stream = stdout; break; case NTFS_LOG_LEVEL_DEBUG: case NTFS_LOG_LEVEL_TRACE: case NTFS_LOG_LEVEL_WARNING: case NTFS_LOG_LEVEL_ERROR: case NTFS_LOG_LEVEL_CRITICAL: case NTFS_LOG_LEVEL_PERROR: default: stream = stderr; break; } return stream;}/** * ntfs_log_get_prefix - Default prefixes for logging levels * @level: Log level to be prefixed * * Prefixing the logging output can make it easier to parse. * * Returns: "string" Prefix to be used */static const char * ntfs_log_get_prefix(u32 level){ const char *prefix; switch (level) { case NTFS_LOG_LEVEL_DEBUG: prefix = "DEBUG: "; break; case NTFS_LOG_LEVEL_TRACE: prefix = "TRACE: "; break; case NTFS_LOG_LEVEL_QUIET: prefix = "QUIET: "; break; case NTFS_LOG_LEVEL_INFO: prefix = "INFO: "; break; case NTFS_LOG_LEVEL_VERBOSE: prefix = "VERBOSE: "; break; case NTFS_LOG_LEVEL_PROGRESS: prefix = "PROGRESS: "; break; case NTFS_LOG_LEVEL_WARNING: prefix = "WARNING: "; break; case NTFS_LOG_LEVEL_ERROR: prefix = "ERROR: "; break; case NTFS_LOG_LEVEL_PERROR: prefix = "ERROR: "; break; case NTFS_LOG_LEVEL_CRITICAL: prefix = "CRITICAL: "; break; default: prefix = ""; break; } return prefix;}/** * ntfs_log_set_handler - Provide an alternate logging handler * @handler: function to perform the logging * * This alternate handler will be called for all future logging requests. * If no @handler is specified, logging will revert to the default handler. */void ntfs_log_set_handler(ntfs_log_handler *handler){ if (handler) { ntfs_log.handler = handler;#ifdef HAVE_SYSLOG_H if (handler == ntfs_log_handler_syslog) openlog("libntfs", LOG_PID, LOG_USER);#endif } else ntfs_log.handler = ntfs_log_handler_null;}/** * ntfs_log_redirect - Pass on the request to the real handler * @function: Function in which the log line occurred * @file: File in which the log line occurred * @line: Line number on which the log line occurred * @level: Level at which the line is logged * @data: User specified data, possibly specific to a handler * @format: printf-style formatting string * @...: Arguments to be formatted * * This is just a redirector function. The arguments are simply passed to the * main logging handler (as defined in the global logging struct @ntfs_log). * * Returns: -1 Error occurred * 0 Message wasn't logged * num Number of output characters */int ntfs_log_redirect(const char *function, const char *file, int line, u32 level, void *data, const char *format, ...){ int olderr = errno; int ret; va_list args; if (!(ntfs_log.levels & level)) /* Don't log this message */ return 0; va_start(args, format); errno = olderr; ret = ntfs_log.handler(function, file, line, level, data, format, args); va_end(args); errno = olderr; return ret;}/** * ntfs_log_handler_syslog - syslog logging handler * @function: Function in which the log line occurred * @file: File in which the log line occurred * @line: Line number on which the log line occurred * @level: Level at which the line is logged * @data: User specified data, possibly specific to a handler * @format: printf-style formatting string
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -