Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / lib / libpam / libpam / pam_debug_log.c
1 /*-
2  * Copyright 2001 Mark R V Murray
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD: src/lib/libpam/libpam/pam_debug_log.c,v 1.8.2.2 2002/07/03 21:45:44 des Exp $
27  * $DragonFly: src/lib/libpam/libpam/Attic/pam_debug_log.c,v 1.2 2003/06/17 04:26:50 dillon Exp $
28  */
29
30 #include <libgen.h>
31 #include <stdarg.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <syslog.h>
36
37 #include <security/pam_modules.h>
38 #include <security/pam_mod_misc.h>
39
40 #define FMTBUFSIZ       256
41
42 static char *modulename(const char *);
43
44 /* Log a debug message, including the function name and a
45  * cleaned up filename.
46  */
47 void
48 _pam_log(struct options *options, const char *file, const char *function,
49     const char *format, ...)
50 {
51         va_list ap;
52         char *fmtbuf, *modname;
53
54         if (pam_test_option(options, PAM_OPT_DEBUG, NULL)) {
55                 modname = modulename(file);
56                 va_start(ap, format);
57                 asprintf(&fmtbuf, "%s: %s: %s", modname, function, format);
58                 vsyslog(LOG_DEBUG, fmtbuf, ap);
59                 free(fmtbuf);
60                 va_end(ap);
61         }
62 }
63
64 /* Log a return value, including the function name and a
65  * cleaned up filename.
66  */
67 void
68 _pam_log_retval(struct options *options, const char *file, const char *function,
69     int retval)
70 {
71         char *modname;
72
73         if (pam_test_option(options, PAM_OPT_DEBUG, NULL)) {
74                 modname = modulename(file);
75
76                 switch (retval) {
77                 case PAM_SUCCESS:
78                         syslog(LOG_DEBUG, "%s: %s: returning PAM_SUCCESS",
79                             modname, function);
80                         break;
81                 case PAM_AUTH_ERR:
82                         syslog(LOG_DEBUG, "%s: %s: returning PAM_AUTH_ERR",
83                             modname, function);
84                         break;
85                 case PAM_IGNORE:
86                         syslog(LOG_DEBUG, "%s: %s: returning PAM_IGNORE",
87                             modname, function);
88                         break;
89                 case PAM_PERM_DENIED:
90                         syslog(LOG_DEBUG, "%s: %s: returning PAM_PERM_DENIED",
91                             modname, function);
92                         break;
93                 default:
94                         syslog(LOG_DEBUG, "%s: %s: returning (%d)",
95                             modname, function, retval);
96                 }
97
98                 free(modname);
99         }
100 }
101
102 /* Print a verbose error, including the function name and a
103  * cleaned up filename.
104  */
105 void
106 _pam_verbose_error(pam_handle_t *pamh, struct options *options,
107     const char *file, const char *function, const char *format, ...)
108 {
109         va_list ap;
110         char *statusmsg, *fmtbuf, *modname;
111
112         if (!pam_test_option(options, PAM_OPT_NO_WARN, NULL)) {
113                 modname = modulename(file);
114                 va_start(ap, format);
115                 asprintf(&fmtbuf, "%s: %s: %s", modname, function, format);
116                 vasprintf(&statusmsg, fmtbuf, ap);
117                 pam_prompt(pamh, PAM_ERROR_MSG, statusmsg, NULL);
118                 free(statusmsg);
119                 free(fmtbuf);
120                 va_end(ap);
121         }
122 }
123
124 static char *
125 modulename(const char *file)
126 {
127         char *modname, *period;
128
129         modname = strdup(basename(file));
130         period = strchr(modname, '.');
131         if (period != NULL)
132                 *period = '\0';
133
134         return modname;
135 }