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