summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kike.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/kike.c b/src/kike.c
index 0ce7092..fdb87bc 100644
--- a/src/kike.c
+++ b/src/kike.c
@@ -314,6 +314,7 @@ struct server_context
struct connection *clients; ///< Client connections
SSL_CTX *ssl_ctx; ///< SSL context
+ char *server_name; ///< Our server name
struct str_map users; ///< Maps nicknames to connections
struct str_map channels; ///< Maps channel names to data
@@ -332,6 +333,7 @@ server_context_init (struct server_context *self)
self->listen_fd = -1;
self->clients = NULL;
+ self->server_name = NULL;
str_map_init (&self->users);
// TODO: set channel_free() as the free function?
str_map_init (&self->channels);
@@ -360,6 +362,7 @@ server_context_free (struct server_context *self)
free (link);
}
+ free (self->server_name);
str_map_free (&self->users);
str_map_free (&self->channels);
poller_free (&self->poller);
@@ -784,12 +787,54 @@ error_ssl_1:
}
static bool
+irc_initialize_server_name (struct server_context *ctx, struct error **e)
+{
+ enum validation_result res;
+ const char *server_name = str_map_find (&ctx->config, "server_name");
+ if (server_name)
+ {
+ res = irc_validate_hostname (server_name);
+ if (res != VALIDATION_OK)
+ {
+ error_set (e, NETWORK_ERROR, NETWORK_ERROR_INVALID_CONFIGURATION,
+ "invalid configuration value for `%s': %s", "server_name",
+ irc_validate_to_str (res));
+ return false;
+ }
+ ctx->server_name = xstrdup (server_name);
+ }
+ else
+ {
+ char hostname[HOST_NAME_MAX];
+ if (gethostname (hostname, sizeof hostname))
+ {
+ error_set (e, NETWORK_ERROR, NETWORK_ERROR_INVALID_CONFIGURATION,
+ "%s: %s", "getting the hostname failed", strerror (errno));
+ return false;
+ }
+ res = irc_validate_hostname (hostname);
+ if (res != VALIDATION_OK)
+ {
+ error_set (e, NETWORK_ERROR, NETWORK_ERROR_INVALID_CONFIGURATION,
+ "`%s' is not set and the hostname (`%s') cannot be used: %s",
+ "server_name", hostname, irc_validate_to_str (res));
+ return false;
+ }
+ ctx->server_name = xstrdup (hostname);
+ }
+ return true;
+}
+
+static bool
irc_listen (struct server_context *ctx, struct error **e)
{
const char *bind_host = str_map_find (&ctx->config, "bind_host");
const char *bind_port = str_map_find (&ctx->config, "bind_port");
hard_assert (bind_port != NULL); // We have a default value for this
+ if (!irc_initialize_server_name (ctx, e))
+ return false;
+
struct addrinfo gai_hints, *gai_result, *gai_iter;
memset (&gai_hints, 0, sizeof gai_hints);