7857 zfs/zpool commands print scary errors after 7741
[unleashed.git] / usr / src / cmd / nscd / nscd_config.h
blobd2c7135e4023cbbfdf9d03962aad88e4ca4b251a
1 /*
2 * CDDL HEADER START
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]
19 * CDDL HEADER END
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"
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
35 #include <stdio.h>
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.
45 typedef struct {
46 int index;
47 char *name;
48 } nscd_cfg_id_t;
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
66 * below)
68 typedef struct {
69 int num;
70 nscd_cfg_id_t **list;
71 } nscd_cfg_list_t;
74 * type of configuration list
76 typedef 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;
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.
91 typedef struct {
92 nscd_cfg_id_t *nswdb;
93 void *desc;
94 nscd_cfg_list_type_t type;
95 } nscd_cfg_handle_t;
98 * type of configuration/statistics data
100 typedef 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
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
126 * requested by users
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
139 * description
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
146 * description
148 #define NSCD_CFG_DFLAG_NOTIFY 0x0010
151 * the data sent/received is to be applied to all
152 * nsswitch databases
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
160 * processed
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
239 typedef struct {
240 nscd_rc_t rc;
241 char *msg;
242 } nscd_cfg_error_t;
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 *,
265 nscd_cfg_id_t *,
266 nscd_cfg_flag_t,
267 nscd_cfg_error_t **,
268 void *);
269 typedef nscd_rc_t (*nscd_cfg_func_verify_t)(void *,
270 struct nscd_cfg_param_desc *,
271 nscd_cfg_id_t *,
272 nscd_cfg_flag_t,
273 nscd_cfg_error_t **,
274 void **);
275 typedef struct nscd_cfg_param_desc {
276 nscd_cfg_id_t id;
277 nscd_cfg_data_type_t type;
278 nscd_cfg_flag_t pflag;
279 int p_size;
280 size_t p_offset;
281 int p_fn;
282 int g_size;
283 size_t g_offset;
284 int g_index;
285 void *p_check;
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
293 * run time
295 typedef struct {
296 int num;
297 nscd_cfg_param_desc_t **list;
298 } nscd_cfg_param_desc_list_t;
300 /* this describes data of variable length */
301 typedef struct {
302 void *ptr;
303 int len;
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.
314 typedef 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}
321 * frontend param group (Per nsswitch database)
323 #define NSCD_CFG_GROUP_INFO_FRONTEND {1, 0x0001}
324 typedef struct {
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}
333 typedef 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;
345 * log/debug param group (global)
347 #define NSCD_CFG_GROUP_INFO_GLOBAL_LOG {3, 0x0007}
348 typedef 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;
356 * frontend param group (global)
358 #define NSCD_CFG_GROUP_INFO_GLOBAL_FRONTEND {2, 0x0003}
359 typedef struct {
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}
369 typedef struct {
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}
379 typedef struct {
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)
413 * f: flag, v: value
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 *) \
422 (ma) = (m))
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))
433 * handy macros
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 ? \
440 "yes" : "no")
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
465 * not set in dflag.
467 struct nscd_cfg_stat_desc;
468 typedef nscd_rc_t (*nscd_cfg_func_get_stat_t)(void **,
469 struct nscd_cfg_stat_desc *,
470 nscd_cfg_id_t *,
471 nscd_cfg_flag_t *,
472 void (**) (void *),
473 nscd_cfg_error_t **);
474 typedef struct nscd_cfg_stat_desc {
475 nscd_cfg_id_t id;
476 nscd_cfg_data_type_t type;
477 nscd_cfg_flag_t sflag;
478 nscd_cfg_group_info_t gi;
479 int s_size;
480 size_t s_offset;
481 int s_fn;
482 int g_size;
483 size_t g_offset;
484 int g_index;
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}
517 typedef struct {
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}
531 typedef struct {
532 nscd_cfg_group_info_t gi;
533 int entries_logged;
534 } nscd_cfg_stat_global_log_t;
537 * switch engine stat group (global)
539 #define NSCD_CFG_STAT_GROUP_INFO_GLOBAL_SWITCH {6, 0x003f}
540 typedef struct {
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
553 typedef struct {
554 char *buf;
555 char *next;
556 int size;
557 int used;
558 int left;
559 int real;
560 } nscd_cfg_buf_t;
563 * internal configuration management related functions
565 nscd_rc_t _nscd_cfg_init();
567 nscd_rc_t
568 _nscd_cfg_get_param_desc_list(
569 nscd_cfg_param_desc_list_t **list);
571 nscd_rc_t
572 _nscd_cfg_get_handle(
573 char *param_name,
574 char *nswdb_name,
575 nscd_cfg_handle_t **handle,
576 nscd_cfg_error_t **errorp);
578 nscd_cfg_error_t *
579 _nscd_cfg_make_error(
580 nscd_rc_t rc,
581 char *msg);
583 void
584 _nscd_cfg_free_handle(
585 nscd_cfg_handle_t *handle);
587 void
588 _nscd_cfg_free_group_data(
589 nscd_cfg_handle_t *handle,
590 void *data);
592 void
593 _nscd_cfg_free_param_data(
594 void *data);
596 void
597 _nscd_cfg_free_error(
598 nscd_cfg_error_t *error);
600 nscd_rc_t
601 _nscd_cfg_get(
602 nscd_cfg_handle_t *handle,
603 void **data,
604 int *data_len,
605 nscd_cfg_error_t **errorp);
607 nscd_rc_t
608 _nscd_cfg_set(
609 nscd_cfg_handle_t *handle,
610 void *data,
611 nscd_cfg_error_t **errorp);
613 nscd_rc_t
614 _nscd_cfg_str_to_data(
615 nscd_cfg_param_desc_t *desc,
616 char *str,
617 void *data,
618 void **data_p,
619 nscd_cfg_error_t **errorp);
621 nscd_rc_t
622 _nscd_cfg_prelim_check(
623 nscd_cfg_param_desc_t *desc,
624 void *data,
625 nscd_cfg_error_t **errorp);
627 nscd_rc_t
628 _nscd_cfg_read_file(
629 char *filename,
630 nscd_cfg_error_t **errorp);
632 nscd_rc_t
633 _nscd_cfg_set_linked(
634 nscd_cfg_handle_t *handle,
635 void *data,
636 nscd_cfg_error_t **errorp);
638 char *
639 _nscd_srcs_in_db_nsw_policy(
640 int num_src,
641 char **srcs);
643 nscd_rc_t
644 _nscd_cfg_read_nsswitch_file(
645 char *filename,
646 nscd_cfg_error_t **errorp);
648 #ifdef __cplusplus
650 #endif
652 #endif /* _NSCD_CONFIG_H */