From 16078f3deea5b82ea26e2f01dbd3ef3a5ce25410 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Sun, 8 Jan 2017 18:04:59 +0100 Subject: [PATCH] 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 --- dirmngr/dns-stuff.c | 25 +++++++++++++++++++++++-- dirmngr/dns-stuff.h | 1 + dirmngr/http.c | 28 +++++----------------------- dirmngr/ks-engine-hkp.c | 12 +----------- dirmngr/t-dns-stuff.c | 2 +- 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));