1 /*
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that the following conditions
4 * are met:
5 * 1. Redistributions of source code must retain the above copyright
6 * notice, and the entire permission notice in its entirety,
7 * including the disclaimer of warranties.
8 * 2. Redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution.
11 * 3. The name of the author may not be used to endorse or promote
12 * products derived from this software without specific prior
13 * written permission.
14 *
15 * ALTERNATIVELY, this product may be distributed under the terms of
16 * the GNU Public License, in which case the provisions of the GPL are
17 * required INSTEAD OF the above restrictions. (This clause is
18 * necessary due to a potential bad interaction between the GPL and
19 * the restrictions contained in a BSD-style copyright.)
20 *
21 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31 * OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #include "config.h"
35
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <unistd.h>
39 #include <stdarg.h>
40 #include <errno.h>
41
42 #include <security/pam_modules.h>
43 #include <security/_pam_macros.h>
44 #include <security/pam_ext.h>
45
46 #include "pam_private.h"
47
48 #ifndef LOG_AUTHPRIV
49 #define LOG_AUTHPRIV LOG_AUTH
50 #endif
51
52 static const char *
53 _pam_choice2str (int choice)
54 {
55 switch (choice)
56 {
57 case PAM_AUTHENTICATE:
58 return "auth";
59 case PAM_SETCRED:
60 return "setcred";
61 case PAM_ACCOUNT:
62 return "account";
63 case PAM_OPEN_SESSION:
64 case PAM_CLOSE_SESSION:
65 return "session";
66 case PAM_CHAUTHTOK:
67 return "chauthtok";
68 }
69 return "";
70 }
71
72 void
73 pam_vsyslog (const pam_handle_t *pamh, int priority,
74 const char *fmt, va_list args)
75 {
76 char *msgbuf1 = NULL, *msgbuf2 = NULL;
77 int save_errno = errno;
78
79 if (pamh && pamh->mod_name)
80 {
81 if (asprintf (&msgbuf1, "%s(%s:%s):", pamh->mod_name,
82 pamh->service_name?pamh->service_name:"<unknown>",
83 _pam_choice2str (pamh->choice)) < 0)
84 {
85 syslog (LOG_AUTHPRIV|LOG_ERR, "asprintf: %m");
86 return;
87 }
88 }
89
90 errno = save_errno;
91 if (vasprintf (&msgbuf2, fmt, args) < 0)
92 {
93 syslog (LOG_AUTHPRIV|LOG_ERR, "vasprintf: %m");
94 _pam_drop (msgbuf1);
95 return;
96 }
97
98 errno = save_errno;
99 syslog (LOG_AUTHPRIV|priority, "%s %s",
100 (msgbuf1 ? msgbuf1 : _PAM_SYSTEM_LOG_PREFIX), msgbuf2);
101
102 _pam_drop (msgbuf1);
103 _pam_drop (msgbuf2);
104 }
105
106 void
107 pam_syslog (const pam_handle_t *pamh, int priority,
108 const char *fmt, ...)
109 {
110 va_list args;
111
112 va_start (args, fmt);
113 pam_vsyslog (pamh, priority, fmt, args);
114 va_end (args);
115 }