repo: ngircd
action: commit
revision: 
path_from: 
revision_from: 3243d9ee441e9cd4338965bac7c2ed3b49a3c2dd:
path_to: 
revision_to: 
git.thebackupbox.net
ngircd
git clone git://git.thebackupbox.net/ngircd
commit 3243d9ee441e9cd4338965bac7c2ed3b49a3c2dd
Author: Alexander Barton 
Date:   Wed Nov 19 18:13:03 2008 +0100

    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 ee60566ecd9a0ea366fd888c92528594c4d65343..
index ..4ac2a47857088ccf6eb269dc3181b3274418d49f 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 d6a92c96b9b1fc4bfe8d1ee584389f48ebe13326..
index ..562f778de1c8a86810231bb23826ca9e6b2446ea 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"

-----END OF PAGE-----