#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gssapi/gssapi.h>
#include <gssapi/gssapi_generic.h>
#define GSSAPI_V2
void display_status (char *, OM_uint32, OM_uint32);
static void display_status_1 (char *, OM_uint32, int);
static void display_buffer (gss_buffer_desc);
static int test_import_name (char *);
FILE *display_file;
int main(argc, argv)
int argc;
char **argv;
{
int retval;
display_file = stdout;
retval = test_import_name("host@dcl.mit.edu");
return retval;
}
static int test_import_name(name)
char *name;
{
OM_uint32 maj_stat, min_stat;
gss_name_t gss_name;
gss_buffer_desc buffer_name;
gss_OID name_oid;
buffer_name.value = name;
buffer_name.length = strlen(name) + 1;
maj_stat = gss_import_name(&min_stat, &buffer_name,
(gss_OID) gss_nt_service_name,
&gss_name);
if (maj_stat != GSS_S_COMPLETE) {
display_status("parsing name", maj_stat, min_stat);
return -1;
}
maj_stat = gss_display_name(&min_stat, gss_name, &buffer_name,
&name_oid);
if (maj_stat != GSS_S_COMPLETE) {
display_status("displaying context", maj_stat, min_stat);
return -1;
}
printf("name is: ");
display_buffer(buffer_name);
printf("\n");
(void) gss_release_buffer(&min_stat, &buffer_name);
gss_oid_to_str(&min_stat, name_oid, &buffer_name);
printf("name type is: ");
display_buffer(buffer_name);
printf("\n");
(void) gss_release_buffer(&min_stat, &buffer_name);
#ifdef GSSAPI_V2
(void) gss_release_oid(&min_stat, &name_oid);
#endif
(void) gss_release_name(&min_stat, &gss_name);
return 0;
}
static void display_buffer(buffer)
gss_buffer_desc buffer;
{
char *namebuf;
namebuf = malloc(buffer.length+1);
if (!namebuf) {
fprintf(stderr, "display_buffer: couldn't allocate buffer!\n");
exit(1);
}
strncpy(namebuf, buffer.value, buffer.length);
namebuf[buffer.length] = '\0';
printf("%s", namebuf);
free(namebuf);
}
void display_status(msg, maj_stat, min_stat)
char *msg;
OM_uint32 maj_stat;
OM_uint32 min_stat;
{
display_status_1(msg, maj_stat, GSS_C_GSS_CODE);
display_status_1(msg, min_stat, GSS_C_MECH_CODE);
}
static void display_status_1(m, code, type)
char *m;
OM_uint32 code;
int type;
{
OM_uint32 min_stat;
gss_buffer_desc msg;
#ifdef GSSAPI_V2
OM_uint32 msg_ctx;
#else
int msg_ctx;
#endif
msg_ctx = 0;
while (1) {
(void) gss_display_status(&min_stat, code,
type, GSS_C_NULL_OID,
&msg_ctx, &msg);
if (display_file)
fprintf(display_file, "GSS-API error %s: %s\n", m,
(char *)msg.value);
(void) gss_release_buffer(&min_stat, &msg);
if (!msg_ctx)
break;
}
}