1/*	$NetBSD: test_plugin.c,v 1.3 2023/06/19 21:41:45 christos Exp $	*/
2
3/*
4 * Copyright (c) 2006 Kungliga Tekniska H��gskolan
5 * (Royal Institute of Technology, Stockholm, Sweden).
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * 3. Neither the name of the Institute nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36#include <krb5_locl.h>
37#include "locate_plugin.h"
38
39static krb5_error_code KRB5_CALLCONV
40resolve_init(krb5_context context, void **ctx)
41{
42    *ctx = NULL;
43    return 0;
44}
45
46static void KRB5_CALLCONV
47resolve_fini(void *ctx)
48{
49}
50
51static krb5_error_code KRB5_CALLCONV
52resolve_lookup(void *ctx,
53	       enum locate_service_type service,
54	       const char *realm,
55	       int domain,
56	       int type,
57	       int (*add)(void *,int,struct sockaddr *),
58	       void *addctx)
59{
60    struct sockaddr_in s;
61
62    memset(&s, 0, sizeof(s));
63
64#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
65    s.sin_len = sizeof(s);
66#endif
67    s.sin_family = AF_INET;
68    s.sin_port = htons(88);
69    s.sin_addr.s_addr = htonl(0x7f000002);
70
71    if (strcmp(realm, "NOTHERE.H5L.SE") == 0)
72	(*add)(addctx, type, (struct sockaddr *)&s);
73
74    return 0;
75}
76
77
78krb5plugin_service_locate_ftable resolve = {
79    0,
80    resolve_init,
81    resolve_fini,
82    resolve_lookup,
83    NULL
84};
85
86
87int
88main(int argc, char **argv)
89{
90    krb5_error_code ret;
91    krb5_context context;
92    krb5_krbhst_handle handle;
93    char host[MAXHOSTNAMELEN];
94    int found = 0;
95
96    setprogname(argv[0]);
97
98    ret = krb5_init_context(&context);
99    if (ret)
100	errx(1, "krb5_init_contex");
101
102    ret = krb5_plugin_register(context, PLUGIN_TYPE_DATA,
103			       KRB5_PLUGIN_LOCATE, &resolve);
104    if (ret)
105	krb5_err(context, 1, ret, "krb5_plugin_register");
106
107
108    ret = krb5_krbhst_init_flags(context,
109				 "NOTHERE.H5L.SE",
110				 KRB5_KRBHST_KDC,
111				 0,
112				 &handle);
113    if (ret)
114	krb5_err(context, 1, ret, "krb5_krbhst_init_flags");
115
116
117    while(krb5_krbhst_next_as_string(context, handle, host, sizeof(host)) == 0){
118	found++;
119 	if (!found && strcmp(host, "127.0.0.2") != 0 && strcmp(host, "tcp/127.0.0.2") != 0)
120	    krb5_errx(context, 1, "wrong address: %s", host);
121    }
122    if (!found)
123	krb5_errx(context, 1, "failed to find host");
124    if (found < 2)
125	krb5_errx(context, 1, "did not get the two expected results");
126
127    krb5_krbhst_free(context, handle);
128
129    krb5_free_context(context);
130    return 0;
131}
132