1 /* $NetBSD: ktutil.c,v 1.1.1.2 2014/04/24 12:45:26 pettai 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"); 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 shelp[] = "--help"; 124 char *fake[3]; 125 fake[0] = argv[0]; 126 fake[1] = shelp; 127 fake[2] = NULL; 128 (*c->func)(2, fake); 129 fprintf(stderr, "\n"); 130 } 131 if(c->help && *c->help) 132 fprintf (stderr, "%s\n", c->help); 133 if((++c)->name && c->func == NULL) { 134 int f = 0; 135 fprintf (stderr, "Synonyms:"); 136 while (c->name && c->func == NULL) { 137 fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name); 138 f = 1; 139 } 140 fprintf (stderr, "\n"); 141 } 142 } 143 } 144 return 0; 145 } 146 147 static void 148 usage(int status) 149 { 150 arg_printusage(args, num_args, NULL, "command"); 151 exit(status); 152 } 153 154 int 155 main(int argc, char **argv) 156 { 157 int optidx = 0; 158 krb5_error_code ret; 159 setprogname(argv[0]); 160 ret = krb5_init_context(&context); 161 if (ret) 162 errx (1, "krb5_init_context failed: %d", ret); 163 if(getarg(args, num_args, argc, argv, &optidx)) 164 usage(1); 165 if(help_flag) 166 usage(0); 167 if(version_flag) { 168 print_version(NULL); 169 exit(0); 170 } 171 argc -= optidx; 172 argv += optidx; 173 if(argc == 0) 174 usage(1); 175 ret = sl_command(commands, argc, argv); 176 if(ret == -1) 177 krb5_warnx (context, "unrecognized command: %s", argv[0]); 178 return ret; 179 } 180