2 * UCW Library -- Interface between command-line options and configuration
4 * (c) 2013 Jan Moskyto Matejka <mq@ucw.cz>
5 * (c) 2014 Martin Mares <mj@ucw.cz>
7 * This software may be freely distributed and used according to the terms
8 * of the GNU Lesser General Public License.
13 #include <ucw/opt-internal.h>
15 #include <ucw/conf-internal.h>
16 #include <ucw/fastbuf.h>
21 static void opt_conf_end_of_options(struct cf_context *cc) {
23 if (cc->postpone_commit && cf_close_group())
24 opt_failure("Loading of configuration failed");
27 static void opt_conf_check(struct opt_context *oc)
29 switch (oc->conf_state) {
30 case OPT_CONF_HOOK_BEGIN:
31 oc->conf_state = OPT_CONF_HOOK_CONFIG;
33 case OPT_CONF_HOOK_CONFIG:
35 case OPT_CONF_HOOK_OTHERS:
36 opt_failure("Config options must stand before other options.");
43 void opt_handle_config(const struct opt_item * opt UNUSED, const char * value, void * data)
47 exit(1); // Error message is already printed by cf_load()
50 void opt_handle_set(const struct opt_item * opt UNUSED, const char * value, void * data)
53 struct cf_context *cc = cf_get_context();
56 opt_failure("Cannot set %s", value);
59 void opt_handle_dumpconfig(const struct opt_item * opt UNUSED, const char * value UNUSED, void * data UNUSED)
61 struct cf_context *cc = cf_get_context();
62 opt_conf_end_of_options(cc);
63 struct fastbuf *b = bfdopen(1, 4096);
69 void opt_conf_hook_internal(const struct opt_item * opt, uint event, const char * value UNUSED, void * data) {
70 struct opt_context *oc = data;
71 struct cf_context *cc = cf_get_context();
73 if (event == OPT_HOOK_FINAL) {
74 opt_conf_end_of_options(cc);
78 ASSERT(event == OPT_HOOK_BEFORE_VALUE);
80 if (opt->flags & OPT_BEFORE_CONFIG)
83 switch (oc->conf_state) {
84 case OPT_CONF_HOOK_BEGIN:
85 case OPT_CONF_HOOK_CONFIG:
86 opt_conf_end_of_options(cc);
87 oc->conf_state = OPT_CONF_HOOK_OTHERS;
89 case OPT_CONF_HOOK_OTHERS: