xref: /netbsd-src/crypto/external/bsd/heimdal/dist/admin/ktutil.c (revision d3273b5b76f5afaafe308cead5511dbb8df8c5e9)
1 /*	$NetBSD: ktutil.c,v 1.2 2017/01/28 21:31:44 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 1997-2004 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 "ktutil_locl.h"
37 #include <err.h>
38 
39 __RCSID("$NetBSD: ktutil.c,v 1.2 2017/01/28 21:31:44 christos Exp $");
40 
41 static int help_flag;
42 static int version_flag;
43 int verbose_flag;
44 char *keytab_string;
45 static char keytab_buf[256];
46 
47 static struct getargs args[] = {
48     {
49 	"version",
50 	0,
51 	arg_flag,
52 	&version_flag,
53 	NULL,
54 	NULL
55     },
56     {
57 	"help",
58 	'h',
59 	arg_flag,
60 	&help_flag,
61 	NULL,
62 	NULL
63     },
64     {
65 	"keytab",
66 	'k',
67 	arg_string,
68 	&keytab_string,
69 	"keytab",
70 	"keytab to operate on"
71     },
72     {
73 	"verbose",
74 	'v',
75 	arg_flag,
76 	&verbose_flag,
77 	"verbose",
78 	"run verbosely"
79     }
80 };
81 
82 static int num_args = sizeof(args) / sizeof(args[0]);
83 
84 krb5_context context;
85 
86 krb5_keytab
ktutil_open_keytab(void)87 ktutil_open_keytab(void)
88 {
89     krb5_error_code ret;
90     krb5_keytab keytab;
91     if (keytab_string == NULL) {
92 	ret = krb5_kt_default_name (context, keytab_buf, sizeof(keytab_buf));
93 	if (ret) {
94 	    krb5_warn(context, ret, "krb5_kt_default_name");
95 	    return NULL;
96 	}
97 	keytab_string = keytab_buf;
98     }
99     ret = krb5_kt_resolve(context, keytab_string, &keytab);
100     if (ret) {
101 	krb5_warn(context, ret, "resolving keytab %s", keytab_string);
102 	return NULL;
103     }
104     if (verbose_flag)
105 	fprintf (stderr, "Using keytab %s\n", keytab_string);
106 
107     return keytab;
108 }
109 
110 int
help(void * opt,int argc,char ** argv)111 help(void *opt, int argc, char **argv)
112 {
113     if(argc == 0) {
114 	sl_help(commands, 1, argv - 1 /* XXX */);
115     } else {
116 	SL_cmd *c = sl_match (commands, argv[0], 0);
117  	if(c == NULL) {
118 	    fprintf (stderr, "No such command: %s. "
119 		     "Try \"help\" for a list of commands\n",
120 		     argv[0]);
121 	} else {
122 	    if(c->func) {
123 		char shelp[] = "--help";
124 		char *fake[3];
125 		fake[0] = argv[0];
126 		fake[1] = shelp;
127 		fake[2] = NULL;
128 		(*c->func)(2, fake);
129 		fprintf(stderr, "\n");
130 	    }
131 	    if(c->help && *c->help)
132 		fprintf (stderr, "%s\n", c->help);
133 	    if((++c)->name && c->func == NULL) {
134 		int f = 0;
135 		fprintf (stderr, "Synonyms:");
136 		while (c->name && c->func == NULL) {
137 		    fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name);
138 		    f = 1;
139 		}
140 		fprintf (stderr, "\n");
141 	    }
142 	}
143     }
144     return 0;
145 }
146 
147 static void
usage(int status)148 usage(int status)
149 {
150     arg_printusage(args, num_args, NULL, "command");
151     exit(status);
152 }
153 
154 int
main(int argc,char ** argv)155 main(int argc, char **argv)
156 {
157     int optidx = 0;
158     krb5_error_code ret;
159     setprogname(argv[0]);
160     ret = krb5_init_context(&context);
161     if (ret)
162 	errx (1, "krb5_init_context failed: %d", ret);
163     if(getarg(args, num_args, argc, argv, &optidx))
164 	usage(1);
165     if(help_flag)
166 	usage(0);
167     if(version_flag) {
168 	print_version(NULL);
169 	exit(0);
170     }
171     argc -= optidx;
172     argv += optidx;
173     if(argc == 0)
174 	usage(1);
175     ret = sl_command(commands, argc, argv);
176     if(ret == -1)
177 	krb5_warnx (context, "unrecognized command: %s", argv[0]);
178     return ret;
179 }
180