/*
 * @(#)log.c--Handle debug message and log messages
 */

#define	MASTER

#include "smtprelay.h"
#include <time.h>
#include "log.h"

int	debugLevel	= DEBUG_OP;	/* Debug level */
int	debugNetDump	= FALSE;	/* Dump network transactions */
char	*logId		= "";		/* ID for log messages */
char	logBuf[4096];			/* General buffer for messages */

void
LogPrefix(
    FILE	*F
)
{
    time_t	tod;
    struct	tm *tp;

    tod = time(NULL);
    tp = localtime(&tod);

    fprintf(
	F,
	"[%s] ",
	logId
    );
}

void
LogMsg(char *str)
{
    LogPrefix(stderr);
    fprintf(stderr,"%s\n",str);
}

/*
 * Log a system error
 */
extern	int	sys_nerr;
/* extern	char	*sys_errlist[]; /* -- for linux, avi */
void
LogError(
    char	*msg		/* message prefix */
)
{
    char	sbuf[4096];

    if(errno > sys_nerr) {
	sprintf(
	    sbuf,
	    "%s%sUnknown error (%d)",
	    msg ? msg : "",
	    msg ? ": " : "",
	    errno
	);
    }
    else
    {
	sprintf(
	    sbuf,
	    "%s%s%s",
	    msg ? msg : "",
	    msg ? ": " : "",
	    sys_errlist[errno]
	);
    }
    LogMsg(sbuf);
}

/*
 * Dump a buffer to the log.
 * Types are:
 *	LD_HEX		Hex dump
 *	LD_ASCII	Ascii dump
 * Or options together to get combinations
 */
void
LogDump(
    u_char	*bp,
    int		bs,
    int		type		/* LD_HEX, LD_ASCII */
)
{
    int		i;
    char	ldbuf[64];
    char	*ldp;

    while(bs > 0) {
	if ( type|LD_HEX )
	{
	    ldp = ldbuf;
	    for(i=0;i<bs && i<16;i++) {
		ldp += sprintf(ldp," %02x",*(bp+i));
	    }
	    LogMsg(ldbuf);
	}
	if ( type|LD_ASCII )
	{
	    ldp = ldbuf;
	    for(i=0;i<bs && i<16;i++) {
		if(*(bp+i)<' ' || *(bp+i) > 127)
		{
		    ldp += sprintf(ldp," . ");
		}
		else
		{
		    ldp += sprintf(ldp," %c ",*(bp+i));
		}
	    }
	    LogMsg(ldbuf);
	}
	bp += 16;
	bs -= 16;
    }
}
