[master] 80d2036 Simplify to use only one VSS_resolver() call and one call-back.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Mar 12 09:54:22 CET 2015
commit 80d20364692a644f2f1ede5bb713e6e91fbcb98a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Mar 12 08:53:54 2015 +0000
Simplify to use only one VSS_resolver() call and one call-back.
diff --git a/lib/libvcc/vcc_utils.c b/lib/libvcc/vcc_utils.c
index 694294c..9e8ef9e 100644
--- a/lib/libvcc/vcc_utils.c
+++ b/lib/libvcc/vcc_utils.c
@@ -146,6 +146,9 @@ struct rss {
struct suckaddr *vsa4;
struct suckaddr *vsa6;
+ struct vsb *vsb;
+ int retval;
+ int wrong;
};
static int __match_proto__(vss_resolved_f)
@@ -153,40 +156,33 @@ rs_callback(void *priv, const struct suckaddr *vsa)
{
struct rss *rss;
int v;
+ char a[VTCP_ADDRBUFSIZE];
+ char p[VTCP_PORTBUFSIZE];
CAST_OBJ_NOTNULL(rss, priv, RSS_MAGIC);
assert(VSA_Sane(vsa));
v = VSA_Get_Proto(vsa);
+ VTCP_name(vsa, a, sizeof a, p, sizeof p);
+ VSB_printf(rss->vsb, "\t%s:%s\n", a, p);
if (v == AF_INET) {
if (rss->vsa4 == NULL)
rss->vsa4 = VSA_Clone(vsa);
else if (VSA_Compare(vsa, rss->vsa4))
- return (-2);
+ rss->wrong++;
+ rss->retval++;
} else if (v == AF_INET6) {
if (rss->vsa6 == NULL)
rss->vsa6 = VSA_Clone(vsa);
else if (VSA_Compare(vsa, rss->vsa6))
- return (-2);
+ rss->wrong++;
+ rss->retval++;
} else {
WRONG("Wrong protocol");
}
return (0);
}
-static int __match_proto__(vss_resolved_f)
-rs_callback2(void *priv, const struct suckaddr *vsa)
-{
- struct vcc *tl;
- char a[VTCP_ADDRBUFSIZE];
- char p[VTCP_PORTBUFSIZE];
-
- CAST_OBJ_NOTNULL(tl, priv, VCC_MAGIC);
- VTCP_name(vsa, a, sizeof a, p, sizeof p);
- VSB_printf(tl->sb, "\t%s:%s\n", a, p);
- return (0);
-}
-
void
Resolve_Sockaddr(struct vcc *tl,
const char *host,
@@ -200,7 +196,7 @@ Resolve_Sockaddr(struct vcc *tl,
const struct token *t_err,
const char *errid)
{
- int error, retval = 0;
+ int error;
struct rss *rss;
const char *err;
@@ -211,8 +207,11 @@ Resolve_Sockaddr(struct vcc *tl,
ALLOC_OBJ(rss, RSS_MAGIC);
AN(rss);
+ rss->vsb = VSB_new_auto();
+ AN(rss->vsb);
error = VSS_resolver(host, def_port, rs_callback, rss, &err);
+ AZ(VSB_finish(rss->vsb));
if (err != NULL) {
VSB_printf(tl->sb,
"%s '%.*s' could not be resolved to an IP address:\n"
@@ -222,46 +221,37 @@ Resolve_Sockaddr(struct vcc *tl,
vcc_ErrWhere(tl, t_err);
free(rss->vsa4);
free(rss->vsa6);
+ VSB_delete(rss->vsb);
FREE_OBJ(rss);
return;
}
+ AZ(error);
if (rss->vsa4 != NULL) {
vcc_suckaddr(tl, host, rss->vsa4, ipv4, ipv4_ascii, p_ascii);
free(rss->vsa4);
- retval++;
}
if (rss->vsa6 != NULL) {
vcc_suckaddr(tl, host, rss->vsa6, ipv6, ipv6_ascii, p_ascii);
free(rss->vsa6);
- retval++;
}
- FREE_OBJ(rss);
- if (error == -2 || retval > maxips) {
+ if (rss->retval == 0) {
+ VSB_printf(tl->sb,
+ "%s '%.*s': resolves to "
+ "neither IPv4 nor IPv6 addresses.\n",
+ errid, PF(t_err) );
+ vcc_ErrWhere(tl, t_err);
+ }
+ if (rss->wrong || rss->retval > maxips) {
VSB_printf(tl->sb,
"%s %.*s: resolves to too many addresses.\n"
"Only one IPv4 %s IPv6 are allowed.\n"
"Please specify which exact address "
- "you want to use, we found all of these:\n",
+ "you want to use, we found all of these:\n%s",
errid, PF(t_err),
- maxips > 1 ? "and one" : "or");
- (void)VSS_resolver(host, def_port, rs_callback2, tl, &err);
- if (err != NULL) {
- VSB_printf(tl->sb,
- "%s '%.*s' could not be resolved to an"
- " IP address:\n"
- "\t%s\n"
- "(Sorry if that error message is gibberish.)\n",
- errid, PF(t_err), err);
- }
- vcc_ErrWhere(tl, t_err);
- return;
- }
- AZ(error);
- if (retval == 0) {
- VSB_printf(tl->sb,
- "%s '%.*s': resolves to "
- "neither IPv4 nor IPv6 addresses.\n",
- errid, PF(t_err) );
+ maxips > 1 ? "and one" : "or",
+ VSB_data(rss->vsb));
vcc_ErrWhere(tl, t_err);
}
+ VSB_delete(rss->vsb);
+ FREE_OBJ(rss);
}
More information about the varnish-commit
mailing list