/ kuser / kcc.c
kcc.c
  1  /*
  2   * Copyright (c) 2010 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 "kuser_locl.h"
 35  #include <sl.h>
 36  #include "kcc-commands.h"
 37  
 38  static void usage (int ret) __attribute__((noreturn));
 39  
 40  krb5_context kcc_context;
 41  static int version_flag;
 42  static int help_flag;
 43  
 44  static struct getargs args[] = {
 45      { "version", 	0,   arg_flag, &version_flag, NULL, NULL },
 46      { "help",		0,   arg_flag, &help_flag, NULL, NULL }
 47  };
 48  
 49  static void
 50  usage(int ret)
 51  {
 52      arg_printusage_i18n(args,
 53  			sizeof(args)/sizeof(*args),
 54  			N_("Usage: ", ""),
 55  			NULL,
 56  			"command ..",
 57  			getarg_i18n);
 58      exit (ret);
 59  }
 60  
 61  int
 62  help(void *opt, int argc, char **argv)
 63  {
 64      sl_slc_help(commands, argc, argv);
 65      return 0;
 66  }
 67  
 68  int
 69  kgetcred(struct kgetcred_options *opt, int argc, char **argv)
 70  {
 71      if(opt->version_flag) {
 72  	print_version(NULL);
 73  	exit(0);
 74      }
 75      return 0;
 76  }
 77  
 78  /*
 79   * Wrapper for command line compatiblity
 80   */
 81  
 82  int
 83  kvno(struct kvno_options *opt, int argc, char **argv)
 84  {
 85      struct kgetcred_options k;
 86      memset(&k, 0, sizeof(k));
 87  
 88      if(opt->version_flag) {
 89  	print_version(NULL);
 90  	exit(0);
 91      }
 92  
 93      k.cache_string = opt->cache_string;
 94      k.enctype_string = opt->enctype_string;
 95  
 96      return kgetcred(&k, argc, argv);
 97  }
 98  
 99  static int
100  command_alias(const char *name)
101  {
102      const char *aliases[] = {
103  	"kinit", "klist", "kswitch", "kgetcred", "kvno", "kdeltkt",
104  	"kdestroy", "kcpytkt", NULL
105      }, **p = aliases;
106  
107      while (*p && strcmp(name, *p) != 0)
108  	p++;
109      return *p != NULL;
110  }
111  
112  
113  int
114  main(int argc, char **argv)
115  {
116      krb5_error_code ret;
117      int optidx = 0;
118      int exit_status = 0;
119  
120      setprogname (argv[0]);
121  
122      setlocale (LC_ALL, "");
123      bindtextdomain ("heimdal_kuser", HEIMDAL_LOCALEDIR);
124      textdomain("heimdal_kuser");
125  
126      ret = krb5_init_context(&kcc_context);
127      if (ret == KRB5_CONFIG_BADFORMAT)
128  	errx (1, "krb5_init_context failed to parse configuration file");
129      else if (ret)
130  	errx(1, "krb5_init_context failed: %d", ret);
131  
132      /*
133       * Support linking of kcc to commands
134       */
135  
136      if (!command_alias(getprogname())) {
137  
138  	if (argc == 1) {
139  	    sl_slc_help(commands, 0, NULL);
140  	    return 1;
141  	}
142  
143  	if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
144  	    usage(1);
145  
146  	if (help_flag)
147  	    usage (0);
148  
149  	if(version_flag) {
150  	    print_version(NULL);
151  	    exit(0);
152  	}
153  
154      } else {
155  	argv[0] = rk_UNCONST(getprogname());
156      }
157  
158      argc -= optidx;
159      argv += optidx;
160  
161      if (argc != 0) {
162  	ret = sl_command(commands, argc, argv);
163  	if(ret == -1)
164  	    krb5_warnx(kcc_context, "unrecognized command: %s", argv[0]);
165  	else if (ret == -2)
166  	    ret = 0;
167  	if(ret != 0)
168  	    exit_status = 1;
169      } else {
170  	sl_slc_help(commands, argc, argv);
171  	exit_status = 1;
172      }
173  
174      krb5_free_context(kcc_context);
175      return exit_status;
176  }