freebsd-skq/usr.sbin/ctm/ctm_rmail/error.c
phk 80ef2eaf89 (Not tested yet. I may insist that ctm be invoked with absolute path. /phk)
This patch fixes the concurrency problem, and adds a possibly useful -f switch
(which you can read about in the man page :-) ).  It also removes the absolute
path from the invocation of ctm.  I'll write a note about how to use a script
with sendmail and procmail or some such, and people can fix their PATH there.

BTW, this patch changes ctm_rmail.1, ctm_rmail.c and error.c in the ctm_rmail
directory.

Stephen.

Reviewed by:	phk
Submitted by:	Stephen McKay <syssgm@devetir.qld.gov.au>
1995-02-25 05:10:18 +00:00

98 lines
1.8 KiB
C

/*
* Routines for logging error messages or other informative messages.
*
* Log messages can easily contain the program name, a time stamp, system
* error messages, and arbitrary printf-style strings, and can be directed
* to stderr or a log file.
*
* Author: Stephen McKay
*
* NOTICE: This is free software. I hope you get some use from this program.
* In return you should think about all the nice people who give away software.
* Maybe you should write some free software too.
*/
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <time.h>
#include <errno.h>
#include "error.h"
static FILE *error_fp = NULL;
static char *prog = NULL;
/*
* Log errors to the given file.
*/
void
err_set_log(char *log_file)
{
FILE *fp;
if ((fp = fopen(log_file, "a")) == NULL)
err("cannot log to '%s'", log_file);
else
error_fp = fp;
}
/*
* Set the error prefix if not logging to a file.
*/
void
err_prog_name(char *name)
{
if ((prog = strrchr(name, '/')) == NULL)
prog = name;
else
prog++;
}
/*
* Log an error.
*
* A leading '*' in the message format means we want the system errno
* decoded and appended.
*/
void
err(char *fmt, ...)
{
va_list ap;
time_t now;
struct tm *tm;
FILE *fp;
int x = errno;
int want_errno;
if ((fp = error_fp) == NULL)
{
fp = stderr;
if (prog != NULL)
fprintf(fp, "%s: ", prog);
}
else
{
time(&now);
tm = localtime(&now);
fprintf(fp, "%04d-%02d-%02d %02d:%02d ", tm->tm_year+1900,
tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min);
}
want_errno = 0;
if (*fmt == '*')
want_errno++, fmt++;
va_start(ap, fmt);
vfprintf(fp, fmt, ap);
va_end(ap);
if (want_errno)
fprintf(fp, ": %s", strerror(x));
fprintf(fp, "\n");
fflush(fp);
}