#include "mysccs.h"
SCCSID("@(#)$Id: //tools/src/freeware/gsskrb5/rel_name.c#1 $")

/************************************************************************
 * $Id: //tools/src/freeware/gsskrb5/rel_name.c#1 $
 ************************************************************************
 *
 * Copyright (c) 1997-2000  SAP AG.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by SAP AG"
 *
 * 4. The name "SAP AG" must not be used to endorse or promote products
 *    derived from this software without prior written permission.
 *    For written permission, please contact www.press@sap.com
 *
 * 5. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by SAP AG"
 *
 * THIS SOFTWARE IS PROVIDED BY SAP AG ``AS IS'' AND ANY EXPRESSED
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. SAP AG SHALL BE LIABLE FOR ANY DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE ONLY IF CAUSED BY SAP AG'S
 * INTENT OR GROSS NEGLIGENCE. IN CASE SAP AG IS LIABLE UNDER THIS
 * AGREEMENT FOR DAMAGES CAUSED BY SAP AG'S GROSS NEGLIGENCE SAP AG
 * FURTHER SHALL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT, AND SHALL NOT BE LIABLE IN EXCESS OF THE AMOUNT OF
 * DAMAGES TYPICALLY FORESEEABLE FOR SAP AG, WHICH SHALL IN NO EVENT
 * EXCEED US$ 500.000.- 
 *
 ************************************************************************/



#include "gssmaini.h"


/*
 * gn_gss_release_name()
 *
 *  Description:
 *    Release a gssapi internal name.
 *    gssapi internal names are kept in a linked list of gn_name_desc
 *    structures.  The first element of this structure will contain the
 *    information that was used to create this name, e.g. the input
 *    values that were supplied to gss_import_name().
 *    Further entries in the list are cached information of
 *    canonical representations of the name generated by specific
 *    mechanisms.
 *
 */
OM_uint32
gn_gss_release_name(
	OM_uint32	FAR *	pp_min_stat,
	gss_name_t	FAR *	pp_name
      )
{
   char         * this_Call = " gn_gss_release_name(): ";
   gn_name_desc * name, * first, * next;
   OM_uint32	  maj_stat;

   (*pp_min_stat) = 0;
   if ( pp_name==NULL ) {
      RETURN_MIN_MAJ( MINOR_INVALID_NAME,
		      GSS_S_CALL_INACCESSIBLE_READ | GSS_S_FAILURE );
   }
   if ( (*pp_name)==GSS_C_NO_NAME ) {
      DEBUG_ACTION((tf, " %sreleasing GSS_C_NO_NAME\n", this_Call));
      return(GSS_S_COMPLETE);
   }

   name = (gn_name_desc *) (*pp_name);

   if ( name->magic_cookie != COOKIE_NAME ) {
      return(GSS_S_BAD_NAME);
   }

   first = name->first;
   if (name!=first) {
      DEBUG_STRANGE((tf, "Internal ERROR:%sthis is not the top name handle",
		         this_Call ))
      RETURN_MIN_MAJ( MINOR_INTERNAL_ERROR, GSS_S_FAILURE );
   }

   do {

      next = name->next;
      maj_stat = gn_release_name( pp_min_stat, &name );
      if ( maj_stat!=GSS_S_COMPLETE) {
	 return(maj_stat);
      }

   } while ( (name = next)!=NULL );

   (*pp_name) = GSS_C_NO_NAME;

   return(GSS_S_COMPLETE);

} /* gn_gss_release_name() */




/*
 * gn_release_name()
 *
 */
OM_uint32
gn_release_name( OM_uint32 * pp_min_stat, gn_name_desc ** pp_name )
{
   char           * this_Call = "gn_release_name";

   (*pp_min_stat) = 0;

   if ( (*pp_name)!=NULL ) {
      if ( (*pp_name)->magic_cookie != COOKIE_NAME ) {
         DEBUG_STRANGE((tf, "Internal ERROR: %s(): magic cookie missing!\n",
		         this_Call ))
	 RETURN_MIN_MAJ( MINOR_INTERNAL_ERROR, GSS_S_FAILURE );
      } else {
	 sy_clear_free( (void **) &((*pp_name)->name),   (*pp_name)->name_len   );
	 sy_clear_free( (void **) &((*pp_name)->prname), (*pp_name)->prname_len );
	 sy_clear_free( (void **) pp_name, sizeof(**pp_name) );
      }
   }

   return(GSS_S_COMPLETE);

} /* gn_release_name() */

