/*
 * Copyright 2001 by Lionel Schwarz, Computing Center IN2P3
 */

/*#ifdef HAVE_UNISTD_H*/
#include <unistd.h>
/*#endif*/
#include <syslog.h>
#include <errno.h>

#include "gfw-misc.h"
#include "gfw.h"

#ifndef gss_nt_service_name
#define gss_nt_service_name GSS_C_NT_HOSTBASED_SERVICE
#endif

/*#ifdef USE_STRING_H*/
#include <string.h>
/*#else
#include <strings.h>
#endif*/


/*
 * Function: gfw_acquire_cred
 *
 * Purpose: acquire a credential
 *
 * Arguments:
 *
 *  minor_status    (w) the second status
 * 	service_name    (r) the GSS-API service name to authenticate to
 *  server_creds    (w) the credential acquired
 *
 * Returns: major status
 *
 */
OM_uint32 gfw_acquire_cred(
OM_uint32 *    minor_status,
char *          service_name, 
gss_cred_id_t * server_creds)
{
    gss_buffer_desc name_buf;
    gss_name_t server_name = GSS_C_NO_NAME;
    OM_uint32 maj_stat, min_stat;

#ifdef DEBUG 
    display_file = fopen("/tmp/gfw-server.log","w") ;
#endif
    if (service_name) {
#ifdef DEBUG 
        fprintf(display_file,"service_name=%s\n",service_name) ;
#endif
        name_buf.value = service_name;
        name_buf.length = strlen(name_buf.value) + 1;
        maj_stat = gss_import_name(minor_status, 
                                    &name_buf, 
                                    (gss_OID) gss_nt_service_name, 
                                    &server_name);
        if (maj_stat != GSS_S_COMPLETE) {
            display_status("importing name", maj_stat, *minor_status);
            return maj_stat;
        }
    }

    maj_stat = gss_acquire_cred(minor_status, 
                                server_name, 
                                GSS_C_INDEFINITE,
                                GSS_C_NULL_OID_SET, 
                                GSS_C_ACCEPT,
                                server_creds, 
                                NULL, 
                                NULL);
    if (maj_stat != GSS_S_COMPLETE) {
        display_status("acquiring credentials", maj_stat, *minor_status);
        return maj_stat;
    }

    if (service_name) {
        (void) gss_release_name(&min_stat, &server_name);
    }

    return maj_stat;
}




syntax highlighted by Code2HTML, v. 0.9.1