The conditional commit machinery and grouping of configuration files
have been made independent on the stack and moved to conf-input.c.
Also, stack is now initialized and destroyed in parse_fastbuf(),
so unterminated braces are reported properly, including the name
of the file.
{
load_default(cc);
if (cc->postpone_commit && cf_close_group())
{
load_default(cc);
if (cc->postpone_commit && cf_close_group())
- die("Cannot commit after the initialization");
+ die("Loading of configuration failed");
/* Parsing multiple files */
/* Parsing multiple files */
+static int
+maybe_commit(struct cf_context *cc)
+{
+ if (cf_commit_all(cc->postpone_commit ? CF_NO_COMMIT : cc->everything_committed ? CF_COMMIT : CF_COMMIT_ALL))
+ return 1;
+ if (!cc->postpone_commit)
+ cc->everything_committed = 1;
+ return 0;
+}
+
static char *
parse_fastbuf(struct cf_context *cc, const char *name_fb, struct fastbuf *fb, uns depth)
{
static char *
parse_fastbuf(struct cf_context *cc, const char *name_fb, struct fastbuf *fb, uns depth)
{
p->line = p->line_buf;
*p->line = 0;
p->line = p->line_buf;
*p->line = 0;
+ if (!depth)
+ cf_init_stack(cc);
+
+ char *err = NULL;
while (1)
{
err = split_command(p);
if (err)
goto error;
if (!p->words)
while (1)
{
err = split_command(p);
if (err)
goto error;
if (!p->words)
char *name = p->copy_buf.ptr + p->word_buf.ptr[0];
char *pars[p->words-1];
for (uns i=1; i<p->words; i++)
char *name = p->copy_buf.ptr + p->word_buf.ptr[0];
char *pars[p->words-1];
for (uns i=1; i<p->words; i++)
+
+ if (!depth)
+ {
+ if (cf_done_stack(cc))
+ err = "Unterminated block";
+ else if (maybe_commit(cc))
+ err = "Commit failed";
+ }
+ if (!err)
+ return NULL;
+
error:
if (name_fb)
msg(L_ERROR, "File %s, line %d: %s", name_fb, p->line_num, err);
error:
if (name_fb)
msg(L_ERROR, "File %s, line %d: %s", name_fb, p->line_num, err);
static int
load_file(struct cf_context *cc, const char *file)
{
static int
load_file(struct cf_context *cc, const char *file)
{
struct fastbuf *fb = bopen_try(file, O_RDONLY, 1<<14);
if (!fb) {
struct fastbuf *fb = bopen_try(file, O_RDONLY, 1<<14);
if (!fb) {
- msg(L_ERROR, "Cannot open %s: %m", file);
+ msg(L_ERROR, "Cannot open configuration file %s: %m", file);
return 1;
}
char *err_msg = parse_fastbuf(cc, file, fb, 0);
bclose(fb);
return 1;
}
char *err_msg = parse_fastbuf(cc, file, fb, 0);
bclose(fb);
- return !!err_msg || cf_done_stack(cc);
}
static int
load_string(struct cf_context *cc, const char *string)
{
}
static int
load_string(struct cf_context *cc, const char *string)
{
struct fastbuf fb;
fbbuf_init_read(&fb, (byte *)string, strlen(string), 0);
char *msg = parse_fastbuf(cc, NULL, &fb, 0);
struct fastbuf fb;
fbbuf_init_read(&fb, (byte *)string, strlen(string), 0);
char *msg = parse_fastbuf(cc, NULL, &fb, 0);
- return !!msg || cf_done_stack(cc);
}
/* Safe loading and reloading */
}
/* Safe loading and reloading */
cf_journal_swap();
cf_journal_delete();
}
cf_journal_swap();
cf_journal_delete();
}
+
+void
+cf_open_group(void)
+{
+ struct cf_context *cc = cf_get_context();
+ cc->postpone_commit++;
+}
+
+int
+cf_close_group(void)
+{
+ struct cf_context *cc = cf_get_context();
+ ASSERT(cc->postpone_commit);
+ if (!--cc->postpone_commit)
+ return maybe_commit(cc);
+ else
+ return 0;
+}
int
cf_done_stack(struct cf_context *cc)
{
int
cf_done_stack(struct cf_context *cc)
{
- if (cc->stack_level > 0) {
- msg(L_ERROR, "Unterminated block"); // FIXME: Where?
- return 1;
- }
- if (cf_commit_all(cc->postpone_commit ? CF_NO_COMMIT : cc->everything_committed ? CF_COMMIT : CF_COMMIT_ALL))
- return 1;
- if (!cc->postpone_commit)
- cc->everything_committed = 1;
- return 0;
-}
-
-void
-cf_open_group(void)
-{
- struct cf_context *cc = cf_get_context();
- cc->postpone_commit++;
-}
-
-int
-cf_close_group(void)
-{
- struct cf_context *cc = cf_get_context();
- ASSERT(cc->postpone_commit);
- if (!--cc->postpone_commit)
- return cf_done_stack(cc);
- else
- return 0;
+ return (cc->stack_level > 0);