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