]> granicus.if.org Git - linux-pam/blob - dynamic/pam.c
Relevant BUGIDs: 486063
[linux-pam] / dynamic / pam.c
1 /*
2  * $Id$
3  *
4  * If you want to dynamically load libpam using dlopen() or something,
5  * then dlopen( ' this shared object ' ); It takes care of exporting
6  * the right symbols to any modules loaded by libpam.
7  */
8
9 #include <stdio.h>
10 #include <dlfcn.h>
11 #include <security/pam_appl.h>
12 #include <security/_pam_macros.h>
13
14 #ifndef LIBPAMPATH
15 #define LIBPAMPATH "/lib/libpam.so"
16 #endif
17
18 static void *libpam_h = NULL;
19
20 #define CONFIRM_PAM_FUNCTION(x, y, z, err) \
21     do { \
22         union { const void *tpointer; y (*fn) z ; } fptr; \
23         fptr.tpointer = dlsym(libpam_h, #x); real_##x = fptr.fn; \
24         if (real_##x == NULL) { \
25             D(("unable to resolve '" #x "': %s", dlerror())); \
26             return err; \
27         } \
28     } while (0)
29
30
31 extern void _init(void);
32
33 void _init()
34 {
35     if (libpam_h == NULL) {
36         libpam_h = dlopen(LIBPAMPATH, RTLD_GLOBAL|RTLD_NOW);
37     }
38 }
39
40 extern void _fini(void);
41
42 void _fini()
43 {
44     if (libpam_h != NULL) {
45         dlclose(libpam_h);
46     }
47 }
48
49 int pam_start(const char *service_name, const char *user,
50               const struct pam_conv *pam_conversation,
51               pam_handle_t **pamh)
52 {
53     static int (*real_pam_start)(const char *, const char *,
54                                  const struct pam_conv *,
55                                  pam_handle_t **);
56     CONFIRM_PAM_FUNCTION(pam_start, int, (const char *, const char *,
57                                           const struct pam_conv *,
58                                           pam_handle_t **), PAM_ABORT);
59     return real_pam_start(service_name, user, pam_conversation, pamh);
60 }
61
62 int pam_end(pam_handle_t *pamh, int pam_status)
63 {
64     static int (*real_pam_end)(pam_handle_t *, int);
65     CONFIRM_PAM_FUNCTION(pam_end, int, (pam_handle_t *, int), PAM_ABORT);
66     return real_pam_end(pamh, pam_status);
67 }
68
69 int pam_set_item(pam_handle_t *pamh, int item_type, const void *item)
70 {
71     static int (*real_pam_set_item)(pam_handle_t *, int, const void *);
72     CONFIRM_PAM_FUNCTION(pam_set_item, int,
73                          (pam_handle_t *, int, const void *), PAM_ABORT);
74     return real_pam_set_item(pamh, item_type, item);
75 }
76
77 int pam_get_item(const pam_handle_t *pamh, int item_type, const void **item)
78 {
79     static int (*real_pam_get_item)(const pam_handle_t *, int, const void **);
80     CONFIRM_PAM_FUNCTION(pam_get_item, int,
81                          (const pam_handle_t *, int, const void **),
82                          PAM_ABORT);
83     return real_pam_get_item(pamh, item_type, item);
84 }
85
86 int pam_fail_delay(pam_handle_t *pamh, unsigned int musec_delay)
87 {
88     static int (*real_pam_fail_delay)(pam_handle_t *, unsigned int);
89     CONFIRM_PAM_FUNCTION(pam_fail_delay, int, (pam_handle_t *, unsigned int),
90                          PAM_ABORT);
91     return real_pam_fail_delay(pamh, musec_delay);
92 }
93
94 typedef const char * const_char_pointer;
95
96 const_char_pointer pam_strerror(pam_handle_t *pamh, int errnum)
97 {
98     static const_char_pointer (*real_pam_strerror)(pam_handle_t *, int);
99     CONFIRM_PAM_FUNCTION(pam_strerror, const_char_pointer,
100                          (pam_handle_t *, int), NULL);
101     return real_pam_strerror(pamh, errnum);
102 }
103
104 int pam_putenv(pam_handle_t *pamh, const char *name_value)
105 {
106     static int (*real_pam_putenv)(pam_handle_t *, const char *);
107     CONFIRM_PAM_FUNCTION(pam_putenv, int, (pam_handle_t *, const char *),
108                          PAM_ABORT);
109     return real_pam_putenv(pamh, name_value);
110 }
111
112 const_char_pointer pam_getenv(pam_handle_t *pamh, const char *name)
113 {
114     static const_char_pointer (*real_pam_getenv)(pam_handle_t *, const char *);
115     CONFIRM_PAM_FUNCTION(pam_getenv, const_char_pointer,
116                          (pam_handle_t *, const char *), NULL);
117     return real_pam_getenv(pamh, name);
118 }
119
120 typedef char ** char_ppointer;
121 char_ppointer pam_getenvlist(pam_handle_t *pamh)
122 {
123     static char_ppointer (*real_pam_getenvlist)(pam_handle_t *);
124     CONFIRM_PAM_FUNCTION(pam_getenvlist, char_ppointer, (pam_handle_t *),
125                          NULL);
126     return real_pam_getenvlist(pamh);
127 }
128
129 /* Authentication management */
130
131 int pam_authenticate(pam_handle_t *pamh, int flags)
132 {
133     static int (*real_pam_authenticate)(pam_handle_t *, int);
134     CONFIRM_PAM_FUNCTION(pam_authenticate, int, (pam_handle_t *, int),
135                          PAM_ABORT);
136     return real_pam_authenticate(pamh, flags);
137 }
138
139 int pam_setcred(pam_handle_t *pamh, int flags)
140 {
141     static int (*real_pam_setcred)(pam_handle_t *, int);
142     CONFIRM_PAM_FUNCTION(pam_setcred, int, (pam_handle_t *, int), PAM_ABORT);
143     return real_pam_setcred(pamh, flags);
144 }
145
146 /* Account Management API's */
147
148 int pam_acct_mgmt(pam_handle_t *pamh, int flags)
149 {
150     static int (*real_pam_acct_mgmt)(pam_handle_t *, int);
151     CONFIRM_PAM_FUNCTION(pam_acct_mgmt, int, (pam_handle_t *, int), PAM_ABORT);
152     return real_pam_acct_mgmt(pamh, flags);
153 }
154
155 /* Session Management API's */
156
157 int pam_open_session(pam_handle_t *pamh, int flags)
158 {
159     static int (*real_pam_open_session)(pam_handle_t *, int);
160     CONFIRM_PAM_FUNCTION(pam_open_session, int, (pam_handle_t *, int),
161                          PAM_ABORT);
162     return real_pam_open_session(pamh, flags);
163 }
164
165 int pam_close_session(pam_handle_t *pamh, int flags)
166 {
167     static int (*real_pam_close_session)(pam_handle_t *, int);
168     CONFIRM_PAM_FUNCTION(pam_close_session, int, (pam_handle_t *, int),
169                          PAM_ABORT);
170     return real_pam_close_session(pamh, flags);
171 }
172
173 /* Password Management API's */
174
175 int pam_chauthtok(pam_handle_t *pamh, int flags)
176 {
177     static int (*real_pam_chauthtok)(pam_handle_t *, int);
178     CONFIRM_PAM_FUNCTION(pam_chauthtok, int, (pam_handle_t *, int), PAM_ABORT);
179     return real_pam_chauthtok(pamh, flags);
180 }