]> mj.ucw.cz Git - libucw.git/blob - ucw/conf-internal.h
Released as 6.5.16.
[libucw.git] / ucw / conf-internal.h
1 /*
2  *      UCW Library -- Configuration files: only for internal use of conf-*.c
3  *
4  *      (c) 2001--2006 Robert Spalek <robert@ucw.cz>
5  *      (c) 2003--2012 Martin Mares <mj@ucw.cz>
6  *      (c) 2014 Pavel Charvat <pchar@ucw.cz>
7  *
8  *      This software may be freely distributed and used according to the terms
9  *      of the GNU Lesser General Public License.
10  */
11
12 #ifndef _UCW_CONF_INTERNAL_H
13 #define _UCW_CONF_INTERNAL_H
14
15 #include <ucw/threads.h>
16
17 #ifdef CONFIG_UCW_CLEAN_ABI
18 #define cf_add_dirty ucw_cf_add_dirty
19 #define cf_commit_all ucw_cf_commit_all
20 #define cf_done_stack ucw_cf_done_stack
21 #define cf_find_subitem ucw_cf_find_subitem
22 #define cf_init_stack ucw_cf_init_stack
23 #define cf_interpret_line ucw_cf_interpret_line
24 #define cf_journal_delete ucw_cf_journal_delete
25 #define cf_journal_swap ucw_cf_journal_swap
26 #define cf_load_default ucw_cf_load_default
27 #define cf_obtain_context ucw_cf_obtain_context
28 #define cf_op_names ucw_cf_op_names
29 #define cf_sections ucw_cf_sections
30 #define cf_type_names ucw_cf_type_names
31 #define cf_type_size ucw_cf_type_size
32 #endif
33
34 /* Item stack used by conf-intr.c */
35
36 #define MAX_STACK_SIZE 16
37
38 struct item_stack {             // used by conf-intr.c
39   struct cf_section *sec;       // nested section
40   void *base_ptr;               // because original pointers are often relative
41   int op;                       // it is performed when a closing brace is encountered
42   void *list;                   // list the operations should be done on
43   u32 mask;                     // bit array of selectors searching in a list
44   struct cf_item *item;         // cf_item of the list
45 };
46
47 /* List of dirty sections used by conf-section.c */
48
49 struct dirty_section {
50   struct cf_section *sec;
51   void *ptr;
52 };
53
54 #define GBUF_TYPE       struct dirty_section
55 #define GBUF_PREFIX(x)  dirtsec_##x
56 #include <ucw/gbuf.h>
57
58 /* Configuration context */
59
60 struct cf_context {
61   struct mempool *pool;
62   int is_active;
63   int config_loaded;                    // at least one config file was loaded
64   struct cf_parser_state *parser;
65   uint everything_committed;            // did we already commit each section?
66   uint postpone_commit;                 // counter of calls to cf_open_group()
67   uint other_options;                   // used internally by cf_getopt()
68   clist conf_entries;                   // files/strings to reload
69   struct cf_journal_item *journal;      // journalling
70   int enable_journal;
71   struct old_pools *pools;
72   struct item_stack stack[MAX_STACK_SIZE];      // interpreter stack
73   uint stack_level;
74   struct cf_section sections;           // root section
75   uint sections_initialized;
76   dirtsec_t dirty;                      // dirty sections
77   uint dirties;
78 };
79
80 /* conf-ctxt.c */
81 static inline struct cf_context *cf_get_context(void)
82 {
83   struct cf_context *cc = ucwlib_thread_context()->cf_context;
84   ASSERT(cc->is_active);
85   return cc;
86 }
87
88 // In fact, this is equivalent to cf_get_context(), but it is not inlined,
89 // because we want to force the linker to include conf-context.c, which contains
90 // a constructor of the whole context mechanism.
91 struct cf_context *cf_obtain_context(void);
92
93 /* conf-intr.c */
94 #define OP_MASK 0xff            // only get the operation
95 #define OP_OPEN 0x100           // here we only get an opening brace instead of parameters
96 #define OP_1ST 0x200            // in the 1st phase selectors are recorded into the mask
97 #define OP_2ND 0x400            // in the 2nd phase real data are entered
98 enum cf_operation;
99 extern char *cf_op_names[];
100 extern char *cf_type_names[];
101
102 uint cf_type_size(enum cf_type type, const union cf_union *u);
103 char *cf_interpret_line(struct cf_context *cc, char *name, enum cf_operation op, int number, char **pars);
104 void cf_init_stack(struct cf_context *cc);
105 int cf_done_stack(struct cf_context *cc);
106
107 /* conf-journal.c */
108 void cf_journal_swap(void);
109 void cf_journal_delete(void);
110
111 /* conf-section.c */
112 #define SEC_FLAG_DYNAMIC        0x80000000      // contains a dynamic attribute
113 #define SEC_FLAG_UNKNOWN        0x40000000      // ignore unknown entriies
114 #define SEC_FLAG_CANT_COPY      0x20000000      // contains lists or parsers
115 #define SEC_FLAG_NUMBER         0x0fffffff      // number of entries
116 enum cf_commit_mode { CF_NO_COMMIT, CF_COMMIT, CF_COMMIT_ALL };
117 extern struct cf_section cf_sections;
118
119 struct cf_item *cf_find_subitem(struct cf_section *sec, const char *name);
120 int cf_commit_all(enum cf_commit_mode cm);
121 void cf_add_dirty(struct cf_section *sec, void *ptr);
122
123 /* conf-getopt.c */
124 void cf_load_default(struct cf_context *cc);
125
126 #endif