commit - decf98d5efce97f1abfbd125a9aae92a2e94b89f
commit + a3072ce698873d3732160b1cee63a35ccb75d5b4
blob - b317ada41efb0b1fd645f776272f869da96c65d7
blob + 0b194a0968bae23f89c56798a9f300e13b55fb99
--- src/ngircd/channel.c
+++ src/ngircd/channel.c
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);
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);
blob - ef36a2fe5d1c1842c851624c5322c91979554084
blob + 373ea6b1ed7bf6709038f84d3b08be11eefffa3b
--- src/ngircd/conf.c
+++ src/ngircd/conf.c
{
struct passwd *pwd;
struct group *grp;
- unsigned int i;
+ unsigned int i, j;
bool config_valid;
size_t predef_channel_count;
struct Conf_Channel *predef_chan;
/* Valid "Channel" section */
puts( "[CHANNEL]" );
printf(" Name = %s\n", predef_chan->name);
- printf(" Modes = %s\n", predef_chan->modes);
+ for(j = 0; j < predef_chan->modes_num; j++)
+ printf(" Modes = %s\n", predef_chan->modes[j]);
printf(" Key = %s\n", predef_chan->key);
printf(" MaxUsers = %lu\n", predef_chan->maxusers);
printf(" Topic = %s\n", predef_chan->topic);
}
if (strcasecmp(Var, "Modes") == 0) {
/* Initial modes */
- len = strlcpy(chan->modes, Arg, sizeof(chan->modes));
- if (len >= sizeof(chan->modes))
+ if(chan->modes_num >= sizeof(chan->modes)) {
+ Config_Error(LOG_ERR, "Too many Modes, option ignored.");
+ return;
+ }
+ chan->modes[chan->modes_num++] = strndup(Arg, COMMAND_LEN);
+ if(strlen(Arg) >= COMMAND_LEN)
Config_Error_TooLong(File, Line, Var);
return;
}
blob - 900338dd0124e3d8f36a5b9dfa8bca39c45a81a0
blob + 0d2965c1f2059fa508ce3b5cb4c5fe3a0bb6acb7
--- src/ngircd/conf.h
+++ src/ngircd/conf.h
/** Pre-defined channels */
struct Conf_Channel {
char name[CHANNEL_NAME_LEN]; /**< Name of the channel */
- char modes[COMMAND_LEN]; /**< Initial channel modes to evaluate */
+ char *modes[512]; /**< 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 */
unsigned long maxusers; /**< User limit for this channel, mode "l" */
+ unsigned int modes_num; /**< Number of channel modes to evaluate */
};