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

📄 oswlog.c

📁 This a good VPN source
💻 C
字号:
/* error logging functions * Copyright (C) 1997 Angelos D. Keromytis. * Copyright (C) 1998-2001  D. Hugh Redelmeier. * * This program 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.  See <http://www.fsf.org/copyleft/gpl.txt>. * * This program 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. * * RCSID $Id: oswlog.c,v 1.3 2004/10/16 23:42:13 mcr Exp $ */#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <stdarg.h>#include <syslog.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <signal.h>	/* used only if MSG_NOSIGNAL not defined */#include <sys/queue.h>#include <libgen.h>#include <sys/stat.h>#include <sys/types.h>#include <openswan.h>#include "constants.h"#include "oswlog.h"bool    log_to_stderr = TRUE,	/* should log go to stderr? */    log_to_syslog = FALSE;	/* should log go to syslog? */bool    logged_txt_warning = FALSE;  /* should we complain about finding KEY? */void openswanlib_passert_fail(const char *pred_str, const char *file_str,			      unsigned long line_no);openswan_passert_fail_t openswan_passert_fail = openswanlib_passert_fail;voidtool_init_log(void){    if (log_to_stderr)	setbuf(stderr, NULL);    if (log_to_syslog)	openlog(progname, LOG_CONS | LOG_NDELAY | LOG_PID, LOG_AUTHPRIV);}voidtool_close_log(void){    if (log_to_syslog)	closelog();}/* format a string for the log, with suitable prefixes. * A format starting with ~ indicates that this is a reprocessing * of the message, so prefixing and quoting is suppressed. */static voidfmt_log(char *buf, size_t buf_len,	const char *fmt, va_list ap){    bool reproc = *fmt == '~';    size_t ps;    buf[0] = '\0';    if (reproc)	fmt++;	/* ~ at start of format suppresses this prefix */    else if (progname != NULL)    {	/* start with name of connection */	strncat(buf, progname, buf_len);    }    ps = strlen(buf);    vsnprintf(buf + ps, buf_len - ps, fmt, ap);    if (!reproc)	(void)sanitize_string(buf, buf_len);}voidopenswan_log(const char *message, ...){    va_list args;    char m[LOG_WIDTH];	/* longer messages will be truncated */    va_start(args, message);    fmt_log(m, sizeof(m), message, args);    va_end(args);    if (log_to_stderr)	fprintf(stderr, "%s\n", m);    if (log_to_syslog)	syslog(LOG_WARNING, "%s", m);}voidopenswan_loglog(int mess_no, const char *message, ...){    va_list args;    char m[LOG_WIDTH];	/* longer messages will be truncated */    va_start(args, message);    fmt_log(m, sizeof(m), message, args);    va_end(args);    if (log_to_stderr)	fprintf(stderr, "%s\n", m);    if (log_to_syslog)	syslog(LOG_WARNING, "%s", m);}voidopenswan_log_errno_routine(int e, const char *message, ...){    va_list args;    char m[LOG_WIDTH];	/* longer messages will be truncated */    va_start(args, message);    fmt_log(m, sizeof(m), message, args);    va_end(args);    if (log_to_stderr)	fprintf(stderr, "ERROR: %s. Errno %d: %s\n", m, e, strerror(e));    if (log_to_syslog)	syslog(LOG_ERR, "ERROR: %s. Errno %d: %s", m, e, strerror(e));}voidopenswan_exit_log(const char *message, ...){    va_list args;    char m[LOG_WIDTH];	/* longer messages will be truncated */    va_start(args, message);    fmt_log(m, sizeof(m), message, args);    va_end(args);    if (log_to_stderr)	fprintf(stderr, "FATAL ERROR: %s\n", m);    if (log_to_syslog)	syslog(LOG_ERR, "FATAL ERROR: %s", m);    exit_tool(1);}voidopenswan_exit_log_errno_routine(int e, const char *message, ...){    va_list args;    char m[LOG_WIDTH];	/* longer messages will be truncated */    va_start(args, message);    fmt_log(m, sizeof(m), message, args);    va_end(args);    if (log_to_stderr)	fprintf(stderr, "FATAL ERROR: %s. Errno %d: %s\n", m, e, strerror(e));    if (log_to_syslog)	syslog(LOG_ERR, "FATAL ERROR: %s. Errno %d: %s", m, e, strerror(e));    exit_tool(1);}/* Debugging message support */#if !defined(NO_DEBUG)voidopenswan_switch_fail(int n, const char *file_str, unsigned long line_no){    char buf[30];    snprintf(buf, sizeof(buf), "case %d unexpected", n);    openswan_passert_fail(buf, file_str, line_no);}voidopenswanlib_passert_fail(const char *pred_str, const char *file_str,		      unsigned long line_no){    /* we will get a possibly unplanned prefix.  Hope it works */    openswan_loglog(RC_LOG_SERIOUS, "ASSERTION FAILED at %s:%lu: %s", file_str, line_no, pred_str);    abort();	/* exiting correctly doesn't always work */}voidopenswan_pexpect_log(const char *pred_str, const char *file_str, unsigned long line_no){    /* we will get a possibly unplanned prefix.  Hope it works */    loglog(RC_LOG_SERIOUS, "EXPECTATION FAILED at %s:%lu: %s", file_str, line_no, pred_str);}lset_t    base_debugging = DBG_NONE,	/* default to reporting nothing */    cur_debugging =  DBG_NONE;voidset_debugging(lset_t deb){    cur_debugging = deb;    pfkey_lib_debug = (cur_debugging&DBG_PFKEY ?		       PF_KEY_DEBUG_PARSE_MAX : PF_KEY_DEBUG_PARSE_NONE);}/* log a debugging message (prefixed by "| ") */voidopenswan_DBG_log(const char *message, ...){    va_list args;    char m[LOG_WIDTH];	/* longer messages will be truncated */    va_start(args, message);    vsnprintf(m, sizeof(m), message, args);    va_end(args);    /* then sanitize anything else that is left. */    (void)sanitize_string(m, sizeof(m));    if (log_to_stderr)	fprintf(stderr, "| %s\n", m);    if (log_to_syslog)	syslog(LOG_DEBUG, "| %s", m);}/* dump raw bytes in hex to stderr (for lack of any better destination) */voidopenswan_DBG_dump(const char *label, const void *p, size_t len){#   define DUMP_LABEL_WIDTH 20	/* arbitrary modest boundary */#   define DUMP_WIDTH	(4 * (1 + 4 * 3) + 1)    char buf[DUMP_LABEL_WIDTH + DUMP_WIDTH];    char *bp;    const unsigned char *cp = p;    bp = buf;    if (label != NULL && label[0] != '\0')    {	/* Handle the label.  Care must be taken to avoid buffer overrun. */	size_t llen = strlen(label);	if (llen + 1 > sizeof(buf))	{	    DBG_log("%s", label);	}	else	{	    strcpy(buf, label);	    if (buf[llen-1] == '\n')	    {		buf[llen-1] = '\0';	/* get rid of newline */		DBG_log("%s", buf);	    }	    else if (llen < DUMP_LABEL_WIDTH)	    {		bp = buf + llen;	    }	    else	    {		DBG_log("%s", buf);	    }	}    }    do {	int i, j;	for (i = 0; len!=0 && i!=4; i++)	{	    *bp++ = ' ';	    for (j = 0; len!=0 && j!=4; len--, j++)	    {		static const char hexdig[] = "0123456789abcdef";		*bp++ = ' ';		*bp++ = hexdig[(*cp >> 4) & 0xF];		*bp++ = hexdig[*cp & 0xF];		cp++;	    }	}	*bp = '\0';	DBG_log("%s", buf);	bp = buf;    } while (len != 0);#   undef DUMP_LABEL_WIDTH#   undef DUMP_WIDTH}#endif /* DEBUG *//* * Local Variables: * c-basic-offset:4 * c-style: pluto * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -