aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2017-01-08 17:04:59 +0000
committerWerner Koch <[email protected]>2017-01-08 17:04:59 +0000
commit16078f3deea5b82ea26e2f01dbd3ef3a5ce25410 (patch)
treea8da190a48cb319aaab1d25a35e0ba060fd51194
parentdirmngr: Strip root zone suffix from libdns SRV results. (diff)
downloadgnupg-16078f3deea5b82ea26e2f01dbd3ef3a5ce25410.tar.gz
gnupg-16078f3deea5b82ea26e2f01dbd3ef3a5ce25410.zip
dirmngr: Change internal SRV lookup API.
* dirmngr/dns-stuff.c (get_dns_srv): Add args SERVICE and PROTO. * dirmngr/http.c (connect_server): Simplify SRV lookup. * dirmngr/ks-engine-hkp.c (map_host): Ditto. * dirmngr/t-dns-stuff.c (main): Adjust for changed get_dns_srv. -- This new API is more convenient because it includes commonly used code. Note that right now http.c's SRV record code is not used. Signed-off-by: Werner Koch <[email protected]>
-rw-r--r--dirmngr/dns-stuff.c25
-rw-r--r--dirmngr/dns-stuff.h1
-rw-r--r--dirmngr/http.c28
-rw-r--r--dirmngr/ks-engine-hkp.c12
-rw-r--r--dirmngr/t-dns-stuff.c2
5 files changed, 31 insertions, 37 deletions
diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c
index 028b065ab..a8713eb44 100644
--- a/dirmngr/dns-stuff.c
+++ b/dirmngr/dns-stuff.c
@@ -1740,17 +1740,37 @@ getsrv_standard (const char *name,
}
-/* Note that we do not return NONAME but simply store 0 at R_COUNT. */
+/* Query a SRV record for SERVICE and PROTO for NAME. If SERVICE is
+ * NULL, NAME is expected to contain the full query name. Note that
+ * we do not return NONAME but simply store 0 at R_COUNT. On error an
+ * error code is returned and 0 stored at R_COUNT. */
gpg_error_t
-get_dns_srv (const char *name, struct srventry **list, unsigned int *r_count)
+get_dns_srv (const char *name, const char *service, const char *proto,
+ struct srventry **list, unsigned int *r_count)
{
gpg_error_t err;
+ char *namebuffer = NULL;
unsigned int srvcount;
int i;
*list = NULL;
*r_count = 0;
srvcount = 0;
+
+ /* If SERVICE is given construct the query from it and PROTO. */
+ if (service)
+ {
+ namebuffer = xtryasprintf ("_%s._%s.%s",
+ service, proto? proto:"tcp", name);
+ if (!namebuffer)
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
+ name = namebuffer;
+ }
+
+
#ifdef USE_LIBDNS
if (!standard_resolver)
{
@@ -1852,6 +1872,7 @@ get_dns_srv (const char *name, struct srventry **list, unsigned int *r_count)
}
if (!err)
*r_count = srvcount;
+ xfree (namebuffer);
return err;
}
diff --git a/dirmngr/dns-stuff.h b/dirmngr/dns-stuff.h
index eb7fe7246..d68dd1728 100644
--- a/dirmngr/dns-stuff.h
+++ b/dirmngr/dns-stuff.h
@@ -153,6 +153,7 @@ gpg_error_t get_dns_cert (const char *name, int want_certtype,
/* Return an array of SRV records. */
gpg_error_t get_dns_srv (const char *name,
+ const char *service, const char *proto,
struct srventry **list, unsigned int *r_count);
diff --git a/dirmngr/http.c b/dirmngr/http.c
index 14d60df4b..7a028047d 100644
--- a/dirmngr/http.c
+++ b/dirmngr/http.c
@@ -2362,29 +2362,11 @@ connect_server (const char *server, unsigned short port,
/* Do the SRV thing */
if (srvtag)
{
- /* We're using SRV, so append the tags. */
- if (1 + strlen (srvtag) + 6 + strlen (server) + 1
- <= DIMof (struct srventry, target))
- {
- char *srvname = xtrymalloc (DIMof (struct srventry, target));
-
- if (!srvname) /* Out of core */
- {
- serverlist = NULL;
- srvcount = 0;
- }
- else
- {
- stpcpy (stpcpy (stpcpy (stpcpy (srvname,"_"), srvtag),
- "._tcp."), server);
- err = get_dns_srv (srvname, &serverlist, &srvcount);
- if (err)
- log_info ("getting SRV '%s' failed: %s\n",
- srvname, gpg_strerror (err));
- xfree (srvname);
- /* Note that on error SRVCOUNT is zero. */
- }
- }
+ err = get_dns_srv (server, srvtag, NULL, &serverlist, &srvcount);
+ if (err)
+ log_info ("getting '%s' SRV for '%s' failed: %s\n",
+ srvtag, server, gpg_strerror (err));
+ /* Note that on error SRVCOUNT is zero. */
}
if (!serverlist)
diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c
index a6c22f8cd..283e805f0 100644
--- a/dirmngr/ks-engine-hkp.c
+++ b/dirmngr/ks-engine-hkp.c
@@ -426,7 +426,6 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect,
int refidx;
int is_pool = 0;
char *cname;
- char *srvrecord;
struct srventry *srvs;
unsigned int srvscount;
@@ -448,16 +447,7 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect,
if (!is_ip_address (name))
{
/* Check for SRV records. */
- srvrecord = xtryasprintf ("_hkp._tcp.%s", name);
- if (srvrecord == NULL)
- {
- err = gpg_error_from_syserror ();
- xfree (reftbl);
- return err;
- }
-
- err = get_dns_srv (srvrecord, &srvs, &srvscount);
- xfree (srvrecord);
+ err = get_dns_srv (name, "hkp", NULL, &srvs, &srvscount);
if (err)
{
xfree (reftbl);
diff --git a/dirmngr/t-dns-stuff.c b/dirmngr/t-dns-stuff.c
index bc4ca9a51..23c0c6aa0 100644
--- a/dirmngr/t-dns-stuff.c
+++ b/dirmngr/t-dns-stuff.c
@@ -235,7 +235,7 @@ main (int argc, char **argv)
int i;
err = get_dns_srv (name? name : "_hkp._tcp.wwwkeys.pgp.net",
- &srv, &count);
+ NULL, NULL, &srv, &count);
if (err)
printf ("get_dns_srv failed: %s <%s>\n",
gpg_strerror (err), gpg_strsource (err));