Commit d85a8e5e authored by Dag Erling Smørgrav's avatar Dag Erling Smørgrav

Restructure mgt_cli_callback(), and add comments to make it clear what's

going on.  Also take care of a bug where strchr() was used on a non-NUL-
terminated buffer.  This fixes #134.


git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@1855 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 9545e22a
...@@ -284,8 +284,8 @@ struct cli_port { ...@@ -284,8 +284,8 @@ struct cli_port {
int fdo; int fdo;
int verbose; int verbose;
char *buf; char *buf;
unsigned nbuf; int nbuf; /* next free position in buf */
unsigned lbuf; int lbuf; /* length of buf */
struct cli cli[1]; struct cli cli[1];
char name[30]; char name[30];
}; };
...@@ -294,39 +294,53 @@ static int ...@@ -294,39 +294,53 @@ static int
mgt_cli_callback(struct ev *e, int what) mgt_cli_callback(struct ev *e, int what)
{ {
struct cli_port *cp; struct cli_port *cp;
char *p; char *p, *q;
int i; int i;
CAST_OBJ_NOTNULL(cp, e->priv, CLI_PORT_MAGIC); CAST_OBJ_NOTNULL(cp, e->priv, CLI_PORT_MAGIC);
while (!(what & (EV_ERR | EV_HUP))) { if (what & (EV_ERR | EV_HUP))
goto cli_close;
/* grow the buffer if it is full */
if (cp->nbuf == cp->lbuf) { if (cp->nbuf == cp->lbuf) {
cp->lbuf += cp->lbuf; cp->lbuf += cp->lbuf;
cp->buf = realloc(cp->buf, cp->lbuf); cp->buf = realloc(cp->buf, cp->lbuf);
XXXAN(cp->buf); XXXAN(cp->buf);
} }
/* read more data into the buffer */
i = read(cp->fdi, cp->buf + cp->nbuf, cp->lbuf - cp->nbuf); i = read(cp->fdi, cp->buf + cp->nbuf, cp->lbuf - cp->nbuf);
if (i <= 0) if (i <= 0)
break; goto cli_close;
cp->nbuf += i; cp->nbuf += i;
p = strchr(cp->buf, '\n');
if (p == NULL) for (p = q = cp->buf; q < cp->buf + cp->nbuf; ++q) {
return (0); if (*q != '\n')
*p = '\0'; continue;
fprintf(stderr, "CLI <%s>\n", cp->buf); /* got a newline == got a command */
*q = '\0';
vsb_clear(cp->cli->sb); vsb_clear(cp->cli->sb);
cli_dispatch(cp->cli, cli_proto, cp->buf); cli_dispatch(cp->cli, cli_proto, p);
vsb_finish(cp->cli->sb); vsb_finish(cp->cli->sb);
/* XXX: cp->verbose */
/* send the result back */
if (cli_writeres(cp->fdo, cp->cli)) if (cli_writeres(cp->fdo, cp->cli))
break; goto cli_close;
i = ++p - cp->buf;
assert(i <= cp->nbuf); /* ready for next command */
if (i < cp->nbuf) p = q + 1;
memcpy(cp->buf, p, cp->nbuf - i);
cp->nbuf -= i;
return (0);
} }
/* see if there's any data left in the buffer */
if (p != q) {
assert(q == cp->buf + cp->nbuf);
cp->nbuf -= (p - cp->buf);
memmove(cp->buf, p, cp->nbuf);
}
return (0);
cli_close:
vsb_delete(cp->cli->sb); vsb_delete(cp->cli->sb);
free(cp->buf); free(cp->buf);
close(cp->fdi); close(cp->fdi);
...@@ -402,7 +416,7 @@ mgt_cli_telnet(const char *T_arg) ...@@ -402,7 +416,7 @@ mgt_cli_telnet(const char *T_arg)
free(addr); free(addr);
free(port); free(port);
if (n == 0) { if (n == 0) {
fprintf(stderr, "Could not open TELNET port\n"); fprintf(stderr, "Could not open management port\n");
exit(2); exit(2);
} }
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment