- /* forwarden? */
- if( Req->argc == 2 )
- {
- target = Client_Search( Req->argv[1] );
- if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->argv[1] );
- if( target != Client_ThisServer( ))
- {
- /* ok, forwarden */
- if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
- else from = Client;
- if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG, Client_ID( Client ), Req->prefix );
- return IRC_WriteStrClientPrefix( target, from, "PONG %s :%s", Client_ID( from ), Req->argv[1] );
+ /* Wrong number of arguments? */
+ if (Req->argc < 1)
+ return IRC_WriteStrClient(Client, ERR_NOORIGIN_MSG,
+ Client_ID(Client));
+ if (Req->argc > 2)
+ return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Client), Req->command);
+
+ /* Forward? */
+ if (Req->argc == 2 && Client_Type(Client) == CLIENT_SERVER) {
+ target = Client_Search(Req->argv[0]);
+ if (!target)
+ return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
+ Client_ID(Client), Req->argv[0]);
+
+ from = Client_Search(Req->prefix);
+
+ if (target != Client_ThisServer() && target != from) {
+ /* Ok, we have to forward the message. */
+ if (!from)
+ return IRC_WriteStrClient(Client,
+ ERR_NOSUCHSERVER_MSG,
+ Client_ID(Client), Req->prefix);
+
+ if (Client_Type(Client_NextHop(target)) != CLIENT_SERVER)
+ s = Client_ID(from);
+ else
+ s = Req->argv[0];
+ return IRC_WriteStrClientPrefix(target, from,
+ "PONG %s :%s", s, Req->argv[1]);