#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;
+
+ *minor = 0;
+
+ if (ctx == GSS_C_NO_CONTEXT) {
+ major = GSS_S_NO_CONTEXT;
+ goto cleanup;
+ }
+
+ if (src_name != NULL) {
+ major = gss_duplicate_name(minor, ctx->initiatorName, src_name);
+ if (GSS_ERROR(major))
+ goto cleanup;
+ }
+
+ if (targ_name != NULL) {
+ major = gss_duplicate_name(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;
+
+cleanup:
+ if (GSS_ERROR(major)) {
+ gssEapReleaseName(&tmpMinor, src_name);
+ gssEapReleaseName(&tmpMinor, targ_name);
+ }
+
+ return major;
+}