tree-wide: Use pamh as pam_handle_t parameter name

libpam uses pamh in its function declarations for
the plugin API so let's use the same name in our
tree as well.

Making sure the plugin function definitions match
the plugin function declarations is required to
enable clang-tidy's
readability-inconsistent-declaration-parameter-name
check, but to keep things consistent everywhere we
opt to use pamh tree-wide.
This commit is contained in:
Daan De Meyer
2026-01-02 09:21:43 +01:00
parent 2553c53730
commit 944ae1286b
6 changed files with 547 additions and 561 deletions
+23 -23
View File
@@ -1192,18 +1192,18 @@ static int ask_password_conv(
return PAM_SUCCESS;
}
static int pam_close_session_and_delete_credentials(pam_handle_t *handle, int flags) {
static int pam_close_session_and_delete_credentials(pam_handle_t *pamh, int flags) {
int r, s;
assert(handle);
assert(pamh);
r = sym_pam_close_session(handle, flags);
r = sym_pam_close_session(pamh, flags);
if (r != PAM_SUCCESS)
pam_syslog_pam_error(handle, LOG_DEBUG, r, "pam_close_session() failed: @PAMERR@");
pam_syslog_pam_error(pamh, LOG_DEBUG, r, "pam_close_session() failed: @PAMERR@");
s = sym_pam_setcred(handle, PAM_DELETE_CRED | flags);
s = sym_pam_setcred(pamh, PAM_DELETE_CRED | flags);
if (s != PAM_SUCCESS)
pam_syslog_pam_error(handle, LOG_DEBUG, r, "pam_setcred(PAM_DELETE_CRED) failed: @PAMERR@");
pam_syslog_pam_error(pamh, LOG_DEBUG, r, "pam_setcred(PAM_DELETE_CRED) failed: @PAMERR@");
return r != PAM_SUCCESS ? r : s;
}
@@ -1339,7 +1339,7 @@ static int setup_pam(
_cleanup_(barrier_destroy) Barrier barrier = BARRIER_NULL;
_cleanup_strv_free_ char **e = NULL;
_cleanup_free_ char *tty = NULL;
pam_handle_t *handle = NULL;
pam_handle_t *pamh = NULL;
sigset_t old_ss;
int pam_code = PAM_SUCCESS, r;
bool close_session = false;
@@ -1369,9 +1369,9 @@ static int setup_pam(
if (log_get_max_level() < LOG_DEBUG)
flags |= PAM_SILENT;
pam_code = sym_pam_start(context->pam_name, user, &conv, &handle);
pam_code = sym_pam_start(context->pam_name, user, &conv, &pamh);
if (pam_code != PAM_SUCCESS) {
handle = NULL;
pamh = NULL;
goto fail;
}
@@ -1379,32 +1379,32 @@ static int setup_pam(
if (r < 0)
goto fail;
if (r > 0) {
pam_code = sym_pam_set_item(handle, PAM_TTY, tty);
pam_code = sym_pam_set_item(pamh, PAM_TTY, tty);
if (pam_code != PAM_SUCCESS)
goto fail;
}
STRV_FOREACH(nv, *env) {
pam_code = sym_pam_putenv(handle, *nv);
pam_code = sym_pam_putenv(pamh, *nv);
if (pam_code != PAM_SUCCESS)
goto fail;
}
pam_code = sym_pam_acct_mgmt(handle, flags);
pam_code = sym_pam_acct_mgmt(pamh, flags);
if (pam_code != PAM_SUCCESS)
goto fail;
pam_code = sym_pam_setcred(handle, PAM_ESTABLISH_CRED | flags);
pam_code = sym_pam_setcred(pamh, PAM_ESTABLISH_CRED | flags);
if (pam_code != PAM_SUCCESS)
pam_syslog_pam_error(handle, LOG_DEBUG, pam_code, "pam_setcred(PAM_ESTABLISH_CRED) failed, ignoring: @PAMERR@");
pam_syslog_pam_error(pamh, LOG_DEBUG, pam_code, "pam_setcred(PAM_ESTABLISH_CRED) failed, ignoring: @PAMERR@");
pam_code = sym_pam_open_session(handle, flags);
pam_code = sym_pam_open_session(pamh, flags);
if (pam_code != PAM_SUCCESS)
goto fail;
close_session = true;
e = sym_pam_getenvlist(handle);
e = sym_pam_getenvlist(pamh);
if (!e) {
pam_code = PAM_BUF_ERR;
goto fail;
@@ -1479,7 +1479,7 @@ static int setup_pam(
/* If our parent died we'll end the session */
if (getppid() != parent_pid) {
pam_code = pam_close_session_and_delete_credentials(handle, flags);
pam_code = pam_close_session_and_delete_credentials(pamh, flags);
if (pam_code != PAM_SUCCESS)
goto child_finish;
}
@@ -1489,7 +1489,7 @@ static int setup_pam(
child_finish:
/* NB: pam_end() when called in child processes should set PAM_DATA_SILENT to let the module
* know about this. See pam_end(3) */
(void) sym_pam_end(handle, pam_code | flags | PAM_DATA_SILENT);
(void) sym_pam_end(pamh, pam_code | flags | PAM_DATA_SILENT);
_exit(ret);
}
@@ -1497,7 +1497,7 @@ static int setup_pam(
/* If the child was forked off successfully it will do all the cleanups, so forget about the handle
* here. */
handle = NULL;
pamh = NULL;
/* Unblock SIGTERM again in the parent */
assert_se(sigprocmask(SIG_SETMASK, &old_ss, NULL) >= 0);
@@ -1515,16 +1515,16 @@ static int setup_pam(
fail:
if (pam_code != PAM_SUCCESS) {
pam_syslog_pam_error(handle, LOG_ERR, pam_code, "PAM failed: @PAMERR@");
pam_syslog_pam_error(pamh, LOG_ERR, pam_code, "PAM failed: @PAMERR@");
r = -EPERM; /* PAM errors do not map to errno */
} else
log_error_errno(r, "PAM failed: %m");
if (handle) {
if (pamh) {
if (close_session)
pam_code = pam_close_session_and_delete_credentials(handle, flags);
pam_code = pam_close_session_and_delete_credentials(pamh, flags);
(void) sym_pam_end(handle, pam_code | flags);
(void) sym_pam_end(pamh, pam_code | flags);
}
closelog();
File diff suppressed because it is too large Load Diff
+241 -246
View File
File diff suppressed because it is too large Load Diff
+14 -14
View File
@@ -11,13 +11,13 @@
static const char DEFAULT_KEYNAME[] = "cryptsetup";
_public_ PAM_EXTERN int pam_sm_authenticate(
pam_handle_t *handle,
pam_handle_t *pamh,
int flags,
int argc, const char **argv) {
int r;
assert(handle);
assert(pamh);
r = dlopen_libpam();
if (r < 0)
@@ -41,10 +41,10 @@ _public_ PAM_EXTERN int pam_sm_authenticate(
else if (streq(argv[i], "debug"))
debug = true;
else
pam_syslog(handle, LOG_WARNING, "Unknown parameter '%s', ignoring.", argv[i]);
pam_syslog(pamh, LOG_WARNING, "Unknown parameter '%s', ignoring.", argv[i]);
}
pam_debug_syslog(handle, debug, "pam-systemd-loadkey: initializing...");
pam_debug_syslog(pamh, debug, "pam-systemd-loadkey: initializing...");
/* Retrieve the key. */
@@ -52,13 +52,13 @@ _public_ PAM_EXTERN int pam_sm_authenticate(
serial = request_key("user", keyname, NULL, 0);
if (serial < 0) {
if (errno == ENOKEY) {
pam_debug_syslog(handle, debug, "Key not found: %s", keyname);
pam_debug_syslog(pamh, debug, "Key not found: %s", keyname);
return PAM_AUTHINFO_UNAVAIL;
} else if (errno == EKEYEXPIRED) {
pam_debug_syslog(handle, debug, "Key expired: %s", keyname);
pam_debug_syslog(pamh, debug, "Key expired: %s", keyname);
return PAM_AUTHINFO_UNAVAIL;
} else
return pam_syslog_errno(handle, LOG_ERR, errno, "Failed to look up the key: %m");
return pam_syslog_errno(pamh, LOG_ERR, errno, "Failed to look up the key: %m");
}
_cleanup_(erase_and_freep) void *p = NULL;
@@ -66,30 +66,30 @@ _public_ PAM_EXTERN int pam_sm_authenticate(
r = keyring_read(serial, &p, &n);
if (r < 0)
return pam_syslog_errno(handle, LOG_ERR, r, "Failed to read the key: %m");
return pam_syslog_errno(pamh, LOG_ERR, r, "Failed to read the key: %m");
/* Split the key by NUL. Set the last item as authtok. */
_cleanup_strv_free_erase_ char **passwords = strv_parse_nulstr(p, n);
if (!passwords)
return pam_log_oom(handle);
return pam_log_oom(pamh);
size_t passwords_len = strv_length(passwords);
if (passwords_len == 0) {
pam_debug_syslog(handle, debug, "Key is empty.");
pam_debug_syslog(pamh, debug, "Key is empty.");
return PAM_AUTHINFO_UNAVAIL;
} else if (passwords_len > 1)
pam_debug_syslog(handle, debug, "Multiple passwords found in the key. Using the last one.");
pam_debug_syslog(pamh, debug, "Multiple passwords found in the key. Using the last one.");
r = pam_set_item(handle, PAM_AUTHTOK, passwords[passwords_len - 1]);
r = pam_set_item(pamh, PAM_AUTHTOK, passwords[passwords_len - 1]);
if (r != PAM_SUCCESS)
return pam_syslog_pam_error(handle, LOG_ERR, r, "Failed to set PAM auth token: @PAMERR@");
return pam_syslog_pam_error(pamh, LOG_ERR, r, "Failed to set PAM auth token: @PAMERR@");
return PAM_SUCCESS;
}
_public_ PAM_EXTERN int pam_sm_setcred(
pam_handle_t *handle,
pam_handle_t *pamh,
int flags,
int argc, const char **argv) {
+44 -48
View File
@@ -73,20 +73,20 @@ int errno_to_pam_error(int error) {
return ERRNO_VALUE(error) == ENOMEM ? PAM_BUF_ERR : PAM_SERVICE_ERR;
}
int pam_syslog_errno(pam_handle_t *handle, int level, int error, const char *format, ...) {
int pam_syslog_errno(pam_handle_t *pamh, int level, int error, const char *format, ...) {
va_list ap;
error = ERRNO_VALUE(error);
LOCAL_ERRNO(error);
va_start(ap, format);
sym_pam_vsyslog(handle, level, format, ap);
sym_pam_vsyslog(pamh, level, format, ap);
va_end(ap);
return errno_to_pam_error(error);
}
int pam_syslog_pam_error(pam_handle_t *handle, int level, int error, const char *format, ...) {
int pam_syslog_pam_error(pam_handle_t *pamh, int level, int error, const char *format, ...) {
/* This wraps pam_syslog() but will replace @PAMERR@ with a string from pam_strerror().
* @PAMERR@ must be at the very end. */
@@ -95,7 +95,7 @@ int pam_syslog_pam_error(pam_handle_t *handle, int level, int error, const char
const char *p = endswith(format, "@PAMERR@");
if (p) {
const char *pamerr = sym_pam_strerror(handle, error);
const char *pamerr = sym_pam_strerror(pamh, error);
if (strchr(pamerr, '%'))
pamerr = "n/a"; /* We cannot have any formatting chars */
@@ -103,10 +103,10 @@ int pam_syslog_pam_error(pam_handle_t *handle, int level, int error, const char
xsprintf(buf, "%.*s%s", (int)(p - format), format, pamerr);
DISABLE_WARNING_FORMAT_NONLITERAL;
sym_pam_vsyslog(handle, level, buf, ap);
sym_pam_vsyslog(pamh, level, buf, ap);
REENABLE_WARNING;
} else
sym_pam_vsyslog(handle, level, format, ap);
sym_pam_vsyslog(pamh, level, format, ap);
va_end(ap);
@@ -142,7 +142,7 @@ static PamBusData *pam_bus_data_free(PamBusData *d) {
DEFINE_TRIVIAL_CLEANUP_FUNC(PamBusData*, pam_bus_data_free);
static void pam_bus_data_destroy(pam_handle_t *handle, void *data, int error_status) {
static void pam_bus_data_destroy(pam_handle_t *pamh, void *data, int error_status) {
/* Destructor when called from PAM. Note that error_status is supposed to tell us via PAM_DATA_SILENT
* whether we are called in a forked off child of the PAM session or in the original parent. We don't
* bother with that however, and instead rely on the PID checks that sd_bus_flush_close_unref() does
@@ -156,7 +156,7 @@ static void pam_bus_data_destroy(pam_handle_t *handle, void *data, int error_sta
if (FLAGS_SET(error_status, PAM_DATA_SILENT) &&
d->bus && bus_origin_changed(d->bus))
/* Please adjust test/units/end.sh when updating the log message. */
sym_pam_syslog(handle, LOG_DEBUG,
sym_pam_syslog(pamh, LOG_DEBUG,
"Warning: cannot close sd-bus connection (%s) after fork when it was opened before the fork.",
strna(d->cache_id));
@@ -180,7 +180,7 @@ static char* pam_make_bus_cache_id(const char *module_name) {
void pam_bus_data_disconnectp(PamBusData **_d) {
PamBusData *d = *ASSERT_PTR(_d);
pam_handle_t *handle;
pam_handle_t *pamh;
int r;
/* Disconnects the connection explicitly (for use via _cleanup_()) when called */
@@ -188,17 +188,17 @@ void pam_bus_data_disconnectp(PamBusData **_d) {
if (!d)
return;
handle = ASSERT_PTR(d->pam_handle); /* Keep a reference to the session even after 'd' might be invalidated */
pamh = ASSERT_PTR(d->pam_handle); /* Keep a reference to the session even after 'd' might be invalidated */
r = sym_pam_set_data(handle, ASSERT_PTR(d->cache_id), NULL, NULL);
r = sym_pam_set_data(pamh, ASSERT_PTR(d->cache_id), NULL, NULL);
if (r != PAM_SUCCESS)
pam_syslog_pam_error(handle, LOG_ERR, r, "Failed to release PAM user record data, ignoring: @PAMERR@");
pam_syslog_pam_error(pamh, LOG_ERR, r, "Failed to release PAM user record data, ignoring: @PAMERR@");
/* Note, the pam_set_data() call will invalidate 'd', don't access here anymore */
}
int pam_acquire_bus_connection(
pam_handle_t *handle,
pam_handle_t *pamh,
const char *module_name,
bool debug,
sd_bus **ret_bus,
@@ -208,39 +208,39 @@ int pam_acquire_bus_connection(
_cleanup_free_ char *cache_id = NULL;
int r;
assert(handle);
assert(pamh);
assert(module_name);
assert(ret_bus);
cache_id = pam_make_bus_cache_id(module_name);
if (!cache_id)
return pam_log_oom(handle);
return pam_log_oom(pamh);
/* We cache the bus connection so that we can share it between the session and the authentication hooks */
r = sym_pam_get_data(handle, cache_id, (const void**) &d);
r = sym_pam_get_data(pamh, cache_id, (const void**) &d);
if (r == PAM_SUCCESS && d)
goto success;
if (!IN_SET(r, PAM_SUCCESS, PAM_NO_MODULE_DATA))
return pam_syslog_pam_error(handle, LOG_ERR, r, "Failed to get bus connection: @PAMERR@");
return pam_syslog_pam_error(pamh, LOG_ERR, r, "Failed to get bus connection: @PAMERR@");
d = new(PamBusData, 1);
if (!d)
return pam_log_oom(handle);
return pam_log_oom(pamh);
*d = (PamBusData) {
.cache_id = TAKE_PTR(cache_id),
.pam_handle = handle,
.pam_handle = pamh,
};
r = sd_bus_open_system(&d->bus);
if (r < 0)
return pam_syslog_errno(handle, LOG_ERR, r, "Failed to connect to system bus: %m");
return pam_syslog_errno(pamh, LOG_ERR, r, "Failed to connect to system bus: %m");
r = sym_pam_set_data(handle, d->cache_id, d, pam_bus_data_destroy);
r = sym_pam_set_data(pamh, d->cache_id, d, pam_bus_data_destroy);
if (r != PAM_SUCCESS)
return pam_syslog_pam_error(handle, LOG_ERR, r, "Failed to set PAM bus data: @PAMERR@");
return pam_syslog_pam_error(pamh, LOG_ERR, r, "Failed to set PAM bus data: @PAMERR@");
pam_debug_syslog(handle, debug, "New sd-bus connection (%s) opened.", d->cache_id);
pam_debug_syslog(pamh, debug, "New sd-bus connection (%s) opened.", d->cache_id);
success:
*ret_bus = sd_bus_ref(d->bus);
@@ -253,38 +253,34 @@ success:
return PAM_SUCCESS;
}
int pam_get_bus_data(
pam_handle_t *handle,
const char *module_name,
PamBusData **ret) {
int pam_get_bus_data(pam_handle_t *pamh, const char *module_name, PamBusData **ret) {
PamBusData *d = NULL;
_cleanup_free_ char *cache_id = NULL;
int r;
assert(handle);
assert(pamh);
assert(module_name);
assert(ret);
cache_id = pam_make_bus_cache_id(module_name);
if (!cache_id)
return pam_log_oom(handle);
return pam_log_oom(pamh);
/* We cache the bus connection so that we can share it between the session and the authentication hooks */
r = sym_pam_get_data(handle, cache_id, (const void**) &d);
r = sym_pam_get_data(pamh, cache_id, (const void**) &d);
if (!IN_SET(r, PAM_SUCCESS, PAM_NO_MODULE_DATA))
return pam_syslog_pam_error(handle, LOG_ERR, r, "Failed to get bus connection: @PAMERR@");
return pam_syslog_pam_error(pamh, LOG_ERR, r, "Failed to get bus connection: @PAMERR@");
*ret = d;
return PAM_SUCCESS;
}
void pam_cleanup_free(pam_handle_t *handle, void *data, int error_status) {
void pam_cleanup_free(pam_handle_t *pamh, void *data, int error_status) {
/* A generic destructor for pam_set_data() that just frees the specified data */
free(data);
}
void pam_cleanup_close(pam_handle_t *handle, void *data, int error_status) {
void pam_cleanup_close(pam_handle_t *pamh, void *data, int error_status) {
/* A generic destructor for pam_set_data() that just closes the specified fd.
*
@@ -298,13 +294,13 @@ void pam_cleanup_close(pam_handle_t *handle, void *data, int error_status) {
safe_close(PTR_TO_FD(data));
}
int pam_get_item_many_internal(pam_handle_t *handle, ...) {
int pam_get_item_many_internal(pam_handle_t *pamh, ...) {
va_list ap;
int r;
assert(handle);
assert(pamh);
va_start(ap, handle);
va_start(ap, pamh);
for (;;) {
int item_type = va_arg(ap, int);
if (item_type <= 0) {
@@ -313,7 +309,7 @@ int pam_get_item_many_internal(pam_handle_t *handle, ...) {
}
const void **value = ASSERT_PTR(va_arg(ap, const void **));
r = sym_pam_get_item(handle, item_type, value);
r = sym_pam_get_item(pamh, item_type, value);
if (!IN_SET(r, PAM_BAD_ITEM, PAM_SUCCESS))
break;
}
@@ -322,13 +318,13 @@ int pam_get_item_many_internal(pam_handle_t *handle, ...) {
return r;
}
int pam_get_data_many_internal(pam_handle_t *handle, ...) {
int pam_get_data_many_internal(pam_handle_t *pamh, ...) {
va_list ap;
int r;
assert(handle);
assert(pamh);
va_start(ap, handle);
va_start(ap, pamh);
for (;;) {
const char *data_name = va_arg(ap, const char *);
if (!data_name) {
@@ -337,7 +333,7 @@ int pam_get_data_many_internal(pam_handle_t *handle, ...) {
}
const void **value = ASSERT_PTR(va_arg(ap, const void **));
r = sym_pam_get_data(handle, data_name, value);
r = sym_pam_get_data(pamh, data_name, value);
if (!IN_SET(r, PAM_NO_MODULE_DATA, PAM_SUCCESS))
break;
}
@@ -346,11 +342,11 @@ int pam_get_data_many_internal(pam_handle_t *handle, ...) {
return r;
}
int pam_prompt_graceful(pam_handle_t *handle, int style, char **ret_response, const char *fmt, ...) {
int pam_prompt_graceful(pam_handle_t *pamh, int style, char **ret_response, const char *fmt, ...) {
va_list args;
int r;
assert(handle);
assert(pamh);
assert(fmt);
/* This is just like pam_prompt(), but does not noisily (i.e. beyond LOG_DEBUG) log on its own, but leaves that to the caller */
@@ -363,11 +359,11 @@ int pam_prompt_graceful(pam_handle_t *handle, int style, char **ret_response, co
return PAM_BUF_ERR;
const struct pam_conv *conv = NULL;
r = sym_pam_get_item(handle, PAM_CONV, (const void**) &conv);
r = sym_pam_get_item(pamh, PAM_CONV, (const void**) &conv);
if (!IN_SET(r, PAM_SUCCESS, PAM_BAD_ITEM))
return pam_syslog_pam_error(handle, LOG_DEBUG, r, "Failed to get conversation function structure: @PAMERR@");
return pam_syslog_pam_error(pamh, LOG_DEBUG, r, "Failed to get conversation function structure: @PAMERR@");
if (!conv || !conv->conv) {
sym_pam_syslog(handle, LOG_DEBUG, "No conversation function.");
sym_pam_syslog(pamh, LOG_DEBUG, "No conversation function.");
return PAM_SYSTEM_ERR;
}
@@ -380,7 +376,7 @@ int pam_prompt_graceful(pam_handle_t *handle, int style, char **ret_response, co
r = conv->conv(1, &pmessage, &response, conv->appdata_ptr);
_cleanup_(erase_and_freep) char *rr = response ? response->resp : NULL; /* make sure string is freed + erased */
if (r != PAM_SUCCESS)
return pam_syslog_pam_error(handle, LOG_DEBUG, r, "Conversation function failed: @PAMERR@");
return pam_syslog_pam_error(pamh, LOG_DEBUG, r, "Conversation function failed: @PAMERR@");
if (ret_response)
*ret_response = TAKE_PTR(rr);
+15 -15
View File
@@ -33,9 +33,9 @@ void pam_log_setup(void);
int errno_to_pam_error(int error) _const_;
int pam_syslog_errno(pam_handle_t *handle, int level, int error, const char *format, ...) _printf_(4,5);
int pam_syslog_errno(pam_handle_t *pamh, int level, int error, const char *format, ...) _printf_(4,5);
int pam_syslog_pam_error(pam_handle_t *handle, int level, int error, const char *format, ...) _printf_(4,5);
int pam_syslog_pam_error(pam_handle_t *pamh, int level, int error, const char *format, ...) _printf_(4,5);
/* Call sym_pam_syslog if debug is enabled */
#define pam_debug_syslog(handle, debug, fmt, ...) \
@@ -53,19 +53,19 @@ int pam_syslog_pam_error(pam_handle_t *handle, int level, int error, const char
errno_to_pam_error(_error); \
})
static inline int pam_log_oom(pam_handle_t *handle) {
static inline int pam_log_oom(pam_handle_t *pamh) {
/* This is like log_oom(), but uses PAM logging */
return pam_syslog_errno(handle, LOG_ERR, ENOMEM, "Out of memory.");
return pam_syslog_errno(pamh, LOG_ERR, ENOMEM, "Out of memory.");
}
static inline int pam_bus_log_create_error(pam_handle_t *handle, int r) {
static inline int pam_bus_log_create_error(pam_handle_t *pamh, int r) {
/* This is like bus_log_create_error(), but uses PAM logging */
return pam_syslog_errno(handle, LOG_ERR, r, "Failed to create bus message: %m");
return pam_syslog_errno(pamh, LOG_ERR, r, "Failed to create bus message: %m");
}
static inline int pam_bus_log_parse_error(pam_handle_t *handle, int r) {
static inline int pam_bus_log_parse_error(pam_handle_t *pamh, int r) {
/* This is like bus_log_parse_error(), but uses PAM logging */
return pam_syslog_errno(handle, LOG_ERR, r, "Failed to parse bus message: %m");
return pam_syslog_errno(pamh, LOG_ERR, r, "Failed to parse bus message: %m");
}
typedef struct PamBusData PamBusData;
@@ -74,23 +74,23 @@ void pam_bus_data_disconnectp(PamBusData **d);
/* Use a different module name per different PAM module. They are all loaded in the same namespace, and this
* helps avoid a clash in the internal data structures of sd-bus. It will be used as key for cache items. */
int pam_acquire_bus_connection(
pam_handle_t *handle,
pam_handle_t *pamh,
const char *module_name,
bool debug,
sd_bus **ret_bus,
PamBusData **ret_pam_bus_data);
int pam_get_bus_data(pam_handle_t *handle, const char *module_name, PamBusData **ret);
int pam_get_bus_data(pam_handle_t *pamh, const char *module_name, PamBusData **ret);
void pam_cleanup_free(pam_handle_t *handle, void *data, int error_status);
void pam_cleanup_close(pam_handle_t *handle, void *data, int error_status);
void pam_cleanup_free(pam_handle_t *pamh, void *data, int error_status);
void pam_cleanup_close(pam_handle_t *pamh, void *data, int error_status);
int pam_get_item_many_internal(pam_handle_t *handle, ...);
int pam_get_item_many_internal(pam_handle_t *pamh, ...);
#define pam_get_item_many(handle, ...) pam_get_item_many_internal(handle, __VA_ARGS__, -1)
int pam_get_data_many_internal(pam_handle_t *handle, ...) _sentinel_;
int pam_get_data_many_internal(pam_handle_t *pamh, ...) _sentinel_;
#define pam_get_data_many(handle, ...) pam_get_data_many_internal(handle, __VA_ARGS__, NULL)
int pam_prompt_graceful(pam_handle_t *handle, int style, char **ret_response, const char *fmt, ...) _printf_(4,5);
int pam_prompt_graceful(pam_handle_t *pamh, int style, char **ret_response, const char *fmt, ...) _printf_(4,5);
#else