/*
 * gss.h
 *
 */

#ifndef _ECAT_GSS_H
#define _ECAT_GSS_H

#if defined(macintosh) || defined(__MWERKS__)
#define EINPROGRESS -2
#include <gssapi.h>
#include <gssapi_generic.h>
#else
#include <gssapi/gssapi.h>
#include <gssapi/gssapi_generic.h>
#endif

extern int send_token(int, gss_buffer_desc*);
extern int recv_token(int, gss_buffer_desc*);
extern char *connect_socket(int*, struct sockaddr_in*);
extern char *unix_errmsg(char*, int);
extern char *gss_errmsg(char*, OM_uint32, OM_uint32);
extern char *client_establish_context(int, gss_cred_id_t, char*, char*, gss_ctx_id_t*);
extern char *server_acquire_creds(char*, char*, int, gss_cred_id_t*);
extern char *server_establish_context(int, gss_cred_id_t, gss_ctx_id_t*, gss_buffer_t);



/*******************************************************************************
 *
 * awful, ugly kludge to make GSS thread-safe....
 *
 *	the following should be deleted as soon as GSS is
 *	guaranteed to be thread-safe
 *
 ******************************************************************************/

#if !defined(NO_THREADS)

#define gss_accept_sec_context TS_gss_accept_sec_context
OM_uint32 INTERFACE gss_accept_sec_context
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_ctx_id_t FAR *,		/* context_handle */
            gss_cred_id_t,		/* acceptor_cred_handle */
            gss_buffer_t,		/* input_token_buffer */
            gss_channel_bindings_t,	/* input_chan_bindings */
            gss_name_t FAR *,		/* src_name */
            gss_OID FAR *,		/* mech_type */
            gss_buffer_t,		/* output_token */
            OM_uint32 FAR *,		/* ret_flags */
            OM_uint32 FAR *,		/* time_rec */
            gss_cred_id_t FAR *		/* delegated_cred_handle */
           ));

#define gss_acquire_cred TS_gss_acquire_cred
OM_uint32 INTERFACE gss_acquire_cred
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_name_t,			/* desired_name */
            OM_uint32,			/* time_req */
            gss_OID_set,		/* desired_mechs */
            gss_cred_usage_t,		/* cred_usage */
            gss_cred_id_t FAR *,	/* output_cred_handle */
            gss_OID_set FAR *,		/* actual_mechs */
            OM_uint32 FAR *		/* time_rec */
           ));

#define gss_delete_sec_context TS_gss_delete_sec_context
OM_uint32 INTERFACE gss_delete_sec_context
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_ctx_id_t FAR *,		/* context_handle */
            gss_buffer_t		/* output_token */
           ));

#define gss_display_name TS_gss_display_name
OM_uint32 INTERFACE gss_display_name
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_name_t,			/* input_name */
            gss_buffer_t,		/* output_name_buffer */
            gss_OID FAR *		/* output_name_type */
           ));

#define gss_display_status TS_gss_display_status
OM_uint32 INTERFACE gss_display_status
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            OM_uint32,			/* status_value */
            int,			/* status_type */
            gss_OID,			/* mech_type (used to be const) */
            OM_uint32 FAR *,		/* message_context */
            gss_buffer_t		/* status_string */
           ));

#define gss_import_name TS_gss_import_name
OM_uint32 INTERFACE gss_import_name
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_buffer_t,		/* input_name_buffer */
            gss_OID,			/* input_name_type(used to be const) */
            gss_name_t FAR *		/* output_name */
           ));

#define gss_init_sec_context TS_gss_init_sec_context
OM_uint32 INTERFACE gss_init_sec_context
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_cred_id_t,		/* claimant_cred_handle */
            gss_ctx_id_t FAR *,		/* context_handle */
            gss_name_t,			/* target_name */
            gss_OID,			/* mech_type (used to be const) */
            OM_uint32,			/* req_flags */
            OM_uint32,			/* time_req */
            gss_channel_bindings_t,	/* input_chan_bindings */
            gss_buffer_t,		/* input_token */
            gss_OID FAR *,		/* actual_mech_type */
            gss_buffer_t,		/* output_token */
            OM_uint32 FAR *,		/* ret_flags */
            OM_uint32 FAR *		/* time_rec */
           ));

#define gss_oid_to_str TS_gss_oid_to_str
OM_uint32 INTERFACE gss_oid_to_str
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
	    gss_OID,			/* oid */
	    gss_buffer_t		/* oid_str */
	   ));

#define gss_release_buffer TS_gss_release_buffer
OM_uint32 INTERFACE gss_release_buffer
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_buffer_t		/* buffer */
           ));

#define gss_release_name TS_gss_release_name
OM_uint32 INTERFACE gss_release_name
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_name_t FAR *		/* input_name */
           ));

#define gss_release_oid_set TS_gss_release_oid_set
OM_uint32 INTERFACE gss_release_oid_set
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
            gss_OID_set FAR * 		/* set */
           ));

#define gss_seal TS_gss_seal
OM_uint32 INTERFACE gss_seal
PROTOTYPE( (OM_uint32 FAR *,    /* minor_status */
            gss_ctx_id_t,     	/* context_handle */
            int,              	/* conf_req_flag */
            int,              	/* qop_req */
            gss_buffer_t,     	/* input_message_buffer */
            int FAR *,          /* conf_state */
            gss_buffer_t      	/* output_message_buffer */
           ));

#define gss_str_to_oid TS_gss_str_to_oid
OM_uint32 INTERFACE gss_str_to_oid
PROTOTYPE( (OM_uint32 FAR *,		/* minor_status */
	    gss_buffer_t,		/* oid_str */
	    gss_OID FAR *		/* oid */
	   ));

#define gss_unseal TS_gss_unseal
OM_uint32 INTERFACE gss_unseal
PROTOTYPE( (OM_uint32 FAR *,    /* minor_status */
            gss_ctx_id_t,     	/* context_handle */
            gss_buffer_t,     	/* input_message_buffer */
            gss_buffer_t,     	/* output_message_buffer */
            int FAR *,          /* conf_state */
            int FAR *           /* qop_state */
           ));

#endif

#endif /* _ECAT_GSS_H */
