Merge branches 'master' and 'suser_to_priv'
[dragonfly.git] / contrib / openpam / lib / openpam_log.c
1 /*-
2  * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
3  * Copyright (c) 2004-2007 Dag-Erling Smørgrav
4  * All rights reserved.
5  *
6  * This software was developed for the FreeBSD Project by ThinkSec AS and
7  * Network Associates Laboratories, the Security Research Division of
8  * Network Associates, Inc.  under DARPA/SPAWAR contract N66001-01-C-8035
9  * ("CBOSS"), as part of the DARPA CHATS research program.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. The name of the author may not be used to endorse or promote
20  *    products derived from this software without specific prior written
21  *    permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  * $Id: openpam_log.c 408 2007-12-21 11:36:24Z des $
36  */
37
38 #include <ctype.h>
39 #include <stdarg.h>
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43 #include <syslog.h>
44
45 #include <security/pam_appl.h>
46
47 #include "openpam_impl.h"
48
49 #ifdef OPENPAM_DEBUG
50 int _openpam_debug = 1;
51 #else
52 int _openpam_debug = 0;
53 #endif
54
55 #if !defined(openpam_log)
56
57 /*
58  * OpenPAM extension
59  *
60  * Log a message through syslog
61  */
62
63 void
64 openpam_log(int level, const char *fmt, ...)
65 {
66         va_list ap;
67         int priority;
68
69         switch (level) {
70         case PAM_LOG_DEBUG:
71                 if (!_openpam_debug)
72                         return;
73                 priority = LOG_DEBUG;
74                 break;
75         case PAM_LOG_VERBOSE:
76                 priority = LOG_INFO;
77                 break;
78         case PAM_LOG_NOTICE:
79                 priority = LOG_NOTICE;
80                 break;
81         case PAM_LOG_ERROR:
82         default:
83                 priority = LOG_ERR;
84                 break;
85         }
86         va_start(ap, fmt);
87         vsyslog(priority, fmt, ap);
88         va_end(ap);
89 }
90
91 #else
92
93 void
94 _openpam_log(int level, const char *func, const char *fmt, ...)
95 {
96         va_list ap;
97         char *format;
98         int priority;
99
100         switch (level) {
101         case PAM_LOG_DEBUG:
102                 if (!_openpam_debug)
103                         return;
104                 priority = LOG_DEBUG;
105                 break;
106         case PAM_LOG_VERBOSE:
107                 priority = LOG_INFO;
108                 break;
109         case PAM_LOG_NOTICE:
110                 priority = LOG_NOTICE;
111                 break;
112         case PAM_LOG_ERROR:
113         default:
114                 priority = LOG_ERR;
115                 break;
116         }
117         va_start(ap, fmt);
118         if (asprintf(&format, "in %s(): %s", func, fmt) > 0) {
119                 vsyslog(priority, format, ap);
120                 FREE(format);
121         } else {
122                 vsyslog(priority, fmt, ap);
123         }
124         va_end(ap);
125 }
126
127 #endif
128
129 /**
130  * The =openpam_log function logs messages using =syslog.
131  * It is primarily intended for internal use by the library and modules.
132  *
133  * The =level argument indicates the importance of the message.
134  * The following levels are defined:
135  *
136  *      =PAM_LOG_DEBUG:
137  *              Debugging messages.
138  *              These messages are normally not logged unless the global
139  *              integer variable :_openpam_debug is set to a non-zero
140  *              value, in which case they are logged with a =syslog
141  *              priority of =LOG_DEBUG.
142  *      =PAM_LOG_VERBOSE:
143  *              Information about the progress of the authentication
144  *              process, or other non-essential messages.
145  *              These messages are logged with a =syslog priority of
146  *              =LOG_INFO.
147  *      =PAM_LOG_NOTICE:
148  *              Messages relating to non-fatal errors.
149  *              These messages are logged with a =syslog priority of
150  *              =LOG_NOTICE.
151  *      =PAM_LOG_ERROR:
152  *              Messages relating to serious errors.
153  *              These messages are logged with a =syslog priority of
154  *              =LOG_ERR.
155  *
156  * The remaining arguments are a =printf format string and the
157  * corresponding arguments.
158  */