unrealircd/src/debug.c

163 lines
3.5 KiB
C

/*
* Unreal Internet Relay Chat Daemon, src/debug.c
* Copyright (C) 1990 Jarkko Oikarinen and
* University of Oulu, Computing Center
*
* 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 1, or (at your option)
* any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file
* @brief Some debugging functions that should probably be moved elsewhere.
*/
/* debug.c 2.30 1/3/94 (C) 1988 University of Oulu, Computing Center and Jarkko Oikarinen */
#include "unrealircd.h"
/** String of server options in this compile (eg 'D' for debug mode).
*/
MODVAR char serveropts[] = {
#ifdef DEBUGMODE
'D',
#endif
/* FDLIST (always) */
'F',
/* Hub (always) */
'h',
/* NOSPOOF (always) */
'n',
#ifdef VALLOC
'V',
#endif
#ifdef _WIN32
'W',
#endif
#ifdef USE_SYSLOG
'Y',
#endif
'6',
#ifndef NO_OPEROVERRIDE
'O',
#endif
#ifndef OPEROVERRIDE_VERIFY
'o',
#endif
'E',
#ifdef USE_LIBCURL
'r',
#endif
'\0', /* Don't change those nuls. -- Syzop */
'\0',
'\0',
'\0',
'\0'
};
char *extraflags = NULL;
MODVAR int debugfd = 2;
void flag_add(char ch)
{
char *newextra;
if (extraflags)
{
char tmp[2] = { ch, 0 };
newextra = safe_alloc(strlen(extraflags) + 2);
strcpy(newextra, extraflags);
strcat(newextra, tmp);
safe_free(extraflags);
extraflags = newextra;
}
else
{
extraflags = safe_alloc(2);
extraflags[0] = ch;
extraflags[1] = '\0';
}
}
void flag_del(char ch)
{
int newsz;
char *p, *op;
char *newflags;
newsz = 0;
p = extraflags;
for (newsz = 0, p = extraflags; *p; p++)
if (*p != ch)
newsz++;
newflags = safe_alloc(newsz + 1);
for (p = newflags, op = extraflags; (*op) && (newsz); newsz--, op++)
if (*op != ch)
*p++ = *op;
*p = '\0';
safe_free(extraflags);
extraflags = newflags;
}
#ifdef DEBUGMODE
#ifndef _WIN32
#define SET_ERRNO(x) errno = x
#else
#define SET_ERRNO(x) WSASetLastError(x)
#endif /* _WIN32 */
static char debugbuf[4096];
void debug(int level, FORMAT_STRING(const char *form), ...)
{
int err = ERRNO;
va_list vl;
va_start(vl, form);
if ((debuglevel >= 0) && (level <= debuglevel))
{
(void)ircvsnprintf(debugbuf, sizeof(debugbuf), form, vl);
#ifndef _WIN32
strlcat(debugbuf, "\n", sizeof(debugbuf));
if (write(debugfd, debugbuf, strlen(debugbuf)) < 0)
{
/* Yeah.. what can we do if output isn't working? Outputting an error makes no sense */
;
}
#else
strlcat(debugbuf, "\r\n", sizeof(debugbuf));
OutputDebugString(debugbuf);
#endif
}
va_end(vl);
SET_ERRNO(err);
}
int checkprotoflags(Client *client, int flags, const char *file, int line)
{
if (!MyConnect(client))
{
unreal_log(ULOG_ERROR, "main", "BUG_ISTOKEN_REMOTE_CLIENT", client,
"IsToken($token_value) used on remote client in $file:$line",
log_data_integer("token_value", flags),
log_data_string("file", file),
log_data_integer("line", line));
}
return ((client->local->proto & flags) == flags) ? 1 : 0;
}
#endif