diff options
Diffstat (limited to 'crypto/heimdal/kuser/kinit.c')
-rw-r--r-- | crypto/heimdal/kuser/kinit.c | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/crypto/heimdal/kuser/kinit.c b/crypto/heimdal/kuser/kinit.c index be2857c..560e0e2 100644 --- a/crypto/heimdal/kuser/kinit.c +++ b/crypto/heimdal/kuser/kinit.c @@ -32,7 +32,7 @@ */ #include "kuser_locl.h" -RCSID("$Id: kinit.c,v 1.69 2001/01/05 16:32:55 joda Exp $"); +RCSID("$Id: kinit.c,v 1.75 2001/05/07 21:08:15 assar Exp $"); #ifdef KRB4 /* for when the KDC tells us it's a v4 one, we try to talk that */ @@ -248,7 +248,7 @@ usage (int ret) arg_printusage (args, sizeof(args)/sizeof(*args), NULL, - "[principal]"); + "[principal [command]]"); exit (ret); } @@ -290,9 +290,12 @@ renew_validate(krb5_context context, flags.i = 0; flags.b.renewable = flags.b.renew = renew; flags.b.validate = validate; - flags.b.forwardable = forwardable_flag; - flags.b.proxiable = proxiable_flag; - flags.b.request_anonymous = anonymous_flag; + if (forwardable_flag != -1) + flags.b.forwardable = forwardable_flag; + if (proxiable_flag != -1) + flags.b.proxiable = proxiable_flag; + if (anonymous_flag != -1) + flags.b.request_anonymous = anonymous_flag; if(life) in.times.endtime = time(NULL) + life; @@ -339,7 +342,7 @@ main (int argc, char **argv) krb5_addresses no_addrs; char passwd[256]; - set_progname (argv[0]); + setprogname (argv[0]); memset(&cred, 0, sizeof(cred)); ret = krb5_init_context (&context); @@ -376,9 +379,6 @@ main (int argc, char **argv) argc -= optind; argv += optind; - if (argc > 1) - usage (1); - if (argv[0]) { ret = krb5_parse_name (context, argv[0], &principal); if (ret) @@ -394,8 +394,26 @@ main (int argc, char **argv) if(cred_cache) ret = krb5_cc_resolve(context, cred_cache, &ccache); - else - ret = krb5_cc_default (context, &ccache); + else { + if(argc > 1) { + char s[1024]; + ret = krb5_cc_gen_new(context, &krb5_fcc_ops, &ccache); + if(ret) + krb5_err(context, 1, ret, "creating cred cache"); + snprintf(s, sizeof(s), "%s:%s", + krb5_cc_get_type(context, ccache), + krb5_cc_get_name(context, ccache)); + setenv("KRB5CCNAME", s, 1); +#ifdef KRB4 + snprintf(s, sizeof(s), "%s_XXXXXX", TKT_ROOT); + close(mkstemp(s)); + setenv("KRBTKFILE", s, 1); + if (k_hasafs ()) + k_setpag(); +#endif + } else + ret = krb5_cc_default (context, &ccache); + } if (ret) krb5_err (context, 1, ret, "resolving credentials cache"); @@ -437,7 +455,7 @@ main (int argc, char **argv) errx (1, "unparsable time: %s", renew_life); krb5_get_init_creds_opt_set_renew_life (&opt, tmp); - } else if (renewable_flag) + } else if (renewable_flag == 1) krb5_get_init_creds_opt_set_renew_life (&opt, 1 << 30); if(ticket_life != 0) @@ -570,9 +588,18 @@ main (int argc, char **argv) } if(do_afslog && k_hasafs()) krb5_afslog(context, ccache, NULL, NULL); -#endif krb5_free_creds_contents (context, &cred); - krb5_cc_close (context, ccache); +#endif + if(argc > 1) { + simple_execvp(argv[1], argv+1); + krb5_cc_destroy(context, ccache); +#ifdef KRB4 + dest_tkt(); + if(k_hasafs()) + k_unlog(); +#endif + } else + krb5_cc_close (context, ccache); krb5_free_context (context); return 0; } |