mirror of
https://github.com/osmarks/ngircd.git
synced 2025-01-22 05:16:52 +00:00
Allow multiple "Modes =" lines per [Channel] section
This commit is contained in:
parent
decf98d5ef
commit
a3072ce698
@ -99,7 +99,7 @@ Channel_InitPredefined( void )
|
|||||||
const struct Conf_Channel *conf_chan;
|
const struct Conf_Channel *conf_chan;
|
||||||
char *c;
|
char *c;
|
||||||
char modes[COMMAND_LEN], name[CHANNEL_NAME_LEN];
|
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);
|
conf_chan = array_start(&Conf_Channels);
|
||||||
|
|
||||||
@ -138,21 +138,31 @@ Channel_InitPredefined( void )
|
|||||||
if (conf_chan->topic[0])
|
if (conf_chan->topic[0])
|
||||||
Channel_SetTopic(new_chan, NULL, conf_chan->topic);
|
Channel_SetTopic(new_chan, NULL, conf_chan->topic);
|
||||||
|
|
||||||
/* Evaluate modes string with a fake request */
|
/* Evaluate modes strings with fake requests */
|
||||||
if(conf_chan->modes[0]) {
|
if(conf_chan->modes_num) {
|
||||||
strlcpy(modes, conf_chan->modes, sizeof(modes));
|
/* Prepare fake request structure */
|
||||||
strlcpy(name, conf_chan->name, sizeof(name));
|
strlcpy(name, conf_chan->name, sizeof(name));
|
||||||
Log(LOG_DEBUG, "Evaluate \"MODE %s %s\".", name, modes);
|
Log(LOG_INFO, "Evaluating predefined channel modes for \"%s\".", name);
|
||||||
Req.argc = 0;
|
Req.argv[0] = name;
|
||||||
Req.argv[Req.argc++] = name;
|
|
||||||
Req.prefix = Client_ID(Client_ThisServer());
|
Req.prefix = Client_ID(Client_ThisServer());
|
||||||
Req.command = "MODE";
|
Req.command = "MODE";
|
||||||
|
|
||||||
|
/* 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, " ");
|
c = strtok(modes, " ");
|
||||||
while (c && Req.argc < 15) {
|
while (c && Req.argc < 15) {
|
||||||
Req.argv[Req.argc++] = c;
|
Req.argv[Req.argc++] = c;
|
||||||
c = strtok(0, " ");
|
c = strtok(0, " ");
|
||||||
}
|
}
|
||||||
|
if(Req.argc > 1)
|
||||||
IRC_MODE(Client_ThisServer(), &Req);
|
IRC_MODE(Client_ThisServer(), &Req);
|
||||||
|
|
||||||
|
/* Original channel modes srings are no longer needed */
|
||||||
|
free(conf_chan->modes[n]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel_SetKey(new_chan, conf_chan->key);
|
Channel_SetKey(new_chan, conf_chan->key);
|
||||||
|
@ -328,7 +328,7 @@ Conf_Test( void )
|
|||||||
{
|
{
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
struct group *grp;
|
struct group *grp;
|
||||||
unsigned int i;
|
unsigned int i, j;
|
||||||
bool config_valid;
|
bool config_valid;
|
||||||
size_t predef_channel_count;
|
size_t predef_channel_count;
|
||||||
struct Conf_Channel *predef_chan;
|
struct Conf_Channel *predef_chan;
|
||||||
@ -483,7 +483,8 @@ Conf_Test( void )
|
|||||||
/* Valid "Channel" section */
|
/* Valid "Channel" section */
|
||||||
puts( "[CHANNEL]" );
|
puts( "[CHANNEL]" );
|
||||||
printf(" Name = %s\n", predef_chan->name);
|
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(" Key = %s\n", predef_chan->key);
|
||||||
printf(" MaxUsers = %lu\n", predef_chan->maxusers);
|
printf(" MaxUsers = %lu\n", predef_chan->maxusers);
|
||||||
printf(" Topic = %s\n", predef_chan->topic);
|
printf(" Topic = %s\n", predef_chan->topic);
|
||||||
@ -2155,8 +2156,12 @@ Handle_CHANNEL(const char *File, int Line, char *Var, char *Arg)
|
|||||||
}
|
}
|
||||||
if (strcasecmp(Var, "Modes") == 0) {
|
if (strcasecmp(Var, "Modes") == 0) {
|
||||||
/* Initial modes */
|
/* Initial modes */
|
||||||
len = strlcpy(chan->modes, Arg, sizeof(chan->modes));
|
if(chan->modes_num >= sizeof(chan->modes)) {
|
||||||
if (len >= 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);
|
Config_Error_TooLong(File, Line, Var);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -83,11 +83,12 @@ struct SSLOptions {
|
|||||||
/** Pre-defined channels */
|
/** Pre-defined channels */
|
||||||
struct Conf_Channel {
|
struct Conf_Channel {
|
||||||
char name[CHANNEL_NAME_LEN]; /**< Name of the 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 key[CLIENT_PASS_LEN]; /**< Channel key ("password", mode "k" ) */
|
||||||
char topic[COMMAND_LEN]; /**< Initial topic */
|
char topic[COMMAND_LEN]; /**< Initial topic */
|
||||||
char keyfile[512]; /**< Path and name of channel key file */
|
char keyfile[512]; /**< Path and name of channel key file */
|
||||||
unsigned long maxusers; /**< User limit for this channel, mode "l" */
|
unsigned long maxusers; /**< User limit for this channel, mode "l" */
|
||||||
|
unsigned int modes_num; /**< Number of channel modes to evaluate */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user