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