/*
 * log.c: handles the irc session logging functions 
 *
 * Written By Michael Sandrof
 *
 * Copyright (c) 1990 Michael Sandrof.
 * Copyright (c) 1991, 1992 Troy Rollo.
 * Copyright (c) 1992-2003 Matthew R. Green.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $Id: log.c,v 1.7 2003/01/08 20:00:54 f Exp $
 */

#include "irc.h"

#include <sys/stat.h>

#include "log.h"
#include "vars.h"
#include "output.h"
#include "ircaux.h"

/**************************** Patched by Flier ******************************/
#include "myvars.h"

extern void StripAnsi _((char *, char *, int));
/****************************************************************************/

#if 0
#if defined(POSIX)
# define fchmod(path, mode) chmod(path, mode)
#endif
#endif

FILE	*irclog_fp = (FILE *) 0;

/**************************** PATCHED by Flier ******************************/
/*FILE	*
do_log(flag, logfile, fp)
	int	flag;
	char	*logfile;
	FILE	*fp;*/
void
do_log(flag, logfile, fp)
	int	flag;
	char	*logfile;
	FILE	**fp;
/****************************************************************************/
{
	time_t	t;

	if (logfile == (char *) 0)
/**************************** PATCHED by Flier ******************************/
		/*return ((FILE *) 0);*/
        {
                *fp = (FILE *) 0;
                return;
        }
/****************************************************************************/
	t = time(0);
	if (flag)
	{
/**************************** PATCHED by Flier ******************************/
		/*if (fp)*/
		if (*fp)
/****************************************************************************/
			say("Logging is already on");
		else
		{
#ifdef DAEMON_UID
			if (getuid() == DAEMON_UID)
			{
				say("You are not permitted to use LOG");
				/* fp = (FILE *) 0;  unused */
			}
			else
			{
#endif /* DAEMON_UID */
				say("Starting logfile %s", logfile);
/**************************** PATCHED by Flier ******************************/
				/*if ((fp = fopen(logfile, "a")) != NULL)*/
				if ((*fp = fopen(logfile, "a")) != NULL)
/****************************************************************************/
				{
#ifndef _Windows
#ifdef NEED_FCHMOD
					chmod(logfile, S_IREAD | S_IWRITE);
#else
#ifndef _IBMR2
/**************************** PATCHED by Flier ******************************/
					/*fchmod(fileno(fp),S_IREAD | S_IWRITE);*/
					fchmod(fileno(*fp),S_IREAD | S_IWRITE);
/****************************************************************************/
#else
/**************************** PATCHED by Flier ******************************/
					/*int fd = (int) fileno(fp);*/
					int fd = (int) fileno(*fp);
/****************************************************************************/
					fchmod((char *) &fd, S_IREAD |
							S_IWRITE);
#endif /* !_IBMR2 */
#endif /* M_UNIX */
#endif /* _Windows */
/**************************** PATCHED by Flier ******************************/
					/*fprintf(fp, "IRC log started %.16s\n",
							ctime(&t));
					fflush(fp);*/
					fprintf(*fp, "IRC log started %.16s\n",
							ctime(&t));
					fflush(*fp);
/****************************************************************************/
				}
				else
				{
					say("Couldn't open logfile %s: %s",
						logfile, strerror(errno));
/**************************** PATCHED by Flier ******************************/
					/*fp = (FILE *) 0;*/
					*fp = (FILE *) 0;
/****************************************************************************/
				}
#ifdef DAEMON_UID
			}
#endif /* DAEMON_UID */
		}
	}
	else
	{
/**************************** PATCHED by Flier ******************************/
		/*if (fp)*/
		if (*fp)
/****************************************************************************/
		{
/**************************** PATCHED by Flier ******************************/
			/*fprintf(fp, "IRC log ended %.16s\n", ctime(&t));
			fflush(fp);
			fclose(fp);
			fp = (FILE *) 0;*/
			fprintf(*fp, "IRC log ended %.16s\n", ctime(&t));
			fflush(*fp);
			fclose(*fp);
			*fp = (FILE *) 0;
/****************************************************************************/
			say("Logfile ended");
		}
	}
/**************************** PATCHED by Flier ******************************/
	/*return (fp);*/
/****************************************************************************/
}

/* logger: if flag is 0, logging is turned off, else it's turned on */
void
logger(flag)
	int	flag;
{
	char	*logfile;

	if ((logfile = get_string_var(LOGFILE_VAR)) == (char *) 0)
	{
		say("You must set the LOGFILE variable first!");
		set_int_var(LOG_VAR, 0);
		return;
	}
/**************************** PATCHED by Flier ******************************/
	/*irclog_fp = do_log(flag, logfile, irclog_fp);*/
	do_log(flag, logfile, &irclog_fp);
/****************************************************************************/
	if ((irclog_fp == (FILE *) 0) && flag)
		set_int_var(LOG_VAR, 0);
}

/*
 * set_log_file: sets the log file name.  If logging is on already, this
 * closes the last log file and reopens it with the new name.  This is called
 * automatically when you SET LOGFILE. 
 */
void
set_log_file(filename)
	char	*filename;
{
	char	*expanded;

	if (filename)
	{
		if (strcmp(filename, get_string_var(LOGFILE_VAR)))
			expanded = expand_twiddle(filename);
		else
			expanded = expand_twiddle(get_string_var(LOGFILE_VAR));
		set_string_var(LOGFILE_VAR, expanded);
		new_free(&expanded);
		if (irclog_fp)
		{
			logger(0);
			logger(1);
		}
	}
}

/*
 * add_to_log: add the given line to the log file.  If no log file is open
 * this function does nothing. 
 */
void
add_to_log(fp, line)
	FILE	*fp;
	char	*line;
{
	if (fp)
	{
/**************************** Patched by Flier ******************************/
		/*fprintf(fp, "%s\n", line);*/
                char *tmpbuf = new_malloc(strlen(line) + 1);

                StripAnsi(line, tmpbuf, 0);
                fprintf(fp,"%s\n", tmpbuf);
                new_free(&tmpbuf);
/****************************************************************************/
		fflush(fp);
	}
}
