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.
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.
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]
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _NSCD_CONFIG_H
27 #define _NSCD_CONFIG_H
29 #pragma ident "%Z%%M% %I% %E% SMI"
36 #include "nscd_common.h"
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.
51 * forward declaration of nscd_cfg_param_desc_t
53 struct nscd_cfg_param_desc
;
56 * for operations that apply to configuration data
57 * in all the nsswitch databases
59 #define NSCD_CFG_NSW_ALLDB "ALLDB"
60 #define NSCD_CFG_NSW_ALLDB_INDEX 9999
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
74 * type of configuration list
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
;
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
94 nscd_cfg_list_type_t type
;
98 * type of configuration/statistics data
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
111 * data flag is attached to config/stat data passed between
112 * function to specify the nature/type of action to perform
115 #define NSCD_CFG_DFLAG_NONE 0x0000
118 * data should not be freed by receiver;
119 * otherwise it should be freed
121 #define NSCD_CFG_DFLAG_STATIC_DATA 0x0001
124 * data is sent/received due to nscd initialization;
125 * otherwise due to modification of the config data
128 #define NSCD_CFG_DFLAG_INIT 0x0002
131 * the entire group of data is, or should be, sent;
132 * otherwise only a single parameter/stat value
134 #define NSCD_CFG_DFLAG_GROUP 0x0004
137 * the data sent/received is to be verified by the
138 * 'verify' function defined in the parameter
141 #define NSCD_CFG_DFLAG_VERIFY 0x0008
144 * the data sent/received is to be processed by the
145 * 'notify' function defined in the parameter
148 #define NSCD_CFG_DFLAG_NOTIFY 0x0010
151 * the data sent/received is to be applied to all
154 #define NSCD_CFG_DFLAG_SET_ALL_DB 0x0020
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
162 #define NSCD_CFG_DFLAG_BIT_SELECTED 0x0040
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.
170 #define NSCD_CFG_PFLAG_NONE 0x0000
173 * At init/refresh time, send the parameter value
174 * with the data of the entire group; otherwise
175 * send the parameter value only
177 #define NSCD_CFG_PFLAG_INIT_SEND_WHOLE_GROUP 0x0001
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
184 #define NSCD_CFG_PFLAG_UPDATE_SEND_WHOLE_GROUP 0x0002
187 * At init/refresh time, send the config data
188 * once for each nsswitch database
190 #define NSCD_CFG_PFLAG_INIT_SET_ALL_DB 0x0004
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)
197 #define NSCD_CFG_PFLAG_UPDATE_SEND_NON_GLOBAL_ONCE 0x0008
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
204 #define NSCD_CFG_PFLAG_SEND_BIT_SELECTED 0x0010
207 * data is global, not per nsswitch database
209 #define NSCD_CFG_PFLAG_GLOBAL 0x0020
212 * data is group data, not individual parameter value
214 #define NSCD_CFG_PFLAG_GROUP 0x0040
217 * data is of variable length
219 #define NSCD_CFG_PFLAG_VLEN_DATA 0x0080
222 * data is hidden, for internal use only, get/set not allowed
224 #define NSCD_CFG_PFLAG_HIDDEN 0x0100
227 * data is linked, using the value of a different database
229 #define NSCD_CFG_PFLAG_LINKED 0x0200
232 * data is obsolete, ignored with warning, should not be displayed
234 #define NSCD_CFG_PFLAG_OBSOLETE 0x0400
237 * structure for error reporting
245 * typedef for flag, bitmap, and boolean
247 typedef int nscd_cfg_flag_t
;
248 typedef int nscd_cfg_bitmap_t
;
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).
263 typedef nscd_rc_t (*nscd_cfg_func_notify_t
)(void *,
264 struct nscd_cfg_param_desc
*,
269 typedef nscd_rc_t (*nscd_cfg_func_verify_t
)(void *,
270 struct nscd_cfg_param_desc
*,
275 typedef struct nscd_cfg_param_desc
{
277 nscd_cfg_data_type_t type
;
278 nscd_cfg_flag_t pflag
;
286 nscd_cfg_func_notify_t notify
;
287 nscd_cfg_func_verify_t verify
;
288 } nscd_cfg_param_desc_t
;
291 * the _nscd_cfg_get_param_desc_list function returns
292 * the list of nscd config param descriptions at
297 nscd_cfg_param_desc_t
**list
;
298 } nscd_cfg_param_desc_list_t
;
300 /* this describes data of variable length */
304 } nscd_cfg_vlen_data_t
;
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.
316 nscd_cfg_bitmap_t bitmap
;
317 } nscd_cfg_group_info_t
;
318 #define NSCD_CFG_GROUP_INFO_NULL {-1, 0x0000}
321 * frontend param group (Per nsswitch database)
323 #define NSCD_CFG_GROUP_INFO_FRONTEND {1, 0x0001}
325 nscd_cfg_group_info_t gi
;
326 int worker_thread_per_nsw_db
;
327 } nscd_cfg_frontend_t
;
330 * switch engine param group (Per nsswitch database)
332 #define NSCD_CFG_GROUP_INFO_SWITCH {7, 0x07f}
334 nscd_cfg_group_info_t gi
;
335 char *nsw_config_string
;
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
;
345 * log/debug param group (global)
347 #define NSCD_CFG_GROUP_INFO_GLOBAL_LOG {3, 0x0007}
349 nscd_cfg_group_info_t gi
;
353 } nscd_cfg_global_log_t
;
356 * frontend param group (global)
358 #define NSCD_CFG_GROUP_INFO_GLOBAL_FRONTEND {2, 0x0003}
360 nscd_cfg_group_info_t gi
;
361 int common_worker_threads
;
362 int cache_hit_threads
;
363 } nscd_cfg_global_frontend_t
;
366 * self credential param group (global)
368 #define NSCD_CFG_GROUP_INFO_GLOBAL_SELFCRED {2, 0x0003}
370 nscd_cfg_group_info_t gi
;
371 nscd_bool_t enable_selfcred
;
372 int per_user_nscd_ttl
;
373 } nscd_cfg_global_selfcred_t
;
376 * switch engine param group (global)
378 #define NSCD_CFG_GROUP_INFO_GLOBAL_SWITCH {3, 0x0007}
380 nscd_cfg_group_info_t gi
;
381 nscd_bool_t enable_lookup_g
;
382 nscd_bool_t enable_loopback_checking_g
;
383 int check_smf_state_interval_g
;
384 } nscd_cfg_global_switch_t
;
387 * nscd_cfg_param_desc_t should always have nscd_cfg_id_t
388 * as its first field. _nscd_cfg_get_desc below provides
389 * an way to get to the nscd_cfg_param_desc_t from a
390 * pointer to the static nscd_cfg_id_t returned by the
391 * various_nscd_cfg_* functions
393 #define _nscd_cfg_get_desc_i(id) ((nscd_cfg_param_desc_t *)(id))
395 #define _nscd_cfg_get_desc(h) ((h)->desc)
398 * The various param group structure should always have
399 * nscd_cfg_group_info_t as its first field.
400 * _nscd_cfg_get_gi below provides a generic way to
401 * get to the nscd_cfg_group_info_t from a void pointer
402 * to the various param group structure returned by the
403 * _nscd_cfg_* functions
405 #define _nscd_cfg_get_gi(voidp) ((nscd_cfg_group_info_t *)(voidp))
408 * It is possible in the future, we will need more bits
409 * than those in nscd_cfg_flag_t and nscd_cfg_bitmap_t. To
410 * make it easier to extend, the following macro should be
411 * used to deal with flags and bitmaps.
412 * m, m1, m2, ma: mask, n: nth bit (0 based)
415 #define NSCD_CFG_BITMAP_ZERO 0
416 #define _nscd_cfg_bitmap_is_set(m, n) (((m) >> n) & 1)
417 #define _nscd_cfg_bitmap_is_not_set(m, n) (!(((m) >> n) & 1))
418 #define _nscd_cfg_bitmap_is_equal(m1, m2) ((m1) == (m2))
419 #define _nscd_cfg_bitmap_value(m) (m)
420 #define _nscd_cfg_bitmap_set_nth(m, n) ((m) |= (1 << n))
421 #define _nscd_cfg_bitmap_set(ma, m) (*(nscd_cfg_bitmap_t *) \
423 #define _nscd_cfg_bitmap_valid(m1, m2) (((m1) & ~(m2)) == 0)
425 #define NSCD_CFG_FLAG_ZERO 0
426 #define _nscd_cfg_flag_is_set(f, v) ((f) & (v))
427 #define _nscd_cfg_flag_is_not_set(f, v) (!((f) & (v)))
428 #define _nscd_cfg_flag_value(f) (f)
429 #define _nscd_cfg_flag_set(f, v) ((f) | (v))
430 #define _nscd_cfg_flag_unset(f, v) ((f) & ~(v))
435 #define NSCD_NULL "NULL"
436 #define NSCD_CFG_MAX_ERR_MSG_LEN 1024
437 #define NSCD_STR_OR_NULL(s) ((s) == NULL ? "NULL" : (s))
438 #define NSCD_STR_OR_GLOBAL(s) ((s) == NULL ? "GLOBAL" : (s))
439 #define NSCD_Y_OR_N(s) (*(nscd_bool_t *)s == nscd_true ? \
442 #define NSCD_ERR2MSG(e) (((e) && (e)->msg) ? (e)->msg : "")
446 * This macro is based on offsetof defined in stddef_iso.h,
447 * it gives the size of 'm' in structure 's' without needing
448 * the declaration of a 's' variable (as macro sizeof does)
450 #define NSCD_SIZEOF(s, m) (sizeof (((s *)0)->m))
454 * struct nscd_cfg_stat_desc is used to describe each and every
455 * one of the nscd statistics counters so that they can be
456 * processed generically by the configuration management
457 * component. The component does not keep a separate copy of
458 * all counters, which should be maintained by other nscd
459 * components. The 'get_stat' functions defined in the
460 * stat description are supplied by those components and used
461 * by the config management component to request and print
462 * counters on behave of the users. The free_stat function
463 * returned by those components will also be used to free
464 * the stat data if the NSCD_CFG_DFLAG_STATIC_DATA bit is
467 struct nscd_cfg_stat_desc
;
468 typedef nscd_rc_t (*nscd_cfg_func_get_stat_t
)(void **,
469 struct nscd_cfg_stat_desc
*,
473 nscd_cfg_error_t
**);
474 typedef struct nscd_cfg_stat_desc
{
476 nscd_cfg_data_type_t type
;
477 nscd_cfg_flag_t sflag
;
478 nscd_cfg_group_info_t gi
;
485 nscd_cfg_func_get_stat_t get_stat
;
486 } nscd_cfg_stat_desc_t
;
489 * stat flag is defined in the stat description. It
490 * specifies the nature of the statistics counters.
493 #define NSCD_CFG_SFLAG_NONE 0x0000
496 * statistics counter is global, not per nsswitch database
498 #define NSCD_CFG_SFLAG_GLOBAL 0x0001
501 * description is for counter group, not individual counter
503 #define NSCD_CFG_SFLAG_GROUP 0x0002
506 * The following defines the various global and nsswitch
507 * database specific data structures for all the groups of
508 * statistics counters. Before each one, there lists
509 * the associated group info which contains the number of
510 * counters and the corresponding bitmap.
514 * switch engine stat group (Per nsswitch database)
516 #define NSCD_CFG_STAT_GROUP_INFO_SWITCH {6, 0x003f}
518 nscd_cfg_group_info_t gi
;
519 int lookup_request_received
;
520 int lookup_request_queued
;
521 int lookup_request_in_progress
;
522 int lookup_request_succeeded
;
523 int lookup_request_failed
;
524 int loopback_nsw_db_skipped
;
525 } nscd_cfg_stat_switch_t
;
528 * log/debug stat group (global)
530 #define NSCD_CFG_STAT_GROUP_INFO_GLOBAL_LOG {1, 0x0001}
532 nscd_cfg_group_info_t gi
;
534 } nscd_cfg_stat_global_log_t
;
537 * switch engine stat group (global)
539 #define NSCD_CFG_STAT_GROUP_INFO_GLOBAL_SWITCH {6, 0x003f}
541 nscd_cfg_group_info_t gi
;
542 int lookup_request_received_g
;
543 int lookup_request_queued_g
;
544 int lookup_request_in_progress_g
;
545 int lookup_request_succeeded_g
;
546 int lookup_request_failed_g
;
547 int loopback_nsw_db_skipped_g
;
548 } nscd_cfg_stat_global_switch_t
;
551 * control structure for appending string data to a buffer
563 * internal configuration management related functions
565 nscd_rc_t
_nscd_cfg_init();
568 _nscd_cfg_get_param_desc_list(
569 nscd_cfg_param_desc_list_t
**list
);
572 _nscd_cfg_get_handle(
575 nscd_cfg_handle_t
**handle
,
576 nscd_cfg_error_t
**errorp
);
579 _nscd_cfg_make_error(
584 _nscd_cfg_free_handle(
585 nscd_cfg_handle_t
*handle
);
588 _nscd_cfg_free_group_data(
589 nscd_cfg_handle_t
*handle
,
593 _nscd_cfg_free_param_data(
597 _nscd_cfg_free_error(
598 nscd_cfg_error_t
*error
);
602 nscd_cfg_handle_t
*handle
,
605 nscd_cfg_error_t
**errorp
);
609 nscd_cfg_handle_t
*handle
,
611 nscd_cfg_error_t
**errorp
);
614 _nscd_cfg_str_to_data(
615 nscd_cfg_param_desc_t
*desc
,
619 nscd_cfg_error_t
**errorp
);
622 _nscd_cfg_prelim_check(
623 nscd_cfg_param_desc_t
*desc
,
625 nscd_cfg_error_t
**errorp
);
630 nscd_cfg_error_t
**errorp
);
633 _nscd_cfg_set_linked(
634 nscd_cfg_handle_t
*handle
,
636 nscd_cfg_error_t
**errorp
);
639 _nscd_srcs_in_db_nsw_policy(
644 _nscd_cfg_read_nsswitch_file(
646 nscd_cfg_error_t
**errorp
);
652 #endif /* _NSCD_CONFIG_H */