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 32 extern "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 */ 58 typedef 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 */ 72 typedef 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 */ 81 typedef 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 */ 93 typedef 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 */ 106 typedef struct nscd_nsw_state { 107 int dbi; /* which database? */ 108 int max_src; /* is == config->num_lookups */ 109 int getent; /* used by getent */ 110 nss_db_params_t p; 111 struct __nsw_switchconfig_v1 *config; 112 nscd_nsw_config_t **nsw_cfg_p; 113 nscd_nsw_state_base_t *base; 114 nss_backend_t **be; /* array of backends */ 115 nscd_db_t ***be_db_pp; 116 struct nscd_nsw_state *next; 117 } nscd_nsw_state_t; 118 119 /* 120 * nscd_getent_ctx_base_t represents the nscd_getent_ctx_base_t pool 121 * for a NSS database 122 */ 123 typedef struct nscd_getent_ctx_base { 124 int dbi; /* which database? */ 125 int deattached; /* not associated with */ 126 /* current config */ 127 int max_getent_ctx; 128 int num_getent_ctx; 129 int num_waiter; 130 struct nscd_getent_context *first; 131 } nscd_getent_ctx_base_t; 132 133 /* 134 * nscd_getent_context_t is an abstraction of all the data needed 135 * to enumerate a NSS database (e.g. "passwd" or "hosts") 136 */ 137 typedef struct nscd_getent_context { 138 int dbi; 139 nscd_seq_num_t seq_num; 140 nscd_cookie_num_t cookie_num; 141 pid_t pid; /* door client's pid */ 142 int n_src; /* >=max_src: end of sequence */ 143 nscd_nsw_state_t *nsw_state; 144 nss_backend_t *be; 145 nscd_getent_ctx_base_t *base; 146 struct nscd_getent_context *next; 147 } nscd_getent_context_t; 148 149 /* 150 * nscd_smf_state_t is used to keep track of the state of the smf 151 * service associated with a NSS source (e.g. "passwd" or "hosts") 152 */ 153 typedef struct { 154 char *src_name; 155 int src_state; 156 } nscd_smf_state_t; 157 158 /* 159 * nscd_smf_state_t is used to keep track of the state of the smf 160 * service associated with a NSS source (e.g. "passwd" or "hosts") 161 */ 162 typedef struct { 163 int dbi; /* database index */ 164 /* 165 * index of the database of which the switch policy 166 * should be used 167 */ 168 int cfgdbi; 169 /* 170 * index of the pseudo database that the NSS backend 171 * does search on 172 */ 173 int compati; 174 /* 175 * ptr to ptr to the siwtch config structure 176 */ 177 nscd_nsw_config_t **nswcfg; 178 /* 179 * frontend params passed to nss_search or nss_*ent 180 */ 181 struct nss_db_params p; 182 /* 183 * set to 1 if database is "hosts", else 2 if "ipnodes" 184 */ 185 int8_t dnsi; 186 /* 187 * set to 1 if require privilege to look up the database 188 */ 189 uint8_t privdb; 190 } nscd_nsw_params_t; 191 192 /* 193 * additional info returned by the switch engine 194 */ 195 typedef struct { 196 void *pbuf; /* ptr to packed buffer */ 197 size_t pbufsiz; /* length of the packed buffer */ 198 int srci; /* last source searched */ 199 int errnum; /* errno from the backend */ 200 int noarg; /* if set, backend does not use the arg structure */ 201 int fallback; /* if set, may need to fall back to main nscd */ 202 } nscd_sw_return_t; 203 204 /* 205 * nscd cookies used for setent/getent/endent 206 * - p0 cookie: returned by nscd to indicate 207 * the start of the enumeration position 208 * - p1 cookie: returned/updated by nscd to indicate 209 * the current enumeration position 210 */ 211 #define NSCD_P0_COOKIE_SEQNUM -1 212 typedef struct { 213 pid_t p0_pid; 214 time_t p0_time; 215 nscd_seq_num_t p0_seqnum; 216 } nscd_getent_p0_cookie_t; 217 218 typedef struct { 219 nscd_cookie_num_t p1_cookie_num; 220 nscd_seq_num_t p1_seqnum; 221 } nscd_getent_p1_cookie_t; 222 223 /* 224 * static tables or global data defined in other files 225 */ 226 extern int _nscd_cfg_num_nsw_src; 227 extern int _nscd_cfg_num_nsw_src_all; 228 extern int _nscd_cfg_num_nsw_db; 229 extern int _nscd_cfg_num_nsw_db_all; 230 extern int _nscd_cfg_num_smf_services; 231 extern nscd_cfg_id_t _nscd_cfg_nsw_src[]; 232 extern nscd_cfg_id_t *_nscd_cfg_nsw_src_all; 233 extern nscd_cfg_id_t _nscd_cfg_nsw_db[]; 234 extern nss_db_initf_t nscd_nss_db_initf[]; 235 extern nscd_cfg_id_t _nscd_cfg_smf_services[]; 236 extern nscd_smf_state_t *nscd_smf_service_state; 237 extern nscd_db_t ***nscd_src_backend_db; 238 extern nscd_nsw_config_t ***nscd_nsw_config; 239 extern nscd_nsw_state_base_t **nscd_nsw_state_base; 240 extern nscd_getent_ctx_base_t **nscd_getent_ctx_base; 241 extern nscd_cfg_global_switch_t nscd_switch_cfg_g; 242 extern nscd_cfg_switch_t *nscd_switch_cfg; 243 extern nscd_cfg_stat_global_switch_t nscd_switch_stats_g; 244 extern nscd_cfg_stat_switch_t *nscd_switch_stats; 245 246 #define NSCD_NUM_SRC _nscd_cfg_num_nsw_src_all 247 #define NSCD_NUM_DB _nscd_cfg_num_nsw_db_all 248 #define NSCD_NUM_SMF_FMRI _nscd_cfg_num_smf_services 249 #define NSCD_NSW_SRC_NAME(i) (_nscd_cfg_nsw_src_all + i)->name 250 #define NSCD_NSW_DB_NAME(i) _nscd_cfg_nsw_db[i].name 251 #define NSCD_SMF_SVC_FMRI(i) _nscd_cfg_smf_services[i].name 252 #define NSCD_SMF_SVC_INDEX(i) _nscd_cfg_smf_services[i].index 253 #define NSCD_SMF_SVC_STATE(i) nscd_smf_service_state[i].src_state 254 #define NSCD_SW_CFG_G nscd_switch_cfg_g 255 #define NSCD_SW_CFG(i) nscd_switch_cfg[i] 256 #define NSCD_SW_STATS_G nscd_switch_stats_g 257 #define NSCD_SW_STATS(i) nscd_switch_stats[i] 258 259 /* 260 * special service states used by the switch engine 261 */ 262 #define NSCD_SVC_STATE_UNINITED -1 263 #define NSCD_SVC_STATE_UNKNOWN_SRC -2 264 265 /* 266 * prototypes 267 */ 268 269 void 270 _nscd_put_nsw_state( 271 nscd_nsw_state_t *s); 272 273 void 274 _nscd_put_nsw_state_thread( 275 nscd_nsw_state_t *s); 276 277 nscd_rc_t 278 _nscd_get_nsw_state( 279 nss_db_root_t *rootp, 280 nscd_nsw_params_t *params); 281 282 nscd_rc_t 283 _nscd_get_nsw_state_thread( 284 nss_db_root_t *rootp, 285 nscd_nsw_params_t *params); 286 287 nscd_rc_t 288 _nscd_init_all_nsw_state_base(); 289 290 nscd_rc_t 291 _nscd_init_nsw_state_base( 292 int dbi, 293 int compat_basei, 294 int lock); 295 296 nscd_rc_t 297 _nscd_init_all_getent_ctx(); 298 299 nscd_rc_t 300 _nscd_init_getent_ctx_base( 301 int dbi, 302 int lock); 303 304 nscd_db_t 305 *_nscd_create_getent_ctxaddrDB(); 306 307 nscd_rc_t 308 _nscd_get_getent_ctx( 309 nss_getent_t *contextpp, 310 nscd_nsw_params_t *params); 311 312 void 313 _nscd_put_getent_ctx( 314 nscd_getent_context_t *ctx); 315 316 nscd_rc_t 317 _nscd_init_all_nsw_config(); 318 319 nscd_rc_t 320 _nscd_init_all_nsw_be_info_db(); 321 322 #ifdef NSCD_NSSWITCH_CONF_FROM_SMF_PROP 323 nscd_rc_t 324 _nscd_get_new_nsw_config( 325 scf_handle_t *hndl, 326 const char *fmri, 327 scf_propertygroup_t *pg); 328 #endif 329 330 nscd_rc_t 331 _nscd_get_new_service_state( 332 int index, 333 scf_handle_t *hndl, 334 scf_property_t *prop); 335 336 nscd_getent_context_t * 337 _nscd_is_getent_ctx( 338 nscd_cookie_num_t cookie_num); 339 340 nscd_rc_t 341 _nscd_create_sw_struct( 342 int dbi, 343 int compat_basei, 344 const char *dbn, 345 const char *cfgstr, 346 void *swcfgv1, 347 nscd_nsw_params_t *params); 348 349 nscd_rc_t 350 _nscd_create_new_config( 351 nscd_nsw_params_t *params); 352 353 void 354 _nscd_free_nsw_config( 355 nscd_nsw_config_t *nswcfg); 356 357 nscd_rc_t 358 _nscd_init_smf_monitor(); 359 360 nscd_rc_t 361 _nscd_alloc_nsw_config(); 362 363 nscd_rc_t 364 _nscd_alloc_service_state_table(); 365 366 nscd_rc_t 367 _nscd_alloc_nsw_state_base(); 368 369 nscd_rc_t 370 _nscd_alloc_nsw_be_info_db(); 371 372 nscd_rc_t 373 _nscd_alloc_getent_ctx_base(); 374 375 void 376 _nscd_free_all_nsw_state_base(); 377 378 void 379 _nscd_free_all_getent_ctx_base(); 380 381 void 382 _nscd_free_all_nsw_config(); 383 384 void 385 _nscd_free_all_nsw_backend_info_db(); 386 387 struct __nsw_switchconfig_v1 * 388 _nsw_getoneconfig_v1( 389 const char *name, 390 char *linep, 391 enum __nsw_parse_err *errp); 392 int 393 __nsw_freeconfig_v1( 394 struct __nsw_switchconfig_v1 *conf); 395 396 int 397 _nscd_get_smf_state(int srci, int dbi, int recheck); 398 399 void 400 nss_psearch(void *buffer, size_t length); 401 void 402 nss_psetent(void *buffer, size_t length, pid_t pid); 403 void 404 nss_pgetent(void *buffer, size_t length); 405 void 406 nss_pendent(void *buffer, size_t length); 407 void 408 nss_pdelete(void *buffer, size_t length); 409 410 nscd_rc_t _nscd_alloc_switch_cfg(); 411 nscd_rc_t _nscd_alloc_switch_stats(); 412 nscd_db_t *_nscd_create_getent_ctx_addrDB(); 413 nscd_db_t *_nscd_create_getent_ctxDB(); 414 415 #ifdef __cplusplus 416 } 417 #endif 418 419 #endif /* _NSCD_SWITCH_H */ 420