155682Smarkm/*
2233294Sstas * Copyright (c) 1997-2004 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
555682Smarkm *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
955682Smarkm *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
18233294Sstas *    may be used to endorse or promote products derived from this software
19233294Sstas *    without specific prior written permission.
2055682Smarkm *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31233294Sstas * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "ktutil_locl.h"
3572445Sassar#include <err.h>
3655682Smarkm
37233294SstasRCSID("$Id$");
3855682Smarkm
3957416Smarkmstatic int help_flag;
4057416Smarkmstatic int version_flag;
4155682Smarkmint verbose_flag;
42233294Sstaschar *keytab_string;
4390926Snectarstatic char keytab_buf[256];
4455682Smarkm
4555682Smarkmstatic struct getargs args[] = {
46233294Sstas    {
4755682Smarkm	"version",
4855682Smarkm	0,
4955682Smarkm	arg_flag,
5055682Smarkm	&version_flag,
5155682Smarkm	NULL,
52233294Sstas	NULL
5355682Smarkm    },
54233294Sstas    {
55233294Sstas	"help",
56233294Sstas	'h',
57233294Sstas	arg_flag,
58233294Sstas	&help_flag,
59233294Sstas	NULL,
6055682Smarkm	NULL
6155682Smarkm    },
62233294Sstas    {
63233294Sstas	"keytab",
64233294Sstas	'k',
65233294Sstas	arg_string,
66233294Sstas	&keytab_string,
67233294Sstas	"keytab",
68233294Sstas	"keytab to operate on"
6955682Smarkm    },
7055682Smarkm    {
7155682Smarkm	"verbose",
7255682Smarkm	'v',
7355682Smarkm	arg_flag,
7455682Smarkm	&verbose_flag,
7555682Smarkm	"verbose",
7655682Smarkm	"run verbosely"
7755682Smarkm    }
7855682Smarkm};
7955682Smarkm
8055682Smarkmstatic int num_args = sizeof(args) / sizeof(args[0]);
8155682Smarkm
8255682Smarkmkrb5_context context;
8355682Smarkm
8490926Snectarkrb5_keytab
8590926Snectarktutil_open_keytab(void)
8690926Snectar{
8790926Snectar    krb5_error_code ret;
8890926Snectar    krb5_keytab keytab;
8990926Snectar    if (keytab_string == NULL) {
9090926Snectar	ret = krb5_kt_default_name (context, keytab_buf, sizeof(keytab_buf));
9190926Snectar	if (ret) {
9290926Snectar	    krb5_warn(context, ret, "krb5_kt_default_name");
9390926Snectar	    return NULL;
9490926Snectar	}
9590926Snectar	keytab_string = keytab_buf;
9690926Snectar    }
9790926Snectar    ret = krb5_kt_resolve(context, keytab_string, &keytab);
9890926Snectar    if (ret) {
9990926Snectar	krb5_warn(context, ret, "resolving keytab %s", keytab_string);
10090926Snectar	return NULL;
10190926Snectar    }
10290926Snectar    if (verbose_flag)
10390926Snectar	fprintf (stderr, "Using keytab %s\n", keytab_string);
104233294Sstas
10590926Snectar    return keytab;
10690926Snectar}
10790926Snectar
108178825Sdfrint
109178825Sdfrhelp(void *opt, int argc, char **argv)
11055682Smarkm{
111178825Sdfr    if(argc == 0) {
112178825Sdfr	sl_help(commands, 1, argv - 1 /* XXX */);
113178825Sdfr    } else {
114178825Sdfr	SL_cmd *c = sl_match (commands, argv[0], 0);
115178825Sdfr 	if(c == NULL) {
116178825Sdfr	    fprintf (stderr, "No such command: %s. "
117178825Sdfr		     "Try \"help\" for a list of commands\n",
118178825Sdfr		     argv[0]);
119178825Sdfr	} else {
120178825Sdfr	    if(c->func) {
121233294Sstas		char shelp[] = "--help";
122233294Sstas		char *fake[3];
123178825Sdfr		fake[0] = argv[0];
124233294Sstas		fake[1] = shelp;
125233294Sstas		fake[2] = NULL;
126178825Sdfr		(*c->func)(2, fake);
127178825Sdfr		fprintf(stderr, "\n");
128178825Sdfr	    }
129178825Sdfr	    if(c->help && *c->help)
130178825Sdfr		fprintf (stderr, "%s\n", c->help);
131178825Sdfr	    if((++c)->name && c->func == NULL) {
132178825Sdfr		int f = 0;
133178825Sdfr		fprintf (stderr, "Synonyms:");
134178825Sdfr		while (c->name && c->func == NULL) {
135178825Sdfr		    fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name);
136178825Sdfr		    f = 1;
137178825Sdfr		}
138178825Sdfr		fprintf (stderr, "\n");
139178825Sdfr	    }
140178825Sdfr	}
141178825Sdfr    }
14255682Smarkm    return 0;
14355682Smarkm}
14455682Smarkm
14555682Smarkmstatic void
14655682Smarkmusage(int status)
14755682Smarkm{
14855682Smarkm    arg_printusage(args, num_args, NULL, "command");
14955682Smarkm    exit(status);
15055682Smarkm}
15155682Smarkm
15255682Smarkmint
15355682Smarkmmain(int argc, char **argv)
15455682Smarkm{
155178825Sdfr    int optidx = 0;
15655682Smarkm    krb5_error_code ret;
15778527Sassar    setprogname(argv[0]);
15872445Sassar    ret = krb5_init_context(&context);
15972445Sassar    if (ret)
16072445Sassar	errx (1, "krb5_init_context failed: %d", ret);
161178825Sdfr    if(getarg(args, num_args, argc, argv, &optidx))
16255682Smarkm	usage(1);
16355682Smarkm    if(help_flag)
16455682Smarkm	usage(0);
16555682Smarkm    if(version_flag) {
16655682Smarkm	print_version(NULL);
16755682Smarkm	exit(0);
16855682Smarkm    }
169178825Sdfr    argc -= optidx;
170178825Sdfr    argv += optidx;
17155682Smarkm    if(argc == 0)
17255682Smarkm	usage(1);
173178825Sdfr    ret = sl_command(commands, argc, argv);
17455682Smarkm    if(ret == -1)
17555682Smarkm	krb5_warnx (context, "unrecognized command: %s", argv[0]);
17655682Smarkm    return ret;
17755682Smarkm}
178