ZyklonB: revisit error handling

This commit is contained in:
Přemysl Eric Janouch 2016-02-20 00:01:54 +01:00
parent 056e0a4765
commit a275f9636c

View File

@ -310,8 +310,7 @@ irc_get_boolean_from_config
if (set_boolean_if_valid (value, str))
return true;
error_set (e, "invalid configuration value for `%s'", name);
return false;
FAIL ("invalid configuration value for `%s'", name);
}
static bool
@ -443,8 +442,7 @@ error_ssl_1:
// multiple errors on the OpenSSL stack.
if (!error_info)
error_info = ERR_error_string (ERR_get_error (), NULL);
error_set (e, "%s: %s", "could not initialize TLS", error_info);
return false;
FAIL ("%s: %s", "could not initialize TLS", error_info);
}
static bool
@ -457,11 +455,8 @@ irc_establish_connection (struct bot_context *ctx,
int err = getaddrinfo (host, port, &gai_hints, &gai_result);
if (err)
{
error_set (e, "%s: %s: %s",
"connection failed", "getaddrinfo", gai_strerror (err));
return false;
}
FAIL ("%s: %s: %s", "connection failed",
"getaddrinfo", gai_strerror (err));
int sockfd;
for (gai_iter = gai_result; gai_iter; gai_iter = gai_iter->ai_next)
@ -502,10 +497,7 @@ irc_establish_connection (struct bot_context *ctx,
freeaddrinfo (gai_result);
if (!gai_iter)
{
error_set (e, "connection failed");
return false;
}
FAIL ("connection failed");
ctx->irc_fd = sockfd;
return true;
@ -1034,37 +1026,21 @@ plugin_load (struct bot_context *ctx, const char *name, struct error **e)
{
const char *plugin_dir = str_map_find (&ctx->config, "plugin_dir");
if (!plugin_dir)
{
error_set (e, "plugin directory not set");
return false;
}
FAIL ("plugin directory not set");
if (!is_valid_plugin_name (name))
{
error_set (e, "invalid plugin name");
return false;
}
FAIL ("invalid plugin name");
if (str_map_find (&ctx->plugins_by_name, name))
{
error_set (e, "the plugin has already been loaded");
return false;
}
FAIL ("the plugin has already been loaded");
int stdin_pipe[2];
if (pipe (stdin_pipe) == -1)
{
error_set (e, "%s: %s: %s",
"failed to load the plugin", "pipe", strerror (errno));
goto fail_1;
}
FAIL ("%s: %s", "pipe", strerror (errno));
int stdout_pipe[2];
if (pipe (stdout_pipe) == -1)
{
error_set (e, "%s: %s: %s",
"failed to load the plugin", "pipe", strerror (errno));
goto fail_2;
error_set (e, "%s: %s", "pipe", strerror (errno));
goto fail_1;
}
set_cloexec (stdin_pipe[1]);
@ -1073,9 +1049,8 @@ plugin_load (struct bot_context *ctx, const char *name, struct error **e)
pid_t pid = fork ();
if (pid == -1)
{
error_set (e, "%s: %s: %s",
"failed to load the plugin", "fork", strerror (errno));
goto fail_3;
error_set (e, "%s: %s", "fork", strerror (errno));
goto fail_2;
}
if (pid == 0)
@ -1133,13 +1108,12 @@ plugin_load (struct bot_context *ctx, const char *name, struct error **e)
poller_fd_set (&plugin->read_event, POLLIN);
return true;
fail_3:
fail_2:
xclose (stdout_pipe[0]);
xclose (stdout_pipe[1]);
fail_2:
fail_1:
xclose (stdin_pipe[0]);
xclose (stdin_pipe[1]);
fail_1:
return false;
}
@ -1149,10 +1123,7 @@ plugin_unload (struct bot_context *ctx, const char *name, struct error **e)
struct plugin *plugin = str_map_find (&ctx->plugins_by_name, name);
if (!plugin)
{
error_set (e, "no such plugin is loaded");
return false;
}
FAIL ("no such plugin is loaded");
plugin_zombify (plugin);
@ -1781,10 +1752,7 @@ irc_connect (struct bot_context *ctx, struct error **e)
// TODO: again, get rid of `struct error' in here. The question is: how
// do we tell our caller that he should not try to reconnect?
if (!irc_host)
{
error_set (e, "no hostname specified in configuration");
return false;
}
FAIL ("no hostname specified in configuration");
bool use_tls;
if (!irc_get_boolean_from_config (ctx, "tls", &use_tls, e))
@ -1829,11 +1797,7 @@ parse_config (struct bot_context *ctx, struct error **e)
const char *delay_str = str_map_find (&ctx->config, "reconnect_delay");
hard_assert (delay_str != NULL); // We have a default value for this
if (!xstrtoul (&ctx->reconnect_delay, delay_str, 10))
{
error_set (e, "invalid configuration value for `%s'",
"reconnect_delay");
return false;
}
FAIL ("invalid configuration value for `%s'", "reconnect_delay");
hard_assert (!ctx->admin_re);
const char *admin = str_map_find (&ctx->config, "admin");