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/
/****************************************************************************
 ** pDirt syslog.
 ** Original idea and code by Illusion . Slightly modified and rewritten by
 ** Marty 1996
 ***************************************************************************/
#include "kernel.h"
#include "utils.h"
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <stdlib.h>
#include "pflags.h"
#include "parse.h"
#include "log.h"
#include "bprintf.h"

#define 	A_DAY	24*60*60

char *days[] = {
"today",	"yesterday",	"daybefore",	"week",		
"fortnight",	 "month", 	TABLE_END
};

time_t sectime[] = {
0,		A_DAY,		2*A_DAY,	6*A_DAY,	
13*A_DAY, 	30*A_DAY,	0
};

/* Tables to look up a special color by a special log entry */
char *idtable[] = {
"RECOVER",	"SYSTEM",	"UPDATE",	"SIGNAL",
"GAME",		"FILE",		"ERROR",	"STEAL",
"FROB",		"WARN",		"BACK",		"PARSE",
"QUEST",	"CONN",		"JAIL",		"SOCKET",
"SLAIN",	"ZAP",		"HEAL",		"DEBUG",
"TYPO",		"BUG",		"LOG",		"PUNT",
"SUMMON",	"BAN",		"EXORCISE",	"UAF",
"LFLAGS",	"PFLAGS",	"MFLAGS",	"RESET",
"PK",		"ALIAS",	"TOUT",		"GDBM",
"BOOTSTRAP",	"SUGGESTION",	"BECOME",	"MUDDNS",
"TESTRUN",
TABLE_END
};

char *idcolors[] = {
"&+w",		"&+w",		"&+w",		"&=YB",
"&+w",		"&+w",		"&=LR",		"&+w",
"&+w",		"&=WB",		"&+w",		"&+w",
"&+w",		"&+w",		"&=MB",		"&+w",
"&+w",		"&+w",		"&+w",		"&=RB",
"&=WC",		"&=WC",		"&=WC",		"&+w",
"&+w",		"&=YR",		"&+w",		"&=WG",
"&=LW",		"&=BW",		"&=MW",		"&+w",
"&-R",		"&-B",		"&=LY",		"&-C",
"&+L",		"&=WC",		"&+w",		"&=WB",
"&=YR",
TABLE_END	/* Not really needed, but what the heck.. */
};

void seek_line(FILE *fp,int line);
int count_lines(char *fn);
void find_first(FILE *fp, char *pattern);
void beautify_log(FILE *dest, char *buffer);
void lookup_time_index(FILE *logfp, FILE *tempfp, time_t start_date);
void showlog(char *fn);

A_COMMAND(syslogcom)
{   showlog(LOG_FILE);
}

void showlog(char *logfn)
{   char *timestr;
    FILE *fp, *logfp;
    char tfn[100];
    char searchpat[100];
    char buffer[400];
    char cmpbuf[400];
    int  i,max_line;
    time_t t;

    if (!ptstflg(mynum,PFL_SYSLOG))
    {   erreval();
        return;
    }
    sprintf(tfn,"%s/TMP/Syslog.%s",data_dir,pname(mynum));
    if ((fp = fopen(tfn,"w")) == NULL)
    {   fwerror(tfn);
        bprintf("Could not open temporary file.\n");
        return;
    }
    if ((logfp = fopen(logfn,"rt")) == NULL)
    {   mudlog("FILE: Error opening syslog reader.");
	bprintf("Could not find syslog.\n");
        fclose(fp);
        unlink(tfn);
        return;
    }

    /** Default is: show all entries of today 
     **/
    if (EMPTY(txt1))
    {  timestr = ctime(&global_clock);
       timestr += 4;
       timestr[8] = '\0';
       strcpy(searchpat,timestr);
    } 
    else
    {  getreinput(globalbuf);
       brkword();

       i = tlookup(wordbuf, days);

       if (i >= 0)
       {  t = global_clock -  sectime[i];
          if (i > 2)
          {   lookup_time_index(logfp,fp,t);  
              strcpy(searchpat," ");
          }
          else
          {   timestr = ctime(&t);
              timestr += 4;
              timestr[6] = '\0';
              strcpy(searchpat,timestr);
              find_first(logfp,searchpat);
          }
/*
          timestr = ctime(&t);
          timestr += 4;
          timestr[6] = '\0';
          strcpy(searchpat,timestr);
          if (i > 2)
          {  find_first(logfp,searchpat);
             while (feof(logfp) && t <= global_clock)
             {   fprintf(fp,"==SYSLOG== No log entries on %s\n",timestr);
                 t += A_DAY;
                 timestr = ctime(&t);
                 timestr +=4;
                 timestr[6] = '\0';
                 strcpy(searchpat,timestr);
                 find_first(logfp,searchpat);
             }
             strcpy(searchpat," ");
          }
          else
             find_first(logfp,searchpat);
*/
       }
       else if (wordbuf[0] == '*')
       {  seek_line(logfp,0);
          strcpy(searchpat," ");
       }
       else if ((i = atoi(wordbuf)) > 0)
       {  max_line = count_lines(logfn); 
          if (i > max_line)
          {   bprintf("invalid size, Narrowing field to last 10\n");
              seek_line(logfp,max_line - 10);
          }
          else
            seek_line(logfp,max_line - i);
          strcpy(searchpat," ");
       }
       else if (wordbuf[0] == '-' && (wordbuf[1] == 'd' || wordbuf[1] == 'D'))
       {  int days;

          days = atoi(wordbuf+2);
          t = global_clock - (A_DAY *days);
          lookup_time_index(logfp,fp,t);  
          i = (-2);
          strcpy(searchpat," ");
       }
       else 
          strcpy(searchpat,globalbuf);
    }

    if (feof(logfp))
    {   fprintf(fp,"==SYSLOG== No entries for %s\n",wordbuf);
    }

    uppercase(searchpat);
    while (!feof(logfp))
    {   fgets(buffer,sizeof(buffer),logfp);
        strcpy(cmpbuf,buffer);
        if (strstr(uppercase(cmpbuf),searchpat))
        {   if (!feof(logfp))
               beautify_log(fp,buffer);
        }
    }    
    fclose(fp);
    fclose(logfp);
    read_file(tfn,NULL,True,NULL);
    unlink(tfn);
}

