X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-login.c;h=594ddcc303d9c76bdbda8b737fbce76d85acc401;hp=a23788c23ea41871a34d68d70e50f7029c5ae6cf;hb=5aa9c8f44cdee19b40440a61bc212ca6351117ca;hpb=7f795915223bb416fafc6b00f161c410a0a22b76 diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index a23788c2..594ddcc3 100644 --- a/src/ngircd/irc-login.c +++ b/src/ngircd/irc-login.c @@ -9,7 +9,7 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: irc-login.c,v 1.13 2002/04/14 14:02:35 alex Exp $ + * $Id: irc-login.c,v 1.18 2002/09/03 18:55:03 alex Exp $ * * irc-login.c: Anmeldung und Abmeldung im IRC */ @@ -24,21 +24,27 @@ #include #include "ngircd.h" +#include "resolve.h" #include "conf.h" -#include "irc.h" -#include "irc-write.h" +#include "conn.h" +#include "client.h" +#include "channel.h" #include "log.h" #include "messages.h" +#include "parse.h" +#include "irc.h" +#include "irc-write.h" #include "exp.h" #include "irc-login.h" -LOCAL BOOLEAN Hello_User( CLIENT *Client ); -LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason ); +LOCAL BOOLEAN Hello_User PARAMS(( CLIENT *Client )); +LOCAL VOID Kill_Nick PARAMS(( CHAR *Nick, CHAR *Reason )); -GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_PASS( CLIENT *Client, REQUEST *Req ) { assert( Client != NULL ); assert( Req != NULL ); @@ -59,13 +65,52 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req ) } else if((( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) && (( Req->argc == 3 ) || ( Req->argc == 4 ))) { + CHAR *impl, *serverver, *flags, *ptr; + INT protohigh, protolow; + /* noch nicht registrierte Server-Verbindung */ Log( LOG_DEBUG, "Connection %d: got PASS command (new server link) ...", Client_Conn( Client )); /* Passwort speichern */ Client_SetPassword( Client, Req->argv[0] ); + /* Protokollversion ueberpruefen */ + if( strlen( Req->argv[1] ) > 4 ) Req->argv[1][4] = '\0'; + if( strlen( Req->argv[1] ) != 4 ) protohigh = protolow = 0; + else + { + protolow = atoi( &Req->argv[1][2] ); + Req->argv[1][2] = '\0'; + protohigh = atoi( Req->argv[1] ); + } + + /* Implementation, Version und ngIRCd-Flags */ + impl = Req->argv[2]; + ptr = strchr( impl, '|' ); + if( ptr ) *ptr = '\0'; + + if( strcmp( impl, PACKAGE ) == 0 ) + { + /* auf der anderen Seite laeuft auch ein ngIRCd */ + serverver = ptr + 1; + flags = strchr( serverver, ':' ); + if( flags ) + { + *flags = '\0'; + flags++; + } + else flags = ""; + Log( LOG_INFO, "Connection %d: Peer announces itself as %s-%s (flags: \"%s\") using protocol version %d.%d.", Client_Conn( Client ), impl, serverver, flags, protohigh, protolow ); + } + else + { + serverver = flags = ""; + Log( LOG_INFO, "Connection %d: Peer announces itself as server of type \"%s\" usinf protocol version %d.%d.", Client_Conn( Client ), impl, protohigh, protolow ); + } + Client_SetType( Client, CLIENT_GOTPASSSERVER ); + Client_SetFlags( Client, flags ); + return CONNECTED; } else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) @@ -77,7 +122,8 @@ GLOBAL BOOLEAN IRC_PASS( CLIENT *Client, REQUEST *Req ) } /* IRC_PASS */ -GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_NICK( CLIENT *Client, REQUEST *Req ) { CLIENT *intr_c, *target, *c; CHAR *modes; @@ -215,7 +261,8 @@ GLOBAL BOOLEAN IRC_NICK( CLIENT *Client, REQUEST *Req ) } /* IRC_NICK */ -GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_USER( CLIENT *Client, REQUEST *Req ) { assert( Client != NULL ); assert( Req != NULL ); @@ -245,7 +292,8 @@ GLOBAL BOOLEAN IRC_USER( CLIENT *Client, REQUEST *Req ) } /* IRC_USER */ -GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_QUIT( CLIENT *Client, REQUEST *Req ) { CLIENT *target; @@ -287,7 +335,8 @@ GLOBAL BOOLEAN IRC_QUIT( CLIENT *Client, REQUEST *Req ) } /* IRC_QUIT */ -GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_PING( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from; @@ -322,7 +371,8 @@ GLOBAL BOOLEAN IRC_PING( CLIENT *Client, REQUEST *Req ) } /* IRC_PING */ -GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req ) +GLOBAL BOOLEAN +IRC_PONG( CLIENT *Client, REQUEST *Req ) { CLIENT *target, *from; @@ -360,7 +410,8 @@ GLOBAL BOOLEAN IRC_PONG( CLIENT *Client, REQUEST *Req ) } /* IRC_PONG */ -LOCAL BOOLEAN Hello_User( CLIENT *Client ) +LOCAL BOOLEAN +Hello_User( CLIENT *Client ) { assert( Client != NULL ); @@ -379,9 +430,9 @@ LOCAL BOOLEAN Hello_User( CLIENT *Client ) IRC_WriteStrServers( NULL, "NICK %s 1 %s %s 1 +%s :%s", Client_ID( Client ), Client_User( Client ), Client_Hostname( Client ), Client_Modes( Client ), Client_Info( Client )); if( ! IRC_WriteStrClient( Client, RPL_WELCOME_MSG, Client_ID( Client ), Client_Mask( Client ))) return FALSE; - if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, TARGET_CPU, TARGET_CPU, TARGET_OS )) return FALSE; if( ! IRC_WriteStrClient( Client, RPL_CREATED_MSG, Client_ID( Client ), NGIRCd_StartStr )) return FALSE; - if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )))) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_MYINFO_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, USERMODES, CHANMODES )) return FALSE; Client_SetType( Client, CLIENT_USER ); @@ -392,7 +443,8 @@ LOCAL BOOLEAN Hello_User( CLIENT *Client ) } /* Hello_User */ -LOCAL VOID Kill_Nick( CHAR *Nick, CHAR *Reason ) +LOCAL VOID +Kill_Nick( CHAR *Nick, CHAR *Reason ) { CLIENT *c;