[PATCH 1/3] base/query_handler: Implement a simple help handler

robin.sonefors at op5.com robin.sonefors at op5.com
Wed Nov 28 15:37:21 CET 2012


From: Robin Sonefors <robin.sonefors at op5.com>

Because the query handlers are plentiful and nifty, they're something I
should be using, but because I'm bad at remembering things and tired of
reading the source to find out how things work, I need help.

The way I can think of to get help is to try to exercise peer pressure
on whoever writes the query handler, by telling users that there should
be a help text, and then giving them errors error messages when the
query handler doesn't have any help text.

The protocol used by the help query handler for asking other handlers
for help is simply the "help" query.

Signed-off-by: Robin Sonefors <robin.sonefors at op5.com>
---
 base/query-handler.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/base/query-handler.c b/base/query-handler.c
index 8d3cfe3..51acd63 100644
--- a/base/query-handler.c
+++ b/base/query-handler.c
@@ -257,6 +257,31 @@ void qh_deinit(const char *path)
 	unlink(path);
 }
 
+static int qh_help(int sd, char *buf, unsigned int len)
+{
+	struct query_handler *qh;
+	if (!strcmp(buf, "list")) {
+		int i = 0;
+		for (qh = qhandlers; qh; qh = qh->next_qh) {
+			nsock_printf(sd, "%s\n", qh->name);
+		}
+		nsock_printf(sd, 0);
+		return 0;
+	}
+	if (strcmp(buf, "help") && ((qh = qh_find_handler(buf)) != FALSE)) {
+		int res = qh->handler(sd, "help", 4);
+		if (res > 200) {
+			nsock_printf_nul(sd, "The handler %s doesn't have any help yet.", buf);
+		}
+		return 0;
+	}
+
+	nsock_printf_nul(sd, "This is the help query handler.\n"
+		"Try \"#help list\" to see all registered handlers, or\n"
+		"\"#help <handler>\" to get help on a specific handler.");
+	return 0;
+}
+
 static int qh_core(int sd, char *buf, unsigned int len)
 {
 	char *space;
@@ -342,5 +367,8 @@ int qh_init(const char *path)
 	if(!qh_register_handler("core", 0, qh_core))
 		logit(NSLOG_INFO_MESSAGE, FALSE, "qh: core query handler registered\n");
 
+	if(!qh_register_handler("help", 0, qh_help))
+		logit(NSLOG_INFO_MESSAGE, FALSE, "qh: help query handler registered\n");
+
 	return 0;
 }
-- 
1.7.11.7


------------------------------------------------------------------------------
Keep yourself connected to Go Parallel: 
INSIGHTS What's next for parallel hardware, programming and related areas?
Interviews and blogs by thought leaders keep you ahead of the curve.
http://goparallel.sourceforge.net




More information about the Developers mailing list