/** Seeks the line, counting from the start
 **/
void seek_line(FILE *fp,int line)
{   int i;
    char tmp[400];

    fseek(fp,0L,SEEK_SET);
    
    for (i=0;i < line; i++)
       fgets(tmp,sizeof(tmp),fp);
}

/** Count total number of lines in a file. -1 if the file could not be opened.
 **/
int count_lines(char *fn)
{  FILE *fp;
   int  i = 0;
   char tmp[400];

   fp = fopen(fn,"rt");
   if (fp == NULL)
      return -1;

   while (fgets(tmp,sizeof(tmp),fp))
     i++;
   fclose(fp);
   return i;
}

/** Find first occurance of a pattern 
 ** Or EOF if no pattern match was found.
 **/
void find_first(FILE *fp, char *pattern)
{   char buffer[200], cmpbuf[200];
   
    uppercase(pattern); 
    fseek(fp,0L,SEEK_SET);
    while (!feof(fp))
    {   fgets(buffer,sizeof(buffer),fp);
        strcpy(cmpbuf,buffer);
        if (strstr(uppercase(cmpbuf),pattern))
        {  /* beautify_log(fp,buffer);*/
            return;
        }
    }    
}

/** Checks the first word after the timestamp with the table, if it isn't in
 ** there, then no colorcoding is applied.
 **/
void beautify_log(FILE *dest, char *buffer)
{   char *s = buffer;
    char id[20];
    int i,n;

    if (strchr(buffer,'|') == NULL)
      return;

    s+=17;
    for (i = 0; isalpha(s[i]); i++) 
       id[i] = s[i];

    id[i] = 0;
    n = tlookup(id,idtable);

    if (n >= 0)
    {   
        for (i = 0; i < 17; i++)
           fprintf(dest,"%c",buffer[i]);
        fprintf(dest,"%s",idcolors[n]);
        for (; isalpha(buffer[i]) ; i++)
           fprintf(dest,"%c",buffer[i]);
        fprintf(dest,"&+w");
        fprintf(dest,"%s",buffer+i);
    }
    else
      fputs(buffer,dest);
}


void lookup_time_index(FILE *logfp, FILE *tempfp, time_t start_date)
{   time_t t;
    char *timestr;
    char searchpat[30];

    t = start_date;
    timestr = ctime(&t);
    timestr += 4;
    timestr[6] = '\0';
    strcpy(searchpat,timestr);

    find_first(logfp,searchpat);
    while (feof(logfp) && t <= global_clock)
    {   fprintf(tempfp,"==SYSLOG== No log entries on %s\n",timestr);
        t += A_DAY;
        timestr = ctime(&t);
        timestr +=4;
        timestr[6] = '\0';
        strcpy(searchpat,timestr);
        find_first(logfp,searchpat);
    }
}

A_COMMAND(buglogcom)
{   showlog(BUGSYSLOG);
}

A_COMMAND(suggestlogcom)
{   showlog(SUGGESTLOG);
}

A_COMMAND(aberchatlogcom)
{   showlog(ABERCHATLOG);
}