1 /* $NetBSD: ktutil.c,v 1.1.1.1 2011/04/13 18:14:32 elric Exp $ */ 2 3 /* 4 * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include "ktutil_locl.h" 37 #include <err.h> 38 39 __RCSID("$NetBSD: ktutil.c,v 1.1.1.1 2011/04/13 18:14:32 elric Exp $"); 40 41 static int help_flag; 42 static int version_flag; 43 int verbose_flag; 44 char *keytab_string; 45 static char keytab_buf[256]; 46 47 static struct getargs args[] = { 48 { 49 "version", 50 0, 51 arg_flag, 52 &version_flag, 53 NULL, 54 NULL 55 }, 56 { 57 "help", 58 'h', 59 arg_flag, 60 &help_flag, 61 NULL, 62 NULL 63 }, 64 { 65 "keytab", 66 'k', 67 arg_string, 68 &keytab_string, 69 "keytab", 70 "keytab to operate on" 71 }, 72 { 73 "verbose", 74 'v', 75 arg_flag, 76 &verbose_flag, 77 "verbose", 78 "run verbosely" 79 } 80 }; 81 82 static int num_args = sizeof(args) / sizeof(args[0]); 83 84 krb5_context context; 85 86 krb5_keytab 87 ktutil_open_keytab(void) 88 { 89 krb5_error_code ret; 90 krb5_keytab keytab; 91 if (keytab_string == NULL) { 92 ret = krb5_kt_default_name (context, keytab_buf, sizeof(keytab_buf)); 93 if (ret) { 94 krb5_warn(context, ret, "krb5_kt_default_name"); 95 return NULL; 96 } 97 keytab_string = keytab_buf; 98 } 99 ret = krb5_kt_resolve(context, keytab_string, &keytab); 100 if (ret) { 101 krb5_warn(context, ret, "resolving keytab %s", keytab_string); 102 return NULL; 103 } 104 if (verbose_flag) 105 fprintf (stderr, "Using keytab %s\n", keytab_string); 106 107 return keytab; 108 } 109 110 int 111 help(void *opt, int argc, char **argv) 112 { 113 if(argc == 0) { 114 sl_help(commands, 1, argv - 1 /* XXX */); 115 } else { 116 SL_cmd *c = sl_match (commands, argv[0], 0); 117 if(c == NULL) { 118 fprintf (stderr, "No such command: %s. " 119 "Try \"help\" for a list of commands\n", 120 argv[0]); 121 } else { 122 if(c->func) { 123 char *fake[] = { NULL, "--help", NULL }; 124 fake[0] = argv[0]; 125 (*c->func)(2, fake); 126 fprintf(stderr, "\n"); 127 } 128 if(c->help && *c->help) 129 fprintf (stderr, "%s\n", c->help); 130 if((++c)->name && c->func == NULL) { 131 int f = 0; 132 fprintf (stderr, "Synonyms:"); 133 while (c->name && c->func == NULL) { 134 fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name); 135 f = 1; 136 } 137 fprintf (stderr, "\n"); 138 } 139 } 140 } 141 return 0; 142 } 143 144 static void 145 usage(int status) 146 { 147 arg_printusage(args, num_args, NULL, "command"); 148 exit(status); 149 } 150 151 int 152 main(int argc, char **argv) 153 { 154 int optidx = 0; 155 krb5_error_code ret; 156 setprogname(argv[0]); 157 ret = krb5_init_context(&context); 158 if (ret) 159 errx (1, "krb5_init_context failed: %d", ret); 160 if(getarg(args, num_args, argc, argv, &optidx)) 161 usage(1); 162 if(help_flag) 163 usage(0); 164 if(version_flag) { 165 print_version(NULL); 166 exit(0); 167 } 168 argc -= optidx; 169 argv += optidx; 170 if(argc == 0) 171 usage(1); 172 ret = sl_command(commands, argc, argv); 173 if(ret == -1) 174 krb5_warnx (context, "unrecognized command: %s", argv[0]); 175 return ret; 176 } 177