[master] 632fc50 Use VTCP_connect[ed]() instead of VSS_connect()

Poul-Henning Kamp phk at FreeBSD.org
Wed Mar 11 23:53:01 CET 2015


commit 632fc5036f20fb452ba96f88b695ca42bc32aaed
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Mar 11 22:51:17 2015 +0000

    Use VTCP_connect[ed]() instead of VSS_connect()

diff --git a/bin/varnishd/mgt/mgt_cli.c b/bin/varnishd/mgt/mgt_cli.c
index f1dfdec..53747ed 100644
--- a/bin/varnishd/mgt/mgt_cli.c
+++ b/bin/varnishd/mgt/mgt_cli.c
@@ -52,6 +52,7 @@
 #include "vcli_serve.h"
 #include "vev.h"
 #include "vrnd.h"
+#include "vsa.h"
 #include "vss.h"
 #include "vtcp.h"
 
@@ -563,12 +564,20 @@ mgt_cli_telnet(const char *T_arg)
 
 /* Reverse CLI ("Master") connections --------------------------------*/
 
+struct m_addr {
+	unsigned		magic;
+#define M_ADDR_MAGIC		0xbc6217ed
+	struct suckaddr		*sa;
+	VTAILQ_ENTRY(m_addr)	list;
+};
+
 static int M_fd = -1;
 static struct vev *M_poker, *M_conn;
-static struct vss_addr **M_ta;
-static int M_nta, M_nxt;
 static double M_poll = 0.1;
 
+static VTAILQ_HEAD(,m_addr)	m_addr_list =
+    VTAILQ_HEAD_INITIALIZER(m_addr_list);
+
 static void
 Marg_closer(void *priv)
 {
@@ -582,26 +591,20 @@ static int __match_proto__(vev_cb_f)
 Marg_connect(const struct vev *e, int what)
 {
 	struct vsb *vsb;
-	int k;
-	socklen_t l;
+	struct m_addr *ma;
 
 	assert(e == M_conn);
 	(void)what;
 
-	/* Our connect(2) returned, check result */
-	l = sizeof k;
-	AZ(getsockopt(M_fd, SOL_SOCKET, SO_ERROR, &k, &l));
-	if (k) {
-		errno = k;
+	M_fd = VTCP_connected(M_fd);
+	if (M_fd < 0) {
 		syslog(LOG_INFO, "Could not connect to CLI-master: %m");
-		(void)close(M_fd);
-		M_fd = -1;
-		/* Try next address */
-		if (++M_nxt >= M_nta) {
-			M_nxt = 0;
-			if (M_poll < 10)
-				M_poll *= 2;
-		}
+		ma = VTAILQ_FIRST(&m_addr_list);
+		AN(ma);
+		VTAILQ_REMOVE(&m_addr_list, ma, list);
+		VTAILQ_INSERT_TAIL(&m_addr_list, ma, list);
+		if (M_poll < 10)
+			M_poll++;
 		return (1);
 	}
 	vsb = sock_id("master", M_fd);
@@ -615,16 +618,20 @@ static int __match_proto__(vev_cb_f)
 Marg_poker(const struct vev *e, int what)
 {
 	int s;
+	struct m_addr *ma;
 
 	assert(e == M_poker);
 	(void)what;
 
 	M_poker->timeout = M_poll;	/* XXX nasty ? */
-	if (M_fd >= 0)
+	if (M_fd > 0)
 		return (0);
 
+	ma = VTAILQ_FIRST(&m_addr_list);
+	AN(ma);
+
 	/* Try to connect asynchronously */
-	s = VSS_connect(M_ta[M_nxt], 1);
+	s = VTCP_connect(ma->sa, -1);
 	if (s < 0)
 		return (0);
 
@@ -641,17 +648,33 @@ Marg_poker(const struct vev *e, int what)
 	return (0);
 }
 
+static int __match_proto__(vss_resolved_f)
+marg_cb(void *priv, const struct suckaddr *sa)
+{
+	struct m_addr *ma;
+
+	(void)priv;
+	ALLOC_OBJ(ma, M_ADDR_MAGIC);
+	AN(ma);
+	ma->sa = VSA_Clone(sa);
+	VTAILQ_INSERT_TAIL(&m_addr_list, ma, list);
+	return(0);
+}
+
 void
 mgt_cli_master(const char *M_arg)
 {
+	const char *err;
+	int error;
 
 	AN(M_arg);
-	M_nta = VSS_resolve(M_arg, NULL, &M_ta);
-	if (M_nta <= 0) {
-		fprintf(stderr, "Could resolve -M argument to address\n");
-		exit(2);
-	}
-	M_nxt = 0;
+
+	error = VSS_resolver(M_arg, NULL, marg_cb, NULL, &err);
+	if (err != NULL)
+		ARGV_ERR("Could resolve -M argument to address\n\t%s\n", err);
+	AZ(error);
+	if (VTAILQ_EMPTY(&m_addr_list))
+		ARGV_ERR("Could not resolve -M argument to address\n");
 	AZ(M_poker);
 	M_poker = vev_new();
 	AN(M_poker);



More information about the varnish-commit mailing list