r668 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Sat Aug 5 14:45:45 CEST 2006


Author: phk
Date: 2006-08-05 14:45:45 +0200 (Sat, 05 Aug 2006)
New Revision: 668

Modified:
   trunk/varnish-cache/bin/varnishd/common_cli.c
   trunk/varnish-cache/bin/varnishd/common_cli.h
   trunk/varnish-cache/bin/varnishd/mgt_cli.c
Log:
Add a timeout to reads from the child CLI pipe so we don't hang
for ever.


Modified: trunk/varnish-cache/bin/varnishd/common_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/common_cli.c	2006-08-05 12:24:37 UTC (rev 667)
+++ trunk/varnish-cache/bin/varnishd/common_cli.c	2006-08-05 12:45:45 UTC (rev 668)
@@ -4,6 +4,7 @@
 
 #include <errno.h>
 #include <assert.h>
+#include <poll.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <sys/uio.h>
@@ -71,15 +72,31 @@
 	return (i != l);
 }
 
+static int
+read_tmo(int fd, void *ptr, unsigned len, double tmo)
+{
+	int i;
+	struct pollfd pfd[1];
+
+	pfd->fd = fd;
+	pfd->events = POLLIN;
+	i = poll(pfd, 1, (int)(tmo * 1e3));
+	if (i == 0) {
+		errno = ETIMEDOUT;
+		return (-1);
+	}
+	return (read(fd, ptr, len));
+}
+
 int
-cli_readres(int fd, unsigned *status, char **ptr)
+cli_readres(int fd, unsigned *status, char **ptr, double tmo)
 {
-	char res[CLI_LINE0_LEN + 1];	/* For NUL */
+	char res[CLI_LINE0_LEN];	/* For NUL */
 	int i, j;
 	unsigned u, v;
 	char *p;
 
-	i = read(fd, res, CLI_LINE0_LEN);
+	i = read_tmo(fd, res, CLI_LINE0_LEN, tmo);
 	if (i < 0)
 		return (i);
 	assert(i == CLI_LINE0_LEN);	/* XXX: handle */
@@ -91,7 +108,7 @@
 		*status = u;
 	p = malloc(v + 1);
 	assert(p != NULL);
-	i = read(fd, p, v + 1);
+	i = read_tmo(fd, p, v + 1, tmo);
 	if (i < 0) {
 		free(p);
 		return (i);

Modified: trunk/varnish-cache/bin/varnishd/common_cli.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/common_cli.h	2006-08-05 12:24:37 UTC (rev 667)
+++ trunk/varnish-cache/bin/varnishd/common_cli.h	2006-08-05 12:45:45 UTC (rev 668)
@@ -8,7 +8,7 @@
 };
 
 int cli_writeres(int fd, struct cli *cli);
-int cli_readres(int fd, unsigned *status, char **ptr);
+int cli_readres(int fd, unsigned *status, char **ptr, double tmo);
 extern struct cli_proto CLI_cmds[];
 
 cli_func_t cli_func_ping;

Modified: trunk/varnish-cache/bin/varnishd/mgt_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_cli.c	2006-08-05 12:24:37 UTC (rev 667)
+++ trunk/varnish-cache/bin/varnishd/mgt_cli.c	2006-08-05 12:45:45 UTC (rev 668)
@@ -85,7 +85,7 @@
 	assert(i == v);
 	free(p);
 
-	i = cli_readres(cli_i, &u, &p);
+	i = cli_readres(cli_i, &u, &p, 3.0);
 	assert(i == 0);
 	cli_result(cli, u);
 	cli_out(cli, "%s", p);
@@ -187,7 +187,8 @@
 	assert(i == strlen(p));
 	free(p);
 
-	i = cli_readres(cli_i, &j, resp);
+	i = cli_readres(cli_i, &j, resp, 3.0);
+	assert(i == 0);
 	if (status != NULL)
 		*status = j;
 	return (j == CLIS_OK ? 0 : j);




More information about the varnish-commit mailing list