From: Alexander Barton Date: Wed, 19 Nov 2008 17:13:03 +0000 (+0100) Subject: Implement the IRC command "SERVLIST" X-Git-Tag: rel-13-rc1~6 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=commitdiff_plain;h=3243d9ee441e9cd4338965bac7c2ed3b49a3c2dd 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 [ []]". The parameter is not used by ngIRCd at the moment, all registered services are of type 0 (which is the default when omitted). --- diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c index ee60566e..4ac2a478 100644 --- a/src/ngircd/irc-info.c +++ b/src/ngircd/irc-info.c @@ -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 [ []]". */ 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"); diff --git a/src/ngircd/messages.h b/src/ngircd/messages.h index d6a92c96..562f778d 100644 --- a/src/ngircd/messages.h +++ b/src/ngircd/messages.h @@ -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"