From 62a463954815748d0d82da0e30651e6eea7bc9cf Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Wed, 17 Nov 1999 12:14:44 +0000 Subject: [PATCH] Added some temporary examples of how to define CLI commands (search for CF_CLI). To define a new command, just add a new rule to the gramar: CF_CLI(COMMAND NAME, arguments, help-args, help-text) { what-should-the-command-do } ; where are appended to the RHS of the rule, is the argument list as shown in the help and is description of the command for the help. is a C code snippet to be executed. It should not take too much time to execute. If you want to print out a lot of information, you can schedule a routine to be called after the current buffer is flushed by making cli->cont point to the routine (see the TEST LONG command definition for an example); if the connection is closed in the meantime, cli->cleanup gets called. You can access `struct cli' belonging to the connection you're currently servicing as this_cli, but only during parse time, not from routines scheduled for deferred execution. Functions to call inside command handlers: cli_printf(cli, code, printf-args) -- print text to CLI connection, is message code as assigned in doc/reply_codes or a negative one if it's a continuation line. cli_msg(code, printf-args) -- the same for this_cli. Use 'sock -x bird.ctl' for connecting to the CLI until a client is written. --- nest/config.Y | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/nest/config.Y b/nest/config.Y index 6a630b21..4000b6dc 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -187,9 +187,29 @@ password_list: /* Core commands */ -CF_CLI(TEST LEDS, , [[Flashes each LED times]]) NUM { cli_msg(0, "%d", $3); } ; -CF_CLI(TEST, 1, 2) { cli_msg(0, "OK"); } +/* FIXME: These are examples. Remove them soon. */ +CF_CLI_HELP(TEST, , [[Tests different subsystems]]) +CF_CLI(TEST LEDS, NUM, , [[Flashes each LED times]]) { cli_msg(0, "%d", $3); } ; +CF_CLI(TEST MEMORY,,, [[Replace all useful information by testing patterns]]) { cli_msg(0, "DONE"); } ; +CF_CLI(TEST LONG,,, [[Test long replies]]) { + static void test_command(struct cli *); + this_cli->cont = test_command; + this_cli->rover = (void *) 1; + cli_msg(-2, "Start"); +} ; CF_CODE +static void test_command(struct cli *c) +{ + int i = (int) c->rover; + if (i < 10) { + cli_printf(c, -3, "%d", i); + c->rover = (void *) ++i; + } else { + c->cont = NULL; + cli_printf(c, 4, "DONE"); + } +} + CF_END