xref: /freebsd/crypto/krb5/src/lib/krb5/os/t_locate_kdc.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 #include "k5-platform.h"
3 #include "port-sockets.h"
4 #include <sys/types.h>
5 #include <com_err.h>
6 
7 #define TEST
8 #include "fake-addrinfo.h"
9 #include "dnsglue.c"
10 #include "dnssrv.c"
11 #include "locate_kdc.c"
12 
13 enum {
14     LOOKUP_CONF = 3,
15     LOOKUP_DNS,
16     LOOKUP_WHATEVER
17 } how = LOOKUP_WHATEVER;
18 
19 const char *prog;
20 
21 struct serverlist sl;
22 
23 static void
kfatal(krb5_error_code err)24 kfatal (krb5_error_code err)
25 {
26     com_err (prog, err, "- exiting");
27     exit (1);
28 }
29 
30 static const char *
ttypename(k5_transport ttype)31 ttypename (k5_transport ttype)
32 {
33     static char buf[20];
34     switch (ttype) {
35     case TCP_OR_UDP:
36         return "tcp or udp";
37     case TCP:
38         return "tcp";
39     case UDP:
40         return "udp";
41     case HTTPS:
42         return "https";
43     default:
44         snprintf(buf, sizeof(buf), "?%d", ttype);
45         return buf;
46     }
47 }
48 
49 static void
print_addrs(void)50 print_addrs (void)
51 {
52     size_t i;
53     int err;
54 
55     printf("%d servers:\n", (int)sl.nservers);
56     for (i = 0; i < sl.nservers; i++) {
57         struct server_entry *entry = &sl.servers[i];
58         char hostbuf[NI_MAXHOST], srvbuf[NI_MAXSERV];
59 
60         if (entry->hostname != NULL) {
61             printf("%d: h:%s t:%s p:%d m:%d P:%s\n", (int)i,
62                    entry->hostname, ttypename(entry->transport),
63                    entry->port, entry->primary,
64                    entry->uri_path ? entry->uri_path : "");
65             continue;
66         }
67         err = getnameinfo((struct sockaddr *)&entry->addr, entry->addrlen,
68                           hostbuf, sizeof(hostbuf), srvbuf, sizeof(srvbuf),
69                           NI_NUMERICHOST | NI_NUMERICSERV);
70         if (err) {
71             printf("%2d: getnameinfo returns error %d=%s\n", (int)i, err,
72                    gai_strerror(err));
73         } else {
74             printf("%2d: address %s\t%s\tport %s\n", (int)i, hostbuf,
75                    ttypename(entry->transport), srvbuf);
76         }
77     }
78 }
79 
80 int
main(int argc,char * argv[])81 main (int argc, char *argv[])
82 {
83     char *p, *realmname;
84     krb5_data realm;
85     krb5_context ctx;
86     krb5_error_code err;
87     int primary = 0;
88 
89     p = strrchr (argv[0], '/');
90     if (p)
91         prog = p+1;
92     else
93         prog = argv[0];
94 
95     switch (argc) {
96     case 2:
97         /* foo $realm */
98         realmname = argv[1];
99         break;
100     case 3:
101         if (!strcmp (argv[1], "-c"))
102             how = LOOKUP_CONF;
103         else if (!strcmp (argv[1], "-d"))
104             how = LOOKUP_DNS;
105         else if (!strcmp (argv[1], "-m"))
106             primary = 1;
107         else
108             goto usage;
109         realmname = argv[2];
110         break;
111     default:
112     usage:
113         fprintf (stderr, "%s: usage: %s [-c | -d | -m] realm\n", prog, prog);
114         return 1;
115     }
116 
117     err = krb5_init_context (&ctx);
118     if (err)
119         kfatal (err);
120 
121     realm.data = realmname;
122     realm.length = strlen (realmname);
123 
124     switch (how) {
125     case LOOKUP_CONF:
126         err = krb5_locate_srv_conf(ctx, &realm, "kdc", &sl, htons(88));
127         break;
128 
129     case LOOKUP_DNS:
130         err = locate_srv_dns_1(ctx, &realm, "_kerberos", "_udp", &sl);
131         break;
132 
133     case LOOKUP_WHATEVER:
134         err = k5_locate_kdc(ctx, &realm, &sl, primary, FALSE);
135         break;
136     }
137     if (err) kfatal (err);
138     print_addrs();
139 
140     k5_free_serverlist(&sl);
141     krb5_free_context(ctx);
142     return 0;
143 }
144