openpam_log.c revision 107579
1270031Spfg/*-
254820Speter * Copyright (c) 2002 Networks Associates Technology, Inc.
354820Speter * All rights reserved.
454820Speter *
554820Speter * This software was developed for the FreeBSD Project by ThinkSec AS and
654820Speter * Network Associates Laboratories, the Security Research Division of
754820Speter * Network Associates, Inc.  under DARPA/SPAWAR contract N66001-01-C-8035
854820Speter * ("CBOSS"), as part of the DARPA CHATS research program.
954820Speter *
1054820Speter * Redistribution and use in source and binary forms, with or without
1154820Speter * modification, are permitted provided that the following conditions
1254820Speter * are met:
1354820Speter * 1. Redistributions of source code must retain the above copyright
1454820Speter *    notice, this list of conditions and the following disclaimer.
1554820Speter * 2. Redistributions in binary form must reproduce the above copyright
1654820Speter *    notice, this list of conditions and the following disclaimer in the
1754820Speter *    documentation and/or other materials provided with the distribution.
1854820Speter * 3. The name of the author may not be used to endorse or promote
1954820Speter *    products derived from this software without specific prior written
2054820Speter *    permission.
2154820Speter *
2254820Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2354820Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2454820Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2554820Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2654820Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2754820Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2854820Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2954820Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3054820Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3154820Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3254820Speter * SUCH DAMAGE.
3384225Sdillon *
3454820Speter * $P4: //depot/projects/openpam/lib/openpam_log.c#16 $
3555227Speter */
3654820Speter
3754820Speter#include <ctype.h>
3854820Speter#include <stdarg.h>
3954820Speter#include <stdio.h>
4054820Speter#include <stdlib.h>
4155227Speter#include <string.h>
4254820Speter#include <syslog.h>
4392917Sobrien
4454820Speter#include <security/pam_appl.h>
4554820Speter
4654820Speter#include "openpam_impl.h"
4754820Speter
4854820Speter#if defined(openpam_log)
4954820Speter
50121193Smarkm/*
5154820Speter * OpenPAM extension
5254820Speter *
5354820Speter * Log a message through syslog(3)
5454820Speter */
5555227Speter
5654820Spetervoid
5754820Speter_openpam_log(int level, const char *func, const char *fmt, ...)
5855227Speter{
5954820Speter	va_list ap;
6054820Speter	char *format;
6154820Speter	int len, priority;
62270031Spfg
6354820Speter	switch (level) {
6454820Speter	case PAM_LOG_DEBUG:
6554820Speter#ifndef DEBUG
6654820Speter		return;
6754820Speter#endif
6854820Speter		priority = LOG_DEBUG;
6954820Speter		break;
7054820Speter	case PAM_LOG_VERBOSE:
7154820Speter		priority = LOG_INFO;
7254820Speter		break;
7354820Speter	case PAM_LOG_NOTICE:
7454820Speter		priority = LOG_NOTICE;
7554820Speter		break;
7654820Speter	case PAM_LOG_ERROR:
7754820Speter	default:
7854820Speter		priority = LOG_ERR;
79121193Smarkm		break;
8054820Speter	}
8154820Speter	va_start(ap, fmt);
8254820Speter	for (len = strlen(fmt); len > 0 && isspace(fmt[len]); len--)
8354820Speter		/* nothing */;
8454820Speter	if ((format = malloc(strlen(func) + len + 16)) != NULL) {
8554820Speter		sprintf(format, "in %s(): %.*s\n", func, len, fmt);
8654820Speter		vsyslog(priority, format, ap);
8754820Speter		free(format);
8854820Speter	} else {
8955227Speter		vsyslog(priority, fmt, ap);
9054820Speter	}
9155227Speter	va_end(ap);
9254820Speter}
9354820Speter
9454820Speter#else
9554820Speter
9654820Speter/*
9754820Speter * If openpam_log isn't defined as a macro, we're on a platform that
9854820Speter * doesn't support varadic macros (or it does but we aren't aware of
9954820Speter * it).  Do the next best thing.
10054820Speter */
10154820Speter
10254820Spetervoid
10354820Speteropenpam_log(int level, const char *fmt, ...)
10454820Speter{
10554820Speter	va_list ap;
10654820Speter	int priority;
10754820Speter
10854820Speter	switch (level) {
10954820Speter	case PAM_LOG_DEBUG:
11054820Speter#ifndef DEBUG
11154820Speter		return;
11254820Speter#endif
11354820Speter		priority = LOG_DEBUG;
11454820Speter		break;
11554820Speter	case PAM_LOG_VERBOSE:
11654820Speter		priority = LOG_INFO;
11754820Speter		break;
11854820Speter	case PAM_LOG_NOTICE:
11954820Speter		priority = LOG_NOTICE;
12054820Speter		break;
12154820Speter	case PAM_LOG_ERROR:
12254820Speter	default:
12354820Speter		priority = LOG_ERR;
12454820Speter		break;
12554820Speter	}
12654820Speter	va_start(ap, fmt);
12754820Speter	vsyslog(priority, fmt, ap);
12854820Speter	va_end(ap);
12954820Speter}
13054820Speter
13154820Speter#endif
13254820Speter
13354820Speter/*
13454820Speter * NOLIST
13554820Speter */
13654820Speter