X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fchannel.c;fp=src%2Fngircd%2Fchannel.c;h=0b194a0968bae23f89c56798a9f300e13b55fb99;hp=b317ada41efb0b1fd645f776272f869da96c65d7;hb=a3072ce698873d3732160b1cee63a35ccb75d5b4;hpb=decf98d5efce97f1abfbd125a9aae92a2e94b89f diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index b317ada4..0b194a09 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -99,7 +99,7 @@ Channel_InitPredefined( void ) const struct Conf_Channel *conf_chan; char *c; char modes[COMMAND_LEN], name[CHANNEL_NAME_LEN]; - size_t i, channel_count = array_length(&Conf_Channels, sizeof(*conf_chan)); + size_t i, n, channel_count = array_length(&Conf_Channels, sizeof(*conf_chan)); conf_chan = array_start(&Conf_Channels); @@ -138,21 +138,31 @@ Channel_InitPredefined( void ) if (conf_chan->topic[0]) Channel_SetTopic(new_chan, NULL, conf_chan->topic); - /* Evaluate modes string with a fake request */ - if(conf_chan->modes[0]) { - strlcpy(modes, conf_chan->modes, sizeof(modes)); + /* Evaluate modes strings with fake requests */ + if(conf_chan->modes_num) { + /* Prepare fake request structure */ strlcpy(name, conf_chan->name, sizeof(name)); - Log(LOG_DEBUG, "Evaluate \"MODE %s %s\".", name, modes); - Req.argc = 0; - Req.argv[Req.argc++] = name; + Log(LOG_INFO, "Evaluating predefined channel modes for \"%s\".", name); + Req.argv[0] = 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, " "); + + /* Iterate over channel modes strings */ + for (n = 0; n < conf_chan->modes_num; n++) { + Req.argc = 1; + strlcpy(modes, conf_chan->modes[n], sizeof(modes)); + Log(LOG_DEBUG, "Evaluate \"MODE %s %s\".", name, modes); + c = strtok(modes, " "); + while (c && Req.argc < 15) { + Req.argv[Req.argc++] = c; + c = strtok(0, " "); + } + if(Req.argc > 1) + IRC_MODE(Client_ThisServer(), &Req); + + /* Original channel modes srings are no longer needed */ + free(conf_chan->modes[n]); } - IRC_MODE(Client_ThisServer(), &Req); } Channel_SetKey(new_chan, conf_chan->key);