degesch: don't require configuration to run
Well, techincally.
This commit is contained in:
parent
c23898166c
commit
6d0fff6a71
82
degesch.c
82
degesch.c
@ -1813,7 +1813,7 @@ init_buffers (struct app_context *ctx)
|
||||
global->name = xstrdup (PROGRAM_NAME);
|
||||
|
||||
server->type = BUFFER_SERVER;
|
||||
server->name = xstrdup (get_config_string (ctx, "server.irc_host"));
|
||||
server->name = xstrdup ("server");
|
||||
server->server = &ctx->server;
|
||||
|
||||
LIST_APPEND_WITH_TAIL (ctx->buffers, ctx->buffers_tail, global);
|
||||
@ -4311,6 +4311,12 @@ irc_connect (struct server *s, struct error **e)
|
||||
const char *irc_host = get_config_string (ctx, "server.irc_host");
|
||||
int64_t irc_port_int = get_config_integer (ctx, "server.irc_port");
|
||||
|
||||
if (!get_config_string (ctx, "server.irc_host"))
|
||||
{
|
||||
error_set (e, "No hostname specified in configuration");
|
||||
return false;
|
||||
}
|
||||
|
||||
const char *socks_host = get_config_string (ctx, "server.socks_host");
|
||||
int64_t socks_port_int = get_config_integer (ctx, "server.socks_port");
|
||||
const char *socks_username =
|
||||
@ -4464,6 +4470,7 @@ autofill_user_info (struct app_context *ctx, struct error **e)
|
||||
if (!pwd)
|
||||
FAIL ("cannot retrieve user information: %s", strerror (errno));
|
||||
|
||||
// FIXME: set_config_strings() writes errors on its own
|
||||
if (!nickname)
|
||||
set_config_string (ctx, "server.nickname", pwd->pw_name);
|
||||
if (!username)
|
||||
@ -4514,46 +4521,52 @@ read_file (const char *filename, struct str *output, struct error **e)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool
|
||||
load_configuration (struct app_context *ctx, struct error **e)
|
||||
static struct config_item_ *
|
||||
load_configuration_file (const char *filename, struct error **e)
|
||||
{
|
||||
char *filename = resolve_config_filename (PROGRAM_NAME ".conf");
|
||||
if (!filename)
|
||||
{
|
||||
error_set (e, "cannot find configuration");
|
||||
return false;
|
||||
}
|
||||
struct config_item_ *root = NULL;
|
||||
|
||||
struct str data;
|
||||
str_init (&data);
|
||||
bool success = read_file (filename, &data, e);
|
||||
free (filename);
|
||||
if (!success)
|
||||
{
|
||||
str_free (&data);
|
||||
return false;
|
||||
}
|
||||
if (!read_file (filename, &data, e))
|
||||
goto end;
|
||||
|
||||
struct error *error = NULL;
|
||||
struct config_item_ *root =
|
||||
config_item_parse (data.str, data.len, false, &error);
|
||||
str_free (&data);
|
||||
if (!root)
|
||||
if (!(root = config_item_parse (data.str, data.len, false, &error)))
|
||||
{
|
||||
error_set (e, "configuration parse error: %s", error->message);
|
||||
error_free (error);
|
||||
return false;
|
||||
}
|
||||
end:
|
||||
str_free (&data);
|
||||
return root;
|
||||
}
|
||||
|
||||
static void
|
||||
load_configuration (struct app_context *ctx)
|
||||
{
|
||||
struct config_item_ *root = NULL;
|
||||
struct error *e = NULL;
|
||||
|
||||
char *filename = resolve_config_filename (PROGRAM_NAME ".conf");
|
||||
if (filename)
|
||||
root = load_configuration_file (filename, &e);
|
||||
else
|
||||
print_status ("configuration file not found");
|
||||
free (filename);
|
||||
|
||||
if (e)
|
||||
{
|
||||
print_error ("%s", e->message);
|
||||
error_free (e);
|
||||
e = NULL;
|
||||
}
|
||||
|
||||
config_load (&ctx->config, root);
|
||||
|
||||
if (!autofill_user_info (ctx, e))
|
||||
return false;
|
||||
|
||||
if (!get_config_string (ctx, "server.irc_host"))
|
||||
config_load (&ctx->config, root ? root : config_item_object ());
|
||||
if (!autofill_user_info (ctx, &e))
|
||||
{
|
||||
error_set (e, "no hostname specified in configuration");
|
||||
return false;
|
||||
print_error ("%s: %s", "failed to fill in user details", e->message);
|
||||
error_free (e);
|
||||
}
|
||||
|
||||
ctx->reconnect =
|
||||
@ -4562,7 +4575,6 @@ load_configuration (struct app_context *ctx, struct error **e)
|
||||
get_config_boolean (ctx, "behaviour.isolate_buffers");
|
||||
ctx->reconnect_delay =
|
||||
get_config_integer (ctx, "server.reconnect_delay");
|
||||
return true;
|
||||
}
|
||||
|
||||
static char *
|
||||
@ -4727,14 +4739,7 @@ main (int argc, char *argv[])
|
||||
|
||||
setup_signal_handlers ();
|
||||
register_config_modules (&ctx);
|
||||
|
||||
struct error *e = NULL;
|
||||
if (!load_configuration (&ctx, &e))
|
||||
{
|
||||
print_error ("%s", e->message);
|
||||
error_free (e);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
load_configuration (&ctx);
|
||||
|
||||
init_colors (&ctx);
|
||||
init_poller_events (&ctx);
|
||||
@ -4743,6 +4748,7 @@ main (int argc, char *argv[])
|
||||
refresh_prompt (&ctx);
|
||||
|
||||
// TODO: connect asynchronously (first step towards multiple servers)
|
||||
struct error *e = NULL;
|
||||
if (!irc_connect (&ctx.server, &e))
|
||||
{
|
||||
buffer_send_error (&ctx, ctx.server.buffer, "%s", e->message);
|
||||
|
Loading…
Reference in New Issue
Block a user