#include "portab.h"
-static char UNUSED id[] = "$Id: irc-channel.c,v 1.31 2005/09/02 12:50:25 alex Exp $";
+static char UNUSED id[] = "$Id: irc-channel.c,v 1.37 2006/10/06 21:32:58 fw Exp $";
#include "imp.h"
#include <assert.h>
GLOBAL bool
IRC_JOIN( CLIENT *Client, REQUEST *Req )
{
- char *channame, *key, *flags, *topic, modes[8];
+ char *channame, *channame_ptr, *key, *key_ptr, *flags, *topic, modes[8];
bool is_new_chan, is_invited, is_banned;
CLIENT *target;
CHANNEL *chan;
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
/* Are channel keys given? */
- if( Req->argc > 1 ) key = Req->argv[1];
- else key = NULL;
+ if (Req->argc > 1) {
+ key = Req->argv[1];
+ key_ptr = strchr(key, ',');
+ if (key_ptr) *key_ptr = '\0';
+ }
+ else
+ key = key_ptr = NULL;
+
+ channame = Req->argv[0];
+ channame_ptr = strchr(channame, ',');
+ if (channame_ptr) *channame_ptr = '\0';
/* Channel-Namen durchgehen */
- chan = NULL;
- channame = strtok( Req->argv[0], "," );
- while( channame )
+ while (channame)
{
chan = NULL; flags = NULL;
if( Client_Type( Client ) == CLIENT_USER )
{
/* Test if the user has reached his maximum channel count */
- if( Client_Type( Client ) == CLIENT_USER )
- {
- if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
- {
- IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG, Client_ID( Client ), channame );
- return CONNECTED;
- }
- }
+ if(( Conf_MaxJoins > 0 ) && ( Channel_CountForUser( Client ) >= Conf_MaxJoins ))
+ return IRC_WriteStrClient( Client, ERR_TOOMANYCHANNELS_MSG,
+ Client_ID( Client ), channame );
/* Existiert der Channel bereits, oder wird er im Moment neu erzeugt? */
if( is_new_chan )
IRC_WriteStrClient( Client, ERR_BANNEDFROMCHAN_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
- channame = strtok( NULL, "," );
+ channame = strchr(channame, ',');
continue;
}
IRC_WriteStrClient( Client, ERR_INVITEONLYCHAN_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
- channame = strtok( NULL, "," );
+ channame = strchr(channame, ',');
continue;
}
IRC_WriteStrClient( Client, ERR_BADCHANNELKEY_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
- channame = strtok( NULL, "," );
+ channame = strchr(channame, ',');
continue;
}
IRC_WriteStrClient( Client, ERR_CHANNELISFULL_MSG, Client_ID( Client ), channame );
/* Try next name, if any */
- channame = strtok( NULL, "," );
+ channame = strchr(channame, ',');
continue;
}
}
if( ! Channel_Join( target, channame ))
{
/* naechsten Namen ermitteln */
- channame = strtok( NULL, "," );
+ channame = strchr(channame, ',');
continue;
}
if( ! chan ) chan = Channel_Search( channame );
IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
}
- /* naechsten Namen ermitteln */
- channame = strtok( NULL, "," );
+ /* next channel? */
+ channame = channame_ptr;
+ if (channame) {
+ channame++;
+ channame_ptr = strchr(channame, ',');
+ if (channame_ptr) *channame_ptr = '\0';
+
+ if (key_ptr) {
+ key = ++key_ptr;
+ key_ptr = strchr(key, ',');
+ if (key_ptr) *key_ptr = '\0';
+ }
+ }
}
return CONNECTED;
} /* IRC_JOIN */
{
if( *ptr == 'l' )
{
- snprintf( l, sizeof( l ), " %ld", Channel_MaxUsers( chan ));
+ snprintf( l, sizeof( l ), " %lu", Channel_MaxUsers( chan ));
strlcat( modes_add, l, sizeof( modes_add ));
}
if( *ptr == 'k' )