wileymud-1.187b/
wileymud-1.187b/attic/
wileymud-1.187b/attic/bin/
wileymud-1.187b/attic/lib/
wileymud-1.187b/attic/lib/adm/
wileymud-1.187b/attic/lib/man/
wileymud-1.187b/attic/lib/new-wld/
wileymud-1.187b/attic/lib/new-wld/default/
wileymud-1.187b/attic/lib/old/
wileymud-1.187b/attic/lib/wld/
wileymud-1.187b/attic/public_html/
wileymud-1.187b/attic/public_html/gfx/
wileymud-1.187b/attic/src/bin/
wileymud-1.187b/attic/src/etc/
wileymud-1.187b/attic/src/libauth-4.0-p5/
wileymud-1.187b/attic/src/sedna/
wileymud-1.187b/backups/
wileymud-1.187b/bin/
wileymud-1.187b/docs/
wileymud-1.187b/etc/
wileymud-1.187b/lib/
wileymud-1.187b/lib/adm/
wileymud-1.187b/lib/boards/
wileymud-1.187b/lib/log/
wileymud-1.187b/lib/man/
wileymud-1.187b/lib/ply/
wileymud-1.187b/lib/ply/a/
wileymud-1.187b/lib/ply/b/
wileymud-1.187b/lib/ply/c/
wileymud-1.187b/lib/ply/d/
wileymud-1.187b/lib/ply/g/
wileymud-1.187b/lib/ply/k/
wileymud-1.187b/lib/ply/m/
wileymud-1.187b/lib/ply/s/
wileymud-1.187b/lib/ply/t/
wileymud-1.187b/public_html/gfx/
wileymud-1.187b/src/bin/
wileymud-1.187b/src/convert/attic/
wileymud-1.187b/src/convert/obj/
wileymud-1.187b/src/convert/perl/
wileymud-1.187b/src/convert/perl/MudConvert/
wileymud-1.187b/src/convert/perl/MudConvert/DUMP/
wileymud-1.187b/src/convert/perl/MudConvert/Report/
wileymud-1.187b/src/convert/perl/MudConvert/WileyMUD/
wileymud-1.187b/src/convert/perl/output/
wileymud-1.187b/src/convert/perl/output/DUMP/
wileymud-1.187b/src/convert/perl/output/Report/
wileymud-1.187b/src/convert/perl/output/WileyMUD/
wileymud-1.187b/src/etc/
wileymud-1.187b/src/etc/init.d/
wileymud-1.187b/src/etc/rc.d/
wileymud-1.187b/src/etc/rc.d/init.d/
wileymud-1.187b/src/lib/
wileymud-1.187b/src/lib/adm/
wileymud-1.187b/src/lib/boards/
wileymud-1.187b/src/lib/log/
wileymud-1.187b/src/lib/man/
wileymud-1.187b/src/lib/ply/
wileymud-1.187b/src/lib/ply/a/
wileymud-1.187b/src/lib/ply/b/
wileymud-1.187b/src/lib/ply/c/
wileymud-1.187b/src/lib/ply/d/
wileymud-1.187b/src/lib/ply/e/
wileymud-1.187b/src/lib/ply/f/
wileymud-1.187b/src/lib/ply/g/
wileymud-1.187b/src/lib/ply/h/
wileymud-1.187b/src/lib/ply/i/
wileymud-1.187b/src/lib/ply/j/
wileymud-1.187b/src/lib/ply/k/
wileymud-1.187b/src/lib/ply/l/
wileymud-1.187b/src/lib/ply/m/
wileymud-1.187b/src/lib/ply/n/
wileymud-1.187b/src/lib/ply/o/
wileymud-1.187b/src/lib/ply/p/
wileymud-1.187b/src/lib/ply/q/
wileymud-1.187b/src/lib/ply/r/
wileymud-1.187b/src/lib/ply/s/
wileymud-1.187b/src/lib/ply/t/
wileymud-1.187b/src/lib/ply/u/
wileymud-1.187b/src/lib/ply/v/
wileymud-1.187b/src/lib/ply/w/
wileymud-1.187b/src/lib/ply/x/
wileymud-1.187b/src/lib/ply/y/
wileymud-1.187b/src/lib/ply/z/
wileymud-1.187b/src/obj/
wileymud-1.187b/src/utils/
wileymud-1.187b/src/utils/mobmaker/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>
#include <sys/timeb.h>

