version 1.34, 2006/04/20 12:13:19 |
version 1.35, 2006/05/27 03:30:30 |
|
|
/* $OpenBSD$ */ |
/* $OpenBSD$ */ |
/* |
/* |
|
* Copyright (c) 2006 Joris Vink <joris@openbsd.org> |
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> |
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> |
* All rights reserved. |
* All rights reserved. |
* |
* |
|
|
|
|
extern char *__progname; |
extern char *__progname; |
|
|
|
|
#ifdef unused |
|
static char *cvs_log_levels[LP_MAX + 1] = { |
|
"debug", |
|
"info", |
|
"notice", |
|
"warning", |
|
"error", |
|
"alert", |
|
"error", |
|
"abort", |
|
"trace", |
|
}; |
|
#endif |
|
|
|
static int cvs_slpriomap[LP_MAX + 1] = { |
|
LOG_DEBUG, |
|
LOG_INFO, |
|
LOG_NOTICE, |
|
LOG_WARNING, |
|
LOG_ERR, |
|
LOG_ALERT, |
|
LOG_ERR, |
|
LOG_ERR, |
|
LOG_DEBUG, |
|
}; |
|
|
|
#if !defined(RCSPROG) |
|
static int send_m = 1; |
static int send_m = 1; |
#endif |
|
static u_int cvs_log_dest = LD_STD; |
|
static u_int cvs_log_flags = 0; |
|
|
|
static struct syslog_data cvs_sl = SYSLOG_DATA_INIT; |
|
|
|
/* filter manipulation macros */ |
|
#define CVS_LOG_FLTRRST() (cvs_log_filters = 0) |
|
#define CVS_LOG_FLTRSET(l) (cvs_log_filters |= (1 << l)) |
|
#define CVS_LOG_FLTRGET(l) (cvs_log_filters & (1 << l)) |
|
#define CVS_LOG_FLTRCLR(l) (cvs_log_filters &= ~(1 << l)) |
|
|
|
static u_int cvs_log_filters; |
|
|
|
|
|
/* |
/* |
* cvs_log_init() |
|
* |
|
* Initialize the logging facility of the server. |
|
*/ |
|
void |
|
cvs_log_init(u_int dest, u_int flags) |
|
{ |
|
int slopt; |
|
|
|
cvs_log_dest = dest; |
|
cvs_log_flags = flags; |
|
|
|
/* by default, filter only LP_DEBUG and LP_INFO levels */ |
|
CVS_LOG_FLTRRST(); |
|
CVS_LOG_FLTRSET(LP_DEBUG); |
|
CVS_LOG_FLTRSET(LP_INFO); |
|
|
|
/* traces are enabled with the -t command-line option */ |
|
CVS_LOG_FLTRSET(LP_TRACE); |
|
|
|
if (dest & LD_SYSLOG) { |
|
slopt = 0; |
|
|
|
if (dest & LD_CONS) |
|
slopt |= LOG_CONS; |
|
if (flags & LF_PID) |
|
slopt |= LOG_PID; |
|
|
|
openlog_r(__progname, slopt, LOG_DAEMON, &cvs_sl); |
|
} |
|
} |
|
|
|
|
|
/* |
|
* cvs_log_cleanup() |
|
* |
|
* Cleanup the logging facility. |
|
*/ |
|
void |
|
cvs_log_cleanup(void) |
|
{ |
|
|
|
closelog_r(&cvs_sl); |
|
} |
|
|
|
|
|
/* |
|
* cvs_log_filter() |
|
* |
|
* Apply or remove filters on the logging facility. The exact operation is |
|
* specified by the <how> and <level> arguments. The <how> arguments tells |
|
* how the filters will be affected, and <level> gives the log levels that |
|
* will be affected by the change. |
|
* Returns 0 on success, or -1 on failure. |
|
*/ |
|
|
|
int |
|
cvs_log_filter(u_int how, u_int level) |
|
{ |
|
u_int i; |
|
|
|
if (level > LP_MAX && level != LP_ALL) { |
|
cvs_log(LP_ERR, "invalid log level for filter"); |
|
return (-1); |
|
} |
|
|
|
switch (how) { |
|
case LP_FILTER_SET: |
|
if (level == LP_ALL) |
|
for (i = 0; i <= LP_MAX; i++) |
|
CVS_LOG_FLTRSET(i); |
|
else |
|
CVS_LOG_FLTRSET(level); |
|
break; |
|
case LP_FILTER_UNSET: |
|
if (level == LP_ALL) |
|
CVS_LOG_FLTRRST(); |
|
else |
|
CVS_LOG_FLTRCLR(level); |
|
break; |
|
default: |
|
return (-1); |
|
} |
|
|
|
return (0); |
|
} |
|
|
|
|
|
/* |
|
* cvs_log() |
* cvs_log() |
* |
* |
* Log the format-string message |
* Log the format-string message |
|
|
va_end(vap); |
va_end(vap); |
} |
} |
|
|
|
|
/* |
/* |
* cvs_vlog() |
* cvs_vlog() |
* |
* |
|
|
int ecp; |
int ecp; |
char prefix[64], buf[1024], ebuf[255]; |
char prefix[64], buf[1024], ebuf[255]; |
FILE *out; |
FILE *out; |
#if !defined(RCSPROG) |
|
char *cmdname; |
char *cmdname; |
struct cvs_cmd *cmdp; |
struct cvs_cmd *cmdp; |
#endif |
|
|
|
if (level > LP_MAX) |
if (cvs_trace != 1 && level == LP_TRACE) |
fatal("cvs_vlog failed"); |
|
|
|
/* apply any filters */ |
|
if (CVS_LOG_FLTRGET(level)) |
|
return; |
return; |
|
|
if (level == LP_ERRNO) |
if (level == LP_ERRNO) |
|
|
ecp = 0; |
ecp = 0; |
|
|
/* always use the command name in error messages, not aliases */ |
/* always use the command name in error messages, not aliases */ |
#if !defined(RCSPROG) |
|
if (cvs_command == NULL) |
if (cvs_command == NULL) |
cmdname = " "; |
cmdname = " "; |
else { |
else { |
|
|
snprintf(prefix, sizeof(prefix), "%s %s", __progname, |
snprintf(prefix, sizeof(prefix), "%s %s", __progname, |
cmdname); |
cmdname); |
} else /* just use the standard strlcpy */ |
} else /* just use the standard strlcpy */ |
#endif |
|
strlcpy(prefix, __progname, sizeof(prefix)); |
strlcpy(prefix, __progname, sizeof(prefix)); |
|
|
if ((cvs_log_flags & LF_PID) && level != LP_TRACE) { |
|
snprintf(buf, sizeof(buf), "[%d]", (int)getpid()); |
|
strlcat(prefix, buf, sizeof(prefix)); |
|
} |
|
|
|
vsnprintf(buf, sizeof(buf), fmt, vap); |
vsnprintf(buf, sizeof(buf), fmt, vap); |
if (level == LP_ERRNO) { |
if (level == LP_ERRNO) { |
snprintf(ebuf, sizeof(ebuf), ": %s", strerror(errno)); |
snprintf(ebuf, sizeof(ebuf), ": %s", strerror(errno)); |
strlcat(buf, ebuf, sizeof(buf)); |
strlcat(buf, ebuf, sizeof(buf)); |
} |
} |
|
|
if (cvs_log_dest & LD_STD) { |
if (level == LP_NOTICE) |
if (level < LP_NOTICE) |
out = stdout; |
out = stdout; |
else |
else |
out = stderr; |
out = stderr; |
|
|
|
#if !defined(RCSPROG) |
if (cvs_cmdop == CVS_OP_SERVER) { |
if (cvs_cmdop == CVS_OP_SERVER) { |
if (out == stdout) |
if (out == stdout) |
putc('M', out); |
putc('M', out); |
else { |
else { |
out = stdout; |
out = stdout; |
putc('E', out); |
putc('E', out); |
|
} |
|
putc(' ', out); |
|
} |
} |
#endif |
|
|
|
fputs(prefix, out); |
putc(' ', out); |
if (level != LP_TRACE) |
|
fputs(": ", out); |
|
fputs(buf, out); |
|
fputc('\n', out); |
|
} |
} |
|
|
if (cvs_log_dest & LD_SYSLOG) |
fputs(prefix, out); |
syslog_r(cvs_slpriomap[level], &cvs_sl, "%s", buf); |
if (level != LP_TRACE) |
|
fputs(": ", out); |
|
fputs(buf, out); |
|
fputc('\n', out); |
|
|
/* preserve it just in case we changed it? */ |
/* preserve it just in case we changed it? */ |
if (level == LP_ERRNO) |
if (level == LP_ERRNO) |
errno = ecp; |
errno = ecp; |
} |
} |
|
|
|
|
/* |
/* |
* cvs_printf() |
* cvs_printf() |
* |
* |
|
|
cvs_printf(const char *fmt, ...) |
cvs_printf(const char *fmt, ...) |
{ |
{ |
int ret; |
int ret; |
#if !defined(RCSPROG) |
|
char *nstr, *dp, *sp; |
char *nstr, *dp, *sp; |
#endif |
|
va_list vap; |
va_list vap; |
|
|
va_start(vap, fmt); |
va_start(vap, fmt); |
|
|
#if !defined(RCSPROG) |
|
if (cvs_cmdop == CVS_OP_SERVER) { |
if (cvs_cmdop == CVS_OP_SERVER) { |
ret = vasprintf(&nstr, fmt, vap); |
ret = vasprintf(&nstr, fmt, vap); |
if (ret == -1) |
if (ret == -1) |
|
|
} |
} |
xfree(nstr); |
xfree(nstr); |
} else |
} else |
#endif |
|
ret = vprintf(fmt, vap); |
ret = vprintf(fmt, vap); |
|
|
va_end(vap); |
va_end(vap); |