Load an MOTD on start
This commit is contained in:
parent
03ec980f26
commit
aaedbf93f1
|
@ -277,6 +277,13 @@ str_vector_free (struct str_vector *self)
|
||||||
self->vector = NULL;
|
self->vector = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
str_vector_reset (struct str_vector *self)
|
||||||
|
{
|
||||||
|
str_vector_free (self);
|
||||||
|
str_vector_init (self);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
str_vector_add_owned (struct str_vector *self, char *s)
|
str_vector_add_owned (struct str_vector *self, char *s)
|
||||||
{
|
{
|
||||||
|
|
36
src/kike.c
36
src/kike.c
|
@ -28,6 +28,8 @@
|
||||||
static struct config_item g_config_table[] =
|
static struct config_item g_config_table[] =
|
||||||
{
|
{
|
||||||
{ "server_name", NULL, "Server name" },
|
{ "server_name", NULL, "Server name" },
|
||||||
|
{ "motd", NULL, "MOTD filename" },
|
||||||
|
|
||||||
{ "bind_host", NULL, "Address of the IRC server" },
|
{ "bind_host", NULL, "Address of the IRC server" },
|
||||||
{ "bind_port", "6667", "Port of the IRC server" },
|
{ "bind_port", "6667", "Port of the IRC server" },
|
||||||
{ "ssl_cert", NULL, "Server SSL certificate (PEM)" },
|
{ "ssl_cert", NULL, "Server SSL certificate (PEM)" },
|
||||||
|
@ -321,6 +323,8 @@ struct server_context
|
||||||
struct poller poller; ///< Manages polled description
|
struct poller poller; ///< Manages polled description
|
||||||
bool quitting; ///< User requested quitting
|
bool quitting; ///< User requested quitting
|
||||||
bool polling; ///< The event loop is running
|
bool polling; ///< The event loop is running
|
||||||
|
|
||||||
|
struct str_vector motd; ///< MOTD (none if empty)
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -341,6 +345,8 @@ server_context_init (struct server_context *self)
|
||||||
poller_init (&self->poller);
|
poller_init (&self->poller);
|
||||||
self->quitting = false;
|
self->quitting = false;
|
||||||
self->polling = false;
|
self->polling = false;
|
||||||
|
|
||||||
|
str_vector_init (&self->motd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -366,6 +372,8 @@ server_context_free (struct server_context *self)
|
||||||
str_map_free (&self->users);
|
str_map_free (&self->users);
|
||||||
str_map_free (&self->channels);
|
str_map_free (&self->channels);
|
||||||
poller_free (&self->poller);
|
poller_free (&self->poller);
|
||||||
|
|
||||||
|
str_vector_free (&self->motd);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Main program ------------------------------------------------------------
|
// --- Main program ------------------------------------------------------------
|
||||||
|
@ -786,6 +794,32 @@ error_ssl_1:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
irc_initialize_motd (struct server_context *ctx, struct error **e)
|
||||||
|
{
|
||||||
|
hard_assert (ctx->motd.len == 0);
|
||||||
|
const char *motd = str_map_find (&ctx->config, "motd");
|
||||||
|
if (!motd)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
FILE *fp = fopen (motd, "r");
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
error_set (e, IO_ERROR, IO_ERROR_FAILED,
|
||||||
|
"%s: %s", "failed reading the MOTD file", strerror (errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct str line;
|
||||||
|
str_init (&line);
|
||||||
|
while (read_line (fp, &line))
|
||||||
|
str_vector_add_owned (&ctx->motd, str_steal (&line));
|
||||||
|
str_free (&line);
|
||||||
|
|
||||||
|
fclose (fp);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
irc_initialize_server_name (struct server_context *ctx, struct error **e)
|
irc_initialize_server_name (struct server_context *ctx, struct error **e)
|
||||||
{
|
{
|
||||||
|
@ -834,6 +868,8 @@ irc_listen (struct server_context *ctx, struct error **e)
|
||||||
|
|
||||||
if (!irc_initialize_server_name (ctx, e))
|
if (!irc_initialize_server_name (ctx, e))
|
||||||
return false;
|
return false;
|
||||||
|
if (!irc_initialize_motd (ctx, e))
|
||||||
|
return false;
|
||||||
|
|
||||||
struct addrinfo gai_hints, *gai_result, *gai_iter;
|
struct addrinfo gai_hints, *gai_result, *gai_iter;
|
||||||
memset (&gai_hints, 0, sizeof gai_hints);
|
memset (&gai_hints, 0, sizeof gai_hints);
|
||||||
|
|
Loading…
Reference in New Issue