Implement the IRC command "SERVLIST"

The IRC command "SERVLIST" lists all the registered services, see RFC 2811, section 3.5.1.
The syntax is "SERVLIST [<mask> [<type>]]". The parameter <type> is not used by ngIRCd at
the moment, all registered services are of type 0 (which is the default when omitted).
This commit is contained in:
Alexander Barton 2008-11-19 18:13:03 +01:00
parent 672b391523
commit 3243d9ee44
2 changed files with 21 additions and 2 deletions

View File

@ -270,12 +270,15 @@ IRC_LUSERS( CLIENT *Client, REQUEST *Req )
/**
* List registered services.
* This function is a dummy that immediately returns RPL_SERVLISTEND.
* Handler for the IRC command "SERVLIST".
* List registered services, see RFC 2811, section 3.5.1: the syntax is
* "SERVLIST [<mask> [<type>]]".
*/
GLOBAL bool
IRC_SERVLIST(CLIENT *Client, REQUEST *Req)
{
CLIENT *c;
assert(Client != NULL);
assert(Req != NULL);
@ -283,6 +286,21 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req)
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
Client_ID(Client), Req->command);
if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) {
for (c = Client_First(); c!= NULL; c = Client_Next(c)) {
if (Client_Type(c) != CLIENT_SERVICE)
continue;
if (Req->argc > 0 && !MatchCaseInsensitive(Req->argv[0],
Client_ID(c)))
continue;
if (!IRC_WriteStrClient(Client, RPL_SERVLIST_MSG,
Client_ID(Client), Client_Mask(c),
Client_Mask(Client_Introducer(c)), "*",
0, Client_Hops(c), Client_Info(c)))
return DISCONNECTED;
}
}
return IRC_WriteStrClient(Client, RPL_SERVLISTEND_MSG, Client_ID(Client),
Req->argc > 0 ? Req->argv[0] : "*",
Req->argc > 1 ? Req->argv[1] : "0");

View File

@ -30,6 +30,7 @@
#define RPL_STATSCOMMANDS_MSG "212 %s %s %ld %ld %ld"
#define RPL_ENDOFSTATS_MSG "219 %s %c :End of STATS report"
#define RPL_UMODEIS_MSG "221 %s +%s"
#define RPL_SERVLIST_MSG "234 %s %s %s %s %d %d :%s"
#define RPL_SERVLISTEND_MSG "235 %s %s %s :End of service listing"
#define RPL_STATSUPTIME "242 %s :Server Up %u days %u:%02u:%02u"