diff --git a/nest/cli.c b/nest/cli.c index 469d45b6..1debfccf 100644 --- a/nest/cli.c +++ b/nest/cli.c @@ -307,14 +307,14 @@ cli_event(void *data) } cli * -cli_new(void *priv) +cli_new(struct birdsock *sock) { pool *p = rp_new(cli_pool, "CLI"); cli *c = mb_alloc(p, sizeof(cli)); bzero(c, sizeof(cli)); c->pool = p; - c->priv = priv; + c->sock = sock; c->event = ev_new(p); c->event->hook = cli_event; c->event->data = c; @@ -415,7 +415,12 @@ cli_free(cli *c) if (c == cmd_reconfig_stored_cli) cmd_reconfig_stored_cli = NULL; - if (!defer) + if (defer) + { + rfree(c->sock); + c->sock = NULL; + } + else rfree(c->pool); } diff --git a/nest/cli.h b/nest/cli.h index 92572968..2b96da5b 100644 --- a/nest/cli.h +++ b/nest/cli.h @@ -28,7 +28,7 @@ struct cli_out { typedef struct cli { node n; /* Node in list of all log hooks */ pool *pool; - void *priv; /* Private to sysdep layer */ + struct birdsock *sock; /* Underlying socket */ byte *rx_buf, *rx_pos, *rx_aux; /* sysdep */ struct cli_out *tx_buf, *tx_pos, *tx_write; event *event; @@ -63,7 +63,7 @@ static inline void cli_separator(cli *c) /* Functions provided to sysdep layer */ -cli *cli_new(void *); +cli *cli_new(struct birdsock *); void cli_init(void); void cli_free(cli *); void cli_kick(cli *); diff --git a/nest/rt-show.c b/nest/rt-show.c index dc88047a..d8eb2174 100644 --- a/nest/rt-show.c +++ b/nest/rt-show.c @@ -233,6 +233,7 @@ static int rt_show_cleanup(struct cli *c) { struct rt_show_data *d = c->rover; + c->cleanup = NULL; /* Cancel the feed */ if (d->req.hook) diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index bf9f2be0..74827d98 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -395,7 +395,8 @@ static char *path_control_socket = PATH_CONTROL_SOCKET; static void cli_write(cli *c) { - sock *s = c->priv; + sock *s = c->sock; + ASSERT_DIE(c->sock); while (c->tx_pos) { @@ -419,7 +420,9 @@ cli_write(cli *c) void cli_write_trigger(cli *c) { - sock *s = c->priv; + sock *s = c->sock; + if (!s) + return; if (s->tbuf == NULL) cli_write(c); @@ -434,7 +437,8 @@ cli_tx(sock *s) int cli_get_command(cli *c) { - sock *s = c->priv; + sock *s = c->sock; + ASSERT_DIE(c->sock); byte *t = c->rx_aux ? : s->rbuf; byte *tend = s->rpos; byte *d = c->rx_pos; @@ -477,6 +481,7 @@ cli_err(sock *s, int err) else log(L_INFO "CLI connection closed"); } + cli_free(s->data); }