#include "portab.h"
-static char UNUSED id[] = "$Id: irc-server.c,v 1.28 2002/12/26 17:14:48 alex Exp $";
+static char UNUSED id[] = "$Id: irc-server.c,v 1.32 2003/04/20 23:09:26 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <string.h>
#include "resolve.h"
-#include "conf.h"
#include "conn.h"
+#include "conn-zip.h"
+#include "conf.h"
#include "client.h"
#include "channel.h"
#include "irc-write.h"
GLOBAL BOOLEAN
IRC_SERVER( CLIENT *Client, REQUEST *Req )
{
- CHAR str[LINE_LEN], *ptr;
+ CHAR str[LINE_LEN], *ptr, *modes, *topic;
CLIENT *from, *c, *cl;
CL2CHAN *cl2chan;
INT max_hops, i;
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
/* Ist dieser Server bei uns konfiguriert? */
- for( i = 0; i < Conf_Server_Count; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
- if( i >= Conf_Server_Count )
+ for( i = 0; i < MAX_SERVERS; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
+ if( i >= MAX_SERVERS )
{
/* Server ist nicht konfiguriert! */
Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
Log( LOG_NOTICE|LOG_snotice, "Server \"%s\" registered (connection %d, 1 hop - direct link).", Client_ID( Client ), con );
Client_SetType( Client, CLIENT_SERVER );
- Conn_SetServer( con, i );
+ Conf_SetServer( i, con );
#ifdef USE_ZLIB
/* Kompression initialisieren, wenn erforderlich */
if( strchr( Client_Flags( Client ), 'Z' ))
{
- if( ! Conn_InitZip( con ))
+ if( ! Zip_InitConn( con ))
{
/* Fehler! */
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, FALSE );
while( chan )
{
#ifdef IRCPLUS
- /* Wenn unterstuetzt, CHANINFO senden */
+ /* Send CHANINFO if the peer supports it */
if( strchr( Client_Flags( Client ), 'C' ))
{
- /* CHANINFO senden */
- if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), Channel_Modes( chan ), Channel_Topic( chan ))) return DISCONNECTED;
+ modes = Channel_Modes( chan );
+ topic = Channel_Topic( chan );
+
+ if( *modes || *topic )
+ {
+ /* send CHANINFO */
+ if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )) && ( ! *topic ))
+ {
+ /* "CHANINFO <chan> +<modes>" */
+ if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s", Channel_Name( chan ), modes )) return DISCONNECTED;
+ }
+ else if(( ! strchr( Channel_Modes( chan ), 'k' )) && ( ! strchr( Channel_Modes( chan ), 'l' )))
+ {
+ /* "CHANINFO <chan> +<modes> :<topic>" */
+ if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s :%s", Channel_Name( chan ), modes, topic )) return DISCONNECTED;
+ }
+ else
+ {
+ /* "CHANINFO <chan> +<modes> <key> <limit> :<topic>" */
+ if( ! IRC_WriteStrClient( Client, "CHANINFO %s +%s %s %ld :%s", Channel_Name( chan ), modes, strchr( Channel_Modes( chan ), 'k' ) ? Channel_Key( chan ) : "*", strchr( Channel_Modes( chan ), 'l' ) ? Channel_MaxUsers( chan ) : 0L, topic )) return DISCONNECTED;
+ }
+ }
}
#endif
GLOBAL BOOLEAN
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
{
- CHAR str[COMMAND_LEN], *channame, *ptr, modes[8];
+ CHAR nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
BOOLEAN is_op, is_voiced;
CHANNEL *chan;
CLIENT *c;
/* Falsche Anzahl Parameter? */
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
- strlcpy( str, Req->argv[1], sizeof( str ));
+ strlcpy( nick_in, Req->argv[1], sizeof( nick_in ));
+ strcpy( nick_out, "" );
channame = Req->argv[0];
- ptr = strtok( str, "," );
+ ptr = strtok( nick_in, "," );
while( ptr )
{
is_op = is_voiced = FALSE;
/* Modes im Channel bekannt machen */
IRC_WriteStrChannelPrefix( Client, chan, Client, FALSE, "MODE %s +%s %s", channame, modes, Client_ID( c ));
}
+
+ if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
+ strlcat( nick_out, ptr, sizeof( nick_out ));
}
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
}
/* an andere Server weiterleiten */
- IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], Req->argv[1] );
+ if( nick_out[0] != '\0' ) IRC_WriteStrServersPrefix( Client, Client_ThisServer( ), "NJOIN %s :%s", Req->argv[0], nick_out );
return CONNECTED;
} /* IRC_NJOIN */