0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-08 01:51:54 +00:00

Cli: automatic splitting of server->client lines by newline

This commit is contained in:
Jan Moskyto Matejka 2017-06-19 16:37:17 +02:00
parent 801fd81efe
commit f5d4593b56

View File

@ -121,42 +121,62 @@ cli_printf(cli *c, int code, char *msg, ...)
{
va_list args;
byte buf[CLI_LINE_SIZE];
byte *head = alloca(10);
int cd = code;
int errcode;
int size, cnt;
int size, hsize;
if (cd < 0)
{
cd = -cd;
if (cd == c->last_reply)
size = bsprintf(buf, " ");
hsize = bsprintf(head, " ");
else
size = bsprintf(buf, "%04d-", cd);
hsize = bsprintf(head, "%04d-", cd);
errcode = -8000;
}
else if (cd == CLI_ASYNC_CODE)
{
size = 1; buf[0] = '+';
hsize = 1; head[0] = '+';
errcode = cd;
}
else
{
size = bsprintf(buf, "%04d ", cd);
hsize = bsprintf(head, "%04d ", cd);
errcode = 8000;
}
c->last_reply = cd;
va_start(args, msg);
cnt = bvsnprintf(buf+size, sizeof(buf)-size-1, msg, args);
size = bvsnprintf(buf, sizeof(buf)-1, msg, args);
va_end(args);
if (cnt < 0)
if (size < 0)
{
cli_printf(c, errcode, "<line overflow>");
return;
}
size += cnt;
buf[size++] = '\n';
memcpy(cli_alloc_out(c, size), buf, size);
buf[size] = 0;
if (errcode == -8000) {
/* Buffer may contain multiple lines, split them. */
for (byte *b = buf, *e = strchr(buf, '\n'); e; b = e+1, e = strchr(b, '\n')) {
byte *out = cli_alloc_out(c, (e - b) + hsize + 1);
memcpy(out, head, hsize);
memcpy(out+hsize, b, (e - b) + 1);
head = " ";
hsize = 1;
}
} else {
/* Sanitize output for one-line versions of output. */
for (byte *b = strchr(buf, '\n'); (b-buf) < size-1; b = strchr(b, '\n'))
*b = '\t';
/* Now the output is one-line, newlines transformed to tabs. */
byte *out = cli_alloc_out(c, (size + hsize));
memcpy(out, head, hsize);
memcpy(out+hsize, buf, size);
}
}
static void