From decf98d5efce97f1abfbd125a9aae92a2e94b89f Mon Sep 17 00:00:00 2001 From: michi Date: Wed, 19 Feb 2020 09:26:21 +0000 Subject: [PATCH] Evaluate initial channel modes Allow setting arbitrary channel modes in the config file. Closes #55. --- src/ngircd/channel.c | 25 +++++++++++++++++++++---- src/ngircd/conf.h | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 53c385c2..b317ada4 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -36,6 +36,8 @@ #include "log.h" #include "messages.h" #include "match.h" +#include "parse.h" +#include "irc-mode.h" #define REMOVE_PART 0 #define REMOVE_QUIT 1 @@ -93,8 +95,10 @@ GLOBAL void Channel_InitPredefined( void ) { CHANNEL *new_chan; + REQUEST Req; const struct Conf_Channel *conf_chan; - const char *c; + char *c; + char modes[COMMAND_LEN], name[CHANNEL_NAME_LEN]; size_t i, channel_count = array_length(&Conf_Channels, sizeof(*conf_chan)); conf_chan = array_start(&Conf_Channels); @@ -134,9 +138,22 @@ Channel_InitPredefined( void ) if (conf_chan->topic[0]) Channel_SetTopic(new_chan, NULL, conf_chan->topic); - c = conf_chan->modes; - while (*c) - Channel_ModeAdd(new_chan, *c++); + /* Evaluate modes string with a fake request */ + if(conf_chan->modes[0]) { + strlcpy(modes, conf_chan->modes, sizeof(modes)); + strlcpy(name, conf_chan->name, sizeof(name)); + Log(LOG_DEBUG, "Evaluate \"MODE %s %s\".", name, modes); + Req.argc = 0; + Req.argv[Req.argc++] = name; + Req.prefix = Client_ID(Client_ThisServer()); + Req.command = "MODE"; + c = strtok(modes, " "); + while (c && Req.argc<15) { + Req.argv[Req.argc++] = c; + c = strtok(0, " "); + } + IRC_MODE(Client_ThisServer(), &Req); + } Channel_SetKey(new_chan, conf_chan->key); Channel_SetMaxUsers(new_chan, conf_chan->maxusers); diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index 8029c0f7..900338dd 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -83,7 +83,7 @@ struct SSLOptions { /** Pre-defined channels */ struct Conf_Channel { char name[CHANNEL_NAME_LEN]; /**< Name of the channel */ - char modes[CHANNEL_MODE_LEN]; /**< Initial channel modes */ + char modes[COMMAND_LEN]; /**< Initial channel modes to evaluate */ char key[CLIENT_PASS_LEN]; /**< Channel key ("password", mode "k" ) */ char topic[COMMAND_LEN]; /**< Initial topic */ char keyfile[512]; /**< Path and name of channel key file */ -- 2.39.2