commit - 93a52dfab86da096e629a8e2f86229245378ac68
commit + 180095be32cbe1ac983cfc91f39af1ac4ba7c370
blob - 2a8a6149f5d126eb416c4b8713a1bf8e894a8981
blob + 889ab5383dc2ba0ec2f5bab6d222f24a78a9fc03
--- src/ngircd/irc.c
+++ src/ngircd/irc.c
* Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
* der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
*
- * $Id: irc.c,v 1.70 2002/02/26 22:06:40 alex Exp $
+ * $Id: irc.c,v 1.71 2002/02/27 00:50:05 alex Exp $
*
* irc.c: IRC-Befehle
*
* $Log: irc.c,v $
+ * Revision 1.71 2002/02/27 00:50:05 alex
+ * - einige unnoetige Client_NextHop()-Aufrufe entfernt.
+ * - NAMES korrigiert und komplett implementiert.
+ *
* Revision 1.70 2002/02/26 22:06:40 alex
* - Nick-Aenderungen werden nun wieder korrekt ins Logfile geschrieben.
*
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
- return IRC_WriteStrClientPrefix( Client_NextHop( target ), from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
+ return IRC_WriteStrClientPrefix( target, from, "PING %s :%s", Client_ID( from ), Req->argv[1] );
}
}
if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
else from = Client;
if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
- return IRC_WriteStrClientPrefix( Client_NextHop( target ), from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
+ return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
}
}
GLOBAL BOOLEAN IRC_NAMES( CLIENT *Client, REQUEST *Req )
{
- CHAR rpl[COMMAND_LEN];
- CLIENT *c;
+ CHAR rpl[COMMAND_LEN], *ptr;
+ CLIENT *target, *from, *c;
+ CHANNEL *chan;
assert( Client != NULL );
assert( Req != NULL );
- if( Client_Type( Client ) != CLIENT_USER ) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
+ if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
/* Falsche Anzahl Parameter? */
- if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
+ if( Req->argc > 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
- /* Noch alle User ausgeben, die in keinem Channel sind */
- rpl[0] = '\0';
- c = Client_First( );
- while( c )
- {
- if( Client_Type( c ) == CLIENT_USER )
+ /* From aus Prefix ermitteln */
+ if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_GetFromID( Req->prefix );
+ else from = Client;
+ if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
+
+ if( Req->argc == 2 )
+ {
+ /* an anderen Server forwarden */
+ target = Client_GetFromID( Req->argv[1] );
+ if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
+
+ if( target != Client_ThisServer( ))
{
- /* Okay, das ist ein User */
- strcat( rpl, Client_ID( c ));
- strcat( rpl, " " );
+ /* Ok, anderer Server ist das Ziel: forwarden */
+ return IRC_WriteStrClientPrefix( target, from, "NAMES %s :%s", Req->argv[0], Req->argv[1] );
}
+ }
- /* Antwort zu lang? Splitten. */
- if( strlen( rpl ) > 480 )
+ if( Req->argc > 0 )
+ {
+ /* bestimmte Channels durchgehen */
+ ptr = strtok( Req->argv[0], "," );
+ while( ptr )
{
- if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
- if( ! IRC_WriteStrClient( Client, RPL_NAMREPLY_MSG, Client_ID( Client ), "*", "*", rpl )) return DISCONNECTED;
- rpl[0] = '\0';
+ chan = Channel_Search( ptr );
+ if( chan )
+ {
+ /* Namen ausgeben */
+ if( ! Send_NAMES( from, chan )) return DISCONNECTED;
+ }
+ if( ! IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), ptr )) return DISCONNECTED;
+
+ /* naechsten Namen ermitteln */
+ ptr = strtok( NULL, "," );
}
-
+ return CONNECTED;
+ }
+
+ /* alle Channels durchgehen */
+ chan = Channel_First( );
+ while( chan )
+ {
+ /* Namen ausgeben */
+ if( ! Send_NAMES( from, chan )) return DISCONNECTED;
+
+ /* naechster Channel */
+ chan = Channel_Next( chan );
+ }
+
+ c = Client_First( );
+ sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" );
+ while( c )
+ {
+ if(( Client_Type( c ) == CLIENT_USER ) && ( Channel_FirstChannelOf( c ) == NULL ))
+ {
+ /* Okay, das ist ein User: anhaengen */
+ if( rpl[strlen( rpl ) - 1] != ':' ) strcat( rpl, " " );
+ strcat( rpl, Client_ID( c ));
+
+ if( strlen( rpl ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
+ {
+ /* Zeile wird zu lang: senden! */
+ if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
+ sprintf( rpl, RPL_NAMREPLY_MSG, Client_ID( from ), "*", "*" );
+ }
+ }
+
+ /* naechster Client */
c = Client_Next( c );
}
- if( rpl[0] )
+ if( rpl[strlen( rpl ) - 1] != ':')
{
/* es wurden User gefunden */
- if( rpl[strlen( rpl ) - 1] == ' ' ) rpl[strlen( rpl ) - 1] = '\0';
- if( ! IRC_WriteStrClient( Client, RPL_NAMREPLY_MSG, Client_ID( Client ), "*", "*", rpl )) return DISCONNECTED;
+ if( ! IRC_WriteStrClient( from, rpl )) return DISCONNECTED;
}
- return IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), "*" );
+
+ return IRC_WriteStrClient( from, RPL_ENDOFNAMES_MSG, Client_ID( from ), "*" );
} /* IRC_NAMES */
{
/* an Client bestaetigen */
IRC_WriteStrClientPrefix( Client, target, "JOIN :%s", channame );
+
/* Topic an Client schicken */
IRC_WriteStrClient( Client, RPL_TOPIC_MSG, Client_ID( Client ), channame, "What a wonderful channel!" );
+
/* Mitglieder an Client Melden */
Send_NAMES( Client, chan );
+ IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( chan ));
}
/* naechsten Namen ermitteln */
if( ! target ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[0] );
/* forwarden */
- IRC_WriteStrClientPrefix( Client_NextHop( target ), prefix, "VERSION %s", Req->argv[0] );
+ IRC_WriteStrClientPrefix( target, prefix, "VERSION %s", Req->argv[0] );
return CONNECTED;
}
if( ! IRC_WriteStrClient( Client, str )) return DISCONNECTED;
}
- /* Ende anzeigen */
- IRC_WriteStrClient( Client, RPL_ENDOFNAMES_MSG, Client_ID( Client ), Channel_Name( Chan ));
-
return CONNECTED;
} /* Send_NAMES */