The CLI I/O functions work as desired.
This commit is contained in:
parent
7d3aab1c16
commit
b9672a845f
5 changed files with 83 additions and 62 deletions
116
nest/cli.c
116
nest/cli.c
|
@ -17,36 +17,60 @@ cli_printf(cli *c, int code, char *msg, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
byte buf[1024];
|
byte buf[1024];
|
||||||
int flag = (code < 0) ? '-' : ' ';
|
int cd = code;
|
||||||
int size;
|
int size, cnt;
|
||||||
struct cli_out *o;
|
struct cli_out *o;
|
||||||
|
|
||||||
va_start(args, msg);
|
va_start(args, msg);
|
||||||
if (code < 0)
|
if (cd < 0)
|
||||||
code = -code;
|
{
|
||||||
bsprintf(buf, "%04d%c", code, flag);
|
cd = -cd;
|
||||||
size = bvsnprintf(buf+5, sizeof(buf)-6, msg, args);
|
if (cd == c->last_reply)
|
||||||
if (size < 0)
|
size = bsprintf(buf, " ");
|
||||||
size = bsprintf(buf, "9999%c<line overflow>", flag);
|
else
|
||||||
|
size = bsprintf(buf, "%04d-", cd);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
size += 5;
|
size = bsprintf(buf, "%04d ", cd);
|
||||||
|
c->last_reply = cd;
|
||||||
|
cnt = bvsnprintf(buf+size, sizeof(buf)-size-1, msg, args);
|
||||||
|
if (cnt < 0)
|
||||||
|
{
|
||||||
|
cli_printf(c, code < 0 ? -8000 : 8000, "<line overflow>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
size += cnt;
|
||||||
buf[size++] = '\n';
|
buf[size++] = '\n';
|
||||||
if (!(o = c->tx_write) || o->wpos + size > o->end)
|
if (!(o = c->tx_write) || o->wpos + size > o->end)
|
||||||
{
|
{
|
||||||
o = mb_alloc(c->pool, sizeof(struct cli_out) + CLI_TX_BUF_SIZE);
|
if (!o && c->tx_buf)
|
||||||
if (c->tx_write)
|
o = c->tx_buf;
|
||||||
c->tx_write->next = o;
|
|
||||||
else
|
else
|
||||||
c->tx_buf = o;
|
{
|
||||||
o->next = NULL;
|
o = mb_alloc(c->pool, sizeof(struct cli_out) + CLI_TX_BUF_SIZE);
|
||||||
o->wpos = o->outpos = o->buf;
|
if (c->tx_write)
|
||||||
o->end = o->buf + CLI_TX_BUF_SIZE;
|
c->tx_write->next = o;
|
||||||
|
else
|
||||||
|
c->tx_buf = o;
|
||||||
|
o->next = NULL;
|
||||||
|
o->wpos = o->outpos = o->buf;
|
||||||
|
o->end = o->buf + CLI_TX_BUF_SIZE;
|
||||||
|
}
|
||||||
c->tx_write = o;
|
c->tx_write = o;
|
||||||
|
if (!c->tx_pos)
|
||||||
|
c->tx_pos = o;
|
||||||
}
|
}
|
||||||
memcpy(o->wpos, buf, size);
|
memcpy(o->wpos, buf, size);
|
||||||
o->wpos += size;
|
o->wpos += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cli_hello(cli *c)
|
||||||
|
{
|
||||||
|
cli_printf(c, 1, "BIRD " BIRD_VERSION " ready.");
|
||||||
|
c->cont = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cli_free_out(cli *c)
|
cli_free_out(cli *c)
|
||||||
{
|
{
|
||||||
|
@ -54,7 +78,7 @@ cli_free_out(cli *c)
|
||||||
|
|
||||||
if (o = c->tx_buf)
|
if (o = c->tx_buf)
|
||||||
{
|
{
|
||||||
c->tx_write = o;
|
c->tx_write = NULL;
|
||||||
o->wpos = o->outpos = o->buf;
|
o->wpos = o->outpos = o->buf;
|
||||||
while (p = o->next)
|
while (p = o->next)
|
||||||
{
|
{
|
||||||
|
@ -65,8 +89,28 @@ cli_free_out(cli *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cli_flush(cli *c)
|
cli_event(void *data)
|
||||||
{
|
{
|
||||||
|
cli *c = data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (c->tx_pos)
|
||||||
|
;
|
||||||
|
else if (c->cont)
|
||||||
|
c->cont(c);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = cli_get_command(c);
|
||||||
|
if (!err)
|
||||||
|
return 0;
|
||||||
|
if (err < 0)
|
||||||
|
cli_printf(c, 9000, "Command too long");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cli_printf(c, -9001, "Parse error in:");
|
||||||
|
cli_printf(c, 9001, c->rx_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (cli_write(c))
|
if (cli_write(c))
|
||||||
{
|
{
|
||||||
cli_free_out(c);
|
cli_free_out(c);
|
||||||
|
@ -75,30 +119,6 @@ cli_flush(cli *c)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
cli_event(void *data)
|
|
||||||
{
|
|
||||||
cli *c = data;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
debug("CLI EVENT\n");
|
|
||||||
if (!c->inited)
|
|
||||||
{
|
|
||||||
c->inited = 1;
|
|
||||||
cli_printf(c, 0, "Welcome!");
|
|
||||||
cli_printf(c, 0, "Here");
|
|
||||||
return cli_flush(c);
|
|
||||||
}
|
|
||||||
err = cli_get_command(c);
|
|
||||||
if (!err)
|
|
||||||
return 0;
|
|
||||||
if (err < 0)
|
|
||||||
debug("CLI CMD ERR\n");
|
|
||||||
else
|
|
||||||
debug("CLI CMD %s\n", c->rx_buf);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cli *
|
cli *
|
||||||
cli_new(void *priv)
|
cli_new(void *priv)
|
||||||
{
|
{
|
||||||
|
@ -111,24 +131,24 @@ cli_new(void *priv)
|
||||||
c->event->hook = cli_event;
|
c->event->hook = cli_event;
|
||||||
c->event->data = c;
|
c->event->data = c;
|
||||||
c->tx_buf = c->tx_pos = c->tx_write = NULL;
|
c->tx_buf = c->tx_pos = c->tx_write = NULL;
|
||||||
c->inited = 0;
|
c->cont = cli_hello;
|
||||||
cli_kick(c);
|
c->last_reply = 0;
|
||||||
|
ev_schedule(c->event);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cli_kick(cli *c)
|
cli_kick(cli *c)
|
||||||
{
|
{
|
||||||
debug("CLI KICK\n");
|
if (!c->cont && !c->tx_pos)
|
||||||
ev_schedule(c->event);
|
ev_schedule(c->event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cli_written(cli *c)
|
cli_written(cli *c)
|
||||||
{
|
{
|
||||||
debug("CLI WRITTEN\n");
|
|
||||||
cli_free_out(c);
|
cli_free_out(c);
|
||||||
cli_kick(c);
|
ev_schedule(c->event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
14
nest/cli.h
14
nest/cli.h
|
@ -24,26 +24,32 @@ struct cli_out {
|
||||||
typedef struct cli {
|
typedef struct cli {
|
||||||
pool *pool;
|
pool *pool;
|
||||||
void *priv; /* Private to sysdep layer */
|
void *priv; /* Private to sysdep layer */
|
||||||
int inited;
|
|
||||||
byte rx_buf[CLI_RX_BUF_SIZE];
|
byte rx_buf[CLI_RX_BUF_SIZE];
|
||||||
byte *rx_pos, *rx_aux; /* sysdep */
|
byte *rx_pos, *rx_aux; /* sysdep */
|
||||||
struct cli_out *tx_buf, *tx_pos, *tx_write;
|
struct cli_out *tx_buf, *tx_pos, *tx_write;
|
||||||
event *event;
|
event *event;
|
||||||
|
void (*cont)(struct cli *c);
|
||||||
|
void *rover; /* Private to continuation routine */
|
||||||
|
int last_reply;
|
||||||
} cli;
|
} cli;
|
||||||
|
|
||||||
extern pool *cli_pool;
|
extern pool *cli_pool;
|
||||||
|
|
||||||
|
/* Functions to be called by command handlers */
|
||||||
|
|
||||||
|
void cli_printf(cli *, int, char *, ...);
|
||||||
|
|
||||||
|
/* Functions provided to sysdep layer */
|
||||||
|
|
||||||
cli *cli_new(void *);
|
cli *cli_new(void *);
|
||||||
void cli_init(void);
|
void cli_init(void);
|
||||||
void cli_free(cli *);
|
void cli_free(cli *);
|
||||||
void cli_kick(cli *);
|
void cli_kick(cli *);
|
||||||
void cli_written(cli *);
|
void cli_written(cli *);
|
||||||
void cli_printf(cli *, int, char *, ...);
|
|
||||||
|
|
||||||
/* Function provided by sysdep layer */
|
/* Functions provided by sysdep layer */
|
||||||
|
|
||||||
int cli_write(cli *);
|
int cli_write(cli *);
|
||||||
void cli_disconnect(cli *);
|
|
||||||
int cli_get_command(cli *);
|
int cli_get_command(cli *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
#ifndef _BIRD_CONFIG_H_
|
#ifndef _BIRD_CONFIG_H_
|
||||||
#define _BIRD_CONFIG_H_
|
#define _BIRD_CONFIG_H_
|
||||||
|
|
||||||
|
/* BIRD version */
|
||||||
|
#define BIRD_VERSION "0.0.0"
|
||||||
|
|
||||||
/* Include parameters determined by configure script */
|
/* Include parameters determined by configure script */
|
||||||
#include "sysdep/autoconf.h"
|
#include "sysdep/autoconf.h"
|
||||||
|
|
||||||
|
|
|
@ -93,12 +93,6 @@ async_config(void)
|
||||||
|
|
||||||
static sock *cli_sk;
|
static sock *cli_sk;
|
||||||
|
|
||||||
void
|
|
||||||
cli_disconnect(cli *c)
|
|
||||||
{
|
|
||||||
bug("CLI DISCONNECT: Not implemented"); /* FIXME */
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cli_write(cli *c)
|
cli_write(cli *c)
|
||||||
{
|
{
|
||||||
|
@ -146,7 +140,6 @@ cli_get_command(cli *c)
|
||||||
static int
|
static int
|
||||||
cli_rx(sock *s, int size)
|
cli_rx(sock *s, int size)
|
||||||
{
|
{
|
||||||
debug("CLI RX\n");
|
|
||||||
cli_kick(s->data);
|
cli_kick(s->data);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -156,7 +149,6 @@ cli_tx(sock *s)
|
||||||
{
|
{
|
||||||
cli *c = s->data;
|
cli *c = s->data;
|
||||||
|
|
||||||
debug("CLI TX\n");
|
|
||||||
if (cli_write(c))
|
if (cli_write(c))
|
||||||
cli_written(c);
|
cli_written(c);
|
||||||
}
|
}
|
||||||
|
@ -313,7 +305,7 @@ main(int argc, char **argv)
|
||||||
setvbuf(stderr, NULL, _IONBF, 0);
|
setvbuf(stderr, NULL, _IONBF, 0);
|
||||||
parse_args(argc, argv);
|
parse_args(argc, argv);
|
||||||
|
|
||||||
log(L_INFO "Launching BIRD 0.0.0...");
|
log(L_INFO "Launching BIRD " BIRD_VERSION "...");
|
||||||
|
|
||||||
debug("Initializing.\n");
|
debug("Initializing.\n");
|
||||||
resource_init();
|
resource_init();
|
||||||
|
|
|
@ -32,7 +32,7 @@ tags:
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
find . -name "*.[oa]" -or -name core -or -name depend | xargs rm -f
|
find . -name "*.[oa]" -or -name core -or -name depend | xargs rm -f
|
||||||
rm -f $(exedir)/bird $(exedir)/birdc .dep-stamp
|
rm -f $(exedir)/bird $(exedir)/birdc $(exedir)/bird.ctl .dep-stamp
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
rm -f config.* configure sysdep/autoconf.h Makefile Rules
|
rm -f config.* configure sysdep/autoconf.h Makefile Rules
|
||||||
|
|
Loading…
Reference in a new issue