r2724 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Tue Jun 17 12:13:03 CEST 2008


Author: phk
Date: 2008-06-17 12:13:03 +0200 (Tue, 17 Jun 2008)
New Revision: 2724

Modified:
   trunk/varnish-cache/bin/varnishd/mgt.h
   trunk/varnish-cache/bin/varnishd/mgt_child.c
   trunk/varnish-cache/bin/varnishd/mgt_cli.c
Log:
When running in -d -d mode, close all telnet sockets when stdin closes.

... But do not do this for the single -d mode.



Modified: trunk/varnish-cache/bin/varnishd/mgt.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt.h	2008-06-17 10:11:44 UTC (rev 2723)
+++ trunk/varnish-cache/bin/varnishd/mgt.h	2008-06-17 10:13:03 UTC (rev 2724)
@@ -48,7 +48,7 @@
 int mgt_cli_askchild(unsigned *status, char **resp, const char *fmt, ...);
 void mgt_cli_start_child(int fdi, int fdo);
 void mgt_cli_stop_child(void);
-int mgt_cli_telnet(const char *T_arg);
+int mgt_cli_telnet(int dflag, const char *T_arg);
 
 /* mgt_param.c */
 void MCF_ParamSync(void);

Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_child.c	2008-06-17 10:11:44 UTC (rev 2723)
+++ trunk/varnish-cache/bin/varnishd/mgt_child.c	2008-06-17 10:13:03 UTC (rev 2724)
@@ -403,7 +403,7 @@
 		mgt_cli_setup(0, 1, 1, "debug");
 
 	if (T_arg)
-		mgt_cli_telnet(T_arg);
+		mgt_cli_telnet(dflag, T_arg);
 
 	e = ev_new();
 	XXXAN(e);

Modified: trunk/varnish-cache/bin/varnishd/mgt_cli.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_cli.c	2008-06-17 10:11:44 UTC (rev 2723)
+++ trunk/varnish-cache/bin/varnishd/mgt_cli.c	2008-06-17 10:13:03 UTC (rev 2724)
@@ -64,6 +64,18 @@
 
 static int		cli_i = -1, cli_o = -1;
 
+struct telnet {
+	int 			fd;
+	struct ev 		*ev;
+	VTAILQ_ENTRY(telnet)	list;
+};
+
+static VTAILQ_HEAD(,telnet)	telnets = VTAILQ_HEAD_INITIALIZER(telnets);
+static void telnet_close_all(void);
+static void telnet_close_one(int fd);
+
+static int			dflag_copy;
+
 /*--------------------------------------------------------------------*/
 
 static void
@@ -302,12 +314,16 @@
 		(void)close(cp->fdo);
 
 	/* Special case for stdin/out/err */
-	if (cp->fdi == 0)
+	if (cp->fdi == 0) {
 		assert(open("/dev/null", O_RDONLY) == 0);
-	if (cp->fdo == 1) {
 		assert(open("/dev/null", O_WRONLY) == 1);
 		(void)close(2);
 		assert(open("/dev/null", O_WRONLY) == 2);
+
+		if (dflag_copy == 2)
+			telnet_close_all();
+	} else {
+		telnet_close_one(cp->fdi);
 	}
 
 	free(cp);
@@ -365,6 +381,48 @@
 	AZ(ev_add(mgt_evb, cp->ev));
 }
 
+/*--------------------------------------------------------------------*/
+
+static void
+telnet_close_one(int fd)
+{
+	struct telnet *tn, *tn2;
+
+	VTAILQ_FOREACH_SAFE(tn, &telnets, list, tn2) {
+		if (tn->fd != fd)
+			continue;
+		VTAILQ_REMOVE(&telnets, tn, list);
+		AZ(close(tn->fd));
+		free(tn);
+		break;
+	}
+}
+
+
+static void
+telnet_close_all()
+{
+	struct telnet *tn, *tn2;
+
+	VTAILQ_FOREACH_SAFE(tn, &telnets, list, tn2) {
+		VTAILQ_REMOVE(&telnets, tn, list);
+		AZ(close(tn->fd));
+		free(tn);
+	}
+}
+
+static struct telnet *
+telnet_new(int fd)
+{
+	struct telnet *tn;
+
+	tn = calloc(sizeof *tn, 1);
+	AN(tn);
+	tn->fd = fd;
+	VTAILQ_INSERT_TAIL(&telnets, tn, list);
+	return (tn);
+}
+
 static int
 telnet_accept(const struct ev *ev, int what)
 {
@@ -378,6 +436,8 @@
 	(void)what;
 	addrlen = sizeof addr;
 	i = accept(ev->fd, (void *)&addr, &addrlen);
+	if (i < 0 && errno == EBADF)
+		return (1);
 	if (i < 0)
 		return (0);
 
@@ -387,18 +447,23 @@
 	asprintf(&p, "telnet %s:%s %s:%s", abuf2, pbuf2, abuf1, pbuf1);
 	XXXAN(p);
 
+	telnet_new(i);
+
 	mgt_cli_setup(i, i, 0, p);
 	free(p);
 	return (0);
 }
 
 int
-mgt_cli_telnet(const char *T_arg)
+mgt_cli_telnet(int dflag, const char *T_arg)
 {
 	struct vss_addr **ta;
 	char *addr, *port;
-	int i, n;
+	int i, n, sock;
+	struct telnet *tn;
 
+	dflag_copy = dflag;
+
 	XXXAZ(VSS_parse(T_arg, &addr, &port));
 	n = VSS_resolve(addr, port, &ta);
 	free(addr);
@@ -408,13 +473,15 @@
 		exit(2);
 	}
 	for (i = 0; i < n; ++i) {
-		int sock = VSS_listen(ta[i], 10);
-		struct ev *ev = ev_new();
-		XXXAN(ev);
-		ev->fd = sock;
-		ev->fd_flags = POLLIN;
-		ev->callback = telnet_accept;
-		AZ(ev_add(mgt_evb, ev));
+		sock = VSS_listen(ta[i], 10);
+		assert(sock >= 0);
+		tn = telnet_new(sock);
+		tn->ev = ev_new();
+		XXXAN(tn->ev);
+		tn->ev->fd = sock;
+		tn->ev->fd_flags = POLLIN;
+		tn->ev->callback = telnet_accept;
+		AZ(ev_add(mgt_evb, tn->ev));
 		free(ta[i]);
 		ta[i] = NULL;
 	}




More information about the varnish-commit mailing list