]> mj.ucw.cz Git - libucw.git/blob - ucw/getopt.h
eb350012374f198bc2e50eeb2439a1e2cafc7cc4
[libucw.git] / ucw / getopt.h
1 /*
2  *      UCW Library -- Parsing of configuration and command-line options
3  *
4  *      (c) 2001--2006 Robert Spalek <robert@ucw.cz>
5  *      (c) 2003--2006 Martin Mares <mj@ucw.cz>
6  *
7  *      This software may be freely distributed and used according to the terms
8  *      of the GNU Lesser General Public License.
9  */
10
11 #ifndef _UCW_GETOPT_H
12 #define _UCW_GETOPT_H
13
14 #ifdef CONFIG_OWN_GETOPT
15 #include "ucw/getopt/getopt-sh.h"
16 #else
17 #include <getopt.h>
18 #endif
19
20 void reset_getopt(void);        /** If you want to start parsing of the arguments from the first one again. **/
21
22 /***
23  * [[conf_load]]
24  * Safe configuration loading
25  * ~~~~~~~~~~~~~~~~~~~~~~~~~~
26  *
27  * These functions can be used to to safely load or reload configuration.
28  */
29
30 /**
31  * The default config (as set by `CONFIG_UCW_DEFAULT_CONFIG`) or NULL if already loaded.
32  * You can set it to something else manually.
33  */
34 extern char *cf_def_file;
35 /**
36  * Name of environment variable that can override what configuration is loaded.
37  * Defaults to `CONFIG_UCW_ENV_VAR_CONFIG`.
38  **/
39 extern char *cf_env_file;
40 int cf_reload(const char *file);        /** Reload configuration from @file, replace the old one. **/
41 int cf_load(const char *file);          /** Load configuration from @file. If @file is NULL, reload all loaded configuration files. **/
42 /**
43  * Parse some part of configuration passed in @string.
44  * The syntax is the same as in the <<config:,configuration file>>.
45  **/
46 int cf_set(const char *string);
47
48 /***
49  * [[conf_direct]]
50  * Direct access
51  * ~~~~~~~~~~~~~
52  *
53  * Direct access to configuration items.
54  * You probably should not need this.
55  ***/
56
57 /**
58  * List of operations used on items.
59  * This macro is used to generate internal source code,
60  * but you may be interested in the list of operations it creates.
61  *
62  * Each operation corresponds to the same-named operation
63  * described in <<config:operations,configuration syntax>>.
64  **/
65 #define CF_OPERATIONS T(CLOSE) T(SET) T(CLEAR) T(ALL) \
66   T(APPEND) T(PREPEND) T(REMOVE) T(EDIT) T(AFTER) T(BEFORE) T(COPY) T(RESET)
67   /* Closing brace finishes previous block.
68    * Basic attributes (static, dynamic, parsed) can be used with SET.
69    * Dynamic arrays can be used with SET, APPEND, PREPEND.
70    * Sections can be used with SET.
71    * Lists can be used with everything. */
72 #define T(x) OP_##x,
73 enum cf_operation { CF_OPERATIONS };    /** Allowed operations on items. See <<def_CF_OPERATIONS,`CF_OPERATIONS`>> for list (they have an `OP_` prefix -- it means you use `OP_SET` instead of just `SET`). **/
74 #undef T
75
76 struct cf_item;
77 /**
78  * Searches for a configuration item called @name.
79  * If it is found, it is copied into @item and NULL is returned.
80  * Otherwise, an error is returned and @item is zeroed.
81  **/
82 char *cf_find_item(const char *name, struct cf_item *item);
83 /**
84  * Performs a single operation on a given item.
85  **/
86 char *cf_modify_item(struct cf_item *item, enum cf_operation op, int number, char **pars);
87
88 /***
89  * [[conf_dump]]
90  * Debug dumping
91  * ~~~~~~~~~~~~~
92  ***/
93
94 struct fastbuf;
95 /**
96  * Take everything and write it into @fb.
97  **/
98 void cf_dump_sections(struct fastbuf *fb);
99
100 /***
101  * [[conf_journal]]
102  * Journaling control
103  * ~~~~~~~~~~~~~~~~~~
104  *
105  * The configuration system uses journaling to safely reload
106  * configuration. It begins a transaction and tries to load the
107  * configuration. If it fails, it restores the original state.
108  *
109  * The behaviour of journal is described in <<reload,reloading configuration>>.
110  ***/
111
112 struct cf_journal_item;         /** Opaque identifier of the journal state. **/
113 /**
114  * Starts a new transaction. It returns the current state so you can
115  * get back to it. The @new_pool parameter tells if a new memory pool
116  * should be created and used from now.
117  **/
118 struct cf_journal_item *cf_journal_new_transaction(uns new_pool);
119 /**
120  * Marks current state as a complete transaction. The @new_pool
121  * parameter tells if the transaction was created with new memory pool
122  * (the parameter must be the same as the one with
123  * @cf_journal_new_transaction() was called with). The @oldj parameter
124  * is the journal state returned from last
125  * @cf_journal_new_transaction() call.
126  **/
127 void cf_journal_commit_transaction(uns new_pool, struct cf_journal_item *oldj);
128 /**
129  * Returns to an old journal state, reverting anything the current
130  * transaction did. The @new_pool parameter must be the same as the
131  * one you used when you created the transaction. The @oldj parameter
132  * is the journal state you got from @cf_journal_new_transaction() --
133  * it is the state to return to.
134  **/
135 void cf_journal_rollback_transaction(uns new_pool, struct cf_journal_item *oldj);
136
137 /***
138  * [[conf_getopt]]
139  * Loading by @cf_getopt()
140  * ~~~~~~~~~~~~~~~~~~~~~~~
141  ***/
142
143 /**
144  * Short options for loading configuration by @cf_getopt().
145  * Prepend to your own options.
146  **/
147 #define CF_SHORT_OPTS   "C:S:"
148 /**
149  * Long options for loading configuration by @cf_getopt().
150  * Prepend to your own options.
151  **/
152 #define CF_LONG_OPTS    {"config",      1, 0, 'C'}, {"set",             1, 0, 'S'}, CF_LONG_OPTS_DEBUG
153 /**
154  * Use this constant as @long_opts parameter of @cf_getopt() if you do
155  * not have any long options in your program.
156  **/
157 #define CF_NO_LONG_OPTS (const struct option []) { CF_LONG_OPTS { NULL, 0, 0, 0 } }
158 #ifndef CF_USAGE_TAB
159 #define CF_USAGE_TAB ""
160 #endif
161 /**
162  * This macro provides text describing usage of the configuration
163  * loading options. Concatenate with description of your options and
164  * write to the user, if he/she provides invalid options.
165  **/
166 #define CF_USAGE        \
167 "-C, --config filename\t" CF_USAGE_TAB "Override the default configuration file\n\
168 -S, --set sec.item=val\t" CF_USAGE_TAB "Manual setting of a configuration item\n" CF_USAGE_DEBUG
169
170 #ifdef CONFIG_DEBUG
171 #define CF_LONG_OPTS_DEBUG { "dumpconfig", 0, 0, 0x64436667 } ,
172 #define CF_USAGE_DEBUG "    --dumpconfig\t" CF_USAGE_TAB "Dump program configuration\n"
173 #else
174 #define CF_LONG_OPTS_DEBUG
175 #define CF_USAGE_DEBUG
176 #endif
177
178 /**
179  * Takes care of parsing the command-line arguments, loading the
180  * default configuration file (<<var_cf_def_file,`cf_def_file`>>) and processing
181  * configuration options. The calling convention is the same as with GNU getopt_long(),
182  * but you must prefix your own short/long options by the
183  * <<def_CF_LONG_OPTS,`CF_LONG_OPTS`>> or <<def_CF_SHORT_OPTS,`CF_SHORT_OPTS`>> or
184  * pass <<def_CF_NO_LONG_OPTS,`CF_NO_LONG_OPTS`>> if there are no long options.
185  *
186  * The default configuration file can be overwritten by the --config options,
187  * which must come first. During parsing of all other options, the configuration
188  * is already available.
189  **/
190 int cf_getopt(int argc, char * const argv[], const char *short_opts, const struct option *long_opts, int *long_index);
191
192 #endif