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