1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
/*
* debug.c - generic debug routines.
*
* Copyright (c) 1993-2021 Matthew R. Green.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
*
* void debug(int level,char *format, ...); -- the function to call
* void setdlevel(u_char *level); -- turn on debugging for "level"
*/
#include "irc.h" /* This is where DEBUG is defined or not */
IRCII_RCSID("@(#)$eterna: debug.c,v 1.39 2021/02/27 22:38:42 mrg Exp $");
#ifdef DEBUG
# include "debug.h"
static struct {
int dnum;
const u_char *name;
int dlevel;
} debug_levels[] = {
{ DB_SCROLL, UP("scroll"), 0 },
{ DB_LOAD, UP("load"), 0 },
{ DB_HISTORY, UP("history"), 0 },
{ DB_CURSOR, UP("cursor"), 0 },
{ DB_IRCIO, UP("ircio"), 0 },
{ DB_LASTLOG, UP("lastlog"), 0 },
{ DB_WINCREATE, UP("wincreate"), 0 },
{ DB_STATUS, UP("status"), 0 },
{ DB_NEWIO, UP("newio"), 0 },
{ DB_SSL, UP("ssl"), 0 },
{ DB_SERVER, UP("server"), 0 },
{ DB_WINDOW, UP("window"), 0 },
{ DB_PROXY, UP("proxy"), 0 },
{ DB_HELP, UP("help"), 0 },
{ DB_MISC, UP("misc"), 0 },
};
static FILE *log_fp;
void
setdlevel(u_char *level)
{
int i;
for (i = 0; i < ARRAY_SIZE(debug_levels); i++)
if (!my_strcmp(debug_levels[i].name, level))
debug_levels[i].dlevel = 1;
}
void
debug(int level, char *format, ...)
{
va_list vlist;
struct timeval tv;
struct tm tm_store, *tm;
if (level > ARRAY_SIZE(debug_levels) ||
debug_levels[level].dlevel == 0)
return;
if (gettimeofday(&tv, NULL) != 0)
memset(&tv, 0, sizeof tv);
tm = localtime(&tv.tv_sec);
if (!tm)
{
memset(&tm_store, 0, sizeof tm_store);
tm = &tm_store;
}
va_start(vlist, format);
fprintf(log_fp, "%04u-%02u-%02u %02u:%02u:%02u.%06u ",
1990+tm->tm_year, tm->tm_mon, tm->tm_mday,
tm->tm_hour, tm->tm_min, tm->tm_sec, (unsigned)tv.tv_usec);
vfprintf(log_fp, format, vlist);
fputc('\n', log_fp);
fflush(log_fp);
}
void
open_log_file(u_char *file)
{
if (!file)
{
printf("irc: need filename for -o\n");
exit(-1);
}
log_fp = fopen(CP(file), "w");
if (!log_fp)
{
printf("irc: can not open %s: %s\n", file,
errno ? "" : strerror(errno));
exit(-1);
}
}
#endif /* DEBUG */
|