r1856 - in branches/1.1: . bin/varnishadm bin/varnishd

des at projects.linpro.no des at projects.linpro.no
Sun Aug 19 20:13:33 CEST 2007


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) {




More information about the varnish-commit mailing list