Commit 9db443b9 authored by Dag Erling Smørgrav's avatar Dag Erling Smørgrav

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


git-svn-id: http://www.varnish-cache.org/svn/branches/1.1@1856 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 01c8307d
......@@ -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
.An Cecilie Fritzvold Aq cecilihf@linpro.no .
This manual page was written by
utility and this manual page were written by
.An Cecilie Fritzvold Aq cecilihf@linpro.no .
......@@ -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 @@ telnet_mgt(const char* T_arg, int argc, char* argv[])
}
*p = '\0';
bytes = strtol(pp, &p, 10);
answer = malloc(bytes+1);
n = read(sock, answer, bytes);
if (n != bytes) {
......@@ -108,49 +108,47 @@ telnet_mgt(const char* T_arg, int argc, char* argv[])
}
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);
}
......@@ -284,8 +284,8 @@ struct cli_port {
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 @@ static int
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 @@ mgt_cli_telnet(const char *T_arg)
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) {
......
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