/* $Header: /cvsroot/fbmuck/fbmuck/src/log.c,v 1.15 2004/07/03 08:32:34 foxbird Exp $ */
/*
 * Handles logging of tinymuck
 *
 * Copyright (c) 1990 Chelsea Dyerman
 * University of California, Berkeley (XCF)
 *
 */
#include "config.h"
#include <stdio.h>
#include <sys/types.h>
#include <stdarg.h>
#include <time.h>
#include "fbstrings.h"
#include "externs.h"
#include "interface.h"
/* cks: these are varargs routines. We are assuming ANSI C. We could at least
   USE ANSI C varargs features, no? Sigh. */
void
log2file(char *myfilename, char *format, ...)
{
	va_list args;
	FILE *fp;
	va_start(args, format);
	if ((fp = fopen(myfilename, "a")) == NULL) {
		fprintf(stderr, "Unable to open %s!\n", myfilename);
		vfprintf(stderr, format, args);
	} else {
		vfprintf(fp, format, args);
		fprintf(fp, "\n");
		fclose(fp);
	}
	va_end(args);
}
void
log_sanity(char *format, ...)
{
	va_list args;
	FILE *fp;
	time_t lt;
	char buf[40];
	va_start(args, format);
	lt = time(NULL);
	*buf = '\0';
	if ((fp = fopen(LOG_SANITY, "a")) == NULL) {
		fprintf(stderr, "Unable to open %s!\n", LOG_STATUS);
		fprintf(stderr, "%.16s: ", ctime(<));
		vfprintf(stderr, format, args);
	} else {
#ifndef WIN32
		format_time(buf, 32, "%c", localtime(<));
#else
		format_time(buf, 32, "%c", uw32localtime(<));
#endif
		fprintf(fp, "%.32s: ", buf);
		vfprintf(fp, format, args);
		fclose(fp);
	}
	va_end(args);
}
void
log_status(char *format, ...)
{
	va_list args;
	FILE *fp;
	time_t lt;
	char buf[40];
	va_start(args, format);
	lt = time(NULL);
	*buf = '\0';
	if ((fp = fopen(LOG_STATUS, "a")) == NULL) {
		fprintf(stderr, "Unable to open %s!\n", LOG_STATUS);
		fprintf(stderr, "%.16s: ", ctime(<));
		vfprintf(stderr, format, args);
	} else {
#ifndef WIN32
		format_time(buf, 32, "%c", localtime(<));
#else
		format_time(buf, 32, "%c", uw32localtime(<));
#endif
		fprintf(fp, "%.32s: ", buf);
		vfprintf(fp, format, args);
		fclose(fp);
	}
	va_end(args);
}
void
log_muf(char *format, ...)
{
	va_list args;
	FILE *muflog;
	time_t lt;
	char buf[40];
	va_start(args, format);
	lt = time(NULL);
	if ((muflog = fopen(LOG_MUF, "a")) == NULL) {
		fprintf(stderr, "Unable to open %s!\n", LOG_MUF);
		fprintf(stderr, "%.16s: ", ctime(<));
		vfprintf(stderr, format, args);
	} else {
#ifndef WIN32
		format_time(buf, 32, "%c", localtime(<));
#else
		format_time(buf, 32, "%c", uw32localtime(<));
#endif
		fprintf(muflog, "%.32s: ", buf);
		vfprintf(muflog, format, args);
		fclose(muflog);
	}
	va_end(args);
}
void
log_gripe(char *format, ...)
{
	va_list args;
	FILE *fp;
	time_t lt;
	char buf[40];
	va_start(args, format);
	lt = time(NULL);
	*buf = '\0';
	if ((fp = fopen(LOG_GRIPE, "a")) == NULL) {
		fprintf(stderr, "Unable to open %s!\n", LOG_GRIPE);
		fprintf(stderr, "%.16s: ", ctime(<));
		vfprintf(stderr, format, args);
	} else {
#ifndef WIN32
		format_time(buf, 32, "%c", localtime(<));
#else
		format_time(buf, 32, "%c", uw32localtime(<));
#endif
		fprintf(fp, "%.32s: ", buf);
		vfprintf(fp, format, args);
		fclose(fp);
	}
	va_end(args);
}
void
log_command(char *format, ...)
{
	va_list args;
	char buf[40];
	FILE *fp;
	time_t lt;
	va_start(args, format);
	lt = time(NULL);
	*buf = '\0';
	if ((fp = fopen(COMMAND_LOG, "a")) == NULL) {
		fprintf(stderr, "Unable to open %s!\n", COMMAND_LOG);
		vfprintf(stderr, format, args);
	} else {
#ifndef WIN32
		format_time(buf, 32, "%c", localtime(<));
#else
		format_time(buf, 32, "%c", uw32localtime(<));
#endif
		fprintf(fp, "%.32s: ", buf);
		vfprintf(fp, format, args);
		fclose(fp);
	}
	va_end(args);
}
void
strip_evil_characters(char *badstring)
{
 	unsigned char *s = (unsigned char*)badstring;
 
 	if (!s)
  		return;
 
 	for (; *s; ++s) {
 		*s &= 0x7f; /* No high ascii */
 
 		if (*s == 0x1b)
 			*s = '['; /* No escape (Aieeee!) */
 
 		if (!isprint(*s))
 			*s = '_';
  	}
  	return;
}
void
log_user(dbref player, dbref program, char *logmessage)
{
	char logformat[BUFFER_LEN];
	char buf[40];
	time_t lt = 0;
	int len = 0;
	*buf='\0';
	*logformat='\0';
	lt=time(NULL);	
#ifndef WIN32
	format_time(buf, 32, "%c", localtime(<));
#else
	format_time(buf, 32, "%c", uw32localtime(<));
#endif
	snprintf(logformat,BUFFER_LEN,"%s(#%d) [%s(#%d)] at %.32s: ", NAME(player), player, NAME(program), program, buf);
	len = BUFFER_LEN - strlen(logformat)-1;
	strncat (logformat, logmessage, len);
	strip_evil_characters(logformat);
	log2file(USER_LOG,"%s",logformat);
}
void
notify_fmt(dbref player, char *format, ...)
{
	va_list args;
	char bufr[BUFFER_LEN];
	va_start(args, format);
	vsnprintf(bufr, sizeof(bufr), format, args);
	bufr[sizeof(bufr)-1] = '\0';
	notify(player, bufr);
	va_end(args);
}