|
Packit |
8480eb |
/* ----------------------------------------------------------------------- *
|
|
Packit |
8480eb |
*
|
|
Packit |
8480eb |
* log.c - applcation logging routines.
|
|
Packit |
8480eb |
*
|
|
Packit |
8480eb |
* Copyright 2004 Denis Vlasenko <vda@port.imtp.ilyichevsk.odessa.ua>
|
|
Packit |
8480eb |
* - All Rights Reserved
|
|
Packit |
8480eb |
* Copyright 2005 Ian Kent <raven@themaw.net> - All Rights Reserved
|
|
Packit |
8480eb |
*
|
|
Packit |
8480eb |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8480eb |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8480eb |
* the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
|
|
Packit |
8480eb |
* USA; either version 2 of the License, or (at your option) any later
|
|
Packit |
8480eb |
* version; incorporated herein by reference.
|
|
Packit |
8480eb |
*
|
|
Packit |
8480eb |
* This module has been adapted from patches submitted by:
|
|
Packit |
8480eb |
* Denis Vlasenko <vda@port.imtp.ilyichevsk.odessa.ua>
|
|
Packit |
8480eb |
* Thanks Denis.
|
|
Packit |
8480eb |
*
|
|
Packit |
8480eb |
* ----------------------------------------------------------------------- */
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
#include <stdarg.h>
|
|
Packit |
8480eb |
#include <stdio.h>
|
|
Packit |
8480eb |
#include <stdlib.h>
|
|
Packit |
8480eb |
#include <string.h>
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
#include "automount.h"
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
static unsigned int syslog_open = 0;
|
|
Packit |
8480eb |
static unsigned int logging_to_syslog = 0;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
/* log notification level */
|
|
Packit |
8480eb |
static unsigned int do_verbose = 0; /* Verbose feedback option */
|
|
Packit |
8480eb |
static unsigned int do_debug = 0; /* Full debug output */
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
static char *prepare_attempt_prefix(const char *msg)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
unsigned long *attempt_id;
|
|
Packit |
8480eb |
char buffer[ATTEMPT_ID_SIZE + 1];
|
|
Packit |
8480eb |
char *prefixed_msg = NULL;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
attempt_id = pthread_getspecific(key_thread_attempt_id);
|
|
Packit |
8480eb |
if (attempt_id) {
|
|
Packit |
8480eb |
int len = sizeof(buffer) + 1 + strlen(msg) + 1;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
snprintf(buffer, ATTEMPT_ID_SIZE, "%02lx", *attempt_id);
|
|
Packit |
8480eb |
prefixed_msg = (char *) calloc(len, sizeof(char));
|
|
Packit |
8480eb |
strcpy(prefixed_msg, buffer);
|
|
Packit |
8480eb |
strcat(prefixed_msg, "|");
|
|
Packit |
8480eb |
strcat(prefixed_msg, msg);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return prefixed_msg;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void set_log_norm(void)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
do_verbose = 0;
|
|
Packit |
8480eb |
do_debug = 0;
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void set_log_verbose(void)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
do_verbose = 1;
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void set_log_debug(void)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
do_debug = 1;
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void set_log_norm_ap(struct autofs_point *ap)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
ap->logopt = LOGOPT_ERROR;
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void set_log_verbose_ap(struct autofs_point *ap)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
ap->logopt = LOGOPT_VERBOSE;
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void set_log_debug_ap(struct autofs_point *ap)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
ap->logopt = LOGOPT_DEBUG;
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void log_info(unsigned int logopt, const char *msg, ...)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
unsigned int opt_log = logopt & (LOGOPT_DEBUG | LOGOPT_VERBOSE);
|
|
Packit |
8480eb |
char *prefixed_msg;
|
|
Packit |
8480eb |
va_list ap;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (!do_debug && !do_verbose && !opt_log)
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
prefixed_msg = prepare_attempt_prefix(msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
va_start(ap, msg);
|
|
Packit |
8480eb |
if (logging_to_syslog) {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, msg, ap);
|
|
Packit |
8480eb |
} else {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vfprintf(stderr, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vfprintf(stderr, msg, ap);
|
|
Packit |
8480eb |
fputc('\n', stderr);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
va_end(ap);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
free(prefixed_msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void log_notice(unsigned int logopt, const char *msg, ...)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
unsigned int opt_log = logopt & (LOGOPT_DEBUG | LOGOPT_VERBOSE);
|
|
Packit |
8480eb |
char *prefixed_msg;
|
|
Packit |
8480eb |
va_list ap;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (!do_debug && !do_verbose && !opt_log)
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
prefixed_msg = prepare_attempt_prefix(msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
va_start(ap, msg);
|
|
Packit |
8480eb |
if (logging_to_syslog) {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vsyslog(LOG_NOTICE, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, msg, ap);
|
|
Packit |
8480eb |
} else {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vfprintf(stderr, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vfprintf(stderr, msg, ap);
|
|
Packit |
8480eb |
fputc('\n', stderr);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
va_end(ap);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
free(prefixed_msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void log_warn(unsigned int logopt, const char *msg, ...)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
unsigned int opt_log = logopt & (LOGOPT_DEBUG | LOGOPT_VERBOSE);
|
|
Packit |
8480eb |
char *prefixed_msg;
|
|
Packit |
8480eb |
va_list ap;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (!do_debug && !do_verbose && !opt_log)
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
prefixed_msg = prepare_attempt_prefix(msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
va_start(ap, msg);
|
|
Packit |
8480eb |
if (logging_to_syslog) {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vsyslog(LOG_WARNING, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, msg, ap);
|
|
Packit |
8480eb |
} else {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vfprintf(stderr, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vfprintf(stderr, msg, ap);
|
|
Packit |
8480eb |
fputc('\n', stderr);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
va_end(ap);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
free(prefixed_msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void log_error(unsigned logopt, const char *msg, ...)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
char *prefixed_msg;
|
|
Packit |
8480eb |
va_list ap;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
prefixed_msg = prepare_attempt_prefix(msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
va_start(ap, msg);
|
|
Packit |
8480eb |
if (logging_to_syslog) {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vsyslog(LOG_ERR, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, msg, ap);
|
|
Packit |
8480eb |
} else {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vfprintf(stderr, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vfprintf(stderr, msg, ap);
|
|
Packit |
8480eb |
fputc('\n', stderr);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
va_end(ap);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
free(prefixed_msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void log_crit(unsigned logopt, const char *msg, ...)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
char *prefixed_msg;
|
|
Packit |
8480eb |
va_list ap;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
prefixed_msg = prepare_attempt_prefix(msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
va_start(ap, msg);
|
|
Packit |
8480eb |
if (logging_to_syslog) {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vsyslog(LOG_CRIT, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, msg, ap);
|
|
Packit |
8480eb |
} else {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vfprintf(stderr, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vfprintf(stderr, msg, ap);
|
|
Packit |
8480eb |
fputc('\n', stderr);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
va_end(ap);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
free(prefixed_msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void log_debug(unsigned int logopt, const char *msg, ...)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
unsigned int opt_log = logopt & LOGOPT_DEBUG;
|
|
Packit |
8480eb |
char *prefixed_msg;
|
|
Packit |
8480eb |
va_list ap;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (!do_debug && !opt_log)
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
prefixed_msg = prepare_attempt_prefix(msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
va_start(ap, msg);
|
|
Packit |
8480eb |
if (logging_to_syslog) {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vsyslog(LOG_WARNING, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, msg, ap);
|
|
Packit |
8480eb |
} else {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vfprintf(stderr, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vfprintf(stderr, msg, ap);
|
|
Packit |
8480eb |
fputc('\n', stderr);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
va_end(ap);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
free(prefixed_msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void logmsg(const char *msg, ...)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
char *prefixed_msg;
|
|
Packit |
8480eb |
va_list ap;
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
prefixed_msg = prepare_attempt_prefix(msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
va_start(ap, msg);
|
|
Packit |
8480eb |
if (logging_to_syslog) {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vsyslog(LOG_CRIT, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vsyslog(LOG_INFO, msg, ap);
|
|
Packit |
8480eb |
} else {
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
vfprintf(stderr, prefixed_msg, ap);
|
|
Packit |
8480eb |
else
|
|
Packit |
8480eb |
vfprintf(stderr, msg, ap);
|
|
Packit |
8480eb |
fputc('\n', stderr);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
va_end(ap);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
if (prefixed_msg)
|
|
Packit |
8480eb |
free(prefixed_msg);
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
void open_log(void)
|
|
Packit |
8480eb |
{
|
|
Packit |
8480eb |
if (!syslog_open) {
|
|
Packit |
8480eb |
syslog_open = 1;
|
|
Packit |
8480eb |
openlog("automount", LOG_PID, LOG_DAEMON);
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit |
8480eb |
logging_to_syslog = 1;
|
|
Packit |
8480eb |
return;
|
|
Packit |
8480eb |
}
|
|
Packit |
8480eb |
|
|
Packit Service |
42268b |
void log_to_syslog(void)
|
|
Packit Service |
71cd40 |
{
|
|
Packit Service |
42268b |
char buf[MAX_ERR_BUF];
|
|
Packit Service |
42268b |
int nullfd;
|
|
Packit |
50799d |
|
|
Packit Service |
42268b |
open_log();
|
|
Packit |
50799d |
|
|
Packit Service |
42268b |
/* Redirect all our file descriptors to /dev/null */
|
|
Packit Service |
42268b |
nullfd = open("/dev/null", O_RDWR);
|
|
Packit Service |
42268b |
if (nullfd < 0) {
|
|
Packit Service |
42268b |
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
Packit Service |
42268b |
fprintf(stderr, "cannot open /dev/null: %s", estr);
|
|
Packit Service |
42268b |
exit(1);
|
|
Packit Service |
42268b |
}
|
|
Packit Service |
888ac8 |
|
|
Packit Service |
42268b |
if (dup2(nullfd, STDIN_FILENO) < 0 ||
|
|
Packit Service |
42268b |
dup2(nullfd, STDOUT_FILENO) < 0 ||
|
|
Packit Service |
42268b |
dup2(nullfd, STDERR_FILENO) < 0) {
|
|
Packit Service |
42268b |
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|
Packit Service |
42268b |
fprintf(stderr,
|
|
Packit Service |
42268b |
"redirecting file descriptors failed: %s", estr);
|
|
Packit Service |
42268b |
exit(1);
|
|
Packit Service |
42268b |
}
|
|
Packit Service |
888ac8 |
|
|
Packit Service |
42268b |
if (nullfd > 2)
|
|
Packit Service |
42268b |
close(nullfd);
|
|
Packit Service |
888ac8 |
|
|
Packit Service |
42268b |
return;
|
|
Packit Service |
42268b |
}
|
|
Packit Service |
888ac8 |
|
|
Packit Service |
42268b |
void log_to_stderr(void)
|
|
Packit Service |
42268b |
{
|
|
Packit Service |
42268b |
if (syslog_open) {
|
|
Packit Service |
42268b |
syslog_open = 0;
|
|
Packit Service |
42268b |
closelog();
|
|
Packit Service |
888ac8 |
}
|
|
Packit Service |
888ac8 |
|
|
Packit Service |
42268b |
logging_to_syslog = 0;
|
|
Packit Service |
888ac8 |
|
|
Packit Service |
42268b |
return;
|
|
Packit Service |
888ac8 |
}
|