dirmngr: Change internal SRV lookup API.
authorWerner Koch <wk@gnupg.org>
Sun, 8 Jan 2017 17:04:59 +0000 (18:04 +0100)
committerWerner Koch <wk@gnupg.org>
Sun, 8 Jan 2017 17:04:59 +0000 (18:04 +0100)
* 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 <wk@gnupg.org>
dirmngr/dns-stuff.c
dirmngr/dns-stuff.h
dirmngr/http.c
dirmngr/ks-engine-hkp.c
dirmngr/t-dns-stuff.c

index 028b065..a8713eb 100644 (file)
@@ -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;
 }
 
index eb7fe72..d68dd17 100644 (file)
@@ -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);
 
 
index 14d60df..7a02804 100644 (file)
@@ -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)
index a6c22f8..283e805 100644 (file)
@@ -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);
index bc4ca9a..23c0c6a 100644 (file)
@@ -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));