summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nest/cli.h2
-rw-r--r--sysdep/unix/main.c15
2 files changed, 11 insertions, 6 deletions
diff --git a/nest/cli.h b/nest/cli.h
index 8a3294c5..3596e37c 100644
--- a/nest/cli.h
+++ b/nest/cli.h
@@ -29,7 +29,7 @@ typedef struct cli {
node n; /* Node in list of all log hooks */
pool *pool;
void *priv; /* Private to sysdep layer */
- byte *rx_buf, *rx_pos, *rx_aux; /* sysdep */
+ byte *rx_buf, *rx_pos; /* sysdep */
struct cli_out *tx_buf, *tx_pos, *tx_write;
event *event;
void (*cont)(struct cli *c);
diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c
index 18fd4e44..627d7a4a 100644
--- a/sysdep/unix/main.c
+++ b/sysdep/unix/main.c
@@ -441,7 +441,7 @@ int
cli_get_command(cli *c)
{
sock *s = c->priv;
- byte *t = c->rx_aux ? : s->rbuf;
+ byte *t = s->rbuf;
byte *tend = s->rpos;
byte *d = c->rx_pos;
byte *dend = c->rx_buf + CLI_RX_BUF_SIZE - 2;
@@ -452,16 +452,22 @@ cli_get_command(cli *c)
t++;
else if (*t == '\n')
{
+ *d = 0;
t++;
+
+ /* Move remaining data and reset pointers */
+ uint rest = (t < tend) ? (tend - t) : 0;
+ memmove(s->rbuf, t, rest);
+ s->rpos = s->rbuf + rest;
c->rx_pos = c->rx_buf;
- c->rx_aux = t;
- *d = 0;
+
return (d < dend) ? 1 : -1;
}
else if (d < dend)
*d++ = *t++;
}
- c->rx_aux = s->rpos = s->rbuf;
+
+ s->rpos = s->rbuf;
c->rx_pos = d;
return 0;
}
@@ -508,7 +514,6 @@ cli_connect(sock *s, uint size UNUSED)
s->pool = c->pool; /* We need to have all the socket buffers allocated in the cli pool */
s->fast_rx = 1;
c->rx_pos = c->rx_buf;
- c->rx_aux = NULL;
rmove(s, c->pool);
return 1;
}