/* * 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-2004 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. */ #include "irc.h" IRCII_RCSID("@(#)$eterna: log.c,v 1.28 2004/01/06 05:42:16 mrg Exp $"); #include #include "log.h" #include "vars.h" #include "output.h" #include "ircaux.h" FILE *irclog_fp; void do_log(flag, logfile, fpp) int flag; u_char *logfile; FILE **fpp; { time_t t; if (logfile == (u_char *) 0) { *fpp = (FILE *) 0; return; } t = time(0); if (flag) { if (*fpp) say("Logging is already on"); else { #ifdef DAEMON_UID if (getuid() == DAEMON_UID) { say("You are not permitted to use LOG"); /* *fpp = (FILE *) 0; unused */ } else { #endif /* DAEMON_UID */ say("Starting logfile %s", logfile); if ((*fpp = fopen(CP(logfile), "a")) != NULL) { #ifndef _Windows #ifdef NEED_FCHMOD chmod(logfile, S_IREAD | S_IWRITE); #else #ifndef _IBMR2 fchmod(fileno(*fpp),S_IREAD | S_IWRITE); #else int fd = (int) fileno(*fpp); fchmod((char *) &fd, S_IREAD | S_IWRITE); #endif /* !_IBMR2 */ #endif /* M_UNIX */ #endif /* _Windows */ fprintf(*fpp, "IRC log started %.16s\n", ctime(&t)); fflush(*fpp); } else { say("Couldn't open logfile %s: %s", logfile, strerror(errno)); *fpp = (FILE *) 0; } #ifdef DAEMON_UID } #endif /* DAEMON_UID */ } } else { if (*fpp) { fprintf(*fpp, "IRC log ended %.16s\n", ctime(&t)); fflush(*fpp); fclose(*fpp); *fpp = (FILE *) 0; say("Logfile ended"); } } return; } /* logger: if flag is 0, logging is turned off, else it's turned on */ void logger(flag) int flag; { u_char *logfile; if ((logfile = get_string_var(LOGFILE_VAR)) == (u_char *) 0) { say("You must set the LOGFILE variable first!"); set_int_var(LOG_VAR, 0); return; } 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) u_char *filename; { u_char *expanded; if (filename) { if (my_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; u_char *line; { if (fp) { fprintf(fp, "%s\n", line); fflush(fp); } }