all: updated FSF address in GPL text
[sip-router] / cfg / cfg.h
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2007 iptelorg GmbH
5  *
6  * This file is part of SIP-router, a free SIP server.
7  *
8  * SIP-router is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * SIP-router is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  * History
23  * -------
24  *  2007-12-03  Initial version (Miklos)
25  */
26
27 #ifndef _CFG_H
28 #define _CFG_H
29
30 #include "../str.h"
31
32 /* variable type */
33 #define CFG_VAR_UNSET           0U
34 #define CFG_VAR_INT             1U
35 #define CFG_VAR_STRING          2U
36 #define CFG_VAR_STR             3U
37 #define CFG_VAR_POINTER         4U
38
39 /*! \brief number of bits required for the variable type */
40 #define CFG_INPUT_SHIFT         3
41
42 /*! \brief input types */
43 #define CFG_INPUT_INT           (CFG_VAR_INT << CFG_INPUT_SHIFT)
44 #define CFG_INPUT_STRING        (CFG_VAR_STRING << CFG_INPUT_SHIFT)
45 #define CFG_INPUT_STR           (CFG_VAR_STR << CFG_INPUT_SHIFT)
46
47 #define CFG_VAR_MASK(x)         ((x)&((1U<<CFG_INPUT_SHIFT)-1))
48 #define CFG_INPUT_MASK(x)       ((x)&((1U<<(2*CFG_INPUT_SHIFT))-(1U<<CFG_INPUT_SHIFT)))
49
50 #define CFG_ATOMIC              (1U<<(2*CFG_INPUT_SHIFT))       /*!< atomic change is allowed */
51 #define CFG_READONLY            (1U<<(2*CFG_INPUT_SHIFT+1))     /*!< variable is read-only */
52 #define CFG_CB_ONLY_ONCE        (1U<<(2*CFG_INPUT_SHIFT+2))     /*!< per-child process callback needs to be called only once */
53
54 typedef int (*cfg_on_change)(void *, str *, str *, void **);
55 typedef void (*cfg_on_set_child)(str *, str *);
56
57 /*! \brief structrure to be used by the module interface */
58 typedef struct _cfg_def {
59         char    *name;
60         unsigned int    type;
61         int     min;
62         int     max;
63         cfg_on_change           on_change_cb;
64         cfg_on_set_child        on_set_child_cb;
65         char    *descr;
66 } cfg_def_t;
67
68 /*! \brief declares a new cfg group
69  * handler is set to the memory area where the variables are stored
70  * return value is -1 on error
71  */
72 int cfg_declare(char *group_name, cfg_def_t *def, void *values, int def_size,
73                         void **handler);
74
75 #define cfg_sizeof(gname) \
76         sizeof(struct cfg_group_##gname)
77
78 #define cfg_get(gname, handle, var) \
79         ((struct cfg_group_##gname *)handle)->var
80
81 /*! \brief declares a single variable with integer type */
82 int cfg_declare_int(char *group_name, char *var_name,
83                 int val, int min, int max, char *descr);
84
85 /*! \brief declares a single variable with str type */
86 int cfg_declare_str(char *group_name, char *var_name, char *val, char *descr);
87
88 /*! \brief Add a variable to a group instance with integer type.
89  * The group instance is created if it does not exist.
90  * wrapper function for new_add_var()
91  */
92 int cfg_ginst_var_int(char *group_name, unsigned int group_id, char *var_name,
93                         int val);
94
95 /*! \brief Add a variable to a group instance with string type.
96  * The group instance is created if it does not exist.
97  * wrapper function for new_add_var()
98  */
99 int cfg_ginst_var_string(char *group_name, unsigned int group_id, char *var_name,
100                         char *val);
101
102 /*! \brief Create a new group instance.
103  * wrapper function for new_add_var()
104  */
105 int cfg_new_ginst(char *group_name, unsigned int group_id);
106
107 /*! \brief returns the handle of a cfg group */
108 void **cfg_get_handle(char *gname);
109
110 #endif /* _CFG_H */