Mailing List Archive

r1856 - in branches/1.1: . bin/varnishadm bin/varnishd
Author: des
Date: 2007-08-19 20:13:33 +0200 (Sun, 19 Aug 2007)
New Revision: 1856

Modified:
branches/1.1/
branches/1.1/bin/varnishadm/varnishadm.1
branches/1.1/bin/varnishadm/varnishadm.c
branches/1.1/bin/varnishd/mgt_cli.c
Log:
Merged revisions 1853-1855 via svnmerge from
svn+ssh://projects.linpro.no/svn/varnish/trunk/varnish-cache

........
r1853 | des | 2007-08-19 19:17:58 +0200 (Sun, 19 Aug 2007) | 2 lines

Whitespace cleanup
........
r1854 | des | 2007-08-19 19:26:45 +0200 (Sun, 19 Aug 2007) | 2 lines

Improve style.
........
r1855 | des | 2007-08-19 20:12:03 +0200 (Sun, 19 Aug 2007) | 4 lines

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.
........



Property changes on: branches/1.1
___________________________________________________________________
Name: svnmerge-integrated
- /trunk/varnish-cache:1-1722,1727-1729,1738,1743-1777,1779-1795,1797-1798,1800-1808,1810-1815,1817,1819,1823,1831-1838,1846
+ /trunk/varnish-cache:1-1722,1727-1729,1738,1743-1777,1779-1795,1797-1798,1800-1808,1810-1815,1817,1819,1823,1831-1838,1846,1853-1855

Modified: branches/1.1/bin/varnishadm/varnishadm.1
===================================================================
--- branches/1.1/bin/varnishadm/varnishadm.1 2007-08-19 18:12:03 UTC (rev 1855)
+++ branches/1.1/bin/varnishadm/varnishadm.1 2007-08-19 18:13:33 UTC (rev 1856)
@@ -28,45 +28,36 @@
.\"
.\" $Id$
.\"
-.Dd June 06, 2007
+.Dd August 19, 2007
.Dt VARNISHADM 1
.Os
.Sh NAME
.Nm varnishadm
.Sh SYNOPSIS
.Nm
-.Fl T Ar address:port <command>
+.Fl T Ar address:port
+.Cm Ar command
+.Op Ar ...
.Sh DESCRIPTION
The
.Nm
-utility sends the given command to the
+utility sends the given command and arguments to the
.Xr varnishd 1
-instance at address:port and prints the results. 0 is returned on success, 1
-on failure.
+instance at address:port and prints the results.
.Pp
The following options are available:
.Bl -tag -width Fl
.It Fl T Ar address:port
-Connect via telnet to this address and port.
-.Sh EXAMPLES
-The following command lists all available commands provided by the
-management interface of
-.Ed
-.Xr varnishd 1
-.Bd -literal -offset 4n
-$ varnishadm -T 127.0.0.1:23 help
-.Ed
+Connect to the management interface at the specified address and port.
+.El
+.Sh EXIT STATUS
+The exit status of the
+.Nm
+utility is zero if the command succeeded, and non-zero otherwise.
.Sh SEE ALSO
-.Xr varnishd 1 ,
-.Xr varnishhist 1 ,
-.Xr varnishncsa 1 ,
-.Xr varnishstat 1 ,
-.Xr varnishtop 1
+.Xr varnishd 1
.Sh HISTORY
The
.Nm
-utility was developed by
+utility and this manual page were written by
.An Cecilie Fritzvold Aq cecilihf at linpro.no .
-
-This manual page was written by
-.An Cecilie Fritzvold Aq cecilihf at linpro.no .

Modified: branches/1.1/bin/varnishadm/varnishadm.c
===================================================================
--- branches/1.1/bin/varnishadm/varnishadm.c 2007-08-19 18:12:03 UTC (rev 1855)
+++ branches/1.1/bin/varnishadm/varnishadm.c 2007-08-19 18:13:33 UTC (rev 1856)
@@ -46,41 +46,41 @@
* returned
*/
static void
-telnet_mgt(const char* T_arg, int argc, char* argv[])
+telnet_mgt(const char *T_arg, int argc, char *argv[])
{
struct vss_addr **ta;
char *addr, *port;
int i, n;
- int sock;
+ int sock;
long status, bytes;
char *answer = NULL;
char buf[13];
char *p, *pp;
-
+
XXXAZ(VSS_parse(T_arg, &addr, &port));
XXXAN(n = VSS_resolve(addr, port, &ta));
free(addr);
free(port);
if (n == 0) {
- fprintf(stderr, "Could not open TELNET port\n");
+ fprintf(stderr, "Could not resolve '%s'\n", T_arg);
exit(2);
}
-
- sock = VSS_connect(ta[0]);
-
+
+ sock = VSS_connect(ta[0]);
+
for (i = 0; i < n; ++i) {
free(ta[i]);
ta[i] = NULL;
}
free(ta);
-
+
for (i=0; i<argc; i++) {
if (i > 0)
write(sock, " ", 1);
write(sock, argv[i], strlen(argv[i]));
}
write(sock, "\n", 1);
-
+
n = read(sock, buf, 13);
if (n != 13) {
fprintf(stderr, "An error occured in receiving status.\n");
@@ -99,7 +99,7 @@
}
*p = '\0';
bytes = strtol(pp, &p, 10);
-
+
answer = malloc(bytes+1);
n = read(sock, answer, bytes);
if (n != bytes) {
@@ -108,49 +108,47 @@
}
answer[bytes] = '\0';
close(sock);
-
+
if (status == STATUS_OK) {
printf("%s\n", answer);
exit(0);
}
fprintf(stderr, "Command failed with error code %ld\n", status);
exit(1);
-
+
}

