dirmngr: Implement a getaddrinfo wrapper.
[gnupg.git] / dirmngr / t-dns-stuff.c
1 /* t-dns-cert.c - Module test for dns-stuff.c
2  * Copyright (C) 2011 Free Software Foundation, Inc.
3  * Copyright (C) 2011, 2015 Werner Koch
4  *
5  * This file is part of GnuPG.
6  *
7  * GnuPG is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * GnuPG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <assert.h>
25 #ifndef HAVE_W32_SYSTEM
26 # include <netdb.h>
27 #endif
28
29 #include "util.h"
30 #include "dns-stuff.h"
31
32 #define PGM "t-dns-stuff"
33
34 static int verbose;
35 static int debug;
36
37
38
39 int
40 main (int argc, char **argv)
41 {
42   int last_argc = -1;
43   gpg_error_t err;
44   int opt_cert = 0;
45   char const *name;
46
47   gpgrt_init ();
48   if (argc)
49     { argc--; argv++; }
50   while (argc && last_argc != argc )
51     {
52       last_argc = argc;
53       if (!strcmp (*argv, "--"))
54         {
55           argc--; argv++;
56           break;
57         }
58       else if (!strcmp (*argv, "--help"))
59         {
60           fputs ("usage: " PGM " [HOST]\n"
61                  "Options:\n"
62                  "  --verbose         print timings etc.\n"
63                  "  --debug           flyswatter\n"
64                  "  --cert            lookup a CERT RR\n"
65                  , stdout);
66           exit (0);
67         }
68       else if (!strcmp (*argv, "--verbose"))
69         {
70           verbose++;
71           argc--; argv++;
72         }
73       else if (!strcmp (*argv, "--debug"))
74         {
75           verbose += 2;
76           debug++;
77           argc--; argv++;
78         }
79       else if (!strcmp (*argv, "--cert"))
80         {
81           opt_cert = 1;
82           argc--; argv++;
83         }
84       else if (!strncmp (*argv, "--", 2))
85         {
86           fprintf (stderr, PGM ": unknown option '%s'\n", *argv);
87           exit (1);
88         }
89     }
90
91   if (!argc)
92     {
93       opt_cert = 1;
94       name = "simon.josefsson.org";
95     }
96   else if (argc == 1)
97     name = *argv;
98   else
99     {
100       fprintf (stderr, PGM ": too many host names given\n");
101       exit (1);
102     }
103
104   if (opt_cert)
105     {
106       unsigned char *fpr;
107       size_t fpr_len;
108       char *url;
109       void *key;
110       size_t keylen;
111
112       printf ("CERT lookup on '%s'\n", name);
113
114       err = get_dns_cert (name, DNS_CERTTYPE_ANY, &key, &keylen,
115                           &fpr, &fpr_len, &url);
116       if (err)
117         printf ("get_dns_cert failed: %s <%s>\n",
118                 gpg_strerror (err), gpg_strsource (err));
119       else if (key)
120         {
121           printf ("Key found (%u bytes)\n", (unsigned int)keylen);
122         }
123       else
124         {
125           if (fpr)
126             {
127               int i;
128
129               printf ("Fingerprint found (%d bytes): ", (int)fpr_len);
130               for (i = 0; i < fpr_len; i++)
131                 printf ("%02X", fpr[i]);
132               putchar ('\n');
133             }
134           else
135             printf ("No fingerprint found\n");
136
137           if (url)
138             printf ("URL found: %s\n", url);
139           else
140             printf ("No URL found\n");
141
142         }
143
144       xfree (key);
145       xfree (fpr);
146       xfree (url);
147     }
148   else /* Standard lookup.  */
149     {
150       char *cname;
151       dns_addrinfo_t aibuf, ai;
152       int ret;
153       char hostbuf[1025];
154
155       printf ("Lookup on '%s'\n", name);
156
157       err = resolve_dns_name (name, 0, 0, SOCK_STREAM, &aibuf, &cname);
158       if (err)
159         {
160           fprintf (stderr, PGM": resolving '%s' failed: %s\n",
161                    name, gpg_strerror (err));
162           exit (1);
163         }
164
165       if (cname)
166         printf ("cname: %s\n", cname);
167       for (ai = aibuf; ai; ai = ai->next)
168         {
169           printf ("%s %3d %3d   ",
170                   ai->family == AF_INET6? "inet6" :
171                   ai->family == AF_INET?  "inet4" : "?    ",
172                   ai->socktype, ai->protocol);
173
174           ret = getnameinfo (ai->addr, ai->addrlen,
175                              hostbuf, sizeof hostbuf,
176                              NULL, 0,
177                              NI_NUMERICHOST);
178           if (ret)
179             printf ("[getnameinfo failed: %s]\n", gai_strerror (ret));
180           else
181             printf ("%s\n", hostbuf);
182         }
183       xfree (cname);
184       free_dns_addrinfo (aibuf);
185     }
186
187
188   return 0;
189 }