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