17c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
27c478bd9Sstevel@tonic-gate 
3*505d05c7Sgtb #include "k5-int.h"
47c478bd9Sstevel@tonic-gate 
5*505d05c7Sgtb krb5_error_code KRB5_CALLCONV
6*505d05c7Sgtb krb5_cc_copy_creds(krb5_context context, krb5_ccache incc, krb5_ccache outcc)
77c478bd9Sstevel@tonic-gate {
87c478bd9Sstevel@tonic-gate     krb5_error_code code;
97c478bd9Sstevel@tonic-gate     krb5_flags flags;
10*505d05c7Sgtb     krb5_cc_cursor cur = 0;
117c478bd9Sstevel@tonic-gate     krb5_creds creds;
127c478bd9Sstevel@tonic-gate 
137c478bd9Sstevel@tonic-gate     flags = 0;				/* turns off OPENCLOSE mode */
14*505d05c7Sgtb     if ((code = krb5_cc_set_flags(context, incc, flags)))
157c478bd9Sstevel@tonic-gate 	return(code);
167c478bd9Sstevel@tonic-gate     /* the code for this will open the file for reading only, which
177c478bd9Sstevel@tonic-gate        is not what I had in mind.  So I won't turn off OPENCLOSE
187c478bd9Sstevel@tonic-gate        for the output ccache */
197c478bd9Sstevel@tonic-gate #if 0
207c478bd9Sstevel@tonic-gate     if ((code = krb5_cc_set_flags(context, outcc, flags)))
217c478bd9Sstevel@tonic-gate 	return(code);
227c478bd9Sstevel@tonic-gate #endif
237c478bd9Sstevel@tonic-gate 
24*505d05c7Sgtb     if ((code = krb5_cc_start_seq_get(context, incc, &cur)))
257c478bd9Sstevel@tonic-gate 	goto cleanup;
267c478bd9Sstevel@tonic-gate 
27*505d05c7Sgtb     while (!(code = krb5_cc_next_cred(context, incc, &cur, &creds))) {
287c478bd9Sstevel@tonic-gate 	code = krb5_cc_store_cred(context, outcc, &creds);
297c478bd9Sstevel@tonic-gate 	krb5_free_cred_contents(context, &creds);
307c478bd9Sstevel@tonic-gate 	if (code)
317c478bd9Sstevel@tonic-gate 	    goto cleanup;
327c478bd9Sstevel@tonic-gate     }
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate     if (code != KRB5_CC_END)
357c478bd9Sstevel@tonic-gate 	goto cleanup;
367c478bd9Sstevel@tonic-gate 
37*505d05c7Sgtb     code = krb5_cc_end_seq_get(context, incc, &cur);
38*505d05c7Sgtb     cur = 0;
39*505d05c7Sgtb     if (code)
40*505d05c7Sgtb         goto cleanup;
41*505d05c7Sgtb 
427c478bd9Sstevel@tonic-gate     code = 0;
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate cleanup:
457c478bd9Sstevel@tonic-gate     flags = KRB5_TC_OPENCLOSE;
467c478bd9Sstevel@tonic-gate 
47*505d05c7Sgtb     /* If set then we are in an error pathway */
48*505d05c7Sgtb     if (cur)
49*505d05c7Sgtb       krb5_cc_end_seq_get(context, incc, &cur);
50*505d05c7Sgtb 
517c478bd9Sstevel@tonic-gate     if (code)
52*505d05c7Sgtb 	krb5_cc_set_flags(context, incc, flags);
537c478bd9Sstevel@tonic-gate     else
547c478bd9Sstevel@tonic-gate 	code = krb5_cc_set_flags(context, incc, flags);
557c478bd9Sstevel@tonic-gate 
567c478bd9Sstevel@tonic-gate #if 0
577c478bd9Sstevel@tonic-gate     if (code)
587c478bd9Sstevel@tonic-gate 	krb5_cc_set_flags(context, outcc, flags);
597c478bd9Sstevel@tonic-gate     else
607c478bd9Sstevel@tonic-gate 	code = krb5_cc_set_flags(context, outcc, flags);
617c478bd9Sstevel@tonic-gate #endif
627c478bd9Sstevel@tonic-gate 
637c478bd9Sstevel@tonic-gate     return(code);
647c478bd9Sstevel@tonic-gate }
65