*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
-LOCAL BOOLEAN Remove_Client PARAMS(( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer ));
+LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
if( ! Channel_IsValidName( Conf_Channel[i].name ))
{
Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
if( ! Channel_IsValidName( Conf_Channel[i].name ))
{
Log( LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"!", Conf_Channel[i].name );
if( chan )
{
Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name );
if( chan )
{
Log( LOG_INFO, "Can't create pre-defined channel \"%s\": name already in use.", Conf_Channel[i].name );
- Channel_SetTopic( chan, Conf_Channel[i].topic );
+ if (!array_copy(&chan->topic, &Conf_Channel[i].topic)) {
+ Log( LOG_WARNING, "Could not set topic for new pre-defined channel: %s",
+ strerror(errno));
+ }
+ array_free(&Conf_Channel[i].topic);
c = Conf_Channel[i].modes;
while( *c ) Channel_ModeAdd( chan, *c++ );
Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
c = Conf_Channel[i].modes;
while( *c ) Channel_ModeAdd( chan, *c++ );
Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
if( ! Channel_IsValidName( Name ))
{
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
if( ! Channel_IsValidName( Name ))
{
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
-GLOBAL BOOLEAN
-Channel_Part( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
+GLOBAL bool
+Channel_Part( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
{
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
if(( ! chan ) || ( ! Get_Cl2Chan( chan, Client )))
{
IRC_WriteStrClient( Client, ERR_NOSUCHCHANNEL_MSG, Client_ID( Client ), Name );
- if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, TRUE )) return FALSE;
- else return TRUE;
+ if( ! Remove_Client( REMOVE_PART, chan, Client, Origin, Reason, true)) return false;
+ else return true;
-GLOBAL VOID
-Channel_Kick( CLIENT *Client, CLIENT *Origin, CHAR *Name, CHAR *Reason )
+GLOBAL void
+Channel_Kick( CLIENT *Client, CLIENT *Origin, char *Name, char *Reason )
- Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, TRUE );
+ Remove_Client( REMOVE_KICK, chan, Client, Origin, Reason, true);
- Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, FALSE );
+ Remove_Client( REMOVE_QUIT, c, Client, Client, Reason, false );
- /* Mode soll gesetzt werden. TRUE wird geliefert, wenn der
- * Mode neu gesetzt wurde, FALSE, wenn der Channel den Mode
- * bereits hatte. */
+ /* set Mode.
+ * If the channel already had this mode, return false.
+ * If the channel mode was newly set return true.
+ */
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
if( ! strchr( Chan->modes, x[0] ))
{
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
if( ! strchr( Chan->modes, x[0] ))
{
- /* Client hat den Mode noch nicht -> setzen */
- strcat( Chan->modes, x );
- return TRUE;
+ /* Channel does not have this mode yet, set it */
+ strlcat( Chan->modes, x, sizeof( Chan->modes ));
+ return true;
- /* Mode soll geloescht werden. TRUE wird geliefert, wenn der
- * Mode entfernt wurde, FALSE, wenn der Channel den Mode
- * ueberhaupt nicht hatte. */
-
- CHAR x[2], *p;
+ /* Delete mode.
+ * if the mode was removed return true.
+ * if the channel did not have the mode, return false.
+ */
+ char x[2], *p;
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
p = strchr( Chan->modes, x[0] );
assert( Chan != NULL );
x[0] = Mode; x[1] = '\0';
p = strchr( Chan->modes, x[0] );
- /* Channel-User-Mode soll gesetzt werden. TRUE wird geliefert,
- * wenn der Mode neu gesetzt wurde, FALSE, wenn der User den
- * Channel-Mode bereits hatte. */
+ /* Set Channel-User-Mode.
+ * if mode was newly set, return true.
+ * if the User already had this channel-mode, return false.
+ */
x[0] = Mode; x[1] = '\0';
if( ! strchr( cl2chan->modes, x[0] ))
{
x[0] = Mode; x[1] = '\0';
if( ! strchr( cl2chan->modes, x[0] ))
{
- /* Client hat den Mode noch nicht -> setzen */
- strcat( cl2chan->modes, x );
- return TRUE;
+ /* mode not set, -> set it */
+ strlcat( cl2chan->modes, x, sizeof( cl2chan->modes ));
+ return true;
- /* Channel-User-Mode soll geloescht werden. TRUE wird geliefert,
- * wenn der Mode entfernt wurde, FALSE, wenn der User den Channel-Mode
- * ueberhaupt nicht hatte. */
+ /* Delete Channel-User-Mode.
+ * If Mode was removed, return true.
+ * If User did not have the Channel-Mode, return false.
+ */
x[0] = Mode; x[1] = '\0';
p = strchr( cl2chan->modes, x[0] );
x[0] = Mode; x[1] = '\0';
p = strchr( cl2chan->modes, x[0] );
-
- strncpy( Chan->topic, Topic, CHANNEL_TOPIC_LEN - 1 );
- Chan->topic[CHANNEL_TOPIC_LEN - 1] = '\0';
+
+ len = strlen(Topic);
+ if (len < array_bytes(&Chan->topic))
+ array_free(&Chan->topic);
+
+ if (!array_copyb(&Chan->topic, Topic, len))
+ Log(LOG_WARNING, "could not set new Topic %s: %s", Topic, strerror(errno));
+
+ array_cat0(&Chan->topic);
- strncpy( Chan->modes, Modes, CHANNEL_MODE_LEN - 1 );
- Chan->topic[CHANNEL_MODE_LEN - 1] = '\0';
+ strlcpy( Chan->modes, Modes, sizeof( Chan->modes ));
- strncpy( Chan->key, Key, CLIENT_PASS_LEN - 1 );
- Chan->key[CLIENT_PASS_LEN - 1] = '\0';
+ strlcpy( Chan->key, Key, sizeof( Chan->key ));
Log( LOG_DEBUG, "Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
} /* Channel_SetKey */
Log( LOG_DEBUG, "Channel %s: Key is now \"%s\".", Chan->name, Chan->key );
} /* Channel_SetKey */
-GLOBAL BOOLEAN
-Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, CHAR *Text )
+GLOBAL bool
+Channel_Write( CHANNEL *Chan, CLIENT *From, CLIENT *Client, char *Text )
- BOOLEAN is_member, has_voice, is_op, ok;
+ bool is_member, has_voice, is_op, ok;
- /* Okay, Ziel ist ein Channel */
- is_member = has_voice = is_op = FALSE;
+ /* Okay, target is a channel */
+ is_member = has_voice = is_op = false;
- is_member = TRUE;
- if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = TRUE;
- if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = TRUE;
+ is_member = true;
+ if( strchr( Channel_UserModes( Chan, From ), 'v' )) has_voice = true;
+ if( strchr( Channel_UserModes( Chan, From ), 'o' )) is_op = true;
- /* pruefen, ob Client in Channel schreiben darf */
- ok = TRUE;
- if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = FALSE;
- if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = FALSE;
+ /* Is the client allowed to write to channel? */
+ ok = true;
+ if( strchr( Channel_Modes( Chan ), 'n' ) && ( ! is_member )) ok = false;
+ if( strchr( Channel_Modes( Chan ), 'm' ) && ( ! is_op ) && ( ! has_voice )) ok = false;
+
+ /* Is the client banned? */
+ if( Lists_CheckBanned( From, Chan ))
+ {
+ /* Client is banned, bus is he channel operator or has voice? */
+ if(( ! has_voice ) && ( ! is_op )) ok = false;
+ }
if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan ));
if( ! ok ) return IRC_WriteStrClient( From, ERR_CANNOTSENDTOCHAN_MSG, Client_ID( From ), Channel_Name( Chan ));
- return IRC_WriteStrChannelPrefix( Client, Chan, From, TRUE, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
+ return IRC_WriteStrChannelPrefix( Client, Chan, From, true, "PRIVMSG %s :%s", Channel_Name( Chan ), Text );
- c->next = NULL;
- strncpy( c->name, Name, CHANNEL_NAME_LEN - 1 );
- c->name[CHANNEL_NAME_LEN - 1] = '\0';
- strcpy( c->modes, "" );
- strcpy( c->topic, "" );
+ memset( c, 0, sizeof( CHANNEL ));
+ strlcpy( c->name, Name, sizeof( c->name ));
-LOCAL BOOLEAN
-Remove_Client( INT Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, CHAR *Reason, BOOLEAN InformServer )
+LOCAL bool
+Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
case REMOVE_QUIT:
/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
* hier also "nur" noch alle User in betroffenen Channeln infomieren */
case REMOVE_QUIT:
/* QUIT: andere Server wurden bereits informiert, vgl. Client_Destroy();
* hier also "nur" noch alle User in betroffenen Channeln infomieren */
- assert( InformServer == FALSE );
- IRC_WriteStrChannelPrefix( Origin, c, Origin, FALSE, "QUIT :%s", Reason );
+ assert( InformServer == false );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
break;
case REMOVE_KICK:
/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
* im entsprechenden Channel informieren */
if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
break;
case REMOVE_KICK:
/* User wurde geKICKed: ggf. andere Server sowie alle betroffenen User
* im entsprechenden Channel informieren */
if( InformServer ) IRC_WriteStrServersPrefix( Client_NextHop( Origin ), Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
- IRC_WriteStrChannelPrefix( Client, c, Origin, FALSE, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
+ IRC_WriteStrChannelPrefix( Client, c, Origin, false, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
break;
default:
/* PART */
if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
if(( Client_Conn( Client ) > NONE ) && ( Client_Type( Client ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Client, Origin, "KICK %s %s :%s", c->name, Client_ID( Client ), Reason );
Log( LOG_DEBUG, "User \"%s\" has been kicked of \"%s\" by \"%s\": %s.", Client_Mask( Client ), c->name, Client_ID( Origin ), Reason );
break;
default:
/* PART */
if( InformServer ) IRC_WriteStrServersPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
- IRC_WriteStrChannelPrefix( Origin, c, Client, FALSE, "PART %s :%s", c->name, Reason );
+ IRC_WriteStrChannelPrefix( Origin, c, Client, false, "PART %s :%s", c->name, Reason );
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
}
if(( Client_Conn( Origin ) > NONE ) && ( Client_Type( Origin ) == CLIENT_USER )) IRC_WriteStrClientPrefix( Origin, Client, "PART %s :%s", c->name, Reason );
Log( LOG_DEBUG, "User \"%s\" left channel \"%s\" (%s).", Client_Mask( Client ), c->name, Reason );
}