aboutsummaryrefslogtreecommitdiff
path: root/src/config.c
blob: 184b42a099aa034d07dfac51984a7c84571577c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* This file is part of Eclat.
   Copyright (C) 2012 Sergey Poznyakoff.
 
   Eclat is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.
 
   Eclat is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with Eclat.  If not, see <http://www.gnu.org/licenses/>. */

#include "eclat.h"

struct config_finish_hook_entry
{
	struct config_finish_hook_entry *next;
	config_finish_hook_t fun;
	void *data;
};

static struct config_finish_hook_entry *cfh_head, *cfh_tail;
	
void
add_config_finish_hook(config_finish_hook_t fun, void *data)
{
	struct config_finish_hook_entry *ent = grecs_malloc(sizeof(*ent));
	ent->next = NULL;
	ent->fun = fun;
	ent->data = data;
	if (cfh_tail)
		cfh_tail->next = ent;
	else
		cfh_head = ent;
	cfh_tail = ent;
}

int
run_config_finish_hooks()
{
	struct config_finish_hook_entry *p;
	int rc = 0;
	
	for (p = cfh_head; p; p = p->next)
		rc |= p->fun(p->data);
	return rc;
}

static struct grecs_keyword eclat_kw[] = {
	{ "host", "hostname",
	  "Send queries to <hostname> instead of the default host",
	  grecs_type_string, GRECS_DFLT, &default_host },
	{ "access-file", "file",
	  "Specify a file containing `accessID:accessKey' pairs",
	  grecs_type_string, GRECS_DFLT, &access_file_name },
	{ "region", "name",
	  "Define default AWS region",
	  grecs_type_string, GRECS_DFLT, &region_name },
	
	{ NULL }
};
	
void
config_help()
{
	static char docstring[] =
		N_("Configuration file structure for eclat.\n"
		   "For more information, use `info eclat configuration'.");
	grecs_print_docstring(docstring, 0, stdout);
	grecs_print_statement_array(eclat_kw, 1, 0, stdout);
}

static void
grecs_print_diag(grecs_locus_t const *locus, int err, int errcode,
		 const char *msg)
{
	diag(locus, err ? NULL : "warning", "%s", msg);
}

void
config_init()
{
	grecs_include_path_setup(DEFAULT_VERSION_INCLUDE_DIR,
				 DEFAULT_INCLUDE_DIR, NULL);
	grecs_preprocessor = DEFAULT_PREPROCESSOR;
	grecs_log_to_stderr = 1;
	grecs_adjust_string_locations = 1;
	grecs_print_diag_fun = grecs_print_diag;
}

void
config_finish(struct grecs_node *tree)
{
	struct grecs_node *node;

	grecs_tree_reduce(tree, eclat_kw, GRECS_AGGR);
	if (debug_level[ECLAT_DEBCAT_CONF]) {
		grecs_print_node(tree, GRECS_NODE_FLAG_DEFAULT, stderr);
		fputc('\n', stdout);
	}
	if (grecs_error_count || run_config_finish_hooks())
		exit(EX_CONFIG);
}	



Return to:

Send suggestions and report system problems to the System administrator.