#undef DIKU_CRUD
#ifdef DIKU_CRUD
#include "include/global.h"
#include "include/utils.h"
#include "include/comm.h"
#include "include/multiclass.h"
#endif

#define _BUG_C
#include "include/bug.h"

#ifdef DIKU_CRUD
extern struct descriptor_data          *descriptor_list;
#else
#define MAX_STRING_LENGTH 2048
#endif

/*
 * This is my general purpose error handler that spews a time-stamped
 * message to stderr and a logfile.
 * The messages are in this format:
 * <: DATE::(filename,func,line) User[#room]:\n : message\n
 *
 * If File, Func, or Line are NULL they will be ommitted.
 * If BufFile is NULL, stderr will be used alone.
 * If ch is NULL, User will be left blank.
 * If Str is NULL, we are just making a PING!
 *
 * NOTE!  The calling interface is very ugly... it is designed to be very
 * versitle, not pretty... If you want it to be useful in your source code,
 * use a macro like this one:
 * #define log_error(BugFile, ch, Str...) \
 *         bug_logger(__FILE__, __FUNCTION__, __LINE__, BugFile, ch, Str, ## args)
 * which can then be used by simply saying:
 * log_error(BUGLOG, ch, "You died %d times!\n", deaths);
 * producing as an example:
 * <: 950219.195642.037 (ack.c;barf,135) Quixadhal [#3001]:
 *  : You died 27 times!
 * The datestamp is YYMMDD.HHMMSS.MIL format.
 */
void bug_logger(const char *File, const char *Func, int Line,
#ifdef DIKU_CRUD
		unsigned int Level,
#endif
		unsigned int Type, const char *BugFile,
#ifdef DIKU_CRUD
		struct char_data *ch,
#endif
		const char *Str, ...)
{
    va_list                                 arg;
    char                                    Result[MAX_STRING_LENGTH];
    char                                    Temp[MAX_STRING_LENGTH];
    FILE                                   *fp;
    struct timeb                            right_now;
    struct tm                              *now_part;

    bzero(Result, MAX_STRING_LENGTH);
    va_start(arg, Str);
    if (Str && *Str) {
#ifdef DIKU_CRUD
	struct descriptor_data                 *i;

	strcpy(Result, "Notify> ");
#endif
	vsprintf(Temp, Str, arg);
#ifdef DIKU_CRUD
	strcat(Result, Temp);
	for (i = descriptor_list; i; i = i->next)
	    if ((!i->connected) && (GetMaxLevel(i->character) >= Level) &&
		(IS_SET(i->character->specials.act, PLR_LOGS)))
		write_to_q(Result, &i->output);
	bzero(Result, MAX_STRING_LENGTH);
#endif
    } else
	strcpy(Temp, "PING!");
    va_end(arg);
    ftime(&right_now);
    now_part = localtime((const time_t *)&right_now);
    sprintf(Result, "<: %02d%02d%02d.%02d%02d%02d.%03d",
	    now_part->tm_year, now_part->tm_mon + 1, now_part->tm_mday,
	    now_part->tm_hour, now_part->tm_min, now_part->tm_sec, right_now.millitm);
    if (File || Func || Line) {
	strcat(Result, " (");
	if (File && *File) {
	    strcat(Result, File);
	}
	if (Func && *Func)
	    sprintf(Result + strlen(Result), ";%s", Func);
	if (Line)
	    sprintf(Result + strlen(Result), ",%d)", Line);
	else
	    strcat(Result, ")");
    }
#ifdef DIKU_CRUD
    if (ch && !IS_NPC(ch))
	sprintf(Result + strlen(Result), " %s [#%d]\n",
		ch->player.name, ch->in_room ? ch->in_room : 0);
    else
#endif
    if (File || Func || Line)
	strcat(Result, "\n");

    strcat(Result, " : ");
    strcat(Result, Temp);

    if (BugFile && *BugFile) {
	if (!(fp = fopen(BugFile, "a"))) {
	    perror(BugFile);
#ifdef DIKU_CRUD
	    if (ch)
		send_to_char("Could not open the file!\n\r", ch);
#endif
	} else {
	    fprintf(fp, "%s\n", Result);
	    fclose(fp);
	}
    }
    fprintf(stderr, "%s\n", Result);
}