static void
usage(void)
{
- fprintf(stderr, "usage: varnishadm -T address:port <command> \n");
+ fprintf(stderr,
+ "usage: varnishadm -T [address]:port command [...]\n");
exit(1);
}

int
main(int argc, char *argv[])
{
- int c;
- const char *address = NULL;
- int T_arg = 0;
-
- if (argc < 2)
- usage();
+ const char *T_arg = NULL;
+ int opt;

- while ((c = getopt(argc, argv, "T:")) != -1) {
- switch (c) {
+ while ((opt = getopt(argc, argv, "T:")) != -1) {
+ switch (opt) {
case 'T':
- T_arg = 1;
- address = optarg;
+ T_arg = optarg;
break;
default:
usage();
}
}
-
- if (T_arg) {
- if (optind == argc)
- usage();
- telnet_mgt(address, argc - optind, &argv[optind]);
- }
-
+
+ argc -= optind;
+ argv += optind;
+
+ if (T_arg == NULL || argc < 1)
+ usage();
+
+ telnet_mgt(T_arg, argc, argv);
+
exit(0);
}

Modified: branches/1.1/bin/varnishd/mgt_cli.c
===================================================================
--- branches/1.1/bin/varnishd/mgt_cli.c 2007-08-19 18:12:03 UTC (rev 1855)
+++ branches/1.1/bin/varnishd/mgt_cli.c 2007-08-19 18:13:33 UTC (rev 1856)
@@ -284,8 +284,8 @@
int fdo;
int verbose;
char *buf;
- unsigned nbuf;
- unsigned lbuf;
+ int nbuf; /* next free position in buf */
+ int lbuf; /* length of buf */
struct cli cli[1];
char name[30];
};
@@ -294,39 +294,53 @@
mgt_cli_callback(struct ev *e, int what)
{
struct cli_port *cp;
- char *p;
+ char *p, *q;
int i;

CAST_OBJ_NOTNULL(cp, e->priv, CLI_PORT_MAGIC);

- while (!(what & (EV_ERR | EV_HUP))) {
- if (cp->nbuf == cp->lbuf) {
- cp->lbuf += cp->lbuf;
- cp->buf = realloc(cp->buf, cp->lbuf);
- XXXAN(cp->buf);
- }
- i = read(cp->fdi, cp->buf + cp->nbuf, cp->lbuf - cp->nbuf);
- if (i <= 0)
- break;
- cp->nbuf += i;
- p = strchr(cp->buf, '\n');
- if (p == NULL)
- return (0);
- *p = '\0';
- fprintf(stderr, "CLI <%s>\n", cp->buf);
+ if (what & (EV_ERR | EV_HUP))
+ goto cli_close;
+
+ /* grow the buffer if it is full */
+ if (cp->nbuf == cp->lbuf) {
+ cp->lbuf += cp->lbuf;
+ cp->buf = realloc(cp->buf, cp->lbuf);
+ XXXAN(cp->buf);
+ }
+
+ /* read more data into the buffer */
+ i = read(cp->fdi, cp->buf + cp->nbuf, cp->lbuf - cp->nbuf);
+ if (i <= 0)
+ goto cli_close;
+ cp->nbuf += i;
+
+ for (p = q = cp->buf; q < cp->buf + cp->nbuf; ++q) {
+ if (*q != '\n')
+ continue;
+ /* got a newline == got a command */
+ *q = '\0';
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);
- /* XXX: cp->verbose */
+
+ /* send the result back */
if (cli_writeres(cp->fdo, cp->cli))
- break;
- i = ++p - cp->buf;
- assert(i <= cp->nbuf);
- if (i < cp->nbuf)
- memcpy(cp->buf, p, cp->nbuf - i);
- cp->nbuf -= i;
- return (0);
+ goto cli_close;
+
+ /* ready for next command */
+ p = q + 1;
}
+
+ /* 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);
free(cp->buf);
close(cp->fdi);
@@ -402,7 +416,7 @@
free(addr);
free(port);
if (n == 0) {
- fprintf(stderr, "Could not open TELNET port\n");
+ fprintf(stderr, "Could not open management port\n");
exit(2);
}
for (i = 0; i < n; ++i) {