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 <arguments> are appended to the RHS of the rule, <help-args> is the argument list as shown in the help and <help-text> is description of the command for the help. <what-should-the-command-do> 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, <code> 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.
This commit is contained in:
parent
30770df2ab
commit
62a4639548
1 changed files with 22 additions and 2 deletions
|
@ -187,9 +187,29 @@ password_list:
|
||||||
|
|
||||||
/* Core commands */
|
/* Core commands */
|
||||||
|
|
||||||
CF_CLI(TEST LEDS, <N>, [[Flashes each LED <N> times]]) NUM { cli_msg(0, "%d", $3); } ;
|
/* FIXME: These are examples. Remove them soon. */
|
||||||
CF_CLI(TEST, 1, 2) { cli_msg(0, "OK"); }
|
CF_CLI_HELP(TEST, <subsystem>, [[Tests different subsystems]])
|
||||||
|
CF_CLI(TEST LEDS, NUM, <N>, [[Flashes each LED <N> 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
|
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
|
CF_END
|
||||||
|
|
Loading…
Reference in a new issue