15c1eca55SDag-Erling Smørgrav /*- 231c521e9SDag-Erling Smørgrav * Copyright (c) 2002-2003 Networks Associates Technology, Inc. 3*7f106882SDag-Erling Smørgrav * Copyright (c) 2004-2011 Dag-Erling Smørgrav 45c1eca55SDag-Erling Smørgrav * All rights reserved. 55c1eca55SDag-Erling Smørgrav * 65c1eca55SDag-Erling Smørgrav * This software was developed for the FreeBSD Project by ThinkSec AS and 7ee02aaa9SDag-Erling Smørgrav * Network Associates Laboratories, the Security Research Division of 8ee02aaa9SDag-Erling Smørgrav * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 9ee02aaa9SDag-Erling Smørgrav * ("CBOSS"), as part of the DARPA CHATS research program. 105c1eca55SDag-Erling Smørgrav * 115c1eca55SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 125c1eca55SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 135c1eca55SDag-Erling Smørgrav * are met: 145c1eca55SDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 155c1eca55SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer. 165c1eca55SDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 175c1eca55SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 185c1eca55SDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 195c1eca55SDag-Erling Smørgrav * 3. The name of the author may not be used to endorse or promote 205c1eca55SDag-Erling Smørgrav * products derived from this software without specific prior written 215c1eca55SDag-Erling Smørgrav * permission. 225c1eca55SDag-Erling Smørgrav * 235c1eca55SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 245c1eca55SDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 255c1eca55SDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 265c1eca55SDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 275c1eca55SDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 285c1eca55SDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 295c1eca55SDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 305c1eca55SDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 315c1eca55SDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 325c1eca55SDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 335c1eca55SDag-Erling Smørgrav * SUCH DAMAGE. 345c1eca55SDag-Erling Smørgrav * 35*7f106882SDag-Erling Smørgrav * $Id: openpam.h 455 2011-10-29 18:31:11Z des $ 365c1eca55SDag-Erling Smørgrav */ 375c1eca55SDag-Erling Smørgrav 38fe980754SDag-Erling Smørgrav #ifndef SECURITY_OPENPAM_H_INCLUDED 39fe980754SDag-Erling Smørgrav #define SECURITY_OPENPAM_H_INCLUDED 405c1eca55SDag-Erling Smørgrav 415c1eca55SDag-Erling Smørgrav /* 425c1eca55SDag-Erling Smørgrav * Annoying but necessary header pollution 435c1eca55SDag-Erling Smørgrav */ 445c1eca55SDag-Erling Smørgrav #include <stdarg.h> 455c1eca55SDag-Erling Smørgrav 46fe980754SDag-Erling Smørgrav #include <security/openpam_attr.h> 47fe980754SDag-Erling Smørgrav 485c1eca55SDag-Erling Smørgrav #ifdef __cplusplus 495c1eca55SDag-Erling Smørgrav extern "C" { 505c1eca55SDag-Erling Smørgrav #endif 515c1eca55SDag-Erling Smørgrav 5293889be5SDag-Erling Smørgrav struct passwd; 5393889be5SDag-Erling Smørgrav 545c1eca55SDag-Erling Smørgrav /* 555c1eca55SDag-Erling Smørgrav * API extensions 565c1eca55SDag-Erling Smørgrav */ 5793889be5SDag-Erling Smørgrav int 5893889be5SDag-Erling Smørgrav openpam_borrow_cred(pam_handle_t *_pamh, 59fe980754SDag-Erling Smørgrav const struct passwd *_pwd) 60fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 6193889be5SDag-Erling Smørgrav 62*7f106882SDag-Erling Smørgrav int 63*7f106882SDag-Erling Smørgrav openpam_subst(const pam_handle_t *_pamh, 64*7f106882SDag-Erling Smørgrav char *_buf, 65*7f106882SDag-Erling Smørgrav size_t *_bufsize, 66*7f106882SDag-Erling Smørgrav const char *_template); 67*7f106882SDag-Erling Smørgrav 6893889be5SDag-Erling Smørgrav void 6993889be5SDag-Erling Smørgrav openpam_free_data(pam_handle_t *_pamh, 7093889be5SDag-Erling Smørgrav void *_data, 7193889be5SDag-Erling Smørgrav int _status); 7293889be5SDag-Erling Smørgrav 73b33ab329SDag-Erling Smørgrav void 74b33ab329SDag-Erling Smørgrav openpam_free_envlist(char **_envlist); 75b33ab329SDag-Erling Smørgrav 7646acc370SDag-Erling Smørgrav const char * 7746acc370SDag-Erling Smørgrav openpam_get_option(pam_handle_t *_pamh, 7846acc370SDag-Erling Smørgrav const char *_option); 7946acc370SDag-Erling Smørgrav 8046acc370SDag-Erling Smørgrav int 81fe980754SDag-Erling Smørgrav openpam_restore_cred(pam_handle_t *_pamh) 82fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1)); 8393889be5SDag-Erling Smørgrav 8493889be5SDag-Erling Smørgrav int 8546acc370SDag-Erling Smørgrav openpam_set_option(pam_handle_t *_pamh, 8646acc370SDag-Erling Smørgrav const char *_option, 8746acc370SDag-Erling Smørgrav const char *_value); 8846acc370SDag-Erling Smørgrav 895c1eca55SDag-Erling Smørgrav int 90fe980754SDag-Erling Smørgrav pam_error(const pam_handle_t *_pamh, 915c1eca55SDag-Erling Smørgrav const char *_fmt, 92fe980754SDag-Erling Smørgrav ...) 93fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 3)) 94fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 955c1eca55SDag-Erling Smørgrav 965c1eca55SDag-Erling Smørgrav int 975c1eca55SDag-Erling Smørgrav pam_get_authtok(pam_handle_t *_pamh, 9811d144d3SDag-Erling Smørgrav int _item, 995c1eca55SDag-Erling Smørgrav const char **_authtok, 100fe980754SDag-Erling Smørgrav const char *_prompt) 101fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,3)); 1025c1eca55SDag-Erling Smørgrav 1035c1eca55SDag-Erling Smørgrav int 104fe980754SDag-Erling Smørgrav pam_info(const pam_handle_t *_pamh, 1055c1eca55SDag-Erling Smørgrav const char *_fmt, 106fe980754SDag-Erling Smørgrav ...) 107fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 3)) 108fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 1095c1eca55SDag-Erling Smørgrav 1105c1eca55SDag-Erling Smørgrav int 111fe980754SDag-Erling Smørgrav pam_prompt(const pam_handle_t *_pamh, 1125c1eca55SDag-Erling Smørgrav int _style, 1135c1eca55SDag-Erling Smørgrav char **_resp, 1145c1eca55SDag-Erling Smørgrav const char *_fmt, 115fe980754SDag-Erling Smørgrav ...) 116fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 4, 5)) 117fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,4)); 1185c1eca55SDag-Erling Smørgrav 1195c1eca55SDag-Erling Smørgrav int 1205c1eca55SDag-Erling Smørgrav pam_setenv(pam_handle_t *_pamh, 1215c1eca55SDag-Erling Smørgrav const char *_name, 1225c1eca55SDag-Erling Smørgrav const char *_value, 123fe980754SDag-Erling Smørgrav int _overwrite) 124fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2,3)); 1255c1eca55SDag-Erling Smørgrav 1265c1eca55SDag-Erling Smørgrav int 127fe980754SDag-Erling Smørgrav pam_vinfo(const pam_handle_t *_pamh, 1285c1eca55SDag-Erling Smørgrav const char *_fmt, 129fe980754SDag-Erling Smørgrav va_list _ap) 130fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 0)) 131fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 1325c1eca55SDag-Erling Smørgrav 1335c1eca55SDag-Erling Smørgrav int 134fe980754SDag-Erling Smørgrav pam_verror(const pam_handle_t *_pamh, 1355c1eca55SDag-Erling Smørgrav const char *_fmt, 136fe980754SDag-Erling Smørgrav va_list _ap) 137fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 0)) 138fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 1395c1eca55SDag-Erling Smørgrav 1405c1eca55SDag-Erling Smørgrav int 141fe980754SDag-Erling Smørgrav pam_vprompt(const pam_handle_t *_pamh, 1425c1eca55SDag-Erling Smørgrav int _style, 1435c1eca55SDag-Erling Smørgrav char **_resp, 1445c1eca55SDag-Erling Smørgrav const char *_fmt, 145fe980754SDag-Erling Smørgrav va_list _ap) 146fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 4, 0)) 147fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,4)); 1485c1eca55SDag-Erling Smørgrav 1495c1eca55SDag-Erling Smørgrav /* 15031c521e9SDag-Erling Smørgrav * Read cooked lines. 151ca236e63SDag-Erling Smørgrav * Checking for _IOFBF is a fairly reliable way to detect the presence 152ca236e63SDag-Erling Smørgrav * of <stdio.h>, as SUSv3 requires it to be defined there. 15331c521e9SDag-Erling Smørgrav */ 154ca236e63SDag-Erling Smørgrav #ifdef _IOFBF 15531c521e9SDag-Erling Smørgrav char * 15631c521e9SDag-Erling Smørgrav openpam_readline(FILE *_f, 15731c521e9SDag-Erling Smørgrav int *_lineno, 158fe980754SDag-Erling Smørgrav size_t *_lenp) 159fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1)); 16031c521e9SDag-Erling Smørgrav #endif 16131c521e9SDag-Erling Smørgrav 16231c521e9SDag-Erling Smørgrav /* 1635c1eca55SDag-Erling Smørgrav * Log levels 1645c1eca55SDag-Erling Smørgrav */ 1655c1eca55SDag-Erling Smørgrav enum { 1665c1eca55SDag-Erling Smørgrav PAM_LOG_DEBUG, 1675c1eca55SDag-Erling Smørgrav PAM_LOG_VERBOSE, 1685c1eca55SDag-Erling Smørgrav PAM_LOG_NOTICE, 1695c1eca55SDag-Erling Smørgrav PAM_LOG_ERROR 1705c1eca55SDag-Erling Smørgrav }; 1715c1eca55SDag-Erling Smørgrav 1725c1eca55SDag-Erling Smørgrav /* 1735c1eca55SDag-Erling Smørgrav * Log to syslog 1745c1eca55SDag-Erling Smørgrav */ 17511d144d3SDag-Erling Smørgrav void 17611d144d3SDag-Erling Smørgrav _openpam_log(int _level, 1775c1eca55SDag-Erling Smørgrav const char *_func, 1785c1eca55SDag-Erling Smørgrav const char *_fmt, 179e10ae022SDag-Erling Smørgrav ...) 180fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 3, 4)) 181fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((3)); 1825c1eca55SDag-Erling Smørgrav 18355e3fbc9SDag-Erling Smørgrav #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) 18455e3fbc9SDag-Erling Smørgrav #define openpam_log(lvl, ...) \ 18555e3fbc9SDag-Erling Smørgrav _openpam_log((lvl), __func__, __VA_ARGS__) 18655e3fbc9SDag-Erling Smørgrav #elif defined(__GNUC__) && (__GNUC__ >= 3) 18755e3fbc9SDag-Erling Smørgrav #define openpam_log(lvl, ...) \ 18855e3fbc9SDag-Erling Smørgrav _openpam_log((lvl), __func__, __VA_ARGS__) 18911d144d3SDag-Erling Smørgrav #elif defined(__GNUC__) && (__GNUC__ >= 2) && (__GNUC_MINOR__ >= 95) 1908d38dc9dSDag-Erling Smørgrav #define openpam_log(lvl, fmt...) \ 191bdcb69e2SDag-Erling Smørgrav _openpam_log((lvl), __func__, ##fmt) 19211d144d3SDag-Erling Smørgrav #elif defined(__GNUC__) && defined(__FUNCTION__) 1935c1eca55SDag-Erling Smørgrav #define openpam_log(lvl, fmt...) \ 19411d144d3SDag-Erling Smørgrav _openpam_log((lvl), __FUNCTION__, ##fmt) 1955c1eca55SDag-Erling Smørgrav #else 19611d144d3SDag-Erling Smørgrav void 19711d144d3SDag-Erling Smørgrav openpam_log(int _level, 19811d144d3SDag-Erling Smørgrav const char *_format, 199fe980754SDag-Erling Smørgrav ...) 200fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 3)) 201fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((2)); 2025c1eca55SDag-Erling Smørgrav #endif 2035c1eca55SDag-Erling Smørgrav 2045c1eca55SDag-Erling Smørgrav /* 2055c1eca55SDag-Erling Smørgrav * Generic conversation function 2065c1eca55SDag-Erling Smørgrav */ 2075c1eca55SDag-Erling Smørgrav struct pam_message; 2085c1eca55SDag-Erling Smørgrav struct pam_response; 2095c1eca55SDag-Erling Smørgrav int openpam_ttyconv(int _n, 2105c1eca55SDag-Erling Smørgrav const struct pam_message **_msg, 2115c1eca55SDag-Erling Smørgrav struct pam_response **_resp, 2125c1eca55SDag-Erling Smørgrav void *_data); 2135c1eca55SDag-Erling Smørgrav 214ca236e63SDag-Erling Smørgrav extern int openpam_ttyconv_timeout; 215ca236e63SDag-Erling Smørgrav 2165c1eca55SDag-Erling Smørgrav /* 217ac7e3b9dSDag-Erling Smørgrav * Null conversation function 218ac7e3b9dSDag-Erling Smørgrav */ 219ac7e3b9dSDag-Erling Smørgrav int openpam_nullconv(int _n, 220ac7e3b9dSDag-Erling Smørgrav const struct pam_message **_msg, 221ac7e3b9dSDag-Erling Smørgrav struct pam_response **_resp, 222ac7e3b9dSDag-Erling Smørgrav void *_data); 223ac7e3b9dSDag-Erling Smørgrav 224ac7e3b9dSDag-Erling Smørgrav /* 2255c1eca55SDag-Erling Smørgrav * PAM primitives 2265c1eca55SDag-Erling Smørgrav */ 2275c1eca55SDag-Erling Smørgrav enum { 2285c1eca55SDag-Erling Smørgrav PAM_SM_AUTHENTICATE, 2295c1eca55SDag-Erling Smørgrav PAM_SM_SETCRED, 2305c1eca55SDag-Erling Smørgrav PAM_SM_ACCT_MGMT, 2315c1eca55SDag-Erling Smørgrav PAM_SM_OPEN_SESSION, 2325c1eca55SDag-Erling Smørgrav PAM_SM_CLOSE_SESSION, 2335c1eca55SDag-Erling Smørgrav PAM_SM_CHAUTHTOK, 2345c1eca55SDag-Erling Smørgrav /* keep this last */ 2355c1eca55SDag-Erling Smørgrav PAM_NUM_PRIMITIVES 2365c1eca55SDag-Erling Smørgrav }; 2375c1eca55SDag-Erling Smørgrav 2385c1eca55SDag-Erling Smørgrav /* 2395c1eca55SDag-Erling Smørgrav * Dummy service module function 2405c1eca55SDag-Erling Smørgrav */ 2415c1eca55SDag-Erling Smørgrav #define PAM_SM_DUMMY(type) \ 2425c1eca55SDag-Erling Smørgrav PAM_EXTERN int \ 2435c1eca55SDag-Erling Smørgrav pam_sm_##type(pam_handle_t *pamh, int flags, \ 2445c1eca55SDag-Erling Smørgrav int argc, const char *argv[]) \ 2455c1eca55SDag-Erling Smørgrav { \ 246fe980754SDag-Erling Smørgrav \ 247fe980754SDag-Erling Smørgrav (void)pamh; \ 248fe980754SDag-Erling Smørgrav (void)flags; \ 249fe980754SDag-Erling Smørgrav (void)argc; \ 250fe980754SDag-Erling Smørgrav (void)argv; \ 2515c1eca55SDag-Erling Smørgrav return (PAM_IGNORE); \ 2525c1eca55SDag-Erling Smørgrav } 2535c1eca55SDag-Erling Smørgrav 2545c1eca55SDag-Erling Smørgrav /* 2555c1eca55SDag-Erling Smørgrav * PAM service module functions match this typedef 2565c1eca55SDag-Erling Smørgrav */ 2575c1eca55SDag-Erling Smørgrav struct pam_handle; 2585c1eca55SDag-Erling Smørgrav typedef int (*pam_func_t)(struct pam_handle *, int, int, const char **); 2595c1eca55SDag-Erling Smørgrav 2605c1eca55SDag-Erling Smørgrav /* 2615c1eca55SDag-Erling Smørgrav * A struct that describes a module. 2625c1eca55SDag-Erling Smørgrav */ 2635c1eca55SDag-Erling Smørgrav typedef struct pam_module pam_module_t; 2645c1eca55SDag-Erling Smørgrav struct pam_module { 2654579d22cSDag-Erling Smørgrav char *path; 2665c1eca55SDag-Erling Smørgrav pam_func_t func[PAM_NUM_PRIMITIVES]; 2675c1eca55SDag-Erling Smørgrav void *dlh; 2685c1eca55SDag-Erling Smørgrav }; 2695c1eca55SDag-Erling Smørgrav 2705c1eca55SDag-Erling Smørgrav /* 271b825a3acSDag-Erling Smørgrav * Source-code compatibility with Linux-PAM modules 272b825a3acSDag-Erling Smørgrav */ 273b825a3acSDag-Erling Smørgrav #if defined(PAM_SM_AUTH) || defined(PAM_SM_ACCOUNT) || \ 274b825a3acSDag-Erling Smørgrav defined(PAM_SM_SESSION) || defined(PAM_SM_PASSWORD) 275b825a3acSDag-Erling Smørgrav # define LINUX_PAM_MODULE 276b825a3acSDag-Erling Smørgrav #endif 277fe980754SDag-Erling Smørgrav 278b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_AUTH) 279b825a3acSDag-Erling Smørgrav # define _PAM_SM_AUTHENTICATE 0 280b825a3acSDag-Erling Smørgrav # define _PAM_SM_SETCRED 0 281b825a3acSDag-Erling Smørgrav #else 282b825a3acSDag-Erling Smørgrav # undef PAM_SM_AUTH 283b825a3acSDag-Erling Smørgrav # define PAM_SM_AUTH 284b825a3acSDag-Erling Smørgrav # define _PAM_SM_AUTHENTICATE pam_sm_authenticate 285b825a3acSDag-Erling Smørgrav # define _PAM_SM_SETCRED pam_sm_setcred 286b825a3acSDag-Erling Smørgrav #endif 287fe980754SDag-Erling Smørgrav 288b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_ACCOUNT) 289b825a3acSDag-Erling Smørgrav # define _PAM_SM_ACCT_MGMT 0 290b825a3acSDag-Erling Smørgrav #else 291b825a3acSDag-Erling Smørgrav # undef PAM_SM_ACCOUNT 292b825a3acSDag-Erling Smørgrav # define PAM_SM_ACCOUNT 293b825a3acSDag-Erling Smørgrav # define _PAM_SM_ACCT_MGMT pam_sm_acct_mgmt 294b825a3acSDag-Erling Smørgrav #endif 295fe980754SDag-Erling Smørgrav 296b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_SESSION) 297b825a3acSDag-Erling Smørgrav # define _PAM_SM_OPEN_SESSION 0 298b825a3acSDag-Erling Smørgrav # define _PAM_SM_CLOSE_SESSION 0 299b825a3acSDag-Erling Smørgrav #else 300b825a3acSDag-Erling Smørgrav # undef PAM_SM_SESSION 301b825a3acSDag-Erling Smørgrav # define PAM_SM_SESSION 302b825a3acSDag-Erling Smørgrav # define _PAM_SM_OPEN_SESSION pam_sm_open_session 303b825a3acSDag-Erling Smørgrav # define _PAM_SM_CLOSE_SESSION pam_sm_close_session 304b825a3acSDag-Erling Smørgrav #endif 305fe980754SDag-Erling Smørgrav 306b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_PASSWORD) 307b825a3acSDag-Erling Smørgrav # define _PAM_SM_CHAUTHTOK 0 308b825a3acSDag-Erling Smørgrav #else 309b825a3acSDag-Erling Smørgrav # undef PAM_SM_PASSWORD 310b825a3acSDag-Erling Smørgrav # define PAM_SM_PASSWORD 311b825a3acSDag-Erling Smørgrav # define _PAM_SM_CHAUTHTOK pam_sm_chauthtok 312b825a3acSDag-Erling Smørgrav #endif 313b825a3acSDag-Erling Smørgrav 314b825a3acSDag-Erling Smørgrav /* 3155c1eca55SDag-Erling Smørgrav * Infrastructure for static modules using GCC linker sets. 3165c1eca55SDag-Erling Smørgrav * You are not expected to understand this. 3175c1eca55SDag-Erling Smørgrav */ 3181dde0f97SDag-Erling Smørgrav #if !defined(PAM_SOEXT) 3195c1eca55SDag-Erling Smørgrav # define PAM_SOEXT ".so" 3205c1eca55SDag-Erling Smørgrav #endif 321fe980754SDag-Erling Smørgrav 3221dde0f97SDag-Erling Smørgrav #if defined(OPENPAM_STATIC_MODULES) 3231dde0f97SDag-Erling Smørgrav # if !defined(__GNUC__) 3241dde0f97SDag-Erling Smørgrav # error "Don't know how to build static modules on non-GNU compilers" 3251dde0f97SDag-Erling Smørgrav # endif 3265c1eca55SDag-Erling Smørgrav /* gcc, static linking */ 3275c1eca55SDag-Erling Smørgrav # include <sys/cdefs.h> 3285c1eca55SDag-Erling Smørgrav # include <linker_set.h> 3295c1eca55SDag-Erling Smørgrav # define PAM_EXTERN static 3305c1eca55SDag-Erling Smørgrav # define PAM_MODULE_ENTRY(name) \ 3314579d22cSDag-Erling Smørgrav static char _pam_name[] = name PAM_SOEXT; \ 332fe980754SDag-Erling Smørgrav static struct pam_module _pam_module = { \ 333fe980754SDag-Erling Smørgrav .path = _pam_name, \ 334fe980754SDag-Erling Smørgrav .func = { \ 335fe980754SDag-Erling Smørgrav [PAM_SM_AUTHENTICATE] = _PAM_SM_AUTHENTICATE, \ 336fe980754SDag-Erling Smørgrav [PAM_SM_SETCRED] = _PAM_SM_SETCRED, \ 337fe980754SDag-Erling Smørgrav [PAM_SM_ACCT_MGMT] = _PAM_SM_ACCT_MGMT, \ 338fe980754SDag-Erling Smørgrav [PAM_SM_OPEN_SESSION] = _PAM_SM_OPEN_SESSION, \ 339fe980754SDag-Erling Smørgrav [PAM_SM_CLOSE_SESSION] = _PAM_SM_CLOSE_SESSION, \ 340fe980754SDag-Erling Smørgrav [PAM_SM_CHAUTHTOK] = _PAM_SM_CHAUTHTOK \ 341fe980754SDag-Erling Smørgrav }, \ 342fe980754SDag-Erling Smørgrav }; \ 34346acc370SDag-Erling Smørgrav DATA_SET(_openpam_static_modules, _pam_module) 3445c1eca55SDag-Erling Smørgrav #else 3455c1eca55SDag-Erling Smørgrav /* normal case */ 3465c1eca55SDag-Erling Smørgrav # define PAM_EXTERN 3475c1eca55SDag-Erling Smørgrav # define PAM_MODULE_ENTRY(name) 3485c1eca55SDag-Erling Smørgrav #endif 3495c1eca55SDag-Erling Smørgrav 3505c1eca55SDag-Erling Smørgrav #ifdef __cplusplus 3515c1eca55SDag-Erling Smørgrav } 3525c1eca55SDag-Erling Smørgrav #endif 3535c1eca55SDag-Erling Smørgrav 354fe980754SDag-Erling Smørgrav #endif /* !SECURITY_OPENPAM_H_INCLUDED */ 355