nscd_config.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_CONFIG_H
27#define	_NSCD_CONFIG_H
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31#ifdef	__cplusplus
32extern "C" {
33#endif
34
35#include <stdio.h>
36#include "nscd_common.h"
37
38/*
39 * nscd_cfg_id_t is used to identify a config/stat
40 * object. 'index' provides a way to quickly locate
41 * the object in the associated configuration list.
42 * 'name' can be looked up in the config info database
43 * to obtain the index.
44 */
45typedef struct {
46	int		index;
47	char		*name;
48} nscd_cfg_id_t;
49
50/*
51 * forward declaration of nscd_cfg_param_desc_t
52 */
53struct nscd_cfg_param_desc;
54
55/*
56 * for operations that apply to configuration data
57 * in all the nsswitch databases
58 */
59#define	NSCD_CFG_NSW_ALLDB		"ALLDB"
60#define	NSCD_CFG_NSW_ALLDB_INDEX	9999
61
62/*
63 * configuration lists includes switch databases (eg. hosts, passwd),
64 * switch sources (eg. files, ldap), config parameter descriptions
65 * (defined below), and status/statistic counter descriptions (defined
66 * below)
67 */
68typedef struct {
69	int		num;
70	nscd_cfg_id_t	**list;
71} nscd_cfg_list_t;
72
73/*
74 * type of configuration list
75 */
76typedef enum {
77	NSCD_CFG_LIST_NSW_DB	= 0,
78	NSCD_CFG_LIST_NSW_SRC	= 1,
79	NSCD_CFG_LIST_PARAM	= 2,
80	NSCD_CFG_LIST_STAT	= 3
81} nscd_cfg_list_type_t;
82
83/*
84 * A config handle identifies config or stat data,
85 * which if is nsswitch database specific, 'nswdb'
86 * indicates the id of the database; if global,
87 * 'nswdb' should be null. 'desc' is the config
88 * param or stat description assocaited with the
89 * data.
90 */
91typedef struct {
92	nscd_cfg_id_t			*nswdb;
93	void				*desc;
94	nscd_cfg_list_type_t		type;
95} nscd_cfg_handle_t;
96
97/*
98 * type of configuration/statistics data
99 */
100typedef enum {
101	NSCD_CFG_DATA_NONE	= 0,
102	NSCD_CFG_DATA_INTEGER	= 1,
103	NSCD_CFG_DATA_BOOLEAN	= 2,
104	NSCD_CFG_DATA_STRING	= 3,
105	NSCD_CFG_DATA_BITMAP	= 4,
106	NSCD_CFG_DATA_PERCENT	= 5
107} nscd_cfg_data_type_t;
108#define	NSCD_CFG_NUM_DATA_TYPE	5
109
110/*
111 * data flag is attached to config/stat data passed between
112 * function to specify the nature/type of action to perform
113 */
114
115#define	NSCD_CFG_DFLAG_NONE			   0x0000
116
117/*
118 * data should not be freed by receiver;
119 * otherwise it should be freed
120 */
121#define	NSCD_CFG_DFLAG_STATIC_DATA		   0x0001
122
123/*
124 * data is sent/received due to nscd initialization;
125 * otherwise due to modification of the config data
126 * requested by users
127 */
128#define	NSCD_CFG_DFLAG_INIT			   0x0002
129
130/*
131 * the entire group of data is, or should be, sent;
132 * otherwise only a single parameter/stat value
133 */
134#define	NSCD_CFG_DFLAG_GROUP			   0x0004
135
136/*
137 * the data sent/received is to be verified by the
138 * 'verify' function defined in the parameter
139 * description
140 */
141#define	NSCD_CFG_DFLAG_VERIFY			   0x0008
142
143/*
144 * the data sent/received is to be processed by the
145 * 'notify' function defined in the parameter
146 * description
147 */
148#define	NSCD_CFG_DFLAG_NOTIFY			   0x0010
149
150/*
151 * the data sent/received is to be applied to all
152 * nsswitch databases
153 */
154#define	NSCD_CFG_DFLAG_SET_ALL_DB		   0x0020
155
156/*
157 * the entire group of data is sent/received;
158 * however, only those parameters selected by
159 * the bitmap in the group info should be
160 * processed
161 */
162#define	NSCD_CFG_DFLAG_BIT_SELECTED		   0x0040
163
164/*
165 * param flag is defined in the parameter description.
166 * It specifies what operation should be applied to, or
167 * the nature of, the config parameters.
168 */
169
170#define	NSCD_CFG_PFLAG_NONE			   0x0000
171
172/*
173 * At init/refresh time, send the parameter value
174 * with the data of the entire group; otherwise
175 * send the parameter value only
176 */
177#define	NSCD_CFG_PFLAG_INIT_SEND_WHOLE_GROUP	   0x0001
178
179/*
180 * At user requested update time, send the parameter
181 * value with the data of the entire group; otherwise
182 * send the parameter value only
183 */
184#define	NSCD_CFG_PFLAG_UPDATE_SEND_WHOLE_GROUP	   0x0002
185
186/*
187 * At init/refresh time, send the config data
188 * once for each nsswitch database
189 */
190#define	NSCD_CFG_PFLAG_INIT_SET_ALL_DB		   0x0004
191
192/*
193 * At user requested update time, send the per nsswitch
194 * database (non-global) data just one time (not once
195 * for each nsswitch database)
196 */
197#define	NSCD_CFG_PFLAG_UPDATE_SEND_NON_GLOBAL_ONCE 0x0008
198
199/*
200 * send entire group data, but use bitmap to indicate
201 * the one config parameter being processed. This flag
202 * can only be sepcified for a group description
203 */
204#define	NSCD_CFG_PFLAG_SEND_BIT_SELECTED	   0x0010
205
206/*
207 * data is global, not per nsswitch database
208 */
209#define	NSCD_CFG_PFLAG_GLOBAL			   0x0020
210
211/*
212 * data is group data, not individual parameter value
213 */
214#define	NSCD_CFG_PFLAG_GROUP			   0x0040
215
216/*
217 * data is of variable length
218 */
219#define	NSCD_CFG_PFLAG_VLEN_DATA		   0x0080
220
221/*
222 * data is hidden, for internal use only, get/set not allowed
223 */
224#define	NSCD_CFG_PFLAG_HIDDEN			   0x0100
225
226/*
227 * data is linked, using the value of a different database
228 */
229#define	NSCD_CFG_PFLAG_LINKED			   0x0200
230
231/*
232 * data is obsolete, ignored with warning, should not be displayed
233 */
234#define	NSCD_CFG_PFLAG_OBSOLETE			   0x0400
235
236/*
237 * structure for error reporting
238 */
239typedef struct {
240	nscd_rc_t	rc;
241	char		*msg;
242} nscd_cfg_error_t;
243
244/*
245 * typedef for flag, bitmap, and boolean
246 */
247typedef int		nscd_cfg_flag_t;
248typedef int		nscd_cfg_bitmap_t;
249
250/*
251 * struct nscd_cfg_param_desc is used to describe each and
252 * every one of the nscd config parameters so that they can
253 * be processed generically by the configuration management
254 * component. During init or update time, config data needs
255 * to be pushed to other nscd components (frontend, switch
256 * engine, cache backend, and so on) for further processing.
257 * The 'verify' and 'notify' functions are the hooks provided
258 * by these other components to validate and store the new
259 * config data. The 'p_check' field, if specified, points
260 * to a set of data used for preliminary check of a parameter
261 * value (range, length, null checking etc).
262 */
263typedef struct nscd_cfg_param_desc {
264	nscd_cfg_id_t		id;
265	nscd_cfg_data_type_t	type;
266	nscd_cfg_flag_t		pflag;
267	int	p_size;
268	size_t	p_offset;
269	int	p_fn;
270	int	g_size;
271	size_t	g_offset;
272	int	g_index;
273	void	*p_check;
274	char	*nfunc_name;
275	char	*vfunc_name;
276	nscd_rc_t	(*notify)(void			*data,
277			struct nscd_cfg_param_desc	*pdesc,
278			nscd_cfg_id_t			*nswdb,
279			nscd_cfg_flag_t			dflag,
280			nscd_cfg_error_t		**errorp,
281			void				*cookie);
282	nscd_rc_t	(*verify)(void			*data,
283			struct	nscd_cfg_param_desc	*pdesc,
284			nscd_cfg_id_t			*nswdb,
285			nscd_cfg_flag_t			dflag,
286			nscd_cfg_error_t		**errorp,
287			void				**cookie);
288} nscd_cfg_param_desc_t;
289
290/*
291 * the _nscd_cfg_get_param_desc_list function returns
292 * the list of nscd config param descriptions at
293 * run time
294 */
295typedef struct {
296	int			num;
297	nscd_cfg_param_desc_t	**list;
298} nscd_cfg_param_desc_list_t;
299
300/* this describes data of variable length */
301typedef struct {
302	void	*ptr;
303	int	len;
304} nscd_cfg_vlen_data_t;
305
306/*
307 * The following defines the various global and nsswitch
308 * database specific data structures for all the groups of
309 * configuration parameters. Before each one, there lists
310 * the associated group info which contains the number of
311 * parameters and the corresponding bitmap.
312 */
313
314typedef struct {
315	int			num_param;
316	nscd_cfg_bitmap_t	bitmap;
317} nscd_cfg_group_info_t;
318#define	NSCD_CFG_GROUP_INFO_NULL	{-1, 0x0000}
319
320/*
321 * frontend param group (Per nsswitch database)
322 */
323#define	NSCD_CFG_GROUP_INFO_FRONTEND	{1, 0x0001}
324typedef struct {
325	nscd_cfg_group_info_t	gi;
326	int			worker_thread_per_nsw_db;
327} nscd_cfg_frontend_t;
328
329/*
330 * switch engine param group (Per nsswitch database)
331 */
332#define	NSCD_CFG_GROUP_INFO_SWITCH	{7, 0x07f}
333typedef struct {
334	nscd_cfg_group_info_t	gi;
335	char			*nsw_config_string;
336	char			*nsw_config_db;
337	nscd_bool_t		enable_lookup;
338	nscd_bool_t		enable_loopback_checking;
339	int			max_nsw_state_per_db;
340	int			max_nsw_state_per_thread;
341	int			max_getent_ctx_per_db;
342} nscd_cfg_switch_t;
343
344/*
345 * log/debug param group (global)
346 */
347#define	NSCD_CFG_GROUP_INFO_GLOBAL_LOG	{3, 0x0007}
348typedef struct {
349	nscd_cfg_group_info_t	gi;
350	char			*logfile;
351	int			debug_level;
352	int			debug_comp;
353} nscd_cfg_global_log_t;
354
355/*
356 * frontend param group (global)
357 */
358#define	NSCD_CFG_GROUP_INFO_GLOBAL_FRONTEND	{2, 0x0003}
359typedef struct {
360	nscd_cfg_group_info_t	gi;
361	int			common_worker_threads;
362	int			cache_hit_threads;
363} nscd_cfg_global_frontend_t;
364
365/*
366 * self credential param group (global)
367 */
368#define	NSCD_CFG_GROUP_INFO_GLOBAL_SELFCRED	{3, 0x0007}
369typedef struct {
370	nscd_cfg_group_info_t	gi;
371	nscd_bool_t		enable_selfcred;
372	int			max_per_user_nscd;
373	int			per_user_nscd_ttl;
374} nscd_cfg_global_selfcred_t;
375
376/*
377 * switch engine param group (global)
378 */
379#define	NSCD_CFG_GROUP_INFO_GLOBAL_SWITCH	{3, 0x0007}
380typedef struct {
381	nscd_cfg_group_info_t	gi;
382	nscd_bool_t		enable_lookup_g;
383	nscd_bool_t		enable_loopback_checking_g;
384	int			check_smf_state_interval_g;
385} nscd_cfg_global_switch_t;
386
387/*
388 * nscd_cfg_param_desc_t should always have nscd_cfg_id_t
389 * as its first field. _nscd_cfg_get_desc below provides
390 * an way to get to the nscd_cfg_param_desc_t from a
391 * pointer to the static nscd_cfg_id_t returned by the
392 * various_nscd_cfg_* functions
393 */
394#define	_nscd_cfg_get_desc_i(id)	((nscd_cfg_param_desc_t *)(id))
395
396#define	_nscd_cfg_get_desc(h)		((h)->desc)
397
398/*
399 * The various param group structure should always have
400 * nscd_cfg_group_info_t as its first field.
401 * _nscd_cfg_get_gi below provides a generic way to
402 * get to the nscd_cfg_group_info_t from a void pointer
403 * to the various param group structure returned by the
404 * _nscd_cfg_* functions
405 */
406#define	_nscd_cfg_get_gi(voidp)	((nscd_cfg_group_info_t *)(voidp))
407
408/*
409 * It is possible in the future, we will need more bits
410 * than those in nscd_cfg_flag_t and nscd_cfg_bitmap_t. To
411 * make it easier to extend, the following macro should be
412 * used to deal with flags and bitmaps.
413 * m, m1, m2, ma: mask, n: nth bit (0 based)
414 * f: flag, v: value
415 */
416#define	NSCD_CFG_BITMAP_ZERO			0
417#define	_nscd_cfg_bitmap_is_set(m, n)		(((m) >> n) & 1)
418#define	_nscd_cfg_bitmap_is_not_set(m, n)	(!(((m) >> n) & 1))
419#define	_nscd_cfg_bitmap_is_equal(m1, m2)	((m1) == (m2))
420#define	_nscd_cfg_bitmap_value(m)		(m)
421#define	_nscd_cfg_bitmap_set_nth(m, n)		((m) |= (1 << n))
422#define	_nscd_cfg_bitmap_set(ma, m)		(*(nscd_cfg_bitmap_t *) \
423							(ma) = (m))
424#define	_nscd_cfg_bitmap_valid(m1, m2)		(((m1) & ~(m2)) == 0)
425
426#define	NSCD_CFG_FLAG_ZERO			0
427#define	_nscd_cfg_flag_is_set(f, v)		((f) & (v))
428#define	_nscd_cfg_flag_is_not_set(f, v)		(!((f) & (v)))
429#define	_nscd_cfg_flag_value(f)			(f)
430#define	_nscd_cfg_flag_set(f, v)		((f) | (v))
431#define	_nscd_cfg_flag_unset(f, v)		((f) & ~(v))
432
433/*
434 * handy macros
435 */
436#define	NSCD_NULL			"NULL"
437#define	NSCD_CFG_MAX_ERR_MSG_LEN	1024
438#define	NSCD_STR_OR_NULL(s)		((s) == NULL ? "NULL" : (s))
439#define	NSCD_STR_OR_GLOBAL(s)		((s) == NULL ? "GLOBAL" : (s))
440#define	NSCD_Y_OR_N(s)			(*(nscd_bool_t *)s == nscd_true ? \
441				"yes" : "no")
442
443#define	NSCD_ERR2MSG(e)		(((e) && (e)->msg) ? (e)->msg : "")
444
445
446/*
447 * This macro is based on offsetof defined in stddef_iso.h,
448 * it gives the size of 'm' in structure 's' without needing
449 * the declaration of a 's' variable (as macro sizeof does)
450 */
451#define	NSCD_SIZEOF(s, m)		(sizeof (((s *)0)->m))
452
453
454/*
455 * struct nscd_cfg_stat_desc is used to describe each and every
456 * one of the nscd statistics counters so that they can be
457 * processed generically by the configuration management
458 * component. The component does not keep a separate copy of
459 * all counters, which should be maintained by other nscd
460 * components. The 'get_stat' functions defined in the
461 * stat description are supplied by those components and used
462 * by the config management component to request and print
463 * counters on behave of the users. The free_stat function
464 * returned by those components will also be used to free
465 * the stat data if the NSCD_CFG_DFLAG_STATIC_DATA bit is
466 * not set in dflag.
467 */
468typedef struct nscd_cfg_stat_desc {
469	nscd_cfg_id_t		id;
470	nscd_cfg_data_type_t	type;
471	nscd_cfg_flag_t		sflag;
472	nscd_cfg_group_info_t	gi;
473	int	s_size;
474	size_t	s_offset;
475	int	s_fn;
476	int	g_size;
477	size_t	g_offset;
478	int	g_index;
479	char	*gsfunc_name;
480	nscd_rc_t	(*get_stat)(void		**stat,
481			struct nscd_cfg_stat_desc	*sdesc,
482			nscd_cfg_id_t			*nswdb,
483			nscd_cfg_flag_t			*dflag,
484			void				(**free_stat)
485							(void *stat),
486			nscd_cfg_error_t		**errorp);
487} nscd_cfg_stat_desc_t;
488
489/*
490 * stat flag is defined in the stat description. It
491 * specifies the nature of the statistics counters.
492 */
493
494#define	NSCD_CFG_SFLAG_NONE			   0x0000
495
496/*
497 * statistics counter is global, not per nsswitch database
498 */
499#define	NSCD_CFG_SFLAG_GLOBAL			   0x0001
500
501/*
502 * description is for counter group, not individual counter
503 */
504#define	NSCD_CFG_SFLAG_GROUP			   0x0002
505
506/*
507 * The following defines the various global and nsswitch
508 * database specific data structures for all the groups of
509 * statistics counters. Before each one, there lists
510 * the associated group info which contains the number of
511 * counters and the corresponding bitmap.
512 */
513
514/*
515 * switch engine stat group (Per nsswitch database)
516 */
517#define	NSCD_CFG_STAT_GROUP_INFO_SWITCH		{6, 0x003f}
518typedef struct {
519	nscd_cfg_group_info_t	gi;
520	int			lookup_request_received;
521	int			lookup_request_queued;
522	int			lookup_request_in_progress;
523	int			lookup_request_succeeded;
524	int			lookup_request_failed;
525	int			loopback_nsw_db_skipped;
526} nscd_cfg_stat_switch_t;
527
528/*
529 * log/debug stat group (global)
530 */
531#define	NSCD_CFG_STAT_GROUP_INFO_GLOBAL_LOG	{1, 0x0001}
532typedef struct {
533	nscd_cfg_group_info_t	gi;
534	int			entries_logged;
535} nscd_cfg_stat_global_log_t;
536
537/*
538 * switch engine stat group (global)
539 */
540#define	NSCD_CFG_STAT_GROUP_INFO_GLOBAL_SWITCH	{6, 0x003f}
541typedef struct {
542	nscd_cfg_group_info_t	gi;
543	int			lookup_request_received_g;
544	int			lookup_request_queued_g;
545	int			lookup_request_in_progress_g;
546	int			lookup_request_succeeded_g;
547	int			lookup_request_failed_g;
548	int			loopback_nsw_db_skipped_g;
549} nscd_cfg_stat_global_switch_t;
550
551/*
552 * control structure for appending string data to a buffer
553 */
554typedef struct {
555	char		*buf;
556	char		*next;
557	int		size;
558	int		used;
559	int		left;
560	int		real;
561} nscd_cfg_buf_t;
562
563/*
564 * internal configuration management related functions
565 */
566nscd_rc_t _nscd_cfg_init();
567
568nscd_rc_t
569_nscd_cfg_get_param_desc_list(
570	nscd_cfg_param_desc_list_t **list);
571
572nscd_rc_t
573_nscd_cfg_get_handle(
574	char			*param_name,
575	char			*nswdb_name,
576	nscd_cfg_handle_t	**handle,
577	nscd_cfg_error_t	**errorp);
578
579nscd_cfg_error_t *
580_nscd_cfg_make_error(
581	nscd_rc_t		rc,
582	char			*msg);
583
584void
585_nscd_cfg_free_handle(
586	nscd_cfg_handle_t	*handle);
587
588void
589_nscd_cfg_free_group_data(
590	nscd_cfg_handle_t	*handle,
591	void			*data);
592
593void
594_nscd_cfg_free_param_data(
595	void			*data);
596
597void
598_nscd_cfg_free_error(
599	nscd_cfg_error_t	*error);
600
601nscd_rc_t
602_nscd_cfg_get(
603	nscd_cfg_handle_t	*handle,
604	void			**data,
605	int			*data_len,
606	nscd_cfg_error_t	**errorp);
607
608nscd_rc_t
609_nscd_cfg_set(
610	nscd_cfg_handle_t	*handle,
611	void			*data,
612	nscd_cfg_error_t	**errorp);
613
614nscd_rc_t
615_nscd_cfg_str_to_data(
616	nscd_cfg_param_desc_t	*desc,
617	char			*str,
618	void			*data,
619	void			**data_p,
620	nscd_cfg_error_t	**errorp);
621
622nscd_rc_t
623_nscd_cfg_prelim_check(
624	nscd_cfg_param_desc_t	*desc,
625	void			*data,
626	nscd_cfg_error_t	**errorp);
627
628nscd_rc_t
629_nscd_cfg_read_file(
630	char			*filename,
631	nscd_cfg_error_t	**errorp);
632
633nscd_rc_t
634_nscd_cfg_set_linked(
635	nscd_cfg_handle_t	*handle,
636	void			*data,
637	nscd_cfg_error_t	**errorp);
638
639char *
640_nscd_srcs_in_db_nsw_policy(
641	int			num_src,
642	char			**srcs);
643
644nscd_rc_t
645_nscd_cfg_read_nsswitch_file(
646	char			*filename,
647	nscd_cfg_error_t	**errorp);
648
649#ifdef	__cplusplus
650}
651#endif
652
653#endif	/* _NSCD_CONFIG_H */
654