xref: /netbsd-src/crypto/external/bsd/heimdal/dist/admin/ktutil.c (revision 6a493d6bc668897c91594964a732d38505b70cbb)
1 /*	$NetBSD: ktutil.c,v 1.1.1.1 2011/04/13 18:14:32 elric 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.1.1.1 2011/04/13 18:14:32 elric 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
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
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 *fake[] = { NULL, "--help", NULL };
124 		fake[0] = argv[0];
125 		(*c->func)(2, fake);
126 		fprintf(stderr, "\n");
127 	    }
128 	    if(c->help && *c->help)
129 		fprintf (stderr, "%s\n", c->help);
130 	    if((++c)->name && c->func == NULL) {
131 		int f = 0;
132 		fprintf (stderr, "Synonyms:");
133 		while (c->name && c->func == NULL) {
134 		    fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name);
135 		    f = 1;
136 		}
137 		fprintf (stderr, "\n");
138 	    }
139 	}
140     }
141     return 0;
142 }
143 
144 static void
145 usage(int status)
146 {
147     arg_printusage(args, num_args, NULL, "command");
148     exit(status);
149 }
150 
151 int
152 main(int argc, char **argv)
153 {
154     int optidx = 0;
155     krb5_error_code ret;
156     setprogname(argv[0]);
157     ret = krb5_init_context(&context);
158     if (ret)
159 	errx (1, "krb5_init_context failed: %d", ret);
160     if(getarg(args, num_args, argc, argv, &optidx))
161 	usage(1);
162     if(help_flag)
163 	usage(0);
164     if(version_flag) {
165 	print_version(NULL);
166 	exit(0);
167     }
168     argc -= optidx;
169     argv += optidx;
170     if(argc == 0)
171 	usage(1);
172     ret = sl_command(commands, argc, argv);
173     if(ret == -1)
174 	krb5_warnx (context, "unrecognized command: %s", argv[0]);
175     return ret;
176 }
177