1176771Sraj/*-
2192532Sraj * Copyright (c) 2005 Doug Rabson
3176771Sraj * All rights reserved.
4176771Sraj *
5176771Sraj * Redistribution and use in source and binary forms, with or without
6176771Sraj * modification, are permitted provided that the following conditions
7176771Sraj * are met:
8176771Sraj * 1. Redistributions of source code must retain the above copyright
9176771Sraj *    notice, this list of conditions and the following disclaimer.
10176771Sraj * 2. Redistributions in binary form must reproduce the above copyright
11176771Sraj *    notice, this list of conditions and the following disclaimer in the
12176771Sraj *    documentation and/or other materials provided with the distribution.
13176771Sraj *
14176771Sraj * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15176771Sraj * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16176771Sraj * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17176771Sraj * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18176771Sraj * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19176771Sraj * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20176771Sraj * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21176771Sraj * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22176771Sraj * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23176771Sraj * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24176771Sraj * SUCH DAMAGE.
25176771Sraj *
26176771Sraj *	$FreeBSD: src/lib/libgssapi/gss_release_name.c,v 1.1 2005/12/29 14:40:20 dfr Exp $
27176771Sraj */
28176771Sraj
29176771Sraj#include "mech_locl.h"
30176771Sraj
31176771Sraj/**
32176771Sraj * Free a name
33176771Sraj *
34176771Sraj * import_name can point to NULL or be NULL, or a pointer to a
35176771Sraj * gss_name_t structure. If it was a pointer to gss_name_t, the
36176771Sraj * pointer will be set to NULL on success and failure.
37176771Sraj *
38176771Sraj * @param minor_status minor status code
39187151Sraj * @param input_name name to free
40187151Sraj *
41187151Sraj * @returns a gss_error code, see gss_display_status() about printing
42190701Smarcel *        the error code.
43187151Sraj *
44187151Sraj * @ingroup gssapi
45187151Sraj */
46187151SrajGSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
47187151Srajgss_release_name(OM_uint32 *minor_status,
48187151Sraj    gss_name_t *input_name)
49176771Sraj{
50176771Sraj	struct _gss_name *name;
51176771Sraj
52176771Sraj	*minor_status = 0;
53176771Sraj
54176771Sraj	if (input_name == NULL || *input_name == NULL)
55176771Sraj	    return GSS_S_COMPLETE;
56176771Sraj
57187149Sraj	name = (struct _gss_name *) *input_name;
58176771Sraj
59176771Sraj	if (name->gn_type.elements)
60176771Sraj		free(name->gn_type.elements);
61176771Sraj	while (HEIM_SLIST_FIRST(&name->gn_mn)) {
62176771Sraj		struct _gss_mechanism_name *mn;
63224611Smarcel		mn = HEIM_SLIST_FIRST(&name->gn_mn);
64176771Sraj		HEIM_SLIST_REMOVE_HEAD(&name->gn_mn, gmn_link);
65176771Sraj		mn->gmn_mech->gm_release_name(minor_status,
66176771Sraj					      &mn->gmn_name);
67222813Sattilio		free(mn);
68192532Sraj	}
69176771Sraj	gss_release_buffer(minor_status, &name->gn_value);
70176771Sraj	free(name);
71176771Sraj	*input_name = GSS_C_NO_NAME;
72176771Sraj
73176771Sraj	return (GSS_S_COMPLETE);
74176771Sraj}
75176771Sraj