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