ktutil.c revision 178825
1169689Skan/*
2169689Skan * Copyright (c) 1997-2004 Kungliga Tekniska H�gskolan
3169689Skan * (Royal Institute of Technology, Stockholm, Sweden).
4169689Skan * All rights reserved.
5169689Skan *
6169689Skan * Redistribution and use in source and binary forms, with or without
7169689Skan * modification, are permitted provided that the following conditions
8169689Skan * are met:
9169689Skan *
10169689Skan * 1. Redistributions of source code must retain the above copyright
11169689Skan *    notice, this list of conditions and the following disclaimer.
12169689Skan *
13169689Skan * 2. Redistributions in binary form must reproduce the above copyright
14169689Skan *    notice, this list of conditions and the following disclaimer in the
15169689Skan *    documentation and/or other materials provided with the distribution.
16169689Skan *
17169689Skan * 3. Neither the name of the Institute nor the names of its contributors
18169689Skan *    may be used to endorse or promote products derived from this software
19169689Skan *    without specific prior written permission.
20169689Skan *
21169689Skan * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22169689Skan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23169689Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24169689Skan * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25169689Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26169689Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27169689Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28169689Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29169689Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30169689Skan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31169689Skan * SUCH DAMAGE.
32169689Skan */
33169689Skan
34169689Skan#include "ktutil_locl.h"
35169689Skan#include <err.h>
36169689Skan
37169689SkanRCSID("$Id: ktutil.c 15585 2005-07-07 21:52:04Z lha $");
38169689Skan
39169689Skanstatic int help_flag;
40169689Skanstatic int version_flag;
41169689Skanint verbose_flag;
42169689Skanchar *keytab_string;
43169689Skanstatic char keytab_buf[256];
44169689Skan
45169689Skanstatic struct getargs args[] = {
46169689Skan    {
47169689Skan	"version",
48169689Skan	0,
49169689Skan	arg_flag,
50169689Skan	&version_flag,
51169689Skan	NULL,
52169689Skan	NULL
53169689Skan    },
54169689Skan    {
55169689Skan	"help",
56169689Skan	'h',
57169689Skan	arg_flag,
58169689Skan	&help_flag,
59169689Skan	NULL,
60169689Skan	NULL
61169689Skan    },
62169689Skan    {
63169689Skan	"keytab",
64169689Skan	'k',
65169689Skan	arg_string,
66169689Skan	&keytab_string,
67169689Skan	"keytab",
68169689Skan	"keytab to operate on"
69169689Skan    },
70169689Skan    {
71169689Skan	"verbose",
72169689Skan	'v',
73169689Skan	arg_flag,
74169689Skan	&verbose_flag,
75169689Skan	"verbose",
76169689Skan	"run verbosely"
77169689Skan    }
78169689Skan};
79169689Skan
80169689Skanstatic int num_args = sizeof(args) / sizeof(args[0]);
81169689Skan
82169689Skankrb5_context context;
83169689Skan
84169689Skankrb5_keytab
85169689Skanktutil_open_keytab(void)
86169689Skan{
87169689Skan    krb5_error_code ret;
88169689Skan    krb5_keytab keytab;
89169689Skan    if (keytab_string == NULL) {
90169689Skan	ret = krb5_kt_default_name (context, keytab_buf, sizeof(keytab_buf));
91169689Skan	if (ret) {
92169689Skan	    krb5_warn(context, ret, "krb5_kt_default_name");
93169689Skan	    return NULL;
94169689Skan	}
95169689Skan	keytab_string = keytab_buf;
96169689Skan    }
97169689Skan    ret = krb5_kt_resolve(context, keytab_string, &keytab);
98169689Skan    if (ret) {
99169689Skan	krb5_warn(context, ret, "resolving keytab %s", keytab_string);
100169689Skan	return NULL;
101169689Skan    }
102169689Skan    if (verbose_flag)
103169689Skan	fprintf (stderr, "Using keytab %s\n", keytab_string);
104169689Skan
105169689Skan    return keytab;
106169689Skan}
107169689Skan
108169689Skanint
109169689Skanhelp(void *opt, int argc, char **argv)
110169689Skan{
111169689Skan    if(argc == 0) {
112169689Skan	sl_help(commands, 1, argv - 1 /* XXX */);
113169689Skan    } else {
114169689Skan	SL_cmd *c = sl_match (commands, argv[0], 0);
115169689Skan 	if(c == NULL) {
116169689Skan	    fprintf (stderr, "No such command: %s. "
117169689Skan		     "Try \"help\" for a list of commands\n",
118169689Skan		     argv[0]);
119169689Skan	} else {
120169689Skan	    if(c->func) {
121169689Skan		char *fake[] = { NULL, "--help", NULL };
122169689Skan		fake[0] = argv[0];
123169689Skan		(*c->func)(2, fake);
124169689Skan		fprintf(stderr, "\n");
125169689Skan	    }
126169689Skan	    if(c->help && *c->help)
127169689Skan		fprintf (stderr, "%s\n", c->help);
128169689Skan	    if((++c)->name && c->func == NULL) {
129169689Skan		int f = 0;
130169689Skan		fprintf (stderr, "Synonyms:");
131169689Skan		while (c->name && c->func == NULL) {
132169689Skan		    fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name);
133169689Skan		    f = 1;
134169689Skan		}
135169689Skan		fprintf (stderr, "\n");
136169689Skan	    }
137169689Skan	}
138169689Skan    }
139169689Skan    return 0;
140169689Skan}
141169689Skan
142169689Skanstatic void
143169689Skanusage(int status)
144169689Skan{
145169689Skan    arg_printusage(args, num_args, NULL, "command");
146169689Skan    exit(status);
147169689Skan}
148169689Skan
149169689Skanint
150169689Skanmain(int argc, char **argv)
151169689Skan{
152169689Skan    int optidx = 0;
153169689Skan    krb5_error_code ret;
154169689Skan    setprogname(argv[0]);
155169689Skan    ret = krb5_init_context(&context);
156169689Skan    if (ret)
157169689Skan	errx (1, "krb5_init_context failed: %d", ret);
158169689Skan    if(getarg(args, num_args, argc, argv, &optidx))
159169689Skan	usage(1);
160169689Skan    if(help_flag)
161169689Skan	usage(0);
162169689Skan    if(version_flag) {
163169689Skan	print_version(NULL);
164169689Skan	exit(0);
165169689Skan    }
166169689Skan    argc -= optidx;
167169689Skan    argv += optidx;
168169689Skan    if(argc == 0)
169169689Skan	usage(1);
170169689Skan    ret = sl_command(commands, argc, argv);
171169689Skan    if(ret == -1)
172169689Skan	krb5_warnx (context, "unrecognized command: %s", argv[0]);
173169689Skan    return ret;
174169689Skan}
175169689Skan