1 #pragma ident "%Z%%M% %I% %E% SMI" 2 3 #include "k5-int.h" 4 5 krb5_error_code KRB5_CALLCONV 6 krb5_cc_copy_creds(krb5_context context, krb5_ccache incc, krb5_ccache outcc) 7 { 8 krb5_error_code code; 9 krb5_flags flags; 10 krb5_cc_cursor cur = 0; 11 krb5_creds creds; 12 13 flags = 0; /* turns off OPENCLOSE mode */ 14 if ((code = krb5_cc_set_flags(context, incc, flags))) 15 return(code); 16 /* the code for this will open the file for reading only, which 17 is not what I had in mind. So I won't turn off OPENCLOSE 18 for the output ccache */ 19 #if 0 20 if ((code = krb5_cc_set_flags(context, outcc, flags))) 21 return(code); 22 #endif 23 24 if ((code = krb5_cc_start_seq_get(context, incc, &cur))) 25 goto cleanup; 26 27 while (!(code = krb5_cc_next_cred(context, incc, &cur, &creds))) { 28 code = krb5_cc_store_cred(context, outcc, &creds); 29 krb5_free_cred_contents(context, &creds); 30 if (code) 31 goto cleanup; 32 } 33 34 if (code != KRB5_CC_END) 35 goto cleanup; 36 37 code = krb5_cc_end_seq_get(context, incc, &cur); 38 cur = 0; 39 if (code) 40 goto cleanup; 41 42 code = 0; 43 44 cleanup: 45 flags = KRB5_TC_OPENCLOSE; 46 47 /* If set then we are in an error pathway */ 48 if (cur) 49 krb5_cc_end_seq_get(context, incc, &cur); 50 51 if (code) 52 krb5_cc_set_flags(context, incc, flags); 53 else 54 code = krb5_cc_set_flags(context, incc, flags); 55 56 #if 0 57 if (code) 58 krb5_cc_set_flags(context, outcc, flags); 59 else 60 code = krb5_cc_set_flags(context, outcc, flags); 61 #endif 62 63 return(code); 64 } 65