Metropoli BBS
VIEWER: lprintf.c MODE: TEXT (ASCII)
/*
 * Logging
 *
 *
 * Bug reports should be sent to
 *
 *  harald@os2point.ping.de
 *  harald@haport.sesam.com
 *  Fido: 2:2448/434
 *
 */

/*
 * This module contains routines to create and fill the logfile
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>

#include <dbgheap.h>

#include <lprintf.h>

static FILE *fp = NULL;
static int flushmode = 0;

/************************************************************************/
/*  lopen                                                               */
/*                                                                      */
/*  Open logfile. Returns true on success, 0 otherwise.                 */
/************************************************************************/
int lopen(char *filename)
{
    if((fp = fopen(filename, "at")) != NULL) {
        fputc('\n', fp);
        return(1);
    }
    fprintf(stderr, "%s", _strerror(filename));
    return(0);
}

/************************************************************************/
/*  lclose                                                              */
/*                                                                      */
/*  Close logfile.                                                      */
/************************************************************************/
void lclose(void)
{
    if(fp)
        fclose(fp);
}

/************************************************************************/
/*  lflush                                                              */
/*                                                                      */
/*  Set or reset flush mode.                                            */
/************************************************************************/
void lflush(int enable)
{
    flushmode = enable;
}

/************************************************************************/
/*  lprintf                                                             */
/*                                                                      */
/*  Output a line to the logfile. Works like printf. Inserts current    */
/*  date and time.                                                      */
/************************************************************************/
void _cdecl lprintf(char *format,...)
{
    va_list marker;
    FILE *stream = stderr;
    char *cp = format;

    /*
     * Remove linefeeds
     */
    while((cp = strchr(cp, '\n')) != NULL)
        *cp = ' ';

    /*
     * If our output goes to a file, then we insert date
     * and time in front of the line.
     */
    if(fp) {
        time_t now = time(NULL);
        struct tm *snow = localtime(&now);

        fprintf(fp, "%02u/%02u-%02u:%02u ", snow->tm_mon + 1,
                                            snow->tm_mday,
                                            snow->tm_hour,
                                            snow->tm_min);
        stream = fp;
    }

    /*
     * Print the message
     */
    va_start(marker, format);
    vfprintf(stream, format, marker);
    va_end(marker);
    fputc('\n', stream);

    if(flushmode)
        fflush(stream);
}

/************************************************************************/
/*  lperror                                                             */
/*                                                                      */
/*  Print an error message to the logfile. Works like perror.           */
/************************************************************************/
void lperror(const char *string)
{
    char *emsg = strdup(_strerror(string));
    char *cp = strchr(emsg, '\n');

    if(cp)
        *cp = '\0';
    lprintf("%s", emsg);
    free(emsg);
}
[ RETURN TO DIRECTORY ]