root/usr/src/head/nsswitch.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
 *
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * nsswitch.h
 *
 * Low-level interface to the name-service switch.  The interface defined
 * in <nss_common.h> should be used in preference to this.
 *
 * This is a Project Private interface.  It may change in future releases.
 */

#ifndef _NSSWITCH_H
#define _NSSWITCH_H

#ifdef  __cplusplus
extern "C" {
#endif

#ifndef __NSW_CONFIG_FILE
#define __NSW_CONFIG_FILE       "/etc/nsswitch.conf"
#endif
#define __NSW_DEFAULT_FILE      "/etc/default/nss"

#define __NSW_HOSTS_DB          "hosts"
#define __NSW_PASSWD_DB         "passwd"
#define __NSW_GROUP_DB          "group"
#define __NSW_NETGROUP_DB       "netgroup"
#define __NSW_NETWORKS_DB       "networks"
#define __NSW_PROTOCOLS_DB      "protocols"
#define __NSW_RPC_DB            "rpc"
#define __NSW_SERVICES_DB       "services"
#define __NSW_ETHERS_DB         "ethers"
#define __NSW_BOOTPARAMS_DB     "bootparams"
#define __NSW_NETMASKS_DB       "netmasks"
#define __NSW_BROADCASTADDRS_DB "broadcastaddrs"
#define __NSW_MAIL_ALIASES_DB   "aliases"
#define __NSW_AUDITUSER_DB      "audit_user"
#define __NSW_AUTHATTR_DB       "auth_attr"
#define __NSW_EXECATTR_DB       "exec_attr"
#define __NSW_PROFATTR_DB       "prof_attr"
#define __NSW_USERATTR_DB       "user_attr"
#define __NSW_PROJECT_DB        "project"

#define __NSW_STD_ERRS  4       /* number of reserved errors that follow */

#define __NSW_SUCCESS   0       /* found the required data */
#define __NSW_NOTFOUND  1       /* the naming service returned lookup failure */
#define __NSW_UNAVAIL   2       /* could not call the naming service */
#define __NSW_TRYAGAIN  3       /* bind error to suggest a retry */

typedef unsigned char action_t;
#define __NSW_CONTINUE  0       /* the action is to continue to next service */
#define __NSW_RETURN    1       /* the action is to return to the user */

#define __NSW_STR_RETURN        "return"
#define __NSW_STR_CONTINUE      "continue"
#define __NSW_STR_SUCCESS       "success"
#define __NSW_STR_NOTFOUND      "notfound"
#define __NSW_STR_UNAVAIL       "unavail"
#define __NSW_STR_TRYAGAIN      "tryagain"

/* prefix for all switch shared objects */
#define __NSW_LIB       "nsw"

enum __nsw_parse_err {
        __NSW_CONF_PARSE_SUCCESS = 0,   /* parser found the required policy */
        __NSW_CONF_PARSE_NOFILE = 1,    /* the policy files does not exist */
        __NSW_CONF_PARSE_NOPOLICY = 2,  /* the required policy is not set */
                                        /* in the file */
        __NSW_CONF_PARSE_SYSERR = 3     /* system error in the parser */
};


struct __nsw_long_err {
        int nsw_errno;
        action_t action;
        struct __nsw_long_err *next;
};

struct __nsw_lookup {
        char *service_name;
        action_t actions[__NSW_STD_ERRS];
        struct __nsw_long_err *long_errs;
        struct __nsw_lookup *next;
};

struct __nsw_switchconfig {
        int vers;
        char *dbase;
        int num_lookups;
        struct __nsw_lookup *lookups;
};

#define __NSW_ACTION(lkp, err)  \
        ((lkp)->next == NULL ? \
                __NSW_RETURN \
        : \
                ((err) >= 0 && (err) < __NSW_STD_ERRS ? \
                        (lkp)->actions[err] \
                : \
                        __nsw_extended_action(lkp, err)))

struct __nsw_switchconfig *__nsw_getconfig
        (const char *, enum __nsw_parse_err *);
int __nsw_freeconfig(struct __nsw_switchconfig *);
action_t __nsw_extended_action(struct __nsw_lookup *, int);

#ifdef  __cplusplus
}
#endif

#endif /* _NSSWITCH_H */