1*398f5724Sdholland /* $NetBSD: nsswitch.h,v 1.23 2016/01/23 01:26:14 dholland Exp $ */ 2f649503dSlukem 3f649503dSlukem /*- 4e775b9e3Slukem * Copyright (c) 1997, 1998, 1999, 2004 The NetBSD Foundation, Inc. 5f649503dSlukem * All rights reserved. 6f649503dSlukem * 7f649503dSlukem * This code is derived from software contributed to The NetBSD Foundation 8f649503dSlukem * by Luke Mewburn. 9f649503dSlukem * 10f649503dSlukem * Redistribution and use in source and binary forms, with or without 11f649503dSlukem * modification, are permitted provided that the following conditions 12f649503dSlukem * are met: 13f649503dSlukem * 1. Redistributions of source code must retain the above copyright 14f649503dSlukem * notice, this list of conditions and the following disclaimer. 15f649503dSlukem * 2. Redistributions in binary form must reproduce the above copyright 16f649503dSlukem * notice, this list of conditions and the following disclaimer in the 17f649503dSlukem * documentation and/or other materials provided with the distribution. 18f649503dSlukem * 19f649503dSlukem * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20f649503dSlukem * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21f649503dSlukem * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22f649503dSlukem * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23f649503dSlukem * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24f649503dSlukem * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25f649503dSlukem * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26f649503dSlukem * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27f649503dSlukem * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28f649503dSlukem * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29f649503dSlukem * POSSIBILITY OF SUCH DAMAGE. 30f649503dSlukem */ 31f649503dSlukem 32f649503dSlukem #ifndef _NSSWITCH_H 33f649503dSlukem #define _NSSWITCH_H 1 34f649503dSlukem 35f649503dSlukem #include <sys/types.h> 363eb244d8Sjoerg #include <stdarg.h> 37f649503dSlukem 3843d6d8d8Sthorpej #define NSS_MODULE_INTERFACE_VERSION 0 3943d6d8d8Sthorpej 40f649503dSlukem #ifndef _PATH_NS_CONF 41f649503dSlukem #define _PATH_NS_CONF "/etc/nsswitch.conf" 42f649503dSlukem #endif 43f649503dSlukem 44f649503dSlukem #define NS_CONTINUE 0 45f649503dSlukem #define NS_RETURN 1 46f649503dSlukem 4725d91a60Slukem /* 485994f053Slukem * Layout of: 4925d91a60Slukem * uint32_t ns_src.flags 5025d91a60Slukem */ 5125d91a60Slukem /* nsswitch.conf status codes and nsdispatch(3) return values */ 52f649503dSlukem #define NS_SUCCESS (1<<0) /* entry was found */ 53f649503dSlukem #define NS_UNAVAIL (1<<1) /* source not responding, or corrupt */ 54f649503dSlukem #define NS_NOTFOUND (1<<2) /* source responded 'no such entry' */ 55f649503dSlukem #define NS_TRYAGAIN (1<<3) /* source busy, may respond to retrys */ 56f649503dSlukem #define NS_STATUSMASK 0x000000ff /* bitmask to get the status flags */ 57f649503dSlukem 5825d91a60Slukem /* internal nsdispatch(3) flags; not settable in nsswitch.conf(5) */ 5925d91a60Slukem #define NS_FORCEALL (1<<8) /* force all methods to be invoked; */ 6025d91a60Slukem 61f649503dSlukem /* 625994f053Slukem * Currently implemented sources. 63f649503dSlukem */ 64f649503dSlukem #define NSSRC_FILES "files" /* local files */ 65f649503dSlukem #define NSSRC_DNS "dns" /* DNS; IN for hosts, HS for others */ 66a5476903Slukem #define NSSRC_NIS "nis" /* YP/NIS */ 67a5476903Slukem #define NSSRC_COMPAT "compat" /* passwd,group in YP compat mode */ 68f649503dSlukem 69f649503dSlukem /* 705994f053Slukem * Currently implemented databases. 71f649503dSlukem */ 72f649503dSlukem #define NSDB_HOSTS "hosts" 73f649503dSlukem #define NSDB_GROUP "group" 74f649503dSlukem #define NSDB_GROUP_COMPAT "group_compat" 75f649503dSlukem #define NSDB_NETGROUP "netgroup" 76a5476903Slukem #define NSDB_NETWORKS "networks" 77f649503dSlukem #define NSDB_PASSWD "passwd" 78f649503dSlukem #define NSDB_PASSWD_COMPAT "passwd_compat" 79f649503dSlukem #define NSDB_SHELLS "shells" 80f649503dSlukem 81f649503dSlukem /* 825994f053Slukem * Suggested databases to implement. 83f649503dSlukem */ 84f649503dSlukem #define NSDB_ALIASES "aliases" 85f649503dSlukem #define NSDB_AUTH "auth" 86f649503dSlukem #define NSDB_AUTOMOUNT "automount" 87f649503dSlukem #define NSDB_BOOTPARAMS "bootparams" 88f649503dSlukem #define NSDB_ETHERS "ethers" 89f649503dSlukem #define NSDB_EXPORTS "exports" 90f649503dSlukem #define NSDB_NETMASKS "netmasks" 91f649503dSlukem #define NSDB_PHONES "phones" 92f649503dSlukem #define NSDB_PRINTCAP "printcap" 93f649503dSlukem #define NSDB_PROTOCOLS "protocols" 94f649503dSlukem #define NSDB_REMOTE "remote" 95f649503dSlukem #define NSDB_RPC "rpc" 96f649503dSlukem #define NSDB_SENDMAILVARS "sendmailvars" 97f649503dSlukem #define NSDB_SERVICES "services" 98f649503dSlukem #define NSDB_TERMCAP "termcap" 99f649503dSlukem #define NSDB_TTYS "ttys" 100f649503dSlukem 101f649503dSlukem /* 10243d6d8d8Sthorpej * ns_dtab `callback' function signature. 10343d6d8d8Sthorpej */ 1043eb244d8Sjoerg typedef int (*nss_method)(void *, void *, va_list); 10543d6d8d8Sthorpej 10643d6d8d8Sthorpej /* 107f649503dSlukem * ns_dtab - `nsswitch dispatch table' 1085994f053Slukem * Contains an entry for each source and the appropriate function to call. 109f649503dSlukem */ 110ecaf6583Slukem typedef struct { 111f649503dSlukem const char *src; 11243d6d8d8Sthorpej nss_method callback; 113f649503dSlukem void *cb_data; 114f649503dSlukem } ns_dtab; 115f649503dSlukem 116f649503dSlukem /* 1175994f053Slukem * Macros to help build an ns_dtab[] 118f649503dSlukem */ 1191f2f0802Schristos #define NS_FILES_CB(F,C) { NSSRC_FILES, F, __UNCONST(C) }, 1201f2f0802Schristos #define NS_COMPAT_CB(F,C) { NSSRC_COMPAT, F, __UNCONST(C) }, 121f649503dSlukem 122f649503dSlukem #ifdef HESIOD 1231f2f0802Schristos # define NS_DNS_CB(F,C) { NSSRC_DNS, F, __UNCONST(C) }, 124f649503dSlukem #else 125ecaf6583Slukem # define NS_DNS_CB(F,C) 126f649503dSlukem #endif 127f649503dSlukem 128f649503dSlukem #ifdef YP 1291f2f0802Schristos # define NS_NIS_CB(F,C) { NSSRC_NIS, F, __UNCONST(C) }, 130f649503dSlukem #else 131ecaf6583Slukem # define NS_NIS_CB(F,C) 132f649503dSlukem #endif 1331d0c670bSchristos #define NS_NULL_CB { .src = NULL }, 134f649503dSlukem 135ecaf6583Slukem /* 136ecaf6583Slukem * ns_src - `nsswitch source' 1375994f053Slukem * Used by the nsparser routines to store a mapping between a source 138ecaf6583Slukem * and its dispatch control flags for a given database. 139ecaf6583Slukem */ 140ecaf6583Slukem typedef struct { 141ecaf6583Slukem const char *name; 14225d91a60Slukem uint32_t flags; 143ecaf6583Slukem } ns_src; 144ecaf6583Slukem 145ecaf6583Slukem 146ecaf6583Slukem /* 1475994f053Slukem * Default sourcelists (if nsswitch.conf is missing, corrupt, 1485994f053Slukem * or the requested database doesn't have an entry) 149ecaf6583Slukem */ 150ecaf6583Slukem extern const ns_src __nsdefaultsrc[]; 1515994f053Slukem extern const ns_src __nsdefaultcompat[]; 1525994f053Slukem extern const ns_src __nsdefaultcompat_forceall[]; 1535994f053Slukem extern const ns_src __nsdefaultfiles[]; 1545994f053Slukem extern const ns_src __nsdefaultfiles_forceall[]; 1555994f053Slukem extern const ns_src __nsdefaultnis[]; 1565994f053Slukem extern const ns_src __nsdefaultnis_forceall[]; 157ecaf6583Slukem 158f649503dSlukem 15943d6d8d8Sthorpej /* 16043d6d8d8Sthorpej * ns_mtab - `nsswitch method table' 16143d6d8d8Sthorpej * An nsswitch module provides a mapping from (database name, method name) 16243d6d8d8Sthorpej * tuples to the nss_method and associated callback data. Effectively, 16343d6d8d8Sthorpej * ns_dtab, but used for dynamically loaded modules. 16443d6d8d8Sthorpej */ 16543d6d8d8Sthorpej typedef struct { 16643d6d8d8Sthorpej const char *database; 16743d6d8d8Sthorpej const char *name; 16843d6d8d8Sthorpej nss_method method; 16943d6d8d8Sthorpej void *mdata; 17043d6d8d8Sthorpej } ns_mtab; 17143d6d8d8Sthorpej 17243d6d8d8Sthorpej /* 17343d6d8d8Sthorpej * nss_module_register_fn - module registration function 17443d6d8d8Sthorpej * called at module load 17543d6d8d8Sthorpej * nss_module_unregister_fn - module un-registration function 17643d6d8d8Sthorpej * called at module unload 17743d6d8d8Sthorpej */ 178*398f5724Sdholland typedef void (*nss_module_unregister_fn)(ns_mtab *, unsigned int); 179*398f5724Sdholland typedef ns_mtab *(*nss_module_register_fn)(const char *, unsigned int *, 18043d6d8d8Sthorpej nss_module_unregister_fn *); 18143d6d8d8Sthorpej 182f649503dSlukem #ifdef _NS_PRIVATE 183f649503dSlukem 184f649503dSlukem /* 1855994f053Slukem * Private data structures for back-end nsswitch implementation. 186f649503dSlukem */ 187f649503dSlukem 188f649503dSlukem /* 189f649503dSlukem * ns_dbt - `nsswitch database thang' 1905994f053Slukem * For each database in /etc/nsswitch.conf there is a ns_dbt, with its 191f649503dSlukem * name and a list of ns_src's containing the source information. 192f649503dSlukem */ 193ecaf6583Slukem typedef struct { 194f649503dSlukem const char *name; /* name of database */ 195f649503dSlukem ns_src *srclist; /* list of sources */ 196*398f5724Sdholland unsigned int srclistsize; /* size of srclist */ 197f649503dSlukem } ns_dbt; 198f649503dSlukem 19943d6d8d8Sthorpej /* 20043d6d8d8Sthorpej * ns_mod - `nsswitch module' 20143d6d8d8Sthorpej */ 20243d6d8d8Sthorpej typedef struct { 20343d6d8d8Sthorpej const char *name; /* module name */ 20443d6d8d8Sthorpej void *handle; /* handle from dlopen() */ 20543d6d8d8Sthorpej ns_mtab *mtab; /* method table */ 206*398f5724Sdholland unsigned int mtabsize; /* size of mtab */ 20743d6d8d8Sthorpej /* called to unload module */ 20843d6d8d8Sthorpej nss_module_unregister_fn unregister; 20943d6d8d8Sthorpej } ns_mod; 21043d6d8d8Sthorpej 211f649503dSlukem #endif /* _NS_PRIVATE */ 212f649503dSlukem 213f649503dSlukem 214f649503dSlukem #include <sys/cdefs.h> 215f649503dSlukem 216f649503dSlukem __BEGIN_DECLS 21719b7469aSperry int nsdispatch(void *, const ns_dtab [], const char *, 21819b7469aSperry const char *, const ns_src [], ...); 219f649503dSlukem 220f649503dSlukem #ifdef _NS_PRIVATE 22119b7469aSperry int _nsdbtaddsrc(ns_dbt *, const ns_src *); 22219b7469aSperry void _nsdbtdump(const ns_dbt *); 22319b7469aSperry int _nsdbtput(const ns_dbt *); 22419b7469aSperry void _nsyyerror(const char *); 22519b7469aSperry int _nsyylex(void); 226f649503dSlukem #endif /* _NS_PRIVATE */ 227f649503dSlukem 228f649503dSlukem __END_DECLS 229f649503dSlukem 230f649503dSlukem #endif /* !_NSSWITCH_H */ 231