#pragma ident "%Z%%M% %I% %E% SMI" #include "k5-int.h" krb5_error_code KRB5_CALLCONV krb5_cc_copy_creds(krb5_context context, krb5_ccache incc, krb5_ccache outcc) { krb5_error_code code; krb5_flags flags; krb5_cc_cursor cur = 0; krb5_creds creds; flags = 0; /* turns off OPENCLOSE mode */ if ((code = krb5_cc_set_flags(context, incc, flags))) return(code); /* the code for this will open the file for reading only, which is not what I had in mind. So I won't turn off OPENCLOSE for the output ccache */ #if 0 if ((code = krb5_cc_set_flags(context, outcc, flags))) return(code); #endif if ((code = krb5_cc_start_seq_get(context, incc, &cur))) goto cleanup; while (!(code = krb5_cc_next_cred(context, incc, &cur, &creds))) { code = krb5_cc_store_cred(context, outcc, &creds); krb5_free_cred_contents(context, &creds); if (code) goto cleanup; } if (code != KRB5_CC_END) goto cleanup; code = krb5_cc_end_seq_get(context, incc, &cur); cur = 0; if (code) goto cleanup; code = 0; cleanup: flags = KRB5_TC_OPENCLOSE; /* If set then we are in an error pathway */ if (cur) krb5_cc_end_seq_get(context, incc, &cur); if (code) krb5_cc_set_flags(context, incc, flags); else code = krb5_cc_set_flags(context, incc, flags); #if 0 if (code) krb5_cc_set_flags(context, outcc, flags); else code = krb5_cc_set_flags(context, outcc, flags); #endif return(code); }