15c1eca55SDag-Erling Smørgrav /*- 231c521e9SDag-Erling Smørgrav * Copyright (c) 2002-2003 Networks Associates Technology, Inc. 3*f3b0ac34SDag-Erling Smørgrav * Copyright (c) 2004-2015 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 */ 355c1eca55SDag-Erling Smørgrav 36fe980754SDag-Erling Smørgrav #ifndef SECURITY_OPENPAM_H_INCLUDED 37fe980754SDag-Erling Smørgrav #define SECURITY_OPENPAM_H_INCLUDED 385c1eca55SDag-Erling Smørgrav 395c1eca55SDag-Erling Smørgrav /* 405c1eca55SDag-Erling Smørgrav * Annoying but necessary header pollution 415c1eca55SDag-Erling Smørgrav */ 425c1eca55SDag-Erling Smørgrav #include <stdarg.h> 435c1eca55SDag-Erling Smørgrav 44fe980754SDag-Erling Smørgrav #include <security/openpam_attr.h> 45fe980754SDag-Erling Smørgrav 465c1eca55SDag-Erling Smørgrav #ifdef __cplusplus 475c1eca55SDag-Erling Smørgrav extern "C" { 485c1eca55SDag-Erling Smørgrav #endif 495c1eca55SDag-Erling Smørgrav 5093889be5SDag-Erling Smørgrav struct passwd; 5193889be5SDag-Erling Smørgrav 525c1eca55SDag-Erling Smørgrav /* 535c1eca55SDag-Erling Smørgrav * API extensions 545c1eca55SDag-Erling Smørgrav */ 5593889be5SDag-Erling Smørgrav int 5693889be5SDag-Erling Smørgrav openpam_borrow_cred(pam_handle_t *_pamh, 57fe980754SDag-Erling Smørgrav const struct passwd *_pwd) 58fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 5993889be5SDag-Erling Smørgrav 607f106882SDag-Erling Smørgrav int 617f106882SDag-Erling Smørgrav openpam_subst(const pam_handle_t *_pamh, 627f106882SDag-Erling Smørgrav char *_buf, 637f106882SDag-Erling Smørgrav size_t *_bufsize, 647f106882SDag-Erling Smørgrav const char *_template); 657f106882SDag-Erling Smørgrav 6693889be5SDag-Erling Smørgrav void 6793889be5SDag-Erling Smørgrav openpam_free_data(pam_handle_t *_pamh, 6893889be5SDag-Erling Smørgrav void *_data, 6993889be5SDag-Erling Smørgrav int _status); 7093889be5SDag-Erling Smørgrav 71b33ab329SDag-Erling Smørgrav void 72b33ab329SDag-Erling Smørgrav openpam_free_envlist(char **_envlist); 73b33ab329SDag-Erling Smørgrav 7446acc370SDag-Erling Smørgrav const char * 7546acc370SDag-Erling Smørgrav openpam_get_option(pam_handle_t *_pamh, 7646acc370SDag-Erling Smørgrav const char *_option); 7746acc370SDag-Erling Smørgrav 7846acc370SDag-Erling Smørgrav int 79fe980754SDag-Erling Smørgrav openpam_restore_cred(pam_handle_t *_pamh) 80fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1)); 8193889be5SDag-Erling Smørgrav 8293889be5SDag-Erling Smørgrav int 8346acc370SDag-Erling Smørgrav openpam_set_option(pam_handle_t *_pamh, 8446acc370SDag-Erling Smørgrav const char *_option, 8546acc370SDag-Erling Smørgrav const char *_value); 8646acc370SDag-Erling Smørgrav 875c1eca55SDag-Erling Smørgrav int 88fe980754SDag-Erling Smørgrav pam_error(const pam_handle_t *_pamh, 895c1eca55SDag-Erling Smørgrav const char *_fmt, 90fe980754SDag-Erling Smørgrav ...) 91fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 3)) 92fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 935c1eca55SDag-Erling Smørgrav 945c1eca55SDag-Erling Smørgrav int 955c1eca55SDag-Erling Smørgrav pam_get_authtok(pam_handle_t *_pamh, 9611d144d3SDag-Erling Smørgrav int _item, 975c1eca55SDag-Erling Smørgrav const char **_authtok, 98fe980754SDag-Erling Smørgrav const char *_prompt) 99fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,3)); 1005c1eca55SDag-Erling Smørgrav 1015c1eca55SDag-Erling Smørgrav int 102fe980754SDag-Erling Smørgrav pam_info(const pam_handle_t *_pamh, 1035c1eca55SDag-Erling Smørgrav const char *_fmt, 104fe980754SDag-Erling Smørgrav ...) 105fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 3)) 106fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 1075c1eca55SDag-Erling Smørgrav 1085c1eca55SDag-Erling Smørgrav int 109fe980754SDag-Erling Smørgrav pam_prompt(const pam_handle_t *_pamh, 1105c1eca55SDag-Erling Smørgrav int _style, 1115c1eca55SDag-Erling Smørgrav char **_resp, 1125c1eca55SDag-Erling Smørgrav const char *_fmt, 113fe980754SDag-Erling Smørgrav ...) 114fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 4, 5)) 115fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,4)); 1165c1eca55SDag-Erling Smørgrav 1175c1eca55SDag-Erling Smørgrav int 1185c1eca55SDag-Erling Smørgrav pam_setenv(pam_handle_t *_pamh, 1195c1eca55SDag-Erling Smørgrav const char *_name, 1205c1eca55SDag-Erling Smørgrav const char *_value, 121fe980754SDag-Erling Smørgrav int _overwrite) 122fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2,3)); 1235c1eca55SDag-Erling Smørgrav 1245c1eca55SDag-Erling Smørgrav int 125fe980754SDag-Erling Smørgrav pam_vinfo(const pam_handle_t *_pamh, 1265c1eca55SDag-Erling Smørgrav const char *_fmt, 127fe980754SDag-Erling Smørgrav va_list _ap) 128fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 0)) 129fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 1305c1eca55SDag-Erling Smørgrav 1315c1eca55SDag-Erling Smørgrav int 132fe980754SDag-Erling Smørgrav pam_verror(const pam_handle_t *_pamh, 1335c1eca55SDag-Erling Smørgrav const char *_fmt, 134fe980754SDag-Erling Smørgrav va_list _ap) 135fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 0)) 136fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,2)); 1375c1eca55SDag-Erling Smørgrav 1385c1eca55SDag-Erling Smørgrav int 139fe980754SDag-Erling Smørgrav pam_vprompt(const pam_handle_t *_pamh, 1405c1eca55SDag-Erling Smørgrav int _style, 1415c1eca55SDag-Erling Smørgrav char **_resp, 1425c1eca55SDag-Erling Smørgrav const char *_fmt, 143fe980754SDag-Erling Smørgrav va_list _ap) 144fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 4, 0)) 145fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1,4)); 1465c1eca55SDag-Erling Smørgrav 1475c1eca55SDag-Erling Smørgrav /* 14831c521e9SDag-Erling Smørgrav * Read cooked lines. 149ca236e63SDag-Erling Smørgrav * Checking for _IOFBF is a fairly reliable way to detect the presence 150ca236e63SDag-Erling Smørgrav * of <stdio.h>, as SUSv3 requires it to be defined there. 15131c521e9SDag-Erling Smørgrav */ 152ca236e63SDag-Erling Smørgrav #ifdef _IOFBF 15331c521e9SDag-Erling Smørgrav char * 15431c521e9SDag-Erling Smørgrav openpam_readline(FILE *_f, 15531c521e9SDag-Erling Smørgrav int *_lineno, 156fe980754SDag-Erling Smørgrav size_t *_lenp) 157fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((1)); 1582f3ed619SDag-Erling Smørgrav 1592f3ed619SDag-Erling Smørgrav char ** 1602f3ed619SDag-Erling Smørgrav openpam_readlinev(FILE *_f, 1612f3ed619SDag-Erling Smørgrav int *_lineno, 1622f3ed619SDag-Erling Smørgrav int *_lenp) 1632f3ed619SDag-Erling Smørgrav OPENPAM_NONNULL((1)); 1642f3ed619SDag-Erling Smørgrav 1652f3ed619SDag-Erling Smørgrav char * 1662f3ed619SDag-Erling Smørgrav openpam_readword(FILE *_f, 1672f3ed619SDag-Erling Smørgrav int *_lineno, 1682f3ed619SDag-Erling Smørgrav size_t *_lenp) 1692f3ed619SDag-Erling Smørgrav OPENPAM_NONNULL((1)); 17031c521e9SDag-Erling Smørgrav #endif 17131c521e9SDag-Erling Smørgrav 1722f3ed619SDag-Erling Smørgrav int 1732f3ed619SDag-Erling Smørgrav openpam_straddch(char **_str, 1742f3ed619SDag-Erling Smørgrav size_t *_sizep, 1752f3ed619SDag-Erling Smørgrav size_t *_lenp, 1762f3ed619SDag-Erling Smørgrav int ch) 1772f3ed619SDag-Erling Smørgrav OPENPAM_NONNULL((1)); 1782f3ed619SDag-Erling Smørgrav 1792f3ed619SDag-Erling Smørgrav /* 1802f3ed619SDag-Erling Smørgrav * Enable / disable optional features 1812f3ed619SDag-Erling Smørgrav */ 1822f3ed619SDag-Erling Smørgrav enum { 1832f3ed619SDag-Erling Smørgrav OPENPAM_RESTRICT_SERVICE_NAME, 1842f3ed619SDag-Erling Smørgrav OPENPAM_VERIFY_POLICY_FILE, 1852f3ed619SDag-Erling Smørgrav OPENPAM_RESTRICT_MODULE_NAME, 1862f3ed619SDag-Erling Smørgrav OPENPAM_VERIFY_MODULE_FILE, 187*f3b0ac34SDag-Erling Smørgrav OPENPAM_FALLBACK_TO_OTHER, 1882f3ed619SDag-Erling Smørgrav OPENPAM_NUM_FEATURES 1892f3ed619SDag-Erling Smørgrav }; 1902f3ed619SDag-Erling Smørgrav 1912f3ed619SDag-Erling Smørgrav int 1922f3ed619SDag-Erling Smørgrav openpam_set_feature(int _feature, int _onoff); 1932f3ed619SDag-Erling Smørgrav 1942f3ed619SDag-Erling Smørgrav int 1952f3ed619SDag-Erling Smørgrav openpam_get_feature(int _feature, int *_onoff); 1962f3ed619SDag-Erling Smørgrav 19731c521e9SDag-Erling Smørgrav /* 1985c1eca55SDag-Erling Smørgrav * Log levels 1995c1eca55SDag-Erling Smørgrav */ 2005c1eca55SDag-Erling Smørgrav enum { 2012f3ed619SDag-Erling Smørgrav PAM_LOG_LIBDEBUG = -1, 2025c1eca55SDag-Erling Smørgrav PAM_LOG_DEBUG, 2035c1eca55SDag-Erling Smørgrav PAM_LOG_VERBOSE, 2045c1eca55SDag-Erling Smørgrav PAM_LOG_NOTICE, 2055c1eca55SDag-Erling Smørgrav PAM_LOG_ERROR 2065c1eca55SDag-Erling Smørgrav }; 2075c1eca55SDag-Erling Smørgrav 2085c1eca55SDag-Erling Smørgrav /* 2095c1eca55SDag-Erling Smørgrav * Log to syslog 2105c1eca55SDag-Erling Smørgrav */ 21111d144d3SDag-Erling Smørgrav void 21211d144d3SDag-Erling Smørgrav _openpam_log(int _level, 2135c1eca55SDag-Erling Smørgrav const char *_func, 2145c1eca55SDag-Erling Smørgrav const char *_fmt, 215e10ae022SDag-Erling Smørgrav ...) 216fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 3, 4)) 217fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((3)); 2185c1eca55SDag-Erling Smørgrav 21955e3fbc9SDag-Erling Smørgrav #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) 22055e3fbc9SDag-Erling Smørgrav #define openpam_log(lvl, ...) \ 22155e3fbc9SDag-Erling Smørgrav _openpam_log((lvl), __func__, __VA_ARGS__) 22255e3fbc9SDag-Erling Smørgrav #elif defined(__GNUC__) && (__GNUC__ >= 3) 22355e3fbc9SDag-Erling Smørgrav #define openpam_log(lvl, ...) \ 22455e3fbc9SDag-Erling Smørgrav _openpam_log((lvl), __func__, __VA_ARGS__) 22511d144d3SDag-Erling Smørgrav #elif defined(__GNUC__) && (__GNUC__ >= 2) && (__GNUC_MINOR__ >= 95) 2268d38dc9dSDag-Erling Smørgrav #define openpam_log(lvl, fmt...) \ 227bdcb69e2SDag-Erling Smørgrav _openpam_log((lvl), __func__, ##fmt) 22811d144d3SDag-Erling Smørgrav #elif defined(__GNUC__) && defined(__FUNCTION__) 2295c1eca55SDag-Erling Smørgrav #define openpam_log(lvl, fmt...) \ 23011d144d3SDag-Erling Smørgrav _openpam_log((lvl), __FUNCTION__, ##fmt) 2315c1eca55SDag-Erling Smørgrav #else 23211d144d3SDag-Erling Smørgrav void 23311d144d3SDag-Erling Smørgrav openpam_log(int _level, 23411d144d3SDag-Erling Smørgrav const char *_format, 235fe980754SDag-Erling Smørgrav ...) 236fe980754SDag-Erling Smørgrav OPENPAM_FORMAT ((__printf__, 2, 3)) 237fe980754SDag-Erling Smørgrav OPENPAM_NONNULL((2)); 2385c1eca55SDag-Erling Smørgrav #endif 2395c1eca55SDag-Erling Smørgrav 2405c1eca55SDag-Erling Smørgrav /* 2415c1eca55SDag-Erling Smørgrav * Generic conversation function 2425c1eca55SDag-Erling Smørgrav */ 2435c1eca55SDag-Erling Smørgrav struct pam_message; 2445c1eca55SDag-Erling Smørgrav struct pam_response; 2455c1eca55SDag-Erling Smørgrav int openpam_ttyconv(int _n, 2465c1eca55SDag-Erling Smørgrav const struct pam_message **_msg, 2475c1eca55SDag-Erling Smørgrav struct pam_response **_resp, 2485c1eca55SDag-Erling Smørgrav void *_data); 2495c1eca55SDag-Erling Smørgrav 250ca236e63SDag-Erling Smørgrav extern int openpam_ttyconv_timeout; 251ca236e63SDag-Erling Smørgrav 2525c1eca55SDag-Erling Smørgrav /* 253ac7e3b9dSDag-Erling Smørgrav * Null conversation function 254ac7e3b9dSDag-Erling Smørgrav */ 255ac7e3b9dSDag-Erling Smørgrav int openpam_nullconv(int _n, 256ac7e3b9dSDag-Erling Smørgrav const struct pam_message **_msg, 257ac7e3b9dSDag-Erling Smørgrav struct pam_response **_resp, 258ac7e3b9dSDag-Erling Smørgrav void *_data); 259ac7e3b9dSDag-Erling Smørgrav 260ac7e3b9dSDag-Erling Smørgrav /* 2615c1eca55SDag-Erling Smørgrav * PAM primitives 2625c1eca55SDag-Erling Smørgrav */ 2635c1eca55SDag-Erling Smørgrav enum { 2645c1eca55SDag-Erling Smørgrav PAM_SM_AUTHENTICATE, 2655c1eca55SDag-Erling Smørgrav PAM_SM_SETCRED, 2665c1eca55SDag-Erling Smørgrav PAM_SM_ACCT_MGMT, 2675c1eca55SDag-Erling Smørgrav PAM_SM_OPEN_SESSION, 2685c1eca55SDag-Erling Smørgrav PAM_SM_CLOSE_SESSION, 2695c1eca55SDag-Erling Smørgrav PAM_SM_CHAUTHTOK, 2705c1eca55SDag-Erling Smørgrav /* keep this last */ 2715c1eca55SDag-Erling Smørgrav PAM_NUM_PRIMITIVES 2725c1eca55SDag-Erling Smørgrav }; 2735c1eca55SDag-Erling Smørgrav 2745c1eca55SDag-Erling Smørgrav /* 2755c1eca55SDag-Erling Smørgrav * Dummy service module function 2765c1eca55SDag-Erling Smørgrav */ 2775c1eca55SDag-Erling Smørgrav #define PAM_SM_DUMMY(type) \ 2785c1eca55SDag-Erling Smørgrav PAM_EXTERN int \ 2795c1eca55SDag-Erling Smørgrav pam_sm_##type(pam_handle_t *pamh, int flags, \ 2805c1eca55SDag-Erling Smørgrav int argc, const char *argv[]) \ 2815c1eca55SDag-Erling Smørgrav { \ 282fe980754SDag-Erling Smørgrav \ 283fe980754SDag-Erling Smørgrav (void)pamh; \ 284fe980754SDag-Erling Smørgrav (void)flags; \ 285fe980754SDag-Erling Smørgrav (void)argc; \ 286fe980754SDag-Erling Smørgrav (void)argv; \ 2875c1eca55SDag-Erling Smørgrav return (PAM_IGNORE); \ 2885c1eca55SDag-Erling Smørgrav } 2895c1eca55SDag-Erling Smørgrav 2905c1eca55SDag-Erling Smørgrav /* 2915c1eca55SDag-Erling Smørgrav * PAM service module functions match this typedef 2925c1eca55SDag-Erling Smørgrav */ 2935c1eca55SDag-Erling Smørgrav struct pam_handle; 2945c1eca55SDag-Erling Smørgrav typedef int (*pam_func_t)(struct pam_handle *, int, int, const char **); 2955c1eca55SDag-Erling Smørgrav 2965c1eca55SDag-Erling Smørgrav /* 2975c1eca55SDag-Erling Smørgrav * A struct that describes a module. 2985c1eca55SDag-Erling Smørgrav */ 2995c1eca55SDag-Erling Smørgrav typedef struct pam_module pam_module_t; 3005c1eca55SDag-Erling Smørgrav struct pam_module { 3014579d22cSDag-Erling Smørgrav char *path; 3025c1eca55SDag-Erling Smørgrav pam_func_t func[PAM_NUM_PRIMITIVES]; 3035c1eca55SDag-Erling Smørgrav void *dlh; 3045c1eca55SDag-Erling Smørgrav }; 3055c1eca55SDag-Erling Smørgrav 3065c1eca55SDag-Erling Smørgrav /* 307b825a3acSDag-Erling Smørgrav * Source-code compatibility with Linux-PAM modules 308b825a3acSDag-Erling Smørgrav */ 309b825a3acSDag-Erling Smørgrav #if defined(PAM_SM_AUTH) || defined(PAM_SM_ACCOUNT) || \ 310b825a3acSDag-Erling Smørgrav defined(PAM_SM_SESSION) || defined(PAM_SM_PASSWORD) 311b825a3acSDag-Erling Smørgrav # define LINUX_PAM_MODULE 312b825a3acSDag-Erling Smørgrav #endif 313fe980754SDag-Erling Smørgrav 314b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_AUTH) 315b825a3acSDag-Erling Smørgrav # define _PAM_SM_AUTHENTICATE 0 316b825a3acSDag-Erling Smørgrav # define _PAM_SM_SETCRED 0 317b825a3acSDag-Erling Smørgrav #else 318b825a3acSDag-Erling Smørgrav # undef PAM_SM_AUTH 319b825a3acSDag-Erling Smørgrav # define PAM_SM_AUTH 320b825a3acSDag-Erling Smørgrav # define _PAM_SM_AUTHENTICATE pam_sm_authenticate 321b825a3acSDag-Erling Smørgrav # define _PAM_SM_SETCRED pam_sm_setcred 322b825a3acSDag-Erling Smørgrav #endif 323fe980754SDag-Erling Smørgrav 324b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_ACCOUNT) 325b825a3acSDag-Erling Smørgrav # define _PAM_SM_ACCT_MGMT 0 326b825a3acSDag-Erling Smørgrav #else 327b825a3acSDag-Erling Smørgrav # undef PAM_SM_ACCOUNT 328b825a3acSDag-Erling Smørgrav # define PAM_SM_ACCOUNT 329b825a3acSDag-Erling Smørgrav # define _PAM_SM_ACCT_MGMT pam_sm_acct_mgmt 330b825a3acSDag-Erling Smørgrav #endif 331fe980754SDag-Erling Smørgrav 332b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_SESSION) 333b825a3acSDag-Erling Smørgrav # define _PAM_SM_OPEN_SESSION 0 334b825a3acSDag-Erling Smørgrav # define _PAM_SM_CLOSE_SESSION 0 335b825a3acSDag-Erling Smørgrav #else 336b825a3acSDag-Erling Smørgrav # undef PAM_SM_SESSION 337b825a3acSDag-Erling Smørgrav # define PAM_SM_SESSION 338b825a3acSDag-Erling Smørgrav # define _PAM_SM_OPEN_SESSION pam_sm_open_session 339b825a3acSDag-Erling Smørgrav # define _PAM_SM_CLOSE_SESSION pam_sm_close_session 340b825a3acSDag-Erling Smørgrav #endif 341fe980754SDag-Erling Smørgrav 342b825a3acSDag-Erling Smørgrav #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_PASSWORD) 343b825a3acSDag-Erling Smørgrav # define _PAM_SM_CHAUTHTOK 0 344b825a3acSDag-Erling Smørgrav #else 345b825a3acSDag-Erling Smørgrav # undef PAM_SM_PASSWORD 346b825a3acSDag-Erling Smørgrav # define PAM_SM_PASSWORD 347b825a3acSDag-Erling Smørgrav # define _PAM_SM_CHAUTHTOK pam_sm_chauthtok 348b825a3acSDag-Erling Smørgrav #endif 349b825a3acSDag-Erling Smørgrav 350b825a3acSDag-Erling Smørgrav /* 3515c1eca55SDag-Erling Smørgrav * Infrastructure for static modules using GCC linker sets. 3525c1eca55SDag-Erling Smørgrav * You are not expected to understand this. 3535c1eca55SDag-Erling Smørgrav */ 3541dde0f97SDag-Erling Smørgrav #if !defined(PAM_SOEXT) 3555c1eca55SDag-Erling Smørgrav # define PAM_SOEXT ".so" 3565c1eca55SDag-Erling Smørgrav #endif 357fe980754SDag-Erling Smørgrav 3581dde0f97SDag-Erling Smørgrav #if defined(OPENPAM_STATIC_MODULES) 3591dde0f97SDag-Erling Smørgrav # if !defined(__GNUC__) 3601dde0f97SDag-Erling Smørgrav # error "Don't know how to build static modules on non-GNU compilers" 3611dde0f97SDag-Erling Smørgrav # endif 3625c1eca55SDag-Erling Smørgrav /* gcc, static linking */ 3635c1eca55SDag-Erling Smørgrav # include <sys/cdefs.h> 3645c1eca55SDag-Erling Smørgrav # include <linker_set.h> 3655c1eca55SDag-Erling Smørgrav # define PAM_EXTERN static 3665c1eca55SDag-Erling Smørgrav # define PAM_MODULE_ENTRY(name) \ 3674579d22cSDag-Erling Smørgrav static char _pam_name[] = name PAM_SOEXT; \ 368fe980754SDag-Erling Smørgrav static struct pam_module _pam_module = { \ 369fe980754SDag-Erling Smørgrav .path = _pam_name, \ 370fe980754SDag-Erling Smørgrav .func = { \ 371fe980754SDag-Erling Smørgrav [PAM_SM_AUTHENTICATE] = _PAM_SM_AUTHENTICATE, \ 372fe980754SDag-Erling Smørgrav [PAM_SM_SETCRED] = _PAM_SM_SETCRED, \ 373fe980754SDag-Erling Smørgrav [PAM_SM_ACCT_MGMT] = _PAM_SM_ACCT_MGMT, \ 374fe980754SDag-Erling Smørgrav [PAM_SM_OPEN_SESSION] = _PAM_SM_OPEN_SESSION, \ 375fe980754SDag-Erling Smørgrav [PAM_SM_CLOSE_SESSION] = _PAM_SM_CLOSE_SESSION, \ 376fe980754SDag-Erling Smørgrav [PAM_SM_CHAUTHTOK] = _PAM_SM_CHAUTHTOK \ 377fe980754SDag-Erling Smørgrav }, \ 378fe980754SDag-Erling Smørgrav }; \ 37946acc370SDag-Erling Smørgrav DATA_SET(_openpam_static_modules, _pam_module) 3805c1eca55SDag-Erling Smørgrav #else 3815c1eca55SDag-Erling Smørgrav /* normal case */ 3825c1eca55SDag-Erling Smørgrav # define PAM_EXTERN 3835c1eca55SDag-Erling Smørgrav # define PAM_MODULE_ENTRY(name) 3845c1eca55SDag-Erling Smørgrav #endif 3855c1eca55SDag-Erling Smørgrav 3865c1eca55SDag-Erling Smørgrav #ifdef __cplusplus 3875c1eca55SDag-Erling Smørgrav } 3885c1eca55SDag-Erling Smørgrav #endif 3895c1eca55SDag-Erling Smørgrav 390fe980754SDag-Erling Smørgrav #endif /* !SECURITY_OPENPAM_H_INCLUDED */ 391