Cross Reference: copy_ccache.c
xref
: /
osnet-11
/
usr
/
src
/
lib
/
gss_mechs
/
mech_krb5
/
mech
/
copy_ccache.c
Home
History
Annotate
Line#
Navigate
Download
Search
only in
./
2
N/A
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
N/A
#
include
"
gssapiP_krb5.h
"
2
N/A
2
N/A
OM_uint32
KRB5_CALLCONV
2
N/A
gss_krb5int_copy_ccache
(
OM_uint32
*
minor_status
,
2
N/A
gss_cred_id_t
cred_handle
,
2
N/A
const
gss_OID
desired_object
,
2
N/A
const
gss_buffer_t
value
)
2
N/A
{
2
N/A
krb5_gss_cred_id_t
k5creds
;
2
N/A
krb5_cc_cursor
cursor
;
2
N/A
krb5_creds
creds
;
2
N/A
krb5_error_code
code
;
2
N/A
krb5_context
context
;
2
N/A
krb5_ccache
out_ccache
;
2
N/A
2
N/A
assert
(
value
->
length
==
sizeof
(
out_ccache
));
2
N/A
2
N/A
if
(
value
->
length
!=
sizeof
(
out_ccache
))
2
N/A
return
GSS_S_FAILURE
;
2
N/A
2
N/A
out_ccache
= (
krb5_ccache
)
value
->
value
;
2
N/A
2
N/A
/* cred handle will have been validated by gssspi_set_cred_option() */
2
N/A
2
N/A
k5creds
= (
krb5_gss_cred_id_t
)
cred_handle
;
2
N/A
code
=
k5_mutex_lock
(&
k5creds
->
lock
);
2
N/A
if
(
code
) {
2
N/A
*
minor_status
=
code
;
2
N/A
return
GSS_S_FAILURE
;
2
N/A
}
2
N/A
if
(
k5creds
->
usage
==
GSS_C_ACCEPT
) {
2
N/A
k5_mutex_unlock
(&
k5creds
->
lock
);
2
N/A
*
minor_status
= (
OM_uint32
)
G_BAD_USAGE
;
2
N/A
return
(
GSS_S_FAILURE
);
2
N/A
}
2
N/A
2
N/A
code
=
krb5_gss_init_context
(&
context
);
2
N/A
if
(
code
) {
2
N/A
k5_mutex_unlock
(&
k5creds
->
lock
);
2
N/A
*
minor_status
=
code
;
2
N/A
return
GSS_S_FAILURE
;
2
N/A
}
2
N/A
2
N/A
code
=
krb5_cc_start_seq_get
(
context
,
k5creds
->
ccache
, &
cursor
);
2
N/A
if
(
code
) {
2
N/A
k5_mutex_unlock
(&
k5creds
->
lock
);
2
N/A
*
minor_status
=
code
;
2
N/A
save_error_info
(*
minor_status
,
context
);
2
N/A
krb5_free_context
(
context
);
2
N/A
return
(
GSS_S_FAILURE
);
2
N/A
}
2
N/A
while
(!
code
&& !
krb5_cc_next_cred
(
context
,
k5creds
->
ccache
, &
cursor
,
2
N/A
&
creds
)) {
2
N/A
code
=
krb5_cc_store_cred
(
context
,
out_ccache
, &
creds
);
2
N/A
krb5_free_cred_contents
(
context
, &
creds
);
2
N/A
}
2
N/A
krb5_cc_end_seq_get
(
context
,
k5creds
->
ccache
, &
cursor
);
2
N/A
k5_mutex_unlock
(&
k5creds
->
lock
);
2
N/A
*
minor_status
=
code
;
2
N/A
if
(
code
)
2
N/A
save_error_info
(*
minor_status
,
context
);
2
N/A
krb5_free_context
(
context
);
2
N/A
return
code
?
GSS_S_FAILURE
:
GSS_S_COMPLETE
;
2
N/A
}