191094Sdes/*-
2115619Sdes * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
3228690Sdes * Copyright (c) 2004-2011 Dag-Erling Sm��rgrav
491094Sdes * All rights reserved.
591094Sdes *
691094Sdes * This software was developed for the FreeBSD Project by ThinkSec AS and
799158Sdes * Network Associates Laboratories, the Security Research Division of
899158Sdes * Network Associates, Inc.  under DARPA/SPAWAR contract N66001-01-C-8035
999158Sdes * ("CBOSS"), as part of the DARPA CHATS research program.
1091094Sdes *
1191094Sdes * Redistribution and use in source and binary forms, with or without
1291094Sdes * modification, are permitted provided that the following conditions
1391094Sdes * are met:
1491094Sdes * 1. Redistributions of source code must retain the above copyright
1591094Sdes *    notice, this list of conditions and the following disclaimer.
1691094Sdes * 2. Redistributions in binary form must reproduce the above copyright
1791094Sdes *    notice, this list of conditions and the following disclaimer in the
1891094Sdes *    documentation and/or other materials provided with the distribution.
1991094Sdes * 3. The name of the author may not be used to endorse or promote
2091094Sdes *    products derived from this software without specific prior written
2191094Sdes *    permission.
2291094Sdes *
2391094Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2491094Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2591094Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2691094Sdes * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2791094Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2891094Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2991094Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3091094Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3191094Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3291094Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3391094Sdes * SUCH DAMAGE.
3491094Sdes *
35348980Sdes * $OpenPAM: openpam_log.c 938 2017-04-30 21:34:42Z des $
3691094Sdes */
3791094Sdes
38228690Sdes#ifdef HAVE_CONFIG_H
39228690Sdes# include "config.h"
40228690Sdes#endif
41228690Sdes
42236099Sdes#include <errno.h>
4391094Sdes#include <stdarg.h>
4491094Sdes#include <stdio.h>
4591094Sdes#include <stdlib.h>
4691094Sdes#include <syslog.h>
4791094Sdes
4891094Sdes#include <security/pam_appl.h>
4991094Sdes
5091094Sdes#include "openpam_impl.h"
51255376Sdes#include "openpam_asprintf.h"
5291094Sdes
53228690Sdesint openpam_debug = 0;
54114536Sdes
55115619Sdes#if !defined(openpam_log)
5691094Sdes
5791094Sdes/*
5891100Sdes * OpenPAM extension
5991100Sdes *
60115619Sdes * Log a message through syslog
6191094Sdes */
6291094Sdes
6391094Sdesvoid
64115619Sdesopenpam_log(int level, const char *fmt, ...)
6591094Sdes{
6691094Sdes	va_list ap;
67115619Sdes	int priority;
68255376Sdes	int serrno;
6991094Sdes
7091094Sdes	switch (level) {
71236099Sdes	case PAM_LOG_LIBDEBUG:
7291094Sdes	case PAM_LOG_DEBUG:
73228690Sdes		if (!openpam_debug)
74114536Sdes			return;
7591094Sdes		priority = LOG_DEBUG;
7691094Sdes		break;
7791094Sdes	case PAM_LOG_VERBOSE:
7891094Sdes		priority = LOG_INFO;
7991094Sdes		break;
8091094Sdes	case PAM_LOG_NOTICE:
8191094Sdes		priority = LOG_NOTICE;
8291094Sdes		break;
8391094Sdes	case PAM_LOG_ERROR:
84107579Sdes	default:
8591094Sdes		priority = LOG_ERR;
8691094Sdes		break;
8791094Sdes	}
88255376Sdes	serrno = errno;
8991094Sdes	va_start(ap, fmt);
90115619Sdes	vsyslog(priority, fmt, ap);
9191094Sdes	va_end(ap);
92255376Sdes	errno = serrno;
9391094Sdes}
9491094Sdes
9591094Sdes#else
9691094Sdes
9791094Sdesvoid
98115619Sdes_openpam_log(int level, const char *func, const char *fmt, ...)
9991094Sdes{
10091094Sdes	va_list ap;
101115619Sdes	char *format;
10291094Sdes	int priority;
103236099Sdes	int serrno;
10491094Sdes
10591094Sdes	switch (level) {
106236099Sdes	case PAM_LOG_LIBDEBUG:
10791094Sdes	case PAM_LOG_DEBUG:
108228690Sdes		if (!openpam_debug)
109114536Sdes			return;
11091094Sdes		priority = LOG_DEBUG;
11191094Sdes		break;
11291094Sdes	case PAM_LOG_VERBOSE:
11391094Sdes		priority = LOG_INFO;
11491094Sdes		break;
11591094Sdes	case PAM_LOG_NOTICE:
11691094Sdes		priority = LOG_NOTICE;
11791094Sdes		break;
11891094Sdes	case PAM_LOG_ERROR:
119107579Sdes	default:
12091094Sdes		priority = LOG_ERR;
12191094Sdes		break;
12291094Sdes	}
123255376Sdes	serrno = errno;
12491094Sdes	va_start(ap, fmt);
125115619Sdes	if (asprintf(&format, "in %s(): %s", func, fmt) > 0) {
126236099Sdes		errno = serrno;
127115619Sdes		vsyslog(priority, format, ap);
128115619Sdes		FREE(format);
129115619Sdes	} else {
130236099Sdes		errno = serrno;
131115619Sdes		vsyslog(priority, fmt, ap);
132115619Sdes	}
13391094Sdes	va_end(ap);
134255376Sdes	errno = serrno;
13591094Sdes}
13691094Sdes
13791094Sdes#endif
13891100Sdes
139115619Sdes/**
140141098Sdes * The =openpam_log function logs messages using =syslog.
141141098Sdes * It is primarily intended for internal use by the library and modules.
142115619Sdes *
143141098Sdes * The =level argument indicates the importance of the message.
144141098Sdes * The following levels are defined:
145115619Sdes *
146236099Sdes *	=PAM_LOG_LIBDEBUG:
147236099Sdes *		Debugging messages.
148236099Sdes *		For internal use only.
149115619Sdes *	=PAM_LOG_DEBUG:
150141098Sdes *		Debugging messages.
151141098Sdes *		These messages are normally not logged unless the global
152228690Sdes *		integer variable :openpam_debug is set to a non-zero
153141098Sdes *		value, in which case they are logged with a =syslog
154141098Sdes *		priority of =LOG_DEBUG.
155115619Sdes *	=PAM_LOG_VERBOSE:
156115619Sdes *		Information about the progress of the authentication
157141098Sdes *		process, or other non-essential messages.
158141098Sdes *		These messages are logged with a =syslog priority of
159141098Sdes *		=LOG_INFO.
160115619Sdes *	=PAM_LOG_NOTICE:
161141098Sdes *		Messages relating to non-fatal errors.
162141098Sdes *		These messages are logged with a =syslog priority of
163141098Sdes *		=LOG_NOTICE.
164115619Sdes *	=PAM_LOG_ERROR:
165141098Sdes *		Messages relating to serious errors.
166141098Sdes *		These messages are logged with a =syslog priority of
167141098Sdes *		=LOG_ERR.
168115619Sdes *
169115619Sdes * The remaining arguments are a =printf format string and the
170115619Sdes * corresponding arguments.
171255376Sdes *
172255376Sdes * The =openpam_log function does not modify the value of :errno.
17391100Sdes */
174