pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
#include "kernel.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include "log.h"
#include "bprintf.h"

int syslogfd = -1;

/******************************************************************************
 ** openMudSyslog: Opens a syslog file with the given name, in the given mode.
 **
 ** Input Parameters:
 **     char *filename : Name & path of the syslogfile
 **     char *mode     : Mode in which to open the syslog file.
 **                      valid modes are:
 **                      r = readonly
 **                      w = writeonly
 **                      x = read/write
 **                      t = truncate
 **                      a = append
 **                      If the file doesnt exsist, the file is created.
 **
 ** Output Parameters:
 **    int : The fd number of the syslog or a negative number if open failed.
 ****************************************************************************/ 
int openMudSyslog(char *fn,char *mode,int which)
{   int modebits = O_CREAT;
    int i;
    int fd;
 
    if (syslogfd != -1 && which == MUDLOG)
       closeMudSyslog();

    if (mode != NULL)
    {  for (i = 0; mode[i] != '\0'; i++)
         switch (mode[i]) {
         case 'a' : modebits |= (O_CREAT|O_APPEND); break;
         case 't' : modebits |= O_TRUNC; break;
         case 'r' : modebits |= O_RDONLY; break;
         case 'w' : modebits |= (O_CREAT|O_WRONLY); break;
         case 'x' : modebits |= (O_CREAT|O_RDWR); break;
         default:
         }
    }
    fd = open(fn,modebits,S_IRUSR|S_IWUSR);

    if (fd < 0)
    {  perror("SYSLOG");
    }
    return fd;
}

/*****************************************************************************
 ** closeMudSyslog : Closes an syslog file
 **
 ** Input Parameters:
 **       none
 ** Output Parameters:
 **       none
 ***************************************************************************/
void closeMudSyslog(void)
{   if (syslogfd > 0)
    {   close(syslogfd);
        syslogfd = -1;
    }
}

/****************************************************************************
 ** mudSyslog : Writes a log message to the syslog file
 **
 ** input parameters:
 **    int  which    : which logfile.
 **    char *pattern : normal printf pattern with %s/%d/%f notations.
 **    ...           : a number of parameters to fill in the required fields
 **                    in the pattern format.
 ** output parameters:
 **    none
 **************************************************************************/
void mudSyslog(int which, char *pattern,...)
{   va_list  pvar;
    char     format[512];
    char     line[1024];
    time_t   thistime = time(NULL);
    char     *z = ctime(&thistime);
    int	     fd;

    va_start (pvar,pattern);

    z += 4;
    z[15] = '\0';
    sprintf(format,"%s| %s\n\r",z,pattern);
    vsprintf(line,format,pvar);

    switch (which) {
    case BUGLOG:
    case TYPOLOG:
        fd = openMudSyslog(BUGSYSLOG,"wa",which);
        if (fd >= 0)
        {  write(fd,line,strlen(line+1));
           close(fd);
        }
        else
           write(syslogfd,line,strlen(line+1));
        break;
    case SUGGLOG:
	fd = openMudSyslog(SUGGESTLOG,"wa",which);
        if (fd >= 0)
        {  write(fd,line,strlen(line+1));
           close(fd);
        }
        else
           write(syslogfd,line,strlen(line+1));
        break;
    case ABERLOG:
        fd = openMudSyslog(ABERCHATLOG,"wa",which);
        if (fd >= 0)
        {  write(fd,line,strlen(line+1));
           close(fd);
        }
        else
           write(syslogfd,line,strlen(line+1));
        break;
    default:
	if (syslogfd >= 0)
       	    write(syslogfd,line,strlen(line+1));
    /*	else
       	    fprintf(stderr,"%s",line);*/
	break;
    }
    va_end(pvar);
}

void fwerror(char *fn)
{  mudSyslog(MUDLOG,"FILE: Could not open %s for writing.",fn);
   bprintf("Could not open temporary file.\n");
}

int open_logfile(char *fn,Boolean clear_log)
{
    if (clear_log)
       syslogfd = openMudSyslog(fn,"wt",MUDLOG);
    else
       syslogfd = openMudSyslog(fn,"wa",MUDLOG);

    if (syslogfd >= 0)
    {   dup2(syslogfd,fileno(stderr));
        close(syslogfd);
        syslogfd = fileno(stderr);
    }
    return (syslogfd >= 0) ? 0 : -1;
}

void close_logfile()
{   closeMudSyslog();
}

void progerror(char *name)
{   mudSyslog(MUDLOG,"PERROR %s: [%d] %s",name, errno, strerror(errno));
}

void mudlog(char *format,...)
{   char buff[4096];
    va_list  pvar;

    va_start (pvar,format);
    vsprintf(buff,format,pvar);
    mudSyslog(MUDLOG,buff);
    va_end(pvar);
}

void buglog(char *format,...)
{   char buff[4096];
    char pattern[512];
    va_list  pvar;

    va_start (pvar,format);
    sprintf(pattern,"%s",format);
    vsprintf(buff,pattern,pvar);
    mudSyslog(BUGLOG,buff);
    va_end(pvar);
}

void suggestlog(char *format,...)
{   char buff[4096];
    char pattern[512];
    va_list  pvar;

    va_start (pvar,format);
    sprintf(pattern,"%s",format);
    vsprintf(buff,pattern,pvar);
    mudSyslog(SUGGLOG,buff);
    va_end(pvar);
}


void aberlog(char *format,...)
{   char buff[4096];
    char pattern[512];
    va_list  pvar;

    va_start (pvar,format);
    sprintf(pattern,"%s",format);
    vsprintf(buff,pattern,pvar);
    mudSyslog(ABERLOG,buff);
    va_end(pvar);
}