16#include <security/pam_appl.h>
20static void *libpam_h = NULL;
22#define RESOLVE_PAM_FUNCTION(x, y, z, err) \
26 const void *tpointer; \
29 fptr.tpointer = dlsym(libpam_h, #x); \
31 if (real_##x == NULL) \
33 fprintf(stderr, "PAMDL: unable to resolve '%s': %s\n", #x, dlerror()); \
39dlopen_pam(
const char *so)
43 libpam_h = dlopen(so, RTLD_GLOBAL | RTLD_NOW);
45 return libpam_h != NULL;
59pam_start(
const char *service_name,
const char *user,
const struct pam_conv *pam_conversation,
62 int (*real_pam_start)(
const char *,
const char *,
const struct pam_conv *, pam_handle_t **);
63 RESOLVE_PAM_FUNCTION(pam_start,
int,
64 (
const char *,
const char *,
const struct pam_conv *, pam_handle_t **),
66 return real_pam_start(service_name, user, pam_conversation, pamh);
70pam_end(pam_handle_t *pamh,
int pam_status)
72 int (*real_pam_end)(pam_handle_t *, int);
73 RESOLVE_PAM_FUNCTION(pam_end,
int, (pam_handle_t *,
int), PAM_ABORT);
74 return real_pam_end(pamh, pam_status);
78pam_set_item(pam_handle_t *pamh,
int item_type,
const void *item)
80 int (*real_pam_set_item)(pam_handle_t *, int,
const void *);
81 RESOLVE_PAM_FUNCTION(pam_set_item,
int, (pam_handle_t *,
int,
const void *), PAM_ABORT);
82 return real_pam_set_item(pamh, item_type, item);
86pam_get_item(
const pam_handle_t *pamh,
int item_type,
const void **item)
88 int (*real_pam_get_item)(
const pam_handle_t *, int,
const void **);
89 RESOLVE_PAM_FUNCTION(pam_get_item,
int, (
const pam_handle_t *,
int,
const void **), PAM_ABORT);
90 return real_pam_get_item(pamh, item_type, item);
94pam_fail_delay(pam_handle_t *pamh,
unsigned int musec_delay)
96 int (*real_pam_fail_delay)(pam_handle_t *,
unsigned int);
97 RESOLVE_PAM_FUNCTION(pam_fail_delay,
int, (pam_handle_t *,
unsigned int), PAM_ABORT);
98 return real_pam_fail_delay(pamh, musec_delay);
101typedef const char *const_char_pointer;
104pam_strerror(pam_handle_t *pamh,
int errnum)
106 const_char_pointer (*real_pam_strerror)(pam_handle_t *, int);
107 RESOLVE_PAM_FUNCTION(pam_strerror, const_char_pointer, (pam_handle_t *,
int), NULL);
108 return real_pam_strerror(pamh, errnum);
112pam_putenv(pam_handle_t *pamh,
const char *
name_value)
114 int (*real_pam_putenv)(pam_handle_t *,
const char *);
115 RESOLVE_PAM_FUNCTION(pam_putenv,
int, (pam_handle_t *,
const char *), PAM_ABORT);
120pam_getenv(pam_handle_t *pamh,
const char *name)
122 const_char_pointer (*real_pam_getenv)(pam_handle_t *,
const char *);
123 RESOLVE_PAM_FUNCTION(pam_getenv, const_char_pointer, (pam_handle_t *,
const char *), NULL);
124 return real_pam_getenv(pamh, name);
127typedef char **char_ppointer;
129pam_getenvlist(pam_handle_t *pamh)
131 char_ppointer (*real_pam_getenvlist)(pam_handle_t *);
132 RESOLVE_PAM_FUNCTION(pam_getenvlist, char_ppointer, (pam_handle_t *), NULL);
133 return real_pam_getenvlist(pamh);
139pam_authenticate(pam_handle_t *pamh,
int flags)
141 int (*real_pam_authenticate)(pam_handle_t *, int);
142 RESOLVE_PAM_FUNCTION(pam_authenticate,
int, (pam_handle_t *,
int), PAM_ABORT);
143 return real_pam_authenticate(pamh, flags);
147pam_setcred(pam_handle_t *pamh,
int flags)
149 int (*real_pam_setcred)(pam_handle_t *, int);
150 RESOLVE_PAM_FUNCTION(pam_setcred,
int, (pam_handle_t *,
int), PAM_ABORT);
151 return real_pam_setcred(pamh, flags);
157pam_acct_mgmt(pam_handle_t *pamh,
int flags)
159 int (*real_pam_acct_mgmt)(pam_handle_t *, int);
160 RESOLVE_PAM_FUNCTION(pam_acct_mgmt,
int, (pam_handle_t *,
int), PAM_ABORT);
161 return real_pam_acct_mgmt(pamh, flags);
167pam_open_session(pam_handle_t *pamh,
int flags)
169 int (*real_pam_open_session)(pam_handle_t *, int);
170 RESOLVE_PAM_FUNCTION(pam_open_session,
int, (pam_handle_t *,
int), PAM_ABORT);
171 return real_pam_open_session(pamh, flags);
175pam_close_session(pam_handle_t *pamh,
int flags)
177 int (*real_pam_close_session)(pam_handle_t *, int);
178 RESOLVE_PAM_FUNCTION(pam_close_session,
int, (pam_handle_t *,
int), PAM_ABORT);
179 return real_pam_close_session(pamh, flags);
185pam_chauthtok(pam_handle_t *pamh,
int flags)
187 int (*real_pam_chauthtok)(pam_handle_t *, int);
188 RESOLVE_PAM_FUNCTION(pam_chauthtok,
int, (pam_handle_t *,
int), PAM_ABORT);
189 return real_pam_chauthtok(pamh, flags);