Blame lib/log.c

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
}