nscd_switch.h revision 2830:5228d1267a01
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 2006 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	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 */
123typedef 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 */
137typedef struct nscd_getent_context {
138	int				dbi;
139	nscd_seq_num_t			seq_num;
140	nscd_cookie_t			cookie;
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 */
153typedef 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 */
162typedef 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 */
195typedef 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 * static tables or global data defined in other files
206 */
207extern int			_nscd_cfg_num_nsw_src;
208extern int			_nscd_cfg_num_nsw_src_all;
209extern int			_nscd_cfg_num_nsw_db;
210extern int			_nscd_cfg_num_nsw_db_all;
211extern int			_nscd_cfg_num_smf_services;
212extern nscd_cfg_id_t		_nscd_cfg_nsw_src[];
213extern nscd_cfg_id_t		*_nscd_cfg_nsw_src_all;
214extern nscd_cfg_id_t		_nscd_cfg_nsw_db[];
215extern nss_db_initf_t		nscd_nss_db_initf[];
216extern nscd_cfg_id_t		_nscd_cfg_smf_services[];
217extern nscd_smf_state_t		*nscd_smf_service_state;
218extern nscd_db_t		***nscd_src_backend_db;
219extern nscd_nsw_config_t	***nscd_nsw_config;
220extern nscd_nsw_state_base_t	**nscd_nsw_state_base;
221extern nscd_getent_ctx_base_t	**nscd_getent_ctx_base;
222extern nscd_cfg_global_switch_t	nscd_switch_cfg_g;
223extern nscd_cfg_switch_t	*nscd_switch_cfg;
224extern nscd_cfg_stat_global_switch_t nscd_switch_stats_g;
225extern nscd_cfg_stat_switch_t	*nscd_switch_stats;
226
227#define	NSCD_NUM_SRC		_nscd_cfg_num_nsw_src_all
228#define	NSCD_NUM_DB		_nscd_cfg_num_nsw_db_all
229#define	NSCD_NUM_SMF_FMRI	_nscd_cfg_num_smf_services
230#define	NSCD_NSW_SRC_NAME(i)	(_nscd_cfg_nsw_src_all + i)->name
231#define	NSCD_NSW_DB_NAME(i)	_nscd_cfg_nsw_db[i].name
232#define	NSCD_SMF_SVC_FMRI(i)	_nscd_cfg_smf_services[i].name
233#define	NSCD_SMF_SVC_INDEX(i)	_nscd_cfg_smf_services[i].index
234#define	NSCD_SMF_SVC_STATE(i)	nscd_smf_service_state[i].src_state
235#define	NSCD_SW_CFG_G		nscd_switch_cfg_g
236#define	NSCD_SW_CFG(i)		nscd_switch_cfg[i]
237#define	NSCD_SW_STATS_G		nscd_switch_stats_g
238#define	NSCD_SW_STATS(i)	nscd_switch_stats[i]
239
240/*
241 * special service states used by the switch engine
242 */
243#define	NSCD_SVC_STATE_UNINITED		-1
244#define	NSCD_SVC_STATE_UNKNOWN_SRC	-2
245
246/*
247 * prototypes
248 */
249
250void
251_nscd_put_nsw_state(
252	nscd_nsw_state_t	*s);
253
254void
255_nscd_put_nsw_state_thread(
256	nscd_nsw_state_t	*s);
257
258nscd_rc_t
259_nscd_get_nsw_state(
260	nss_db_root_t		*rootp,
261	nscd_nsw_params_t	*params);
262
263nscd_rc_t
264_nscd_get_nsw_state_thread(
265	nss_db_root_t		*rootp,
266	nscd_nsw_params_t	*params);
267
268nscd_rc_t
269_nscd_init_all_nsw_state_base();
270
271nscd_rc_t
272_nscd_init_nsw_state_base(
273	int			dbi,
274	int			lock);
275
276nscd_rc_t
277_nscd_init_all_getent_ctx();
278
279nscd_rc_t
280_nscd_init_getent_ctx_base(
281	int			dbi,
282	int			lock);
283
284nscd_db_t
285*_nscd_create_getent_ctxaddrDB();
286
287nscd_rc_t
288_nscd_get_getent_ctx(
289	nss_getent_t		*contextpp,
290	nscd_nsw_params_t	*params);
291
292void
293_nscd_put_getent_ctx(
294	nscd_getent_context_t	*ctx);
295
296nscd_rc_t
297_nscd_init_all_nsw_config();
298
299nscd_rc_t
300_nscd_init_all_nsw_be_info_db();
301
302#ifdef NSCD_NSSWITCH_CONF_FROM_SMF_PROP
303nscd_rc_t
304_nscd_get_new_nsw_config(
305	scf_handle_t		*hndl,
306	const char		*fmri,
307	scf_propertygroup_t	*pg);
308#endif
309
310nscd_rc_t
311_nscd_get_new_service_state(
312	int			index,
313	scf_handle_t		*hndl,
314	scf_property_t		*prop);
315
316nscd_getent_context_t *
317_nscd_is_getent_ctx(
318	nscd_cookie_t		cookie);
319
320nscd_rc_t
321_nscd_create_sw_struct(
322	int			dbi,
323	const char		*dbn,
324	const char		*cfgstr,
325	void			*swcfgv1,
326	nscd_nsw_params_t	*params);
327
328nscd_rc_t
329_nscd_create_new_config(
330	nscd_nsw_params_t	*params);
331
332void
333_nscd_free_nsw_config(
334	nscd_nsw_config_t	*nswcfg);
335
336nscd_rc_t
337_nscd_init_smf_monitor();
338
339nscd_rc_t
340_nscd_alloc_nsw_config();
341
342nscd_rc_t
343_nscd_alloc_service_state_table();
344
345nscd_rc_t
346_nscd_alloc_nsw_state_base();
347
348nscd_rc_t
349_nscd_alloc_nsw_be_info_db();
350
351nscd_rc_t
352_nscd_alloc_getent_ctx_base();
353
354void
355_nscd_free_all_nsw_state_base();
356
357void
358_nscd_free_all_getent_ctx_base();
359
360void
361_nscd_free_all_nsw_config();
362
363void
364_nscd_free_all_nsw_backend_info_db();
365
366struct __nsw_switchconfig_v1 *
367_nsw_getoneconfig_v1(
368	const char		*name,
369	char			*linep,
370	enum __nsw_parse_err	*errp);
371int
372__nsw_freeconfig_v1(
373	struct __nsw_switchconfig_v1 *conf);
374
375int
376_nscd_get_smf_state(int srci, int dbi, int recheck);
377
378void
379nss_psearch(void *buffer, size_t length);
380void
381nss_psetent(void *buffer, size_t length, pid_t pid);
382void
383nss_pgetent(void *buffer, size_t length);
384void
385nss_pendent(void *buffer, size_t length);
386void
387nss_pdelete(void *buffer, size_t length);
388
389nscd_rc_t _nscd_alloc_switch_cfg();
390nscd_rc_t _nscd_alloc_switch_stats();
391nscd_db_t *_nscd_create_getent_ctx_addrDB();
392nscd_rc_t _nscd_populate_nsw_backend_info();
393nscd_db_t *_nscd_create_getent_ctxDB();
394
395#ifdef	__cplusplus
396}
397#endif
398
399#endif	/* _NSCD_SWITCH_H */
400