commit 3243d9ee441e9cd4338965bac7c2ed3b49a3c2dd from: Alexander Barton date: Wed Nov 19 17:16:26 2008 UTC 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). commit - 672b391523fcc33e4645980c10342478dd1baeb0 commit + 3243d9ee441e9cd4338965bac7c2ed3b49a3c2dd blob - ee60566ecd9a0ea366fd888c92528594c4d65343 blob + 4ac2a47857088ccf6eb269dc3181b3274418d49f --- src/ngircd/irc-info.c +++ src/ngircd/irc-info.c @@ -270,18 +270,36 @@ 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); if (Req->argc > 2) 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] : "*", blob - d6a92c96b9b1fc4bfe8d1ee584389f48ebe13326 blob + 562f778de1c8a86810231bb23826ca9e6b2446ea --- src/ngircd/messages.h +++ 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"