1 /*
2  * Copyright (c) 2005 Kungliga Tekniska Högskolan
3  * (Royal Institute of Technology, Stockholm, Sweden).
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of KTH nor the names of its contributors may be
18  *    used to endorse or promote products derived from this software without
19  *    specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32 
33 #include "krb5_locl.h"
34 #include <err.h>
35 #include <getarg.h>
36 
37 static int debug_flag	= 0;
38 static int version_flag = 0;
39 static int help_flag	= 0;
40 
41 static int
42 expand_hostname(krb5_context context, const char *host)
43 {
44     krb5_error_code ret;
45     char *h, **r;
46 
47     ret = krb5_expand_hostname(context, host, &h);
48     if (ret)
49 	krb5_err(context, 1, ret, "krb5_expand_hostname(%s)", host);
50 
51     free(h);
52 
53     if (debug_flag)
54 	printf("hostname: %s -> %s\n", host, h);
55 
56     ret = krb5_expand_hostname_realms(context, host, &h, &r);
57     if (ret)
58 	krb5_err(context, 1, ret, "krb5_expand_hostname_realms(%s)", host);
59 
60     if (debug_flag) {
61 	int j;
62 
63 	printf("hostname: %s -> %s\n", host, h);
64 	for (j = 0; r[j]; j++) {
65 	    printf("\trealm: %s\n", r[j]);
66 	}
67     }
68     free(h);
69     krb5_free_host_realm(context, r);
70 
71     return 0;
72 }
73 
74 static int
75 test_expand_hostname(krb5_context context)
76 {
77     int i, errors = 0;
78 
79     struct t {
80 	krb5_error_code ret;
81 	const char *orig_hostname;
82 	const char *new_hostname;
83     } tests[] = {
84 	{ 0, "pstn1.su.se", "pstn1.su.se" },
85 	{ 0, "pstnproxy.su.se", "pstnproxy.su.se" },
86     };
87 
88     for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
89 	errors += expand_hostname(context, tests[i].orig_hostname);
90     }
91 
92     return errors;
93 }
94 
95 static struct getargs args[] = {
96     {"debug",	'd',	arg_flag,	&debug_flag,
97      "turn on debuggin", NULL },
98     {"version",	0,	arg_flag,	&version_flag,
99      "print version", NULL },
100     {"help",	0,	arg_flag,	&help_flag,
101      NULL, NULL }
102 };
103 
104 static void
105 usage (int ret)
106 {
107     arg_printusage (args, sizeof(args)/sizeof(*args), NULL, "hostname ...");
108     exit (ret);
109 }
110 
111 
112 int
113 main(int argc, char **argv)
114 {
115     krb5_context context;
116     krb5_error_code ret;
117     int optidx = 0, errors = 0;
118 
119     setprogname(argv[0]);
120 
121     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
122 	usage(1);
123 
124     if (help_flag)
125 	usage (0);
126 
127     if(version_flag){
128 	print_version(NULL);
129 	exit(0);
130     }
131 
132     argc -= optidx;
133     argv += optidx;
134 
135     ret = krb5_init_context(&context);
136     if (ret)
137 	errx (1, "krb5_init_context failed: %d", ret);
138 
139     if (argc > 0) {
140 	while (argc-- > 0)
141 	    errors += expand_hostname(context, *argv++);
142 	return errors;
143     }
144 
145     errors += test_expand_hostname(context);
146 
147     krb5_free_context(context);
148 
149     return errors;
150 }
151