1cb5caa98Sdjl /* 2cb5caa98Sdjl * CDDL HEADER START 3cb5caa98Sdjl * 4cb5caa98Sdjl * The contents of this file are subject to the terms of the 5cb5caa98Sdjl * Common Development and Distribution License (the "License"). 6cb5caa98Sdjl * You may not use this file except in compliance with the License. 7cb5caa98Sdjl * 8cb5caa98Sdjl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9cb5caa98Sdjl * or http://www.opensolaris.org/os/licensing. 10cb5caa98Sdjl * See the License for the specific language governing permissions 11cb5caa98Sdjl * and limitations under the License. 12cb5caa98Sdjl * 13cb5caa98Sdjl * When distributing Covered Code, include this CDDL HEADER in each 14cb5caa98Sdjl * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15cb5caa98Sdjl * If applicable, add the following below this CDDL HEADER, with the 16cb5caa98Sdjl * fields enclosed by brackets "[]" replaced with your own identifying 17cb5caa98Sdjl * information: Portions Copyright [yyyy] [name of copyright owner] 18cb5caa98Sdjl * 19cb5caa98Sdjl * CDDL HEADER END 20cb5caa98Sdjl */ 21cb5caa98Sdjl /* 22cb5caa98Sdjl * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23cb5caa98Sdjl * Use is subject to license terms. 24cb5caa98Sdjl */ 25cb5caa98Sdjl 26cb5caa98Sdjl #ifndef _NSCD_SWITCH_H 27cb5caa98Sdjl #define _NSCD_SWITCH_H 28cb5caa98Sdjl 29cb5caa98Sdjl #pragma ident "%Z%%M% %I% %E% SMI" 30cb5caa98Sdjl 31cb5caa98Sdjl #ifdef __cplusplus 32cb5caa98Sdjl extern "C" { 33cb5caa98Sdjl #endif 34cb5caa98Sdjl 35cb5caa98Sdjl #include <nss_dbdefs.h> 36cb5caa98Sdjl #include <thread.h> 37cb5caa98Sdjl #include <libscf.h> 38cb5caa98Sdjl #define __NSS_PRIVATE_INTERFACE 39cb5caa98Sdjl #include "nsswitch_priv.h" 40cb5caa98Sdjl #undef __NSS_PRIVATE_INTERFACE 41cb5caa98Sdjl #include "nscd_db.h" 42cb5caa98Sdjl #include "nscd_config.h" 43cb5caa98Sdjl 44cb5caa98Sdjl /* 45cb5caa98Sdjl * max. length of e.g. "passwd: files ldap" 46cb5caa98Sdjl */ 47cb5caa98Sdjl #define MAX_NSSWITCH_CONFIG_STRING_SZ 256 48cb5caa98Sdjl 49cb5caa98Sdjl /* 50cb5caa98Sdjl * max. length of the name of a NSS database 51cb5caa98Sdjl */ 52cb5caa98Sdjl #define MAX_NSSWITCH_CONFIG_DB_NAME_SZ 256 53cb5caa98Sdjl 54cb5caa98Sdjl /* 55cb5caa98Sdjl * nscd_nsw_config_t is an abstraction of the configuration 56cb5caa98Sdjl * for a NSS database 57cb5caa98Sdjl */ 58cb5caa98Sdjl typedef struct { 59cb5caa98Sdjl char *db_name; 60cb5caa98Sdjl char *nsw_cfg_str; 61cb5caa98Sdjl nss_db_params_t fe_params; 62cb5caa98Sdjl struct __nsw_switchconfig_v1 *nsw_config; 63cb5caa98Sdjl int max_src; 64cb5caa98Sdjl int *src_idx; /* ptr to array of */ 65cb5caa98Sdjl /* src index */ 66cb5caa98Sdjl int nobase; /* not shared */ 67cb5caa98Sdjl } nscd_nsw_config_t; 68cb5caa98Sdjl 69cb5caa98Sdjl /* 70cb5caa98Sdjl * nscd_be_info_t is an abstraction of a NSS backend 71cb5caa98Sdjl */ 72cb5caa98Sdjl typedef struct { 73cb5caa98Sdjl nss_backend_constr_t be_constr; 74cb5caa98Sdjl nss_backend_finder_t *finder; 75cb5caa98Sdjl void *finder_priv; 76cb5caa98Sdjl } nscd_be_info_t; 77cb5caa98Sdjl 78cb5caa98Sdjl /* 79cb5caa98Sdjl * nscd_state_ctrl_t is used to control a nscd_nsw_state pool 80cb5caa98Sdjl */ 81cb5caa98Sdjl typedef struct { 82cb5caa98Sdjl int max; 83cb5caa98Sdjl int allocated; 84cb5caa98Sdjl int free; 85cb5caa98Sdjl int waiter; 86cb5caa98Sdjl struct nscd_nsw_state *first; 87cb5caa98Sdjl } nscd_state_ctrl_t; 88cb5caa98Sdjl 89cb5caa98Sdjl /* 90cb5caa98Sdjl * nscd_nsw_state_base_t represents the nscd_nsw_state pool 91cb5caa98Sdjl * for a NSS database 92cb5caa98Sdjl */ 93cb5caa98Sdjl typedef struct nscd_nsw_state_base { 94cb5caa98Sdjl int dbi; /* which database? */ 95cb5caa98Sdjl nscd_state_ctrl_t nsw_state; 96cb5caa98Sdjl nscd_state_ctrl_t nsw_state_thr; 97cb5caa98Sdjl int used_by_thr; 98cb5caa98Sdjl thread_t tid; 99cb5caa98Sdjl cond_t thr_cond; 100cb5caa98Sdjl } nscd_nsw_state_base_t; 101cb5caa98Sdjl 102cb5caa98Sdjl /* 103cb5caa98Sdjl * nscd_nsw_state_t is an abstraction of all the data needed 104cb5caa98Sdjl * to do lookup of NSS database (e.g. "passwd" or "hosts") 105cb5caa98Sdjl */ 106cb5caa98Sdjl typedef struct nscd_nsw_state { 107cb5caa98Sdjl int dbi; /* which database? */ 108cb5caa98Sdjl int max_src; /* is == config->num_lookups */ 109cb5caa98Sdjl int getent; /* used by getent */ 110cb5caa98Sdjl nss_db_params_t p; 111cb5caa98Sdjl struct __nsw_switchconfig_v1 *config; 112cb5caa98Sdjl nscd_nsw_config_t **nsw_cfg_p; 113cb5caa98Sdjl nscd_nsw_state_base_t *base; 114cb5caa98Sdjl nss_backend_t **be; /* array of backends */ 115cb5caa98Sdjl nscd_db_t ***be_db_pp; 116cb5caa98Sdjl struct nscd_nsw_state *next; 117cb5caa98Sdjl } nscd_nsw_state_t; 118cb5caa98Sdjl 119cb5caa98Sdjl /* 120cb5caa98Sdjl * nscd_getent_ctx_base_t represents the nscd_getent_ctx_base_t pool 121cb5caa98Sdjl * for a NSS database 122cb5caa98Sdjl */ 123cb5caa98Sdjl typedef struct nscd_getent_ctx_base { 124cb5caa98Sdjl int dbi; /* which database? */ 125cb5caa98Sdjl int deattached; /* not associated with */ 126cb5caa98Sdjl /* current config */ 127cb5caa98Sdjl int max_getent_ctx; 128cb5caa98Sdjl int num_getent_ctx; 129cb5caa98Sdjl int num_waiter; 130cb5caa98Sdjl struct nscd_getent_context *first; 131cb5caa98Sdjl } nscd_getent_ctx_base_t; 132cb5caa98Sdjl 133cb5caa98Sdjl /* 134cb5caa98Sdjl * nscd_getent_context_t is an abstraction of all the data needed 135cb5caa98Sdjl * to enumerate a NSS database (e.g. "passwd" or "hosts") 136cb5caa98Sdjl */ 137cb5caa98Sdjl typedef struct nscd_getent_context { 138cb5caa98Sdjl int dbi; 139cb5caa98Sdjl nscd_seq_num_t seq_num; 140*e37190e5Smichen nscd_cookie_num_t cookie_num; 141cb5caa98Sdjl pid_t pid; /* door client's pid */ 142cb5caa98Sdjl int n_src; /* >=max_src: end of sequence */ 143cb5caa98Sdjl nscd_nsw_state_t *nsw_state; 144cb5caa98Sdjl nss_backend_t *be; 145cb5caa98Sdjl nscd_getent_ctx_base_t *base; 146cb5caa98Sdjl struct nscd_getent_context *next; 147cb5caa98Sdjl } nscd_getent_context_t; 148cb5caa98Sdjl 149cb5caa98Sdjl /* 150cb5caa98Sdjl * nscd_smf_state_t is used to keep track of the state of the smf 151cb5caa98Sdjl * service associated with a NSS source (e.g. "passwd" or "hosts") 152cb5caa98Sdjl */ 153cb5caa98Sdjl typedef struct { 154cb5caa98Sdjl char *src_name; 155cb5caa98Sdjl int src_state; 156cb5caa98Sdjl } nscd_smf_state_t; 157cb5caa98Sdjl 158cb5caa98Sdjl /* 159cb5caa98Sdjl * nscd_smf_state_t is used to keep track of the state of the smf 160cb5caa98Sdjl * service associated with a NSS source (e.g. "passwd" or "hosts") 161cb5caa98Sdjl */ 162cb5caa98Sdjl typedef struct { 163cb5caa98Sdjl int dbi; /* database index */ 164cb5caa98Sdjl /* 165cb5caa98Sdjl * index of the database of which the switch policy 166cb5caa98Sdjl * should be used 167cb5caa98Sdjl */ 168cb5caa98Sdjl int cfgdbi; 169cb5caa98Sdjl /* 170cb5caa98Sdjl * index of the pseudo database that the NSS backend 171cb5caa98Sdjl * does search on 172cb5caa98Sdjl */ 173cb5caa98Sdjl int compati; 174cb5caa98Sdjl /* 175cb5caa98Sdjl * ptr to ptr to the siwtch config structure 176cb5caa98Sdjl */ 177cb5caa98Sdjl nscd_nsw_config_t **nswcfg; 178cb5caa98Sdjl /* 179cb5caa98Sdjl * frontend params passed to nss_search or nss_*ent 180cb5caa98Sdjl */ 181cb5caa98Sdjl struct nss_db_params p; 182cb5caa98Sdjl /* 183cb5caa98Sdjl * set to 1 if database is "hosts", else 2 if "ipnodes" 184cb5caa98Sdjl */ 185cb5caa98Sdjl int8_t dnsi; 186cb5caa98Sdjl /* 187cb5caa98Sdjl * set to 1 if require privilege to look up the database 188cb5caa98Sdjl */ 189cb5caa98Sdjl uint8_t privdb; 190cb5caa98Sdjl } nscd_nsw_params_t; 191cb5caa98Sdjl 192cb5caa98Sdjl /* 193cb5caa98Sdjl * additional info returned by the switch engine 194cb5caa98Sdjl */ 195cb5caa98Sdjl typedef struct { 196cb5caa98Sdjl void *pbuf; /* ptr to packed buffer */ 197cb5caa98Sdjl size_t pbufsiz; /* length of the packed buffer */ 198cb5caa98Sdjl int srci; /* last source searched */ 199cb5caa98Sdjl int errnum; /* errno from the backend */ 200cb5caa98Sdjl int noarg; /* if set, backend does not use the arg structure */ 201cb5caa98Sdjl int fallback; /* if set, may need to fall back to main nscd */ 202cb5caa98Sdjl } nscd_sw_return_t; 203cb5caa98Sdjl 204cb5caa98Sdjl /* 205*e37190e5Smichen * nscd cookies used for setent/getent/endent 206*e37190e5Smichen * - p0 cookie: returned by nscd to indicate 207*e37190e5Smichen * the start of the enumeration position 208*e37190e5Smichen * - p1 cookie: returned/updated by nscd to indicate 209*e37190e5Smichen * the current enumeration position 210*e37190e5Smichen */ 211*e37190e5Smichen #define NSCD_P0_COOKIE_SEQNUM -1 212*e37190e5Smichen typedef struct { 213*e37190e5Smichen pid_t p0_pid; 214*e37190e5Smichen time_t p0_time; 215*e37190e5Smichen nscd_seq_num_t p0_seqnum; 216*e37190e5Smichen } nscd_getent_p0_cookie_t; 217*e37190e5Smichen 218*e37190e5Smichen typedef struct { 219*e37190e5Smichen nscd_cookie_num_t p1_cookie_num; 220*e37190e5Smichen nscd_seq_num_t p1_seqnum; 221*e37190e5Smichen } nscd_getent_p1_cookie_t; 222*e37190e5Smichen 223*e37190e5Smichen /* 224cb5caa98Sdjl * static tables or global data defined in other files 225cb5caa98Sdjl */ 226cb5caa98Sdjl extern int _nscd_cfg_num_nsw_src; 227cb5caa98Sdjl extern int _nscd_cfg_num_nsw_src_all; 228cb5caa98Sdjl extern int _nscd_cfg_num_nsw_db; 229cb5caa98Sdjl extern int _nscd_cfg_num_nsw_db_all; 230cb5caa98Sdjl extern int _nscd_cfg_num_smf_services; 231cb5caa98Sdjl extern nscd_cfg_id_t _nscd_cfg_nsw_src[]; 232cb5caa98Sdjl extern nscd_cfg_id_t *_nscd_cfg_nsw_src_all; 233cb5caa98Sdjl extern nscd_cfg_id_t _nscd_cfg_nsw_db[]; 234cb5caa98Sdjl extern nss_db_initf_t nscd_nss_db_initf[]; 235cb5caa98Sdjl extern nscd_cfg_id_t _nscd_cfg_smf_services[]; 236cb5caa98Sdjl extern nscd_smf_state_t *nscd_smf_service_state; 237cb5caa98Sdjl extern nscd_db_t ***nscd_src_backend_db; 238cb5caa98Sdjl extern nscd_nsw_config_t ***nscd_nsw_config; 239cb5caa98Sdjl extern nscd_nsw_state_base_t **nscd_nsw_state_base; 240cb5caa98Sdjl extern nscd_getent_ctx_base_t **nscd_getent_ctx_base; 241cb5caa98Sdjl extern nscd_cfg_global_switch_t nscd_switch_cfg_g; 242cb5caa98Sdjl extern nscd_cfg_switch_t *nscd_switch_cfg; 243cb5caa98Sdjl extern nscd_cfg_stat_global_switch_t nscd_switch_stats_g; 244cb5caa98Sdjl extern nscd_cfg_stat_switch_t *nscd_switch_stats; 245cb5caa98Sdjl 246cb5caa98Sdjl #define NSCD_NUM_SRC _nscd_cfg_num_nsw_src_all 247cb5caa98Sdjl #define NSCD_NUM_DB _nscd_cfg_num_nsw_db_all 248cb5caa98Sdjl #define NSCD_NUM_SMF_FMRI _nscd_cfg_num_smf_services 249cb5caa98Sdjl #define NSCD_NSW_SRC_NAME(i) (_nscd_cfg_nsw_src_all + i)->name 250cb5caa98Sdjl #define NSCD_NSW_DB_NAME(i) _nscd_cfg_nsw_db[i].name 251cb5caa98Sdjl #define NSCD_SMF_SVC_FMRI(i) _nscd_cfg_smf_services[i].name 252cb5caa98Sdjl #define NSCD_SMF_SVC_INDEX(i) _nscd_cfg_smf_services[i].index 253cb5caa98Sdjl #define NSCD_SMF_SVC_STATE(i) nscd_smf_service_state[i].src_state 254cb5caa98Sdjl #define NSCD_SW_CFG_G nscd_switch_cfg_g 255cb5caa98Sdjl #define NSCD_SW_CFG(i) nscd_switch_cfg[i] 256cb5caa98Sdjl #define NSCD_SW_STATS_G nscd_switch_stats_g 257cb5caa98Sdjl #define NSCD_SW_STATS(i) nscd_switch_stats[i] 258cb5caa98Sdjl 259cb5caa98Sdjl /* 260cb5caa98Sdjl * special service states used by the switch engine 261cb5caa98Sdjl */ 262cb5caa98Sdjl #define NSCD_SVC_STATE_UNINITED -1 263cb5caa98Sdjl #define NSCD_SVC_STATE_UNKNOWN_SRC -2 264cb5caa98Sdjl 265cb5caa98Sdjl /* 266cb5caa98Sdjl * prototypes 267cb5caa98Sdjl */ 268cb5caa98Sdjl 269cb5caa98Sdjl void 270cb5caa98Sdjl _nscd_put_nsw_state( 271cb5caa98Sdjl nscd_nsw_state_t *s); 272cb5caa98Sdjl 273cb5caa98Sdjl void 274cb5caa98Sdjl _nscd_put_nsw_state_thread( 275cb5caa98Sdjl nscd_nsw_state_t *s); 276cb5caa98Sdjl 277cb5caa98Sdjl nscd_rc_t 278cb5caa98Sdjl _nscd_get_nsw_state( 279cb5caa98Sdjl nss_db_root_t *rootp, 280cb5caa98Sdjl nscd_nsw_params_t *params); 281cb5caa98Sdjl 282cb5caa98Sdjl nscd_rc_t 283cb5caa98Sdjl _nscd_get_nsw_state_thread( 284cb5caa98Sdjl nss_db_root_t *rootp, 285cb5caa98Sdjl nscd_nsw_params_t *params); 286cb5caa98Sdjl 287cb5caa98Sdjl nscd_rc_t 288cb5caa98Sdjl _nscd_init_all_nsw_state_base(); 289cb5caa98Sdjl 290cb5caa98Sdjl nscd_rc_t 291cb5caa98Sdjl _nscd_init_nsw_state_base( 292cb5caa98Sdjl int dbi, 293ad0e80f7Smichen int compat_basei, 294cb5caa98Sdjl int lock); 295cb5caa98Sdjl 296cb5caa98Sdjl nscd_rc_t 297cb5caa98Sdjl _nscd_init_all_getent_ctx(); 298cb5caa98Sdjl 299cb5caa98Sdjl nscd_rc_t 300cb5caa98Sdjl _nscd_init_getent_ctx_base( 301cb5caa98Sdjl int dbi, 302cb5caa98Sdjl int lock); 303cb5caa98Sdjl 304cb5caa98Sdjl nscd_db_t 305cb5caa98Sdjl *_nscd_create_getent_ctxaddrDB(); 306cb5caa98Sdjl 307cb5caa98Sdjl nscd_rc_t 308cb5caa98Sdjl _nscd_get_getent_ctx( 309cb5caa98Sdjl nss_getent_t *contextpp, 310cb5caa98Sdjl nscd_nsw_params_t *params); 311cb5caa98Sdjl 312cb5caa98Sdjl void 313cb5caa98Sdjl _nscd_put_getent_ctx( 314cb5caa98Sdjl nscd_getent_context_t *ctx); 315cb5caa98Sdjl 316cb5caa98Sdjl nscd_rc_t 317cb5caa98Sdjl _nscd_init_all_nsw_config(); 318cb5caa98Sdjl 319cb5caa98Sdjl nscd_rc_t 320cb5caa98Sdjl _nscd_init_all_nsw_be_info_db(); 321cb5caa98Sdjl 322cb5caa98Sdjl #ifdef NSCD_NSSWITCH_CONF_FROM_SMF_PROP 323cb5caa98Sdjl nscd_rc_t 324cb5caa98Sdjl _nscd_get_new_nsw_config( 325cb5caa98Sdjl scf_handle_t *hndl, 326cb5caa98Sdjl const char *fmri, 327cb5caa98Sdjl scf_propertygroup_t *pg); 328cb5caa98Sdjl #endif 329cb5caa98Sdjl 330cb5caa98Sdjl nscd_rc_t 331cb5caa98Sdjl _nscd_get_new_service_state( 332cb5caa98Sdjl int index, 333cb5caa98Sdjl scf_handle_t *hndl, 334cb5caa98Sdjl scf_property_t *prop); 335cb5caa98Sdjl 336cb5caa98Sdjl nscd_getent_context_t * 337cb5caa98Sdjl _nscd_is_getent_ctx( 338*e37190e5Smichen nscd_cookie_num_t cookie_num); 339cb5caa98Sdjl 340cb5caa98Sdjl nscd_rc_t 341cb5caa98Sdjl _nscd_create_sw_struct( 342cb5caa98Sdjl int dbi, 343ad0e80f7Smichen int compat_basei, 344cb5caa98Sdjl const char *dbn, 345cb5caa98Sdjl const char *cfgstr, 346cb5caa98Sdjl void *swcfgv1, 347cb5caa98Sdjl nscd_nsw_params_t *params); 348cb5caa98Sdjl 349cb5caa98Sdjl nscd_rc_t 350cb5caa98Sdjl _nscd_create_new_config( 351cb5caa98Sdjl nscd_nsw_params_t *params); 352cb5caa98Sdjl 353cb5caa98Sdjl void 354cb5caa98Sdjl _nscd_free_nsw_config( 355cb5caa98Sdjl nscd_nsw_config_t *nswcfg); 356cb5caa98Sdjl 357cb5caa98Sdjl nscd_rc_t 358cb5caa98Sdjl _nscd_init_smf_monitor(); 359cb5caa98Sdjl 360cb5caa98Sdjl nscd_rc_t 361cb5caa98Sdjl _nscd_alloc_nsw_config(); 362cb5caa98Sdjl 363cb5caa98Sdjl nscd_rc_t 364cb5caa98Sdjl _nscd_alloc_service_state_table(); 365cb5caa98Sdjl 366cb5caa98Sdjl nscd_rc_t 367cb5caa98Sdjl _nscd_alloc_nsw_state_base(); 368cb5caa98Sdjl 369cb5caa98Sdjl nscd_rc_t 370cb5caa98Sdjl _nscd_alloc_nsw_be_info_db(); 371cb5caa98Sdjl 372cb5caa98Sdjl nscd_rc_t 373cb5caa98Sdjl _nscd_alloc_getent_ctx_base(); 374cb5caa98Sdjl 375cb5caa98Sdjl void 376cb5caa98Sdjl _nscd_free_all_nsw_state_base(); 377cb5caa98Sdjl 378cb5caa98Sdjl void 379cb5caa98Sdjl _nscd_free_all_getent_ctx_base(); 380cb5caa98Sdjl 381cb5caa98Sdjl void 382cb5caa98Sdjl _nscd_free_all_nsw_config(); 383cb5caa98Sdjl 384cb5caa98Sdjl void 385cb5caa98Sdjl _nscd_free_all_nsw_backend_info_db(); 386cb5caa98Sdjl 387cb5caa98Sdjl struct __nsw_switchconfig_v1 * 388cb5caa98Sdjl _nsw_getoneconfig_v1( 389cb5caa98Sdjl const char *name, 390cb5caa98Sdjl char *linep, 391cb5caa98Sdjl enum __nsw_parse_err *errp); 392cb5caa98Sdjl int 393cb5caa98Sdjl __nsw_freeconfig_v1( 394cb5caa98Sdjl struct __nsw_switchconfig_v1 *conf); 395cb5caa98Sdjl 396cb5caa98Sdjl int 397cb5caa98Sdjl _nscd_get_smf_state(int srci, int dbi, int recheck); 398cb5caa98Sdjl 399cb5caa98Sdjl void 400cb5caa98Sdjl nss_psearch(void *buffer, size_t length); 401cb5caa98Sdjl void 402cb5caa98Sdjl nss_psetent(void *buffer, size_t length, pid_t pid); 403cb5caa98Sdjl void 404cb5caa98Sdjl nss_pgetent(void *buffer, size_t length); 405cb5caa98Sdjl void 406cb5caa98Sdjl nss_pendent(void *buffer, size_t length); 407cb5caa98Sdjl void 408cb5caa98Sdjl nss_pdelete(void *buffer, size_t length); 409cb5caa98Sdjl 410cb5caa98Sdjl nscd_rc_t _nscd_alloc_switch_cfg(); 411cb5caa98Sdjl nscd_rc_t _nscd_alloc_switch_stats(); 412cb5caa98Sdjl nscd_db_t *_nscd_create_getent_ctx_addrDB(); 413cb5caa98Sdjl nscd_rc_t _nscd_populate_nsw_backend_info(); 414cb5caa98Sdjl nscd_db_t *_nscd_create_getent_ctxDB(); 415cb5caa98Sdjl 416cb5caa98Sdjl #ifdef __cplusplus 417cb5caa98Sdjl } 418cb5caa98Sdjl #endif 419cb5caa98Sdjl 420cb5caa98Sdjl #endif /* _NSCD_SWITCH_H */ 421