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