* SUCH DAMAGE.
*/
+/*
+ * Return context handle properties.
+ */
+
#include "gssapiP_eap.h"
+OM_uint32
+gss_inquire_context(OM_uint32 *minor,
+ gss_ctx_id_t ctx,
+ gss_name_t *src_name,
+ gss_name_t *targ_name,
+ OM_uint32 *lifetime_rec,
+ gss_OID *mech_type,
+ OM_uint32 *ctx_flags,
+ int *locally_initiated,
+ int *open)
+{
+ OM_uint32 major, tmpMinor;
+
+ if (ctx == GSS_C_NO_CONTEXT) {
+ *minor = EINVAL;
+ return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT;
+ }
+
+ GSSEAP_MUTEX_LOCK(&ctx->mutex);
+
+ if (src_name != NULL) {
+ major = gssEapDuplicateName(minor, ctx->initiatorName, src_name);
+ if (GSS_ERROR(major))
+ goto cleanup;
+ }
+
+ if (targ_name != NULL) {
+ major = gssEapDuplicateName(minor, ctx->acceptorName, targ_name);
+ if (GSS_ERROR(major))
+ goto cleanup;
+ }
+
+ if (lifetime_rec != NULL) {
+ time_t now, lifetime;
+
+ if (ctx->expiryTime == 0) {
+ lifetime = GSS_C_INDEFINITE;
+ } else {
+ now = time(NULL);
+ lifetime = now - ctx->expiryTime;
+ if (lifetime < 0)
+ lifetime = 0;
+ }
+
+ *lifetime_rec = lifetime;
+ }
+
+ if (mech_type != NULL) {
+ if (!gssEapInternalizeOid(ctx->mechanismUsed, mech_type)) {
+ major = duplicateOid(minor, ctx->mechanismUsed, mech_type);
+ if (GSS_ERROR(major))
+ goto cleanup;
+ }
+ }
+
+ if (ctx_flags != NULL) {
+ *ctx_flags = ctx->gssFlags;
+ }
+
+ if (locally_initiated != NULL) {
+ *locally_initiated = CTX_IS_INITIATOR(ctx);
+ }
+
+ if (open != NULL) {
+ *open = CTX_IS_ESTABLISHED(ctx);
+ }
+
+ major = GSS_S_COMPLETE;
+ *minor = 0;
+
+cleanup:
+ GSSEAP_MUTEX_UNLOCK(&ctx->mutex);
+
+ if (GSS_ERROR(major)) {
+ gssEapReleaseName(&tmpMinor, src_name);
+ gssEapReleaseName(&tmpMinor, targ_name);
+ }
+
+ return major;
+}