X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-login.c;h=fecde8aeafa534976feef6bab4b2aee6b314454c;hb=7a6f99a607176e9172877fe3de68c3cf8f700166;hp=b8528084e0cc8df388c16a3af795915e3808d04f;hpb=f7327524fce6a7db28850c8b8b8f0e99d0b2402b;p=ngircd-alex.git diff --git a/src/ngircd/irc-login.c b/src/ngircd/irc-login.c index b8528084..fecde8ae 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.15 2002/05/30 16:52:21 alex Exp $ + * $Id: irc-login.c,v 1.23 2002/11/26 23:07:24 alex Exp $ * * irc-login.c: Anmeldung und Abmeldung im IRC */ @@ -65,13 +65,71 @@ 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 c2, c4, *type, *impl, *serverver, *flags, *ptr, *ircflags; + 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 ermitteln */ + if( strlen( Req->argv[1] ) >= 4 ) + { + c2 = Req->argv[1][2]; + c4 = Req->argv[1][4]; + + Req->argv[1][4] = '\0'; + protolow = atoi( &Req->argv[1][2] ); + Req->argv[1][2] = '\0'; + protohigh = atoi( Req->argv[1] ); + + Req->argv[1][2] = c2; + Req->argv[1][4] = c4; + } + else protohigh = protolow = 0; + + /* Protokoll-Typ */ + if( strlen( Req->argv[1] ) > 4 ) type = &Req->argv[1][4]; + else type = NULL; + + /* IRC-Flags (nach RFC 2813) */ + if( Req->argc >= 4 ) ircflags = Req->argv[3]; + else ircflags = ""; + + /* Implementation, Version und ngIRCd-Flags */ + impl = Req->argv[2]; + ptr = strchr( impl, '|' ); + if( ptr ) *ptr = '\0'; + + if( type && ( strcmp( type, PROTOIRCPLUS ) == 0 )) + { + /* auf der anderen Seite laeuft ein Server, der + * ebenfalls das IRC+-Protokoll versteht */ + serverver = ptr + 1; + flags = strchr( serverver, ':' ); + if( flags ) + { + *flags = '\0'; + flags++; + } + else flags = ""; + Log( LOG_INFO, "Connection %d: Peer announces itself as %s-%s using protocol %d.%d/IRC+ (flags: \"%s\").", Client_Conn( Client ), impl, serverver, protohigh, protolow, flags ); + } + else + { + /* auf der anderen Seite laeuft ein Server, der + * nur das Originalprotokoll unterstuetzt */ + serverver = ""; + if( strchr( ircflags, 'Z' )) flags = "Z"; + else flags = ""; + Log( LOG_INFO, "Connection %d: Peer announces itself as \"%s\" using protocol %d.%d (flags: \"%s\").", Client_Conn( Client ), impl, protohigh, protolow, flags ); + } + Client_SetType( Client, CLIENT_GOTPASSSERVER ); + Client_SetFlags( Client, flags ); + return CONNECTED; } else if(( Client_Type( Client ) == CLIENT_UNKNOWN ) || ( Client_Type( Client ) == CLIENT_UNKNOWNSERVER )) @@ -391,7 +449,7 @@ 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( )), VERSION, TARGET_CPU, TARGET_CPU, TARGET_OS )) return FALSE; + if( ! IRC_WriteStrClient( Client, RPL_YOURHOST_MSG, Client_ID( Client ), Client_ID( Client_ThisServer( )), VERSION, TARGET_CPU, TARGET_VENDOR, 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( )), VERSION, USERMODES, CHANMODES )) return FALSE;