1b528cefcSMark Murray /* 2b528cefcSMark Murray * Copyright (c) 1997-1999 Kungliga Tekniska H�gskolan 3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 4b528cefcSMark Murray * All rights reserved. 5b528cefcSMark Murray * 6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without 7b528cefcSMark Murray * modification, are permitted provided that the following conditions 8b528cefcSMark Murray * are met: 9b528cefcSMark Murray * 10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright 11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer. 12b528cefcSMark Murray * 13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the 15b528cefcSMark Murray * documentation and/or other materials provided with the distribution. 16b528cefcSMark Murray * 17b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors 18b528cefcSMark Murray * may be used to endorse or promote products derived from this software 19b528cefcSMark Murray * without specific prior written permission. 20b528cefcSMark Murray * 21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31b528cefcSMark Murray * SUCH DAMAGE. 32b528cefcSMark Murray */ 33b528cefcSMark Murray 34b528cefcSMark Murray #include "kuser_locl.h" 35b528cefcSMark Murray 3613e3f4d6SMark Murray RCSID("$Id: klist.c,v 1.53 2000/02/06 08:15:40 assar Exp $"); 37b528cefcSMark Murray 38b528cefcSMark Murray static char* 39b528cefcSMark Murray printable_time(time_t t) 40b528cefcSMark Murray { 41b528cefcSMark Murray static char s[128]; 42b528cefcSMark Murray strcpy(s, ctime(&t)+ 4); 43b528cefcSMark Murray s[15] = 0; 44b528cefcSMark Murray return s; 45b528cefcSMark Murray } 46b528cefcSMark Murray 47b528cefcSMark Murray static char* 48b528cefcSMark Murray printable_time_long(time_t t) 49b528cefcSMark Murray { 50b528cefcSMark Murray static char s[128]; 51b528cefcSMark Murray strcpy(s, ctime(&t)+ 4); 52b528cefcSMark Murray s[20] = 0; 53b528cefcSMark Murray return s; 54b528cefcSMark Murray } 55b528cefcSMark Murray 56b528cefcSMark Murray static void 57b528cefcSMark Murray print_cred(krb5_context context, krb5_creds *cred) 58b528cefcSMark Murray { 59b528cefcSMark Murray char *str; 60b528cefcSMark Murray krb5_error_code ret; 6113e3f4d6SMark Murray krb5_timestamp sec; 62b528cefcSMark Murray 63b528cefcSMark Murray krb5_timeofday (context, &sec); 64b528cefcSMark Murray 65b528cefcSMark Murray if(cred->times.starttime) 66b528cefcSMark Murray printf ("%s ", printable_time(cred->times.starttime)); 67b528cefcSMark Murray else 68b528cefcSMark Murray printf ("%s ", printable_time(cred->times.authtime)); 69b528cefcSMark Murray 70b528cefcSMark Murray if(cred->times.endtime > sec) 71b528cefcSMark Murray printf ("%s ", printable_time(cred->times.endtime)); 72b528cefcSMark Murray else 73b528cefcSMark Murray printf ("%-15s ", ">>>Expired<<<"); 74b528cefcSMark Murray ret = krb5_unparse_name (context, cred->server, &str); 75b528cefcSMark Murray if (ret) 76b528cefcSMark Murray krb5_err(context, 1, ret, "krb5_unparse_name"); 77b528cefcSMark Murray printf ("%s\n", str); 78b528cefcSMark Murray free (str); 79b528cefcSMark Murray } 80b528cefcSMark Murray 81b528cefcSMark Murray static void 82b528cefcSMark Murray print_cred_verbose(krb5_context context, krb5_creds *cred) 83b528cefcSMark Murray { 84b528cefcSMark Murray int j; 85b528cefcSMark Murray char *str; 86b528cefcSMark Murray krb5_error_code ret; 87b528cefcSMark Murray int first_flag; 8813e3f4d6SMark Murray krb5_timestamp sec; 89b528cefcSMark Murray 90b528cefcSMark Murray krb5_timeofday (context, &sec); 91b528cefcSMark Murray 92b528cefcSMark Murray ret = krb5_unparse_name(context, cred->server, &str); 93b528cefcSMark Murray if(ret) 94b528cefcSMark Murray exit(1); 95b528cefcSMark Murray printf("Server: %s\n", str); 96b528cefcSMark Murray free (str); 97b528cefcSMark Murray { 98b528cefcSMark Murray Ticket t; 99b528cefcSMark Murray size_t len; 100b528cefcSMark Murray char *s; 101b528cefcSMark Murray 102b528cefcSMark Murray decode_Ticket(cred->ticket.data, cred->ticket.length, &t, &len); 103b528cefcSMark Murray ret = krb5_enctype_to_string(context, t.enc_part.etype, &s); 104b528cefcSMark Murray if (ret == 0) { 105b528cefcSMark Murray printf("Ticket etype: %s", s); 106b528cefcSMark Murray free(s); 107b528cefcSMark Murray } else { 108b528cefcSMark Murray printf("Unknown etype: %d", t.enc_part.etype); 109b528cefcSMark Murray } 110b528cefcSMark Murray if(t.enc_part.kvno) 111b528cefcSMark Murray printf(", kvno %d", *t.enc_part.kvno); 112b528cefcSMark Murray printf("\n"); 113b528cefcSMark Murray if(cred->session.keytype != t.enc_part.etype) { 114b528cefcSMark Murray ret = krb5_keytype_to_string(context, cred->session.keytype, &str); 115b528cefcSMark Murray if(ret == KRB5_PROG_KEYTYPE_NOSUPP) 116b528cefcSMark Murray ret = krb5_enctype_to_string(context, cred->session.keytype, 117b528cefcSMark Murray &str); 118b528cefcSMark Murray if(ret) 119b528cefcSMark Murray krb5_warn(context, ret, "session keytype"); 120b528cefcSMark Murray else { 121b528cefcSMark Murray printf("Session key: %s\n", str); 122b528cefcSMark Murray free(str); 123b528cefcSMark Murray } 124b528cefcSMark Murray } 125b528cefcSMark Murray free_Ticket(&t); 126b528cefcSMark Murray } 127b528cefcSMark Murray printf("Auth time: %s\n", printable_time_long(cred->times.authtime)); 128b528cefcSMark Murray if(cred->times.authtime != cred->times.starttime) 129b528cefcSMark Murray printf("Start time: %s\n", printable_time_long(cred->times.starttime)); 130b528cefcSMark Murray printf("End time: %s", printable_time_long(cred->times.endtime)); 131b528cefcSMark Murray if(sec > cred->times.endtime) 132b528cefcSMark Murray printf(" (expired)"); 133b528cefcSMark Murray printf("\n"); 134b528cefcSMark Murray if(cred->flags.b.renewable) 135b528cefcSMark Murray printf("Renew till: %s\n", 136b528cefcSMark Murray printable_time_long(cred->times.renew_till)); 137b528cefcSMark Murray printf("Ticket flags: "); 138b528cefcSMark Murray #define PRINT_FLAG2(f, s) if(cred->flags.b.f) { if(!first_flag) printf(", "); printf("%s", #s); first_flag = 0; } 139b528cefcSMark Murray #define PRINT_FLAG(f) PRINT_FLAG2(f, f) 140b528cefcSMark Murray first_flag = 1; 141b528cefcSMark Murray PRINT_FLAG(forwardable); 142b528cefcSMark Murray PRINT_FLAG(forwarded); 143b528cefcSMark Murray PRINT_FLAG(proxiable); 144b528cefcSMark Murray PRINT_FLAG(proxy); 145b528cefcSMark Murray PRINT_FLAG2(may_postdate, may-postdate); 146b528cefcSMark Murray PRINT_FLAG(postdated); 147b528cefcSMark Murray PRINT_FLAG(invalid); 148b528cefcSMark Murray PRINT_FLAG(renewable); 149b528cefcSMark Murray PRINT_FLAG(initial); 150b528cefcSMark Murray PRINT_FLAG2(pre_authent, pre-authenticated); 151b528cefcSMark Murray PRINT_FLAG2(hw_authent, hw-authenticated); 152b528cefcSMark Murray PRINT_FLAG2(transited_policy_checked, transited-policy-checked); 153b528cefcSMark Murray PRINT_FLAG2(ok_as_delegate, ok-as-delegate); 154b528cefcSMark Murray PRINT_FLAG(anonymous); 155b528cefcSMark Murray printf("\n"); 156b528cefcSMark Murray printf("Addresses: "); 157b528cefcSMark Murray for(j = 0; j < cred->addresses.len; j++){ 158b528cefcSMark Murray char buf[128]; 159b528cefcSMark Murray size_t len; 160b528cefcSMark Murray if(j) printf(", "); 161b528cefcSMark Murray ret = krb5_print_address(&cred->addresses.val[j], 162b528cefcSMark Murray buf, sizeof(buf), &len); 163b528cefcSMark Murray 164b528cefcSMark Murray if(ret == 0) 165b528cefcSMark Murray printf("%s", buf); 166b528cefcSMark Murray } 167b528cefcSMark Murray printf("\n\n"); 168b528cefcSMark Murray } 169b528cefcSMark Murray 170b528cefcSMark Murray /* 171b528cefcSMark Murray * Print all tickets in `ccache' on stdout, verbosily iff do_verbose. 172b528cefcSMark Murray */ 173b528cefcSMark Murray 174b528cefcSMark Murray static void 175b528cefcSMark Murray print_tickets (krb5_context context, 176b528cefcSMark Murray krb5_ccache ccache, 177b528cefcSMark Murray krb5_principal principal, 178b528cefcSMark Murray int do_verbose) 179b528cefcSMark Murray { 180b528cefcSMark Murray krb5_error_code ret; 181b528cefcSMark Murray char *str; 182b528cefcSMark Murray krb5_cc_cursor cursor; 183b528cefcSMark Murray krb5_creds creds; 184b528cefcSMark Murray 185b528cefcSMark Murray ret = krb5_unparse_name (context, principal, &str); 186b528cefcSMark Murray if (ret) 187b528cefcSMark Murray krb5_err (context, 1, ret, "krb5_unparse_name"); 188b528cefcSMark Murray 189b528cefcSMark Murray printf ("%17s: %s:%s\n", 190b528cefcSMark Murray "Credentials cache", 191b528cefcSMark Murray krb5_cc_get_type(context, ccache), 192b528cefcSMark Murray krb5_cc_get_name(context, ccache)); 193b528cefcSMark Murray printf ("%17s: %s\n", "Principal", str); 194b528cefcSMark Murray free (str); 195b528cefcSMark Murray 196b528cefcSMark Murray if(do_verbose) 197b528cefcSMark Murray printf ("%17s: %d\n", "Cache version", 198b528cefcSMark Murray krb5_cc_get_version(context, ccache)); 199b528cefcSMark Murray 200b528cefcSMark Murray if (do_verbose && context->kdc_sec_offset) { 201b528cefcSMark Murray char buf[BUFSIZ]; 202b528cefcSMark Murray int val; 203b528cefcSMark Murray int sig; 204b528cefcSMark Murray 205b528cefcSMark Murray val = context->kdc_sec_offset; 206b528cefcSMark Murray sig = 1; 207b528cefcSMark Murray if (val < 0) { 208b528cefcSMark Murray sig = -1; 209b528cefcSMark Murray val = -val; 210b528cefcSMark Murray } 211b528cefcSMark Murray 212b528cefcSMark Murray unparse_time (val, buf, sizeof(buf)); 213b528cefcSMark Murray 214b528cefcSMark Murray printf ("%17s: %s%s\n", "KDC time offset", 215b528cefcSMark Murray sig == -1 ? "-" : "", buf); 216b528cefcSMark Murray } 217b528cefcSMark Murray 218b528cefcSMark Murray printf("\n"); 219b528cefcSMark Murray 220b528cefcSMark Murray ret = krb5_cc_start_seq_get (context, ccache, &cursor); 221b528cefcSMark Murray if (ret) 222b528cefcSMark Murray krb5_err(context, 1, ret, "krb5_cc_start_seq_get"); 223b528cefcSMark Murray 224b528cefcSMark Murray if(!do_verbose) 225b528cefcSMark Murray printf(" %-15s %-15s %s\n", "Issued", "Expires", "Principal"); 226b528cefcSMark Murray 227b528cefcSMark Murray while (krb5_cc_next_cred (context, 228b528cefcSMark Murray ccache, 229b528cefcSMark Murray &creds, 230b528cefcSMark Murray &cursor) == 0) { 231b528cefcSMark Murray if(do_verbose){ 232b528cefcSMark Murray print_cred_verbose(context, &creds); 233b528cefcSMark Murray }else{ 234b528cefcSMark Murray print_cred(context, &creds); 235b528cefcSMark Murray } 236b528cefcSMark Murray krb5_free_creds_contents (context, &creds); 237b528cefcSMark Murray } 238b528cefcSMark Murray ret = krb5_cc_end_seq_get (context, ccache, &cursor); 239b528cefcSMark Murray if (ret) 240b528cefcSMark Murray krb5_err (context, 1, ret, "krb5_cc_end_seq_get"); 241b528cefcSMark Murray } 242b528cefcSMark Murray 243b528cefcSMark Murray /* 244b528cefcSMark Murray * Check if there's a tgt for the realm of `principal' and ccache and 245b528cefcSMark Murray * if so return 0, else 1 246b528cefcSMark Murray */ 247b528cefcSMark Murray 248b528cefcSMark Murray static int 249b528cefcSMark Murray check_for_tgt (krb5_context context, 250b528cefcSMark Murray krb5_ccache ccache, 251b528cefcSMark Murray krb5_principal principal) 252b528cefcSMark Murray { 253b528cefcSMark Murray krb5_error_code ret; 254b528cefcSMark Murray krb5_creds pattern; 255b528cefcSMark Murray krb5_creds creds; 256b528cefcSMark Murray krb5_realm *client_realm; 257b528cefcSMark Murray int expired; 258b528cefcSMark Murray 259b528cefcSMark Murray client_realm = krb5_princ_realm (context, principal); 260b528cefcSMark Murray 261b528cefcSMark Murray ret = krb5_make_principal (context, &pattern.server, 262b528cefcSMark Murray *client_realm, KRB5_TGS_NAME, *client_realm, 263b528cefcSMark Murray NULL); 264b528cefcSMark Murray if (ret) 265b528cefcSMark Murray krb5_err (context, 1, ret, "krb5_make_principal"); 266b528cefcSMark Murray 267b528cefcSMark Murray ret = krb5_cc_retrieve_cred (context, ccache, 0, &pattern, &creds); 268b528cefcSMark Murray expired = time(NULL) > creds.times.endtime; 269b528cefcSMark Murray krb5_free_principal (context, pattern.server); 270b528cefcSMark Murray krb5_free_creds_contents (context, &creds); 271b528cefcSMark Murray if (ret) { 272b528cefcSMark Murray if (ret == KRB5_CC_END) 273b528cefcSMark Murray return 1; 274b528cefcSMark Murray krb5_err (context, 1, ret, "krb5_cc_retrieve_cred"); 275b528cefcSMark Murray } 276b528cefcSMark Murray return expired; 277b528cefcSMark Murray } 278b528cefcSMark Murray 279b528cefcSMark Murray #ifdef KRB4 280b528cefcSMark Murray /* 281b528cefcSMark Murray * Print a list of all AFS tokens 282b528cefcSMark Murray */ 283b528cefcSMark Murray 284b528cefcSMark Murray static void 285b528cefcSMark Murray display_tokens(int do_verbose) 286b528cefcSMark Murray { 287b528cefcSMark Murray u_int32_t i; 288b528cefcSMark Murray unsigned char t[128]; 289b528cefcSMark Murray struct ViceIoctl parms; 290b528cefcSMark Murray 291b528cefcSMark Murray parms.in = (void *)&i; 292b528cefcSMark Murray parms.in_size = sizeof(i); 293b528cefcSMark Murray parms.out = (void *)t; 294b528cefcSMark Murray parms.out_size = sizeof(t); 295b528cefcSMark Murray 296b528cefcSMark Murray for (i = 0; k_pioctl(NULL, VIOCGETTOK, &parms, 0) == 0; i++) { 297b528cefcSMark Murray int32_t size_secret_tok, size_public_tok; 298b528cefcSMark Murray unsigned char *cell; 299b528cefcSMark Murray struct ClearToken ct; 300b528cefcSMark Murray unsigned char *r = t; 301b528cefcSMark Murray struct timeval tv; 302b528cefcSMark Murray char buf1[20], buf2[20]; 303b528cefcSMark Murray 304b528cefcSMark Murray memcpy(&size_secret_tok, r, sizeof(size_secret_tok)); 305b528cefcSMark Murray /* dont bother about the secret token */ 306b528cefcSMark Murray r += size_secret_tok + sizeof(size_secret_tok); 307b528cefcSMark Murray memcpy(&size_public_tok, r, sizeof(size_public_tok)); 308b528cefcSMark Murray r += sizeof(size_public_tok); 309b528cefcSMark Murray memcpy(&ct, r, size_public_tok); 310b528cefcSMark Murray r += size_public_tok; 311b528cefcSMark Murray /* there is a int32_t with length of cellname, but we dont read it */ 312b528cefcSMark Murray r += sizeof(int32_t); 313b528cefcSMark Murray cell = r; 314b528cefcSMark Murray 315b528cefcSMark Murray gettimeofday (&tv, NULL); 316b528cefcSMark Murray strlcpy (buf1, printable_time(ct.BeginTimestamp), 317b528cefcSMark Murray sizeof(buf1)); 318b528cefcSMark Murray if (do_verbose || tv.tv_sec < ct.EndTimestamp) 319b528cefcSMark Murray strlcpy (buf2, printable_time(ct.EndTimestamp), 320b528cefcSMark Murray sizeof(buf2)); 321b528cefcSMark Murray else 322b528cefcSMark Murray strlcpy (buf2, ">>> Expired <<<", sizeof(buf2)); 323b528cefcSMark Murray 324b528cefcSMark Murray printf("%s %s ", buf1, buf2); 325b528cefcSMark Murray 326b528cefcSMark Murray if ((ct.EndTimestamp - ct.BeginTimestamp) & 1) 327b528cefcSMark Murray printf("User's (AFS ID %d) tokens for %s", ct.ViceId, cell); 328b528cefcSMark Murray else 329b528cefcSMark Murray printf("Tokens for %s", cell); 330b528cefcSMark Murray if (do_verbose) 331b528cefcSMark Murray printf(" (%d)", ct.AuthHandle); 332b528cefcSMark Murray putchar('\n'); 333b528cefcSMark Murray } 334b528cefcSMark Murray } 335b528cefcSMark Murray #endif 336b528cefcSMark Murray 337b528cefcSMark Murray static int version_flag = 0; 338b528cefcSMark Murray static int help_flag = 0; 339b528cefcSMark Murray static int do_verbose = 0; 340b528cefcSMark Murray static int do_test = 0; 341b528cefcSMark Murray #ifdef KRB4 342b528cefcSMark Murray static int do_tokens = 0; 343b528cefcSMark Murray #endif 344b528cefcSMark Murray static char *cred_cache; 345b528cefcSMark Murray 346b528cefcSMark Murray static struct getargs args[] = { 347b528cefcSMark Murray { "cache", 'c', arg_string, &cred_cache, 348b528cefcSMark Murray "credentials cache to list", "cache" }, 349b528cefcSMark Murray { "test", 't', arg_flag, &do_test, 350b528cefcSMark Murray "test for having tickets", NULL }, 351b528cefcSMark Murray #ifdef KRB4 352b528cefcSMark Murray { "tokens", 'T', arg_flag, &do_tokens, 353b528cefcSMark Murray "display AFS tokens", NULL }, 354b528cefcSMark Murray #endif 355b528cefcSMark Murray { "verbose", 'v', arg_flag, &do_verbose, 356b528cefcSMark Murray "Verbose output", NULL }, 357b528cefcSMark Murray { "version", 0, arg_flag, &version_flag, 358b528cefcSMark Murray "print version", NULL }, 359b528cefcSMark Murray { "help", 0, arg_flag, &help_flag, 360b528cefcSMark Murray NULL, NULL} 361b528cefcSMark Murray }; 362b528cefcSMark Murray 363b528cefcSMark Murray static void 364b528cefcSMark Murray usage (int ret) 365b528cefcSMark Murray { 366b528cefcSMark Murray arg_printusage (args, 367b528cefcSMark Murray sizeof(args)/sizeof(*args), 368b528cefcSMark Murray NULL, 369b528cefcSMark Murray ""); 370b528cefcSMark Murray exit (ret); 371b528cefcSMark Murray } 372b528cefcSMark Murray 373b528cefcSMark Murray int 374b528cefcSMark Murray main (int argc, char **argv) 375b528cefcSMark Murray { 376b528cefcSMark Murray krb5_error_code ret; 377b528cefcSMark Murray krb5_context context; 378b528cefcSMark Murray krb5_ccache ccache; 379b528cefcSMark Murray krb5_principal principal; 380b528cefcSMark Murray int optind = 0; 381b528cefcSMark Murray int exit_status = 0; 382b528cefcSMark Murray 383b528cefcSMark Murray set_progname (argv[0]); 384b528cefcSMark Murray 385b528cefcSMark Murray if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) 386b528cefcSMark Murray usage(1); 387b528cefcSMark Murray 388b528cefcSMark Murray if (help_flag) 389b528cefcSMark Murray usage (0); 390b528cefcSMark Murray 391b528cefcSMark Murray if(version_flag){ 392b528cefcSMark Murray print_version(NULL); 393b528cefcSMark Murray exit(0); 394b528cefcSMark Murray } 395b528cefcSMark Murray 396b528cefcSMark Murray argc -= optind; 397b528cefcSMark Murray argv += optind; 398b528cefcSMark Murray 399b528cefcSMark Murray if (argc != 0) 400b528cefcSMark Murray usage (1); 401b528cefcSMark Murray 402b528cefcSMark Murray ret = krb5_init_context (&context); 403b528cefcSMark Murray if (ret) 404b528cefcSMark Murray krb5_err(context, 1, ret, "krb5_init_context"); 405b528cefcSMark Murray 406b528cefcSMark Murray if(cred_cache) { 407b528cefcSMark Murray ret = krb5_cc_resolve(context, cred_cache, &ccache); 408b528cefcSMark Murray if (ret) 409b528cefcSMark Murray krb5_err (context, 1, ret, "%s", cred_cache); 410b528cefcSMark Murray } else { 411b528cefcSMark Murray ret = krb5_cc_default (context, &ccache); 412b528cefcSMark Murray if (ret) 413b528cefcSMark Murray krb5_err (context, 1, ret, "krb5_cc_resolve"); 414b528cefcSMark Murray } 415b528cefcSMark Murray 416b528cefcSMark Murray ret = krb5_cc_get_principal (context, ccache, &principal); 417b528cefcSMark Murray if (ret) { 418b528cefcSMark Murray if(ret == ENOENT) { 419b528cefcSMark Murray if (do_test) 420b528cefcSMark Murray return 1; 421b528cefcSMark Murray else 422b528cefcSMark Murray krb5_errx(context, 1, "No ticket file: %s", 423b528cefcSMark Murray krb5_cc_get_name(context, ccache)); 424b528cefcSMark Murray } else 425b528cefcSMark Murray krb5_err (context, 1, ret, "krb5_cc_get_principal"); 426b528cefcSMark Murray } 427b528cefcSMark Murray if (do_test) 428b528cefcSMark Murray exit_status = check_for_tgt (context, ccache, principal); 429b528cefcSMark Murray else 430b528cefcSMark Murray print_tickets (context, ccache, principal, do_verbose); 431b528cefcSMark Murray 432b528cefcSMark Murray ret = krb5_cc_close (context, ccache); 433b528cefcSMark Murray if (ret) 434b528cefcSMark Murray krb5_err (context, 1, ret, "krb5_cc_close"); 435b528cefcSMark Murray 436b528cefcSMark Murray krb5_free_principal (context, principal); 437b528cefcSMark Murray krb5_free_context (context); 438b528cefcSMark Murray 439b528cefcSMark Murray #ifdef KRB4 440b528cefcSMark Murray if (!do_test && do_tokens && k_hasafs ()) 441b528cefcSMark Murray display_tokens (do_verbose); 442b528cefcSMark Murray #endif 443b528cefcSMark Murray 444b528cefcSMark Murray return exit_status; 445b528cefcSMark Murray } 446