00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _CFG_CTX_H
00028 #define _CFG_CTX_H
00029
00030 #include "../str.h"
00031 #include "../locking.h"
00032 #include "cfg.h"
00033 #include "cfg_struct.h"
00034
00035
00036
00037 union cfg_var_value{
00038 void* vp;
00039 long vlong;
00040 int vint;
00041 str vstr;
00042 unsigned char vraw[1];
00043 };
00044
00045
00047 typedef struct _cfg_changed_var {
00048 cfg_group_t *group;
00049 cfg_mapping_t *var;
00050 struct _cfg_changed_var *next;
00051
00052 unsigned int group_id;
00053 unsigned char group_id_set;
00054 unsigned char del_value;
00055
00056
00057 union cfg_var_value new_val;
00058 } cfg_changed_var_t;
00059
00061 typedef void (*cfg_on_declare)(str *, cfg_def_t *);
00062
00064 typedef struct _cfg_ctx {
00065
00066
00067 cfg_changed_var_t *changed_first;
00068
00069
00070 gen_lock_t lock;
00071
00072
00073
00074 cfg_on_declare on_declare_cb;
00075
00076 struct _cfg_ctx *next;
00077 } cfg_ctx_t;
00078
00079 #define CFG_CTX_LOCK(ctx) lock_get(&(ctx)->lock)
00080 #define CFG_CTX_UNLOCK(ctx) lock_release(&(ctx)->lock)
00081
00084 int cfg_register_ctx(cfg_ctx_t **handle, cfg_on_declare on_declare_cb);
00085
00087 void cfg_ctx_destroy(void);
00088
00090 int cfg_set_now(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00091 void *val, unsigned int val_type);
00092 int cfg_set_now_int(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00093 int val);
00094 int cfg_set_now_string(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00095 char *val);
00096 int cfg_set_now_str(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00097 str *val);
00098
00101 int cfg_del_now(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name);
00102
00103
00104 int cfg_set_delayed(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00105 void *val, unsigned int val_type);
00106 int cfg_set_delayed_int(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00107 int val);
00108 int cfg_set_delayed_string(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00109 char *val);
00110 int cfg_set_delayed_str(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00111 str *val);
00112
00115 int cfg_del_delayed(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name);
00116
00118 int cfg_commit(cfg_ctx_t *ctx);
00119
00121 int cfg_rollback(cfg_ctx_t *ctx);
00122
00124 int cfg_get_by_name(cfg_ctx_t *ctx, str *group_name, unsigned int *group_id, str *var_name,
00125 void **val, unsigned int *val_type);
00126
00128 int cfg_help(cfg_ctx_t *ctx, str *group_name, str *var_name,
00129 char **ch, unsigned int *input_type);
00130
00132 void cfg_notify_drivers(char *group_name, int group_name_len, cfg_def_t *def);
00133
00136 int convert_val(unsigned int val_type, void *val,
00137 unsigned int var_type, void **new_val);
00138
00140 void convert_val_cleanup(void);
00141
00143 #define cfg_get_group_init(handle) \
00144 (*(handle)) = (void *)cfg_group
00145
00161 int cfg_get_group_next(void **h,
00162 str *gname, cfg_def_t **def);
00163
00168 int cfg_diff_init(cfg_ctx_t *ctx,
00169 void **h);
00170
00196 int cfg_diff_next(void **h,
00197 str *gname, unsigned int **gid, str *vname,
00198 void **old_val, void **new_val,
00199 unsigned int *val_type);
00200
00202 void cfg_diff_release(cfg_ctx_t *ctx);
00203
00204
00205 int cfg_add_group_inst(cfg_ctx_t *ctx, str *group_name, unsigned int group_id);
00206
00207
00208 int cfg_del_group_inst(cfg_ctx_t *ctx, str *group_name, unsigned int group_id);
00209
00210
00211
00212
00213
00214
00215 int cfg_group_inst_exists(cfg_ctx_t *ctx, str *group_name, unsigned int group_id);
00216
00217
00218
00219
00220
00221 int cfg_apply_list(cfg_group_inst_t *ginst, cfg_group_t *group,
00222 unsigned int group_id, cfg_add_var_t **add_var_p);
00223
00224 #endif