/* * Portability wrapper around PAM header files. * * This header file includes the various PAM headers, wherever they may be * found on the system, and defines replacements for PAM functions that may * not be available on the local system. * * The canonical version of this file is maintained in the rra-c-util package, * which can be found at . * * Written by Russ Allbery * Copyright 2015, 2020 Russ Allbery * Copyright 2010-2011, 2014 * The Board of Trustees of the Leland Stanford Junior University * * Copying and distribution of this file, with or without modification, are * permitted in any medium without royalty provided the copyright notice and * this notice are preserved. This file is offered as-is, without any * warranty. * * SPDX-License-Identifier: FSFAP */ #ifndef PORTABLE_PAM_H #define PORTABLE_PAM_H 1 #include #include /* Linux PAM 1.1.0 requires sys/types.h before security/pam_modutil.h. */ #include #ifndef HAVE_PAM_MODUTIL_GETPWNAM # include #endif #if defined(HAVE_SECURITY_PAM_APPL_H) # include # include #elif defined(HAVE_PAM_PAM_APPL_H) # include # include #endif #if defined(HAVE_SECURITY_PAM_EXT_H) # include #elif defined(HAVE_PAM_PAM_EXT_H) # include #endif #if defined(HAVE_SECURITY_PAM_MODUTIL_H) # include #elif defined(HAVE_PAM_PAM_MODUTIL_H) # include #endif #include /* Solaris doesn't have these. */ #ifndef PAM_CONV_AGAIN # define PAM_CONV_AGAIN 0 # define PAM_INCOMPLETE PAM_SERVICE_ERR #endif /* Solaris 8 has deficient PAM. */ #ifndef PAM_AUTHTOK_RECOVER_ERR # define PAM_AUTHTOK_RECOVER_ERR PAM_AUTHTOK_ERR #endif /* * Mac OS X 10 doesn't define these. They're meant to be logically or'd with * an exit status in pam_set_data, so define them to 0 if not defined to * deactivate them. */ #ifndef PAM_DATA_REPLACE # define PAM_DATA_REPLACE 0 #endif #ifndef PAM_DATA_SILENT # define PAM_DATA_SILENT 0 #endif /* * Mac OS X 10 apparently doesn't use PAM_BAD_ITEM and returns PAM_SYMBOL_ERR * instead. */ #ifndef PAM_BAD_ITEM # define PAM_BAD_ITEM PAM_SYMBOL_ERR #endif /* We use this as a limit on password length, so make sure it's defined. */ #ifndef PAM_MAX_RESP_SIZE # define PAM_MAX_RESP_SIZE 512 #endif /* * Some PAM implementations support building the module static and exporting * the call points via a struct instead. (This is the default in OpenPAM, for * example.) To support this, the pam_sm_* functions are declared PAM_EXTERN. * Ensure that's defined for implementations that don't have this. */ #ifndef PAM_EXTERN # define PAM_EXTERN #endif BEGIN_DECLS /* Default to a hidden visibility for all portability functions. */ #pragma GCC visibility push(hidden) /* * If pam_modutil_getpwnam is missing, ideally we should roll our own using * getpwnam_r. However, this is a fair bit of work, since we have to stash * the allocated memory in the PAM data so that it will be freed properly. * Bail for right now. */ #if !HAVE_PAM_MODUTIL_GETPWNAM # define pam_modutil_getpwnam(h, u) getpwnam(u) #endif /* Prototype missing optional PAM functions. */ #if !HAVE_PAM_SYSLOG void pam_syslog(const pam_handle_t *, int, const char *, ...); #endif #if !HAVE_PAM_VSYSLOG void pam_vsyslog(const pam_handle_t *, int, const char *, va_list); #endif /* Undo default visibility change. */ #pragma GCC visibility pop END_DECLS #endif /* !PORTABLE_PAM_H */