ktutil.c revision 57416
1/*
2 * Copyright (c) 1997 - 2000 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 the Institute nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#include "ktutil_locl.h"
35
36RCSID("$Id: ktutil.c,v 1.26 2000/02/07 04:29:25 assar Exp $");
37
38static int help_flag;
39static int version_flag;
40int verbose_flag;
41char *keytab_string;
42
43static int help(int argc, char **argv);
44
45static SL_cmd cmds[] = {
46    { "add", 		kt_add,		"add",
47      "adds key to keytab" },
48    { "change",		kt_change,	"change [principal...]",
49      "get new key for principals (all)" },
50    { "copy",		kt_copy,	"copy src dst",
51      "copy one keytab to another" },
52    { "get", 		kt_get,		"get [principal...]",
53      "create key in database and add to keytab" },
54    { "list",		kt_list,	"list",
55      "shows contents of a keytab" },
56    { "purge",		kt_purge,	"purge",
57      "remove old and superceeded entries" },
58    { "remove", 	kt_remove,	"remove",
59      "remove key from keytab" },
60    { "srvconvert",	srvconv,	"srvconvert [flags]",
61      "convert v4 srvtab to keytab" },
62    { "srv2keytab" },
63    { "srvcreate",	srvcreate,	"srvcreate [flags]",
64      "convert keytab to v4 srvtab" },
65    { "key2srvtab" },
66    { "help",		help,		"help",			"" },
67    { NULL, 	NULL,		NULL, 			NULL }
68};
69
70static struct getargs args[] = {
71    {
72	"version",
73	0,
74	arg_flag,
75	&version_flag,
76	NULL,
77	NULL
78    },
79    {
80	"help",
81	'h',
82	arg_flag,
83	&help_flag,
84	NULL,
85	NULL
86    },
87    {
88	"keytab",
89	'k',
90	arg_string,
91	&keytab_string,
92	"keytab",
93	"keytab to operate on"
94    },
95    {
96	"verbose",
97	'v',
98	arg_flag,
99	&verbose_flag,
100	"verbose",
101	"run verbosely"
102    }
103};
104
105static int num_args = sizeof(args) / sizeof(args[0]);
106
107krb5_context context;
108krb5_keytab keytab;
109
110static int
111help(int argc, char **argv)
112{
113    sl_help(cmds, argc, argv);
114    return 0;
115}
116
117static void
118usage(int status)
119{
120    arg_printusage(args, num_args, NULL, "command");
121    exit(status);
122}
123
124int
125main(int argc, char **argv)
126{
127    int optind = 0;
128    krb5_error_code ret;
129    set_progname(argv[0]);
130    krb5_init_context(&context);
131    if(getarg(args, num_args, argc, argv, &optind))
132	usage(1);
133    if(help_flag)
134	usage(0);
135    if(version_flag) {
136	print_version(NULL);
137	exit(0);
138    }
139    argc -= optind;
140    argv += optind;
141    if(argc == 0)
142	usage(1);
143    if(keytab_string) {
144	ret = krb5_kt_resolve(context, keytab_string, &keytab);
145    } else {
146	ret = krb5_kt_default(context, &keytab);
147    }
148    if(ret)
149	krb5_err(context, 1, ret, "resolving keytab");
150    ret = sl_command(cmds, argc, argv);
151    if(ret == -1)
152	krb5_warnx (context, "unrecognized command: %s", argv[0]);
153    krb5_kt_close(context, keytab);
154    return ret;
155}
156