#include "ppport.h"
GSSAPI::OID_out
new(class)
	char *		class
    CODE:
	RETVAL = NULL;
    OUTPUT:
	RETVAL

void
DESTROY(oid)
	GSSAPI::OID	oid
    PREINIT:
	OM_uint32	minor;
    PPCODE:
#if !defined(HEIMDAL)
	if (oid != NULL &&
	    oid != __KRB5_MECHTYPE_OID &&
	    oid != __KRB5_OLD_MECHTYPE_OID &&
	    oid != __GSS_KRB5_NT_USER_NAME &&
	    oid != __GSS_KRB5_NT_PRINCIPAL_NAME &&
	    oid != __SPNEGO_MECHTYPE_OID &&
	    oid != __gss_mech_krb5_v2  ) {
	    (void)gss_release_oid(&minor, &oid);
	}
#endif
#if defined(HEIMDAL)
#    warn("gss_release_oid is unsupported and not Part of the API!");
#endif

GSSAPI::Status
from_str(class, oid, str)
	char *		class
	GSSAPI::OID_out	oid
	gss_buffer_str	str
    CODE:
#if !defined(HEIMDAL)
	RETVAL.major = gss_str_to_oid(&RETVAL.minor, &str, &oid);
#endif
#if defined(HEIMDAL)
	croak("gss_str_to_oid() is not defined in Heimdal API!");
#endif
    OUTPUT:
	RETVAL
	oid

GSSAPI::Status
to_str(oid, str)
	GSSAPI::OID		oid
	gss_oidstr_out	str
    CODE:
	if (oid == NULL) {
	    sv_setsv_mg(ST(1), &PL_sv_undef);
	    XSRETURN_UNDEF;
	}
#if !defined(HEIMDAL)
	RETVAL.major = gss_oid_to_str(&RETVAL.minor, oid, &str);
#endif
#if defined(HEIMDAL)
	croak("gss_oid_to_str() is not defined in Heimdal API!");
#endif
    OUTPUT:
	RETVAL
	str

GSSAPI::Status
inquire_names(oid, oidset)
	GSSAPI::OID		oid
	GSSAPI::OID::Set_out	oidset
    CODE:
	RETVAL.major =
		gss_inquire_names_for_mech(&RETVAL.minor, oid, &oidset);
    OUTPUT:
	RETVAL
	oidset


#
#	generic OIDs
#

GSSAPI::OID_const
gss_nt_user_name()
    CODE:
	RETVAL = GSS_C_NT_USER_NAME;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_nt_machine_uid_name()
    CODE:
	RETVAL = GSS_C_NT_MACHINE_UID_NAME;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_nt_string_uid_name()
    CODE:
	RETVAL =  GSS_C_NT_STRING_UID_NAME;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_nt_service_name()
    CODE:
	RETVAL = GSS_C_NT_HOSTBASED_SERVICE;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_nt_exported_name()
    CODE:
	RETVAL = GSS_C_NT_EXPORT_NAME;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_nt_service_name_v2()
    CODE:
	RETVAL = GSS_C_NT_HOSTBASED_SERVICE;
    OUTPUT:
	RETVAL


#
#	Kerberos OIDs
#

GSSAPI::OID_const
gss_nt_krb5_name()
    CODE:
	RETVAL = __GSS_KRB5_NT_USER_NAME;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_nt_krb5_principal()
    CODE:
	RETVAL = __GSS_KRB5_NT_PRINCIPAL_NAME;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_mech_krb5()
    CODE:
	RETVAL = __KRB5_MECHTYPE_OID;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_mech_spnego()
    CODE:
	RETVAL = __SPNEGO_MECHTYPE_OID;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_mech_krb5_old()
    CODE:
	RETVAL = __KRB5_OLD_MECHTYPE_OID;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_mech_krb5_v2()
    CODE:
	RETVAL = __gss_mech_krb5_v2;
    OUTPUT:
	RETVAL

GSSAPI::OID_const
gss_nt_hostbased_service()
     CODE:
        RETVAL = GSS_C_NT_HOSTBASED_SERVICE;
     OUTPUT:
        RETVAL