New utility program.
authorKen Raeburn <raeburn@mit.edu>
Thu, 19 Jul 2001 11:44:26 +0000 (11:44 +0000)
committerKen Raeburn <raeburn@mit.edu>
Thu, 19 Jul 2001 11:44:26 +0000 (11:44 +0000)
* t_locate_kdc.c: New file.
* Makefile.in (t_locate_kdc.o, t_locate_kdc): New targets.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@13614 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/krb5/os/ChangeLog
src/lib/krb5/os/Makefile.in
src/lib/krb5/os/t_locate_kdc.c [new file with mode: 0644]

index 7e330c91ad5302392f48d5b4766175cbcd23e03a..8688b92d4e4683142925a8081613ec6cea8a2308 100644 (file)
@@ -1,5 +1,8 @@
 2001-07-19  Ken Raeburn  <raeburn@mit.edu>
 
+       * t_locate_kdc.c: New file.
+       * Makefile.in (t_locate_kdc.o, t_locate_kdc): New targets.
+
        * locate_kdc.c: Include fake-addrinfo.h.
        (FAI_PREFIX, FAI_IMPLEMENTATION): Define macros.
        (get_port, add_sockaddr_to_list, add_host_to_list): Drop
index 70faf78337783ae9bd0472baf7dc8be0ddb90ece..417b50d6c4836bb16e577ae76b946e560a9eb3c5 100644 (file)
@@ -171,6 +171,12 @@ t_mktime: gmt_mktime.c
 
 t_localaddr: localaddr.c
        $(CC) $(ALL_CFLAGS) -DTEST -o t_localaddr $(srcdir)/localaddr.c
+
+t_locate_kdc: t_locate_kdc.o
+       $(CC) $(ALL_CFLAGS) -o t_locate_kdc t_locate_kdc.o \
+               -static -L../.. -lkrb5 -lk5crypto -lcom_err @GEN_LIB@ $(LIBS)
+t_locate_kdc.o: t_locate_kdc.c locate_kdc.c
+
 LCLINT=lclint
 LCLINTOPTS= -warnposix \
        -usedef +charintliteral +ignoresigns -predboolint +boolint \
diff --git a/src/lib/krb5/os/t_locate_kdc.c b/src/lib/krb5/os/t_locate_kdc.c
new file mode 100644 (file)
index 0000000..e93b6d8
--- /dev/null
@@ -0,0 +1,110 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <com_err.h>
+
+#define TEST
+#include "locate_kdc.c"
+
+enum {
+    LOOKUP_CONF = 3,
+    LOOKUP_DNS,
+    LOOKUP_WHATEVER
+} how = LOOKUP_WHATEVER;
+
+const char *prog;
+
+struct addrlist al;
+
+void kfatal (krb5_error_code err)
+{
+    com_err (prog, err, "- exiting");
+    exit (1);
+}
+
+void print_addrs ()
+{
+    int i;
+
+    struct sockaddr **addrs = al.addrs;
+    int naddrs = al.naddrs;
+
+    printf ("%d addresses:\n", naddrs);
+    for (i = 0; i < naddrs; i++) {
+       int err;
+       char hostbuf[NI_MAXHOST], srvbuf[NI_MAXSERV];
+       err = getnameinfo (addrs[i], socklen(addrs[i]),
+                          hostbuf, sizeof (hostbuf),
+                          srvbuf, sizeof (srvbuf),
+                          NI_NUMERICHOST | NI_NUMERICSERV);
+       if (err)
+           printf ("%2d: getnameinfo returns error %d=%s\n",
+                   i, err, gai_strerror (err));
+       else
+           printf ("%2d: address %s\tport %s\n", i, hostbuf, srvbuf);
+    }
+}
+
+int main (int argc, char *argv[])
+{
+    char *p, *realmname;
+    krb5_data realm;
+    krb5_context ctx;
+    krb5_error_code err;
+
+    p = strrchr (argv[0], '/');
+    if (p)
+       prog = p+1;
+    else
+       prog = argv[0];
+
+    switch (argc) {
+    case 2:
+       /* foo $realm */
+       realmname = argv[1];
+       break;
+    case 3:
+       if (!strcmp (argv[1], "-c"))
+           how = LOOKUP_CONF;
+       else if (!strcmp (argv[1], "-d"))
+           how = LOOKUP_DNS;
+       else
+           goto usage;
+       realmname = argv[2];
+       break;
+    default:
+    usage:
+       fprintf (stderr, "%s: usage: %s [-c | -d] realm\n", prog, prog);
+       return 1;
+    }
+
+    err = krb5_init_context (&ctx);
+    if (err)
+       kfatal (err);
+
+    realm.data = realmname;
+    realm.length = strlen (realmname);
+
+    switch (how) {
+    case LOOKUP_CONF:
+       err = krb5_locate_srv_conf (ctx, &realm, "kdc", &al, 0,
+                                   htons (88), htons (750));
+       break;
+
+    case LOOKUP_DNS:
+       err = krb5_locate_srv_dns (&realm, "_kerberos", "_udp", &al);
+       break;
+
+    case LOOKUP_WHATEVER:
+       err = krb5_locate_kdc (ctx, &realm, &al, 0);
+       break;
+    }
+    if (err) kfatal (err);
+    print_addrs ();
+    return 0;
+}