1ade90846SJoerg Sonnenberger /*- 2ade90846SJoerg Sonnenberger * Copyright (c) 2002-2003 Networks Associates Technology, Inc. 3*10b5fe87SSascha Wildner * Copyright (c) 2004-2015 Dag-Erling Smørgrav 4ade90846SJoerg Sonnenberger * All rights reserved. 5ade90846SJoerg Sonnenberger * 6ade90846SJoerg Sonnenberger * This software was developed for the FreeBSD Project by ThinkSec AS and 7ade90846SJoerg Sonnenberger * Network Associates Laboratories, the Security Research Division of 8ade90846SJoerg Sonnenberger * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 9ade90846SJoerg Sonnenberger * ("CBOSS"), as part of the DARPA CHATS research program. 10ade90846SJoerg Sonnenberger * 11ade90846SJoerg Sonnenberger * Redistribution and use in source and binary forms, with or without 12ade90846SJoerg Sonnenberger * modification, are permitted provided that the following conditions 13ade90846SJoerg Sonnenberger * are met: 14ade90846SJoerg Sonnenberger * 1. Redistributions of source code must retain the above copyright 15ade90846SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer. 16ade90846SJoerg Sonnenberger * 2. Redistributions in binary form must reproduce the above copyright 17ade90846SJoerg Sonnenberger * notice, this list of conditions and the following disclaimer in the 18ade90846SJoerg Sonnenberger * documentation and/or other materials provided with the distribution. 19ade90846SJoerg Sonnenberger * 3. The name of the author may not be used to endorse or promote 20ade90846SJoerg Sonnenberger * products derived from this software without specific prior written 21ade90846SJoerg Sonnenberger * permission. 22ade90846SJoerg Sonnenberger * 23ade90846SJoerg Sonnenberger * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 24ade90846SJoerg Sonnenberger * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25ade90846SJoerg Sonnenberger * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26ade90846SJoerg Sonnenberger * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 27ade90846SJoerg Sonnenberger * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28ade90846SJoerg Sonnenberger * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29ade90846SJoerg Sonnenberger * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30ade90846SJoerg Sonnenberger * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31ade90846SJoerg Sonnenberger * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32ade90846SJoerg Sonnenberger * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33ade90846SJoerg Sonnenberger * SUCH DAMAGE. 34ade90846SJoerg Sonnenberger * 35*10b5fe87SSascha Wildner * $OpenPAM: openpam.h 938 2017-04-30 21:34:42Z des $ 36ade90846SJoerg Sonnenberger */ 37ade90846SJoerg Sonnenberger 38f23594ceSHasso Tepper #ifndef SECURITY_OPENPAM_H_INCLUDED 39f23594ceSHasso Tepper #define SECURITY_OPENPAM_H_INCLUDED 40ade90846SJoerg Sonnenberger 41ade90846SJoerg Sonnenberger /* 42ade90846SJoerg Sonnenberger * Annoying but necessary header pollution 43ade90846SJoerg Sonnenberger */ 44ade90846SJoerg Sonnenberger #include <stdarg.h> 45ade90846SJoerg Sonnenberger 46f23594ceSHasso Tepper #include <security/openpam_attr.h> 47f23594ceSHasso Tepper 48ade90846SJoerg Sonnenberger #ifdef __cplusplus 49ade90846SJoerg Sonnenberger extern "C" { 50ade90846SJoerg Sonnenberger #endif 51ade90846SJoerg Sonnenberger 52ade90846SJoerg Sonnenberger struct passwd; 53ade90846SJoerg Sonnenberger 54ade90846SJoerg Sonnenberger /* 55ade90846SJoerg Sonnenberger * API extensions 56ade90846SJoerg Sonnenberger */ 57ade90846SJoerg Sonnenberger int 58ade90846SJoerg Sonnenberger openpam_borrow_cred(pam_handle_t *_pamh, 59f23594ceSHasso Tepper const struct passwd *_pwd) 60f23594ceSHasso Tepper OPENPAM_NONNULL((1,2)); 61ade90846SJoerg Sonnenberger 62a474e9feSPeter Avalos int 63a474e9feSPeter Avalos openpam_subst(const pam_handle_t *_pamh, 64a474e9feSPeter Avalos char *_buf, 65a474e9feSPeter Avalos size_t *_bufsize, 66a474e9feSPeter Avalos const char *_template); 67a474e9feSPeter Avalos 68ade90846SJoerg Sonnenberger void 69ade90846SJoerg Sonnenberger openpam_free_data(pam_handle_t *_pamh, 70ade90846SJoerg Sonnenberger void *_data, 71ade90846SJoerg Sonnenberger int _status); 72ade90846SJoerg Sonnenberger 73ade90846SJoerg Sonnenberger void 74ade90846SJoerg Sonnenberger openpam_free_envlist(char **_envlist); 75ade90846SJoerg Sonnenberger 76ade90846SJoerg Sonnenberger const char * 77ade90846SJoerg Sonnenberger openpam_get_option(pam_handle_t *_pamh, 78ade90846SJoerg Sonnenberger const char *_option); 79ade90846SJoerg Sonnenberger 80ade90846SJoerg Sonnenberger int 81f23594ceSHasso Tepper openpam_restore_cred(pam_handle_t *_pamh) 82f23594ceSHasso Tepper OPENPAM_NONNULL((1)); 83ade90846SJoerg Sonnenberger 84ade90846SJoerg Sonnenberger int 85ade90846SJoerg Sonnenberger openpam_set_option(pam_handle_t *_pamh, 86ade90846SJoerg Sonnenberger const char *_option, 87ade90846SJoerg Sonnenberger const char *_value); 88ade90846SJoerg Sonnenberger 89ade90846SJoerg Sonnenberger int 90f23594ceSHasso Tepper pam_error(const pam_handle_t *_pamh, 91ade90846SJoerg Sonnenberger const char *_fmt, 92f23594ceSHasso Tepper ...) 93f23594ceSHasso Tepper OPENPAM_FORMAT ((__printf__, 2, 3)) 94f23594ceSHasso Tepper OPENPAM_NONNULL((1,2)); 95ade90846SJoerg Sonnenberger 96ade90846SJoerg Sonnenberger int 97ade90846SJoerg Sonnenberger pam_get_authtok(pam_handle_t *_pamh, 98ade90846SJoerg Sonnenberger int _item, 99ade90846SJoerg Sonnenberger const char **_authtok, 100f23594ceSHasso Tepper const char *_prompt); 101f23594ceSHasso Tepper 102ade90846SJoerg Sonnenberger int 103ade90846SJoerg Sonnenberger pam_info(const pam_handle_t *_pamh, 104f23594ceSHasso Tepper const char *_fmt, 105ade90846SJoerg Sonnenberger ...) 106f23594ceSHasso Tepper OPENPAM_FORMAT ((__printf__, 2, 3)) 107f23594ceSHasso Tepper OPENPAM_NONNULL((1,2)); 108f23594ceSHasso Tepper 109ade90846SJoerg Sonnenberger int 110ade90846SJoerg Sonnenberger pam_prompt(const pam_handle_t *_pamh, 111f23594ceSHasso Tepper int _style, 112ade90846SJoerg Sonnenberger char **_resp, 113ade90846SJoerg Sonnenberger const char *_fmt, 114ade90846SJoerg Sonnenberger ...) 115f23594ceSHasso Tepper OPENPAM_FORMAT ((__printf__, 4, 5)) 116f23594ceSHasso Tepper OPENPAM_NONNULL((1,4)); 117f23594ceSHasso Tepper 118ade90846SJoerg Sonnenberger int 119ade90846SJoerg Sonnenberger pam_setenv(pam_handle_t *_pamh, 120ade90846SJoerg Sonnenberger const char *_name, 121ade90846SJoerg Sonnenberger const char *_value, 122ade90846SJoerg Sonnenberger int _overwrite); 123f23594ceSHasso Tepper 124f23594ceSHasso Tepper int 125ade90846SJoerg Sonnenberger pam_vinfo(const pam_handle_t *_pamh, 126ade90846SJoerg Sonnenberger const char *_fmt, 127f23594ceSHasso Tepper va_list _ap) 128ade90846SJoerg Sonnenberger OPENPAM_FORMAT ((__printf__, 2, 0)) 129f23594ceSHasso Tepper OPENPAM_NONNULL((1,2)); 130f23594ceSHasso Tepper 131f23594ceSHasso Tepper int 132ade90846SJoerg Sonnenberger pam_verror(const pam_handle_t *_pamh, 133ade90846SJoerg Sonnenberger const char *_fmt, 134f23594ceSHasso Tepper va_list _ap) 135ade90846SJoerg Sonnenberger OPENPAM_FORMAT ((__printf__, 2, 0)) 136f23594ceSHasso Tepper OPENPAM_NONNULL((1,2)); 137f23594ceSHasso Tepper 138f23594ceSHasso Tepper int 139ade90846SJoerg Sonnenberger pam_vprompt(const pam_handle_t *_pamh, 140ade90846SJoerg Sonnenberger int _style, 141f23594ceSHasso Tepper char **_resp, 142ade90846SJoerg Sonnenberger const char *_fmt, 143ade90846SJoerg Sonnenberger va_list _ap) 144ade90846SJoerg Sonnenberger OPENPAM_FORMAT ((__printf__, 4, 0)) 145f23594ceSHasso Tepper OPENPAM_NONNULL((1,4)); 146f23594ceSHasso Tepper 147f23594ceSHasso Tepper /* 148ade90846SJoerg Sonnenberger * Read cooked lines. 149ade90846SJoerg Sonnenberger * Checking for _IOFBF is a fairly reliable way to detect the presence 150ade90846SJoerg Sonnenberger * of <stdio.h>, as SUSv3 requires it to be defined there. 151ade90846SJoerg Sonnenberger */ 152ade90846SJoerg Sonnenberger #ifdef _IOFBF 153ade90846SJoerg Sonnenberger char * 154ade90846SJoerg Sonnenberger openpam_readline(FILE *_f, 155ade90846SJoerg Sonnenberger int *_lineno, 156ade90846SJoerg Sonnenberger size_t *_lenp) 157ade90846SJoerg Sonnenberger OPENPAM_NONNULL((1)); 158f23594ceSHasso Tepper 159f23594ceSHasso Tepper char ** 160577efdeeSPeter Avalos openpam_readlinev(FILE *_f, 161577efdeeSPeter Avalos int *_lineno, 162577efdeeSPeter Avalos int *_lenp) 163577efdeeSPeter Avalos OPENPAM_NONNULL((1)); 164577efdeeSPeter Avalos 165577efdeeSPeter Avalos char * 166577efdeeSPeter Avalos openpam_readword(FILE *_f, 167577efdeeSPeter Avalos int *_lineno, 168577efdeeSPeter Avalos size_t *_lenp) 169577efdeeSPeter Avalos OPENPAM_NONNULL((1)); 170577efdeeSPeter Avalos #endif 171577efdeeSPeter Avalos 172ade90846SJoerg Sonnenberger int 173ade90846SJoerg Sonnenberger openpam_straddch(char **_str, 174577efdeeSPeter Avalos size_t *_sizep, 175577efdeeSPeter Avalos size_t *_lenp, 176577efdeeSPeter Avalos int ch) 177577efdeeSPeter Avalos OPENPAM_NONNULL((1)); 178577efdeeSPeter Avalos 179577efdeeSPeter Avalos /* 180577efdeeSPeter Avalos * Enable / disable optional features 181577efdeeSPeter Avalos */ 182577efdeeSPeter Avalos enum { 183577efdeeSPeter Avalos OPENPAM_RESTRICT_SERVICE_NAME, 184577efdeeSPeter Avalos OPENPAM_VERIFY_POLICY_FILE, 185577efdeeSPeter Avalos OPENPAM_RESTRICT_MODULE_NAME, 186577efdeeSPeter Avalos OPENPAM_VERIFY_MODULE_FILE, 187577efdeeSPeter Avalos OPENPAM_FALLBACK_TO_OTHER, 188577efdeeSPeter Avalos OPENPAM_NUM_FEATURES 189*10b5fe87SSascha Wildner }; 190577efdeeSPeter Avalos 191577efdeeSPeter Avalos int 192577efdeeSPeter Avalos openpam_set_feature(int _feature, int _onoff); 193577efdeeSPeter Avalos 194577efdeeSPeter Avalos int 195577efdeeSPeter Avalos openpam_get_feature(int _feature, int *_onoff); 196577efdeeSPeter Avalos 197577efdeeSPeter Avalos /* 198577efdeeSPeter Avalos * Log levels 199ade90846SJoerg Sonnenberger */ 200ade90846SJoerg Sonnenberger enum { 201ade90846SJoerg Sonnenberger PAM_LOG_LIBDEBUG = -1, 202ade90846SJoerg Sonnenberger PAM_LOG_DEBUG, 203577efdeeSPeter Avalos PAM_LOG_VERBOSE, 204ade90846SJoerg Sonnenberger PAM_LOG_NOTICE, 205ade90846SJoerg Sonnenberger PAM_LOG_ERROR 206ade90846SJoerg Sonnenberger }; 207ade90846SJoerg Sonnenberger 208ade90846SJoerg Sonnenberger /* 209ade90846SJoerg Sonnenberger * Log to syslog 210ade90846SJoerg Sonnenberger */ 211ade90846SJoerg Sonnenberger void 212ade90846SJoerg Sonnenberger _openpam_log(int _level, 213ade90846SJoerg Sonnenberger const char *_func, 214ade90846SJoerg Sonnenberger const char *_fmt, 215ade90846SJoerg Sonnenberger ...) 216ade90846SJoerg Sonnenberger OPENPAM_FORMAT ((__printf__, 3, 4)) 217ade90846SJoerg Sonnenberger OPENPAM_NONNULL((3)); 218f23594ceSHasso Tepper 219f23594ceSHasso Tepper #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) 220ade90846SJoerg Sonnenberger #define openpam_log(lvl, ...) \ 221ade90846SJoerg Sonnenberger _openpam_log((lvl), __func__, __VA_ARGS__) 222ade90846SJoerg Sonnenberger #elif defined(__GNUC__) && (__GNUC__ >= 3) 223ade90846SJoerg Sonnenberger #define openpam_log(lvl, ...) \ 224ade90846SJoerg Sonnenberger _openpam_log((lvl), __func__, __VA_ARGS__) 225ade90846SJoerg Sonnenberger #elif defined(__GNUC__) && (__GNUC__ >= 2) && (__GNUC_MINOR__ >= 95) 226ade90846SJoerg Sonnenberger #define openpam_log(lvl, fmt...) \ 227ade90846SJoerg Sonnenberger _openpam_log((lvl), __func__, ##fmt) 228ade90846SJoerg Sonnenberger #elif defined(__GNUC__) && defined(__FUNCTION__) 229ade90846SJoerg Sonnenberger #define openpam_log(lvl, fmt...) \ 230ade90846SJoerg Sonnenberger _openpam_log((lvl), __FUNCTION__, ##fmt) 231ade90846SJoerg Sonnenberger #else 232ade90846SJoerg Sonnenberger void 233ade90846SJoerg Sonnenberger openpam_log(int _level, 234ade90846SJoerg Sonnenberger const char *_format, 235ade90846SJoerg Sonnenberger ...) 236ade90846SJoerg Sonnenberger OPENPAM_FORMAT ((__printf__, 2, 3)) 237f23594ceSHasso Tepper OPENPAM_NONNULL((2)); 238f23594ceSHasso Tepper #endif 239f23594ceSHasso Tepper 240ade90846SJoerg Sonnenberger /* 241ade90846SJoerg Sonnenberger * Generic conversation function 242ade90846SJoerg Sonnenberger */ 243ade90846SJoerg Sonnenberger struct pam_message; 244ade90846SJoerg Sonnenberger struct pam_response; 245ade90846SJoerg Sonnenberger int openpam_ttyconv(int _n, 246ade90846SJoerg Sonnenberger const struct pam_message **_msg, 247ade90846SJoerg Sonnenberger struct pam_response **_resp, 248ade90846SJoerg Sonnenberger void *_data); 249ade90846SJoerg Sonnenberger 250ade90846SJoerg Sonnenberger extern int openpam_ttyconv_timeout; 251ade90846SJoerg Sonnenberger 252ade90846SJoerg Sonnenberger /* 253ade90846SJoerg Sonnenberger * Null conversation function 254ade90846SJoerg Sonnenberger */ 255ade90846SJoerg Sonnenberger int openpam_nullconv(int _n, 256ade90846SJoerg Sonnenberger const struct pam_message **_msg, 257ade90846SJoerg Sonnenberger struct pam_response **_resp, 258ade90846SJoerg Sonnenberger void *_data); 259ade90846SJoerg Sonnenberger 260ade90846SJoerg Sonnenberger /* 261ade90846SJoerg Sonnenberger * PAM primitives 262ade90846SJoerg Sonnenberger */ 263ade90846SJoerg Sonnenberger enum { 264ade90846SJoerg Sonnenberger PAM_SM_AUTHENTICATE, 265ade90846SJoerg Sonnenberger PAM_SM_SETCRED, 266ade90846SJoerg Sonnenberger PAM_SM_ACCT_MGMT, 267ade90846SJoerg Sonnenberger PAM_SM_OPEN_SESSION, 268ade90846SJoerg Sonnenberger PAM_SM_CLOSE_SESSION, 269ade90846SJoerg Sonnenberger PAM_SM_CHAUTHTOK, 270ade90846SJoerg Sonnenberger /* keep this last */ 271ade90846SJoerg Sonnenberger PAM_NUM_PRIMITIVES 272ade90846SJoerg Sonnenberger }; 273ade90846SJoerg Sonnenberger 274ade90846SJoerg Sonnenberger /* 275ade90846SJoerg Sonnenberger * Dummy service module function 276ade90846SJoerg Sonnenberger */ 277ade90846SJoerg Sonnenberger #define PAM_SM_DUMMY(type) \ 278ade90846SJoerg Sonnenberger PAM_EXTERN int \ 279ade90846SJoerg Sonnenberger pam_sm_##type(pam_handle_t *pamh, int flags, \ 280ade90846SJoerg Sonnenberger int argc, const char *argv[]) \ 281ade90846SJoerg Sonnenberger { \ 282ade90846SJoerg Sonnenberger \ 283ade90846SJoerg Sonnenberger (void)pamh; \ 284f23594ceSHasso Tepper (void)flags; \ 285f23594ceSHasso Tepper (void)argc; \ 286f23594ceSHasso Tepper (void)argv; \ 287f23594ceSHasso Tepper return (PAM_IGNORE); \ 288f23594ceSHasso Tepper } 289ade90846SJoerg Sonnenberger 290ade90846SJoerg Sonnenberger /* 291ade90846SJoerg Sonnenberger * PAM service module functions match this typedef 292ade90846SJoerg Sonnenberger */ 293ade90846SJoerg Sonnenberger struct pam_handle; 294ade90846SJoerg Sonnenberger typedef int (*pam_func_t)(struct pam_handle *, int, int, const char **); 295ade90846SJoerg Sonnenberger 296ade90846SJoerg Sonnenberger /* 297ade90846SJoerg Sonnenberger * A struct that describes a module. 298ade90846SJoerg Sonnenberger */ 299ade90846SJoerg Sonnenberger typedef struct pam_module pam_module_t; 300ade90846SJoerg Sonnenberger struct pam_module { 301ade90846SJoerg Sonnenberger char *path; 302ade90846SJoerg Sonnenberger pam_func_t func[PAM_NUM_PRIMITIVES]; 303ade90846SJoerg Sonnenberger void *dlh; 304ade90846SJoerg Sonnenberger }; 305ade90846SJoerg Sonnenberger 306ade90846SJoerg Sonnenberger /* 307ade90846SJoerg Sonnenberger * Source-code compatibility with Linux-PAM modules 308ade90846SJoerg Sonnenberger */ 309ade90846SJoerg Sonnenberger #if defined(PAM_SM_AUTH) || defined(PAM_SM_ACCOUNT) || \ 310ade90846SJoerg Sonnenberger defined(PAM_SM_SESSION) || defined(PAM_SM_PASSWORD) 311ade90846SJoerg Sonnenberger # define LINUX_PAM_MODULE 312ade90846SJoerg Sonnenberger #endif 313ade90846SJoerg Sonnenberger 314ade90846SJoerg Sonnenberger #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_AUTH) 315f23594ceSHasso Tepper # define _PAM_SM_AUTHENTICATE 0 316ade90846SJoerg Sonnenberger # define _PAM_SM_SETCRED 0 317ade90846SJoerg Sonnenberger #else 318ade90846SJoerg Sonnenberger # undef PAM_SM_AUTH 319ade90846SJoerg Sonnenberger # define PAM_SM_AUTH 320ade90846SJoerg Sonnenberger # define _PAM_SM_AUTHENTICATE pam_sm_authenticate 321ade90846SJoerg Sonnenberger # define _PAM_SM_SETCRED pam_sm_setcred 322ade90846SJoerg Sonnenberger #endif 323ade90846SJoerg Sonnenberger 324ade90846SJoerg Sonnenberger #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_ACCOUNT) 325f23594ceSHasso Tepper # define _PAM_SM_ACCT_MGMT 0 326ade90846SJoerg Sonnenberger #else 327ade90846SJoerg Sonnenberger # undef PAM_SM_ACCOUNT 328ade90846SJoerg Sonnenberger # define PAM_SM_ACCOUNT 329ade90846SJoerg Sonnenberger # define _PAM_SM_ACCT_MGMT pam_sm_acct_mgmt 330ade90846SJoerg Sonnenberger #endif 331ade90846SJoerg Sonnenberger 332ade90846SJoerg Sonnenberger #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_SESSION) 333f23594ceSHasso Tepper # define _PAM_SM_OPEN_SESSION 0 334ade90846SJoerg Sonnenberger # define _PAM_SM_CLOSE_SESSION 0 335ade90846SJoerg Sonnenberger #else 336ade90846SJoerg Sonnenberger # undef PAM_SM_SESSION 337ade90846SJoerg Sonnenberger # define PAM_SM_SESSION 338ade90846SJoerg Sonnenberger # define _PAM_SM_OPEN_SESSION pam_sm_open_session 339ade90846SJoerg Sonnenberger # define _PAM_SM_CLOSE_SESSION pam_sm_close_session 340ade90846SJoerg Sonnenberger #endif 341ade90846SJoerg Sonnenberger 342ade90846SJoerg Sonnenberger #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_PASSWORD) 343f23594ceSHasso Tepper # define _PAM_SM_CHAUTHTOK 0 344ade90846SJoerg Sonnenberger #else 345ade90846SJoerg Sonnenberger # undef PAM_SM_PASSWORD 346ade90846SJoerg Sonnenberger # define PAM_SM_PASSWORD 347ade90846SJoerg Sonnenberger # define _PAM_SM_CHAUTHTOK pam_sm_chauthtok 348ade90846SJoerg Sonnenberger #endif 349ade90846SJoerg Sonnenberger 350ade90846SJoerg Sonnenberger /* 351ade90846SJoerg Sonnenberger * Infrastructure for static modules using GCC linker sets. 352ade90846SJoerg Sonnenberger * You are not expected to understand this. 353ade90846SJoerg Sonnenberger */ 354ade90846SJoerg Sonnenberger #if !defined(PAM_SOEXT) 355ade90846SJoerg Sonnenberger # define PAM_SOEXT ".so" 356a474e9feSPeter Avalos #endif 357ade90846SJoerg Sonnenberger 358ade90846SJoerg Sonnenberger #if defined(OPENPAM_STATIC_MODULES) 359f23594ceSHasso Tepper # if !defined(__GNUC__) 360a474e9feSPeter Avalos # error "Don't know how to build static modules on non-GNU compilers" 361a474e9feSPeter Avalos # endif 362a474e9feSPeter Avalos /* gcc, static linking */ 363a474e9feSPeter Avalos # include <sys/cdefs.h> 364ade90846SJoerg Sonnenberger # include <linker_set.h> 365ade90846SJoerg Sonnenberger # define PAM_EXTERN static 366ade90846SJoerg Sonnenberger # define PAM_MODULE_ENTRY(name) \ 367ade90846SJoerg Sonnenberger static char _pam_name[] = name PAM_SOEXT; \ 368ade90846SJoerg Sonnenberger static struct pam_module _pam_module = { \ 369ade90846SJoerg Sonnenberger .path = _pam_name, \ 370f23594ceSHasso Tepper .func = { \ 371f23594ceSHasso Tepper [PAM_SM_AUTHENTICATE] = _PAM_SM_AUTHENTICATE, \ 372f23594ceSHasso Tepper [PAM_SM_SETCRED] = _PAM_SM_SETCRED, \ 373f23594ceSHasso Tepper [PAM_SM_ACCT_MGMT] = _PAM_SM_ACCT_MGMT, \ 374f23594ceSHasso Tepper [PAM_SM_OPEN_SESSION] = _PAM_SM_OPEN_SESSION, \ 375f23594ceSHasso Tepper [PAM_SM_CLOSE_SESSION] = _PAM_SM_CLOSE_SESSION, \ 376f23594ceSHasso Tepper [PAM_SM_CHAUTHTOK] = _PAM_SM_CHAUTHTOK \ 377f23594ceSHasso Tepper }, \ 378f23594ceSHasso Tepper }; \ 379f23594ceSHasso Tepper DATA_SET(_openpam_static_modules, _pam_module) 380f23594ceSHasso Tepper #else 381ade90846SJoerg Sonnenberger /* normal case */ 382ade90846SJoerg Sonnenberger # define PAM_EXTERN 383ade90846SJoerg Sonnenberger # define PAM_MODULE_ENTRY(name) 384ade90846SJoerg Sonnenberger #endif 385ade90846SJoerg Sonnenberger 386ade90846SJoerg Sonnenberger #ifdef __cplusplus 387ade90846SJoerg Sonnenberger } 388ade90846SJoerg Sonnenberger #endif 389ade90846SJoerg Sonnenberger 390ade90846SJoerg Sonnenberger #endif /* !SECURITY_OPENPAM_H_INCLUDED */ 391ade90846SJoerg Sonnenberger