⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logging.c

📁 一个在linux下挂载ntfs文件系统的好工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * 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 + -