Put a prolog at the top of configuration files

Later I'm going to put in there some more information about the format etc.
This commit is contained in:
Přemysl Eric Janouch 2014-07-13 23:50:44 +02:00
parent f52fab9448
commit 586ccd4e87
3 changed files with 47 additions and 26 deletions

View File

@ -1824,8 +1824,8 @@ read_config_file (struct str_map *config, struct error **e)
} }
static char * static char *
write_default_config (const char *filename, const struct config_item *table, write_default_config (const char *filename, const char *prolog,
struct error **e) const struct config_item *table, struct error **e)
{ {
struct str path, base; struct str path, base;
@ -1861,6 +1861,9 @@ write_default_config (const char *filename, const struct config_item *table,
goto error; goto error;
} }
if (prolog)
fputs (prolog, fp);
errno = 0; errno = 0;
for (; table->key != NULL; table++) for (; table->key != NULL; table++)
{ {

View File

@ -993,12 +993,30 @@ print_usage (const char *program_name)
program_name); program_name);
} }
static void
call_write_default_config (const char *hint)
{
static const char *prolog =
"# " PROGRAM_NAME " " PROGRAM_VERSION " configuration file\n"
"\n";
struct error *e = NULL;
char *filename = write_default_config (hint, prolog, g_config_table, &e);
if (!filename)
{
print_fatal ("%s", e->message);
error_free (e);
exit (EXIT_FAILURE);
}
print_status ("configuration written to `%s'", filename);
free (filename);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
const char *invocation_name = argv[0]; const char *invocation_name = argv[0];
struct error *e = NULL;
static struct option opts[] = static struct option opts[] =
{ {
{ "debug", no_argument, NULL, 'd' }, { "debug", no_argument, NULL, 'd' },
@ -1028,18 +1046,8 @@ main (int argc, char *argv[])
printf (PROGRAM_NAME " " PROGRAM_VERSION "\n"); printf (PROGRAM_NAME " " PROGRAM_VERSION "\n");
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
case 'w': case 'w':
{ call_write_default_config (optarg);
char *filename = write_default_config (optarg, g_config_table, &e);
if (!filename)
{
print_fatal ("%s", e->message);
error_free (e);
exit (EXIT_FAILURE);
}
print_status ("configuration written to `%s'", filename);
free (filename);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
}
default: default:
print_fatal ("error in options"); print_fatal ("error in options");
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
@ -1058,6 +1066,7 @@ main (int argc, char *argv[])
struct server_context ctx; struct server_context ctx;
server_context_init (&ctx); server_context_init (&ctx);
struct error *e = NULL;
if (!read_config_file (&ctx.config, &e)) if (!read_config_file (&ctx.config, &e))
{ {
print_fatal ("error loading configuration: %s", e->message); print_fatal ("error loading configuration: %s", e->message);

View File

@ -1686,6 +1686,25 @@ print_usage (const char *program_name)
program_name); program_name);
} }
static void
call_write_default_config (const char *hint)
{
static const char *prolog =
"# " PROGRAM_NAME " " PROGRAM_VERSION " configuration file\n"
"\n";
struct error *e = NULL;
char *filename = write_default_config (hint, prolog, g_config_table, &e);
if (!filename)
{
print_fatal ("%s", e->message);
error_free (e);
exit (EXIT_FAILURE);
}
print_status ("configuration written to `%s'", filename);
free (filename);
}
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@ -1693,7 +1712,6 @@ main (int argc, char *argv[])
str_vector_init (&g_original_argv); str_vector_init (&g_original_argv);
str_vector_add_vector (&g_original_argv, argv); str_vector_add_vector (&g_original_argv, argv);
struct error *e = NULL;
static struct option opts[] = static struct option opts[] =
{ {
{ "debug", no_argument, NULL, 'd' }, { "debug", no_argument, NULL, 'd' },
@ -1723,18 +1741,8 @@ main (int argc, char *argv[])
printf (PROGRAM_NAME " " PROGRAM_VERSION "\n"); printf (PROGRAM_NAME " " PROGRAM_VERSION "\n");
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
case 'w': case 'w':
{ call_write_default_config (optarg);
char *filename = write_default_config (optarg, g_config_table, &e);
if (!filename)
{
print_fatal ("%s", e->message);
error_free (e);
exit (EXIT_FAILURE);
}
print_status ("configuration written to `%s'", filename);
free (filename);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
}
default: default:
print_fatal ("error in options"); print_fatal ("error in options");
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
@ -1753,6 +1761,7 @@ main (int argc, char *argv[])
struct bot_context ctx; struct bot_context ctx;
bot_context_init (&ctx); bot_context_init (&ctx);
struct error *e = NULL;
if (!read_config_file (&ctx.config, &e)) if (!read_config_file (&ctx.config, &e))
{ {
print_fatal ("error loading configuration: %s", e->message); print_fatal ("error loading configuration: %s", e->message);