1178825Sdfr/*
2233294Sstas * Copyright (c) 2006 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
5178825Sdfr *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
9178825Sdfr *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
12178825Sdfr *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
16178825Sdfr *
17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
18233294Sstas *    may be used to endorse or promote products derived from this software
19233294Sstas *    without specific prior written permission.
20178825Sdfr *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31233294Sstas * SUCH DAMAGE.
32178825Sdfr */
33178825Sdfr
34178825Sdfr#include <krb5_locl.h>
35178825Sdfr#include "locate_plugin.h"
36178825Sdfr
37178825Sdfrstatic krb5_error_code
38178825Sdfrresolve_init(krb5_context context, void **ctx)
39178825Sdfr{
40178825Sdfr    *ctx = NULL;
41178825Sdfr    return 0;
42178825Sdfr}
43178825Sdfr
44178825Sdfrstatic void
45178825Sdfrresolve_fini(void *ctx)
46178825Sdfr{
47178825Sdfr}
48178825Sdfr
49178825Sdfrstatic krb5_error_code
50178825Sdfrresolve_lookup(void *ctx,
51178825Sdfr	       enum locate_service_type service,
52178825Sdfr	       const char *realm,
53178825Sdfr	       int domain,
54233294Sstas	       int type,
55178825Sdfr	       int (*add)(void *,int,struct sockaddr *),
56178825Sdfr	       void *addctx)
57178825Sdfr{
58178825Sdfr    struct sockaddr_in s;
59178825Sdfr
60178825Sdfr    memset(&s, 0, sizeof(s));
61178825Sdfr
62178825Sdfr#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
63178825Sdfr    s.sin_len = sizeof(s);
64178825Sdfr#endif
65178825Sdfr    s.sin_family = AF_INET;
66178825Sdfr    s.sin_port = htons(88);
67178825Sdfr    s.sin_addr.s_addr = htonl(0x7f000002);
68178825Sdfr
69178825Sdfr    if (strcmp(realm, "NOTHERE.H5L.SE") == 0)
70178825Sdfr	(*add)(addctx, type, (struct sockaddr *)&s);
71178825Sdfr
72178825Sdfr    return 0;
73178825Sdfr}
74178825Sdfr
75178825Sdfr
76178825Sdfrkrb5plugin_service_locate_ftable resolve = {
77178825Sdfr    0,
78178825Sdfr    resolve_init,
79178825Sdfr    resolve_fini,
80178825Sdfr    resolve_lookup
81178825Sdfr};
82178825Sdfr
83178825Sdfr
84178825Sdfrint
85178825Sdfrmain(int argc, char **argv)
86178825Sdfr{
87178825Sdfr    krb5_error_code ret;
88178825Sdfr    krb5_context context;
89178825Sdfr    krb5_krbhst_handle handle;
90178825Sdfr    char host[MAXHOSTNAMELEN];
91178825Sdfr    int found = 0;
92178825Sdfr
93178825Sdfr    setprogname(argv[0]);
94178825Sdfr
95178825Sdfr    ret = krb5_init_context(&context);
96178825Sdfr    if (ret)
97178825Sdfr	errx(1, "krb5_init_contex");
98178825Sdfr
99233294Sstas    ret = krb5_plugin_register(context, PLUGIN_TYPE_DATA,
100233294Sstas			       KRB5_PLUGIN_LOCATE, &resolve);
101178825Sdfr    if (ret)
102178825Sdfr	krb5_err(context, 1, ret, "krb5_plugin_register");
103178825Sdfr
104178825Sdfr
105178825Sdfr    ret = krb5_krbhst_init_flags(context,
106178825Sdfr				 "NOTHERE.H5L.SE",
107178825Sdfr				 KRB5_KRBHST_KDC,
108178825Sdfr				 0,
109178825Sdfr				 &handle);
110178825Sdfr    if (ret)
111178825Sdfr	krb5_err(context, 1, ret, "krb5_krbhst_init_flags");
112178825Sdfr
113233294Sstas
114178825Sdfr    while(krb5_krbhst_next_as_string(context, handle, host, sizeof(host)) == 0){
115178825Sdfr	found++;
116178825Sdfr 	if (strcmp(host, "127.0.0.2") != 0)
117178825Sdfr	    krb5_errx(context, 1, "wrong address: %s", host);
118178825Sdfr    }
119178825Sdfr    if (!found)
120178825Sdfr	krb5_errx(context, 1, "failed to find host");
121178825Sdfr
122178825Sdfr    krb5_krbhst_free(context, handle);
123178825Sdfr
124178825Sdfr    krb5_free_context(context);
125178825Sdfr    return 0;
126178825Sdfr}
127