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>

#include "global.h"
#include "utils.h"
#include "comm.h"
#include "multiclass.h"
#include "db.h"

#define _BUG_C
#include "bug.h"

const char                             *LogNames[] = {
    "INFO",
    "ERROR",
    "FATAL",
    "BOOT",
    "AUTH",
    "KILL",
    "DEATH",
    "RESET",
    "IMC"
};

/* Handy query for checking logs:
 *
 * select to_char(date_trunc('second', log_date), 'HH24:MI:SS'), log_types.name, log_entry
 * from logfile join log_types using (log_type_id)
 * where log_date > now() - interval '1 day'
 * order by log_date desc
 * limit 20;     
 */

/*
 * Things we want to have when logging events.....
 *
 * BugFile is the filename you want to log to, NULL means stderr
 *
 * File, Func, Line can all be provided by the compiler as
 * __FILE__, __PRETTY_FUNCTION__, and __LINE__
 *
 * Level is the minimum character level which will see the
 * bug if they're logged in.
 *
 * The AreaFile and AreaLine are the file and line number
 * we were reading while booting the world database.
 *
 * Type is the type of error, typically things like
 * LOG_INFO, LOG_ERROR, LOG_FATAL, LOG_BOOT, LOG_AUTH
 *
 * ch is the char_data pointer for the player/mob
 * obj is an obj_data pointer, if you have one
 * room is.... the room_data pointer.
 *
 * Str is, of course, the message, and it gets printed
 * using varargs, so you can have this be a printf type
 * set of macros.
 */
void bug_logger(unsigned int Type, const char *BugFile,
		const char *File, const char *Func, int Line,
		const char *AreaFile, int AreaLine,
		struct char_data *ch, struct char_data *victim,
		unsigned int Level, const char *Str, ...)
{
    va_list                                 arg;
    char                                    Result[MAX_STRING_LENGTH] = "\0\0\0";
    char                                    Temp[MAX_STRING_LENGTH] = "\0\0\0";
    FILE                                   *fp = NULL;
    struct timeb                            right_now;
    struct tm                              *now_part = NULL;

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

	sprintf(Result, "%s> ", LogNames[Type]);
	vsprintf(Temp, Str, arg);
	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, 1);
	bzero(Result, MAX_STRING_LENGTH);
    } 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);
    sprintf(Result + strlen(Result), " - %s -", LogNames[Type]);
    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, ")");
    }
    if (ch || victim) {
	if (ch)
	    sprintf(Result + strlen(Result), " ch \"%s\" [#%d]", NAME(ch), ch->in_room);
	if (victim)
	    sprintf(Result + strlen(Result), " victim \"%s\" [#%d]",
		    NAME(victim), victim->in_room);
/*
    if (obj)
      sprintf(Result + strlen(Result), " obj \"%s\" [#%d]",
              SAFE_ONAME(obj), obj->in_room);
    if (room)
      sprintf(Result + strlen(Result), " room \"%s\" [#%d]",
              room->name?room->name:"", room->number);
*/
	strcat(Result, "\n");
    } else if (File || Func || Line)
	strcat(Result, "\n");

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

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

    if (stderr) {
	fprintf(stderr, "%s\n", Result);
	fflush(stderr);
    }

}