This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
magicka/deps/odoors/ODLog.c
2017-03-19 07:49:46 +10:00

259 lines
7.2 KiB
C

/* OpenDoors Online Software Programming Toolkit
* (C) Copyright 1991 - 1999 by Brian Pirie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
* File: ODLog.c
*
* Description: Implements the logfile subsystem.
*
* Revisions: Date Ver Who Change
* ---------------------------------------------------------------
* Oct 13, 1994 6.00 BP New file header format.
* Dec 09, 1994 6.00 BP Standardized coding style.
* Aug 19, 1995 6.00 BP 32-bit portability.
* Nov 16, 1995 6.00 BP Removed oddoor.h, added odcore.h.
* Dec 30, 1995 6.00 BP Added ODCALL for calling convention.
* Feb 19, 1996 6.00 BP Changed version number to 6.00.
* Mar 03, 1996 6.10 BP Begin version 6.10.
* Aug 10, 2003 6.23 SH *nix support
*/
#define BUILDING_OPENDOORS
#include <stdio.h>
#include <time.h>
#include "OpenDoor.h"
#include "ODCore.h"
#include "ODGen.h"
#include "ODInEx.h"
#include "ODKrnl.h"
/* Private logfile file handle */
static FILE *logfile_pointer;
/* Private helper functions. */
static BOOL ODLogWriteStandardMsg(INT nLogfileMessage);
static void ODLogClose(INT nReason);
/* ----------------------------------------------------------------------------
* ODLogEnable()
*
* This function is called from od_init() when the user explicitly includes the
* OpenDoors logfile option using the od_control.od_logfile setting.
*
* Parameters: None.
*
* Return: void
*/
ODAPIDEF void ODCALL ODLogEnable(void)
{
/* At this time, this function simply maps to a call to od_log_open(). */
od_log_open();
}
/* ----------------------------------------------------------------------------
* od_log_open()
*
* Called to begin logfile operations. This is when the first message is
* written to the logfile, indicating that the user is entering OpenDoors.
*
* Parameters: None.
*
* Return: TRUE on success, or FALSE on failure.
*/
ODAPIDEF BOOL ODCALL od_log_open()
{
time_t nUnixTime;
struct tm *ptmTimeRecord;
/* Log function entry if running in trace mode. */
TRACE(TRACE_API, "od_log_open()");
/* Initialize OpenDoors if not already done. */
if(!bODInitialized) od_init();
/* Don't open logfile if it has been disabled in config file, etc. */
if(od_control.od_logfile_disable) return(TRUE);
/* Open actual logfile. */
if((logfile_pointer=fopen(od_control.od_logfile_name, "a")) == NULL)
{
return(FALSE);
}
/* Get the current time. */
nUnixTime = time(NULL);
ptmTimeRecord = localtime(&nUnixTime);
/* Print logfile tear line. */
fprintf(logfile_pointer, "\n---------- %s %02d %s %02d, %s\n",
od_control.od_day[ptmTimeRecord->tm_wday],
ptmTimeRecord->tm_mday,
od_control.od_month[ptmTimeRecord->tm_mon],
ptmTimeRecord->tm_year,
od_program_name);
/* Print message of door start up. */
sprintf(szODWorkString, (char *)od_control.od_logfile_messages[11],
od_control.user_name);
od_log_write(szODWorkString);
/* Set internal function hooks to enable calling of logfile features */
/* from elsewhere in OpenDoors. */
pfLogWrite = ODLogWriteStandardMsg;
pfLogClose = ODLogClose;
return(TRUE);
}
/* ----------------------------------------------------------------------------
* ODLogWriteStandardMsg() *** PRIVATE FUNCTION ***
*
* Function called to write a standard message to the logfile.
*
* Parameters: nLogfileMessage - Index of the standard message to write to
* the logfile.
*
* Return: TRUE on success, or FALSE on failure.
*/
static BOOL ODLogWriteStandardMsg(INT nLogfileMessage)
{
if(nLogfileMessage < 0 || nLogfileMessage > 11)
{
return(FALSE);
}
od_log_write((char *)od_control.od_logfile_messages[nLogfileMessage]);
if(nLogfileMessage == 8)
{
sprintf(szODWorkString, od_control.od_logfile_messages[12],
od_control.user_reasonforchat);
szODWorkString[67] = '\0';
od_log_write(szODWorkString);
}
return(TRUE);
}
/* ----------------------------------------------------------------------------
* od_log_write()
*
* Called to write a message to the logfile.
*
* Parameters: pszMessage - Pointer to a string containing the message text.
*
* Return: TRUE on success, or FALSE on failure.
*/
ODAPIDEF BOOL ODCALL od_log_write(char *pszMessage)
{
char *pszFormat;
time_t nUnixTime;
struct tm *ptmTimeRecord;
/* Verify that OpenDoors has been initialized. */
if(!bODInitialized) od_init();
OD_API_ENTRY();
/* Stop if logfile has been disabled in config file, etc. */
if(od_control.od_logfile_disable)
{
OD_API_EXIT();
return(TRUE);
}
/* If logfile has not yet been opened, then open it. */
if(logfile_pointer==NULL)
{
if(!od_log_open())
{
OD_API_EXIT();
return(FALSE);
}
}
/* Get the current system time. */
nUnixTime=time(NULL);
ptmTimeRecord=localtime(&nUnixTime);
/* Determine which logfile format string to use. */
if(ptmTimeRecord->tm_hour<10)
{
pszFormat=(char *)"> %1.1d:%02d:%02d %s\n";
}
else
{
pszFormat=(char *)"> %2.2d:%02d:%02d %s\n";
}
/* Write a line to the logfile. */
fprintf(logfile_pointer, pszFormat, ptmTimeRecord->tm_hour,
ptmTimeRecord->tm_min, ptmTimeRecord->tm_sec, pszMessage);
OD_API_EXIT();
return(TRUE);
}
/* ----------------------------------------------------------------------------
* ODLogClose() *** PRIVATE FUNCTION ***
*
* Writes final entry to the logfile when OpenDoors is exiting.
*
* Parameters: nReason - Specifies the reason why OpenDoors is exiting.
*
* Return: void
*/
static void ODLogClose(INT nReason)
{
/* Stop if logfile has been disabled in the config file, etc. */
if(od_control.od_logfile_disable) return;
/* If logfile has not been opened, then abort. */
if(logfile_pointer==NULL) return;
if(bPreOrExit)
{
od_log_write((char *)od_control.od_logfile_messages[13]);
}
else if(btExitReason<=5 && btExitReason>=1)
{
od_log_write((char *)od_control.od_logfile_messages[btExitReason-1]);
}
else
{
sprintf(szODWorkString,(char *)od_control.od_logfile_messages[5],nReason);
od_log_write(szODWorkString);
}
/* Close the logfile. */
fclose(logfile_pointer);
/* Prevent further use of logfile without first re-opening it. */
pfLogWrite = NULL;
pfLogClose = NULL;
logfile_pointer = NULL;
}