Udiff g_inquire_names.c
--- /net/etna.eng/build7/semery/mit2/webrev/usr/src/lib/libgss/g_inquire_names.c-       Wed Sep  8 17:00:33 2004
+++ g_inquire_names.c   Wed Sep  8 13:42:03 2004
@@ -1,11 +1,11 @@
 /*
  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident  "@(#)g_inquire_names.c  1.17    04/09/08 SMI"
+#pragma ident  "@(#)g_inquire_names.c  1.16    04/02/23 SMI"
 
 /*
  *  glue routine for gss_inquire_context
  */
 
@@ -23,12 +23,17 @@
 
 {
        OM_uint32               status;
        gss_mechanism           mech;
 
-       gss_initialize();
+       if (minor_status == NULL)
+               return (GSS_S_CALL_INACCESSIBLE_WRITE);
+       *minor_status = 0;
 
+       if (name_types == NULL)
+               return (GSS_S_CALL_INACCESSIBLE_WRITE);
+
        /*
         * select the approprate underlying mechanism routine and
         * call it.
         */
 
@@ -41,13 +46,96 @@
                                        mech->context,
                                        minor_status,
                                        mechanism,
                                        name_types);
                else
-                       status = GSS_S_BAD_BINDINGS;
+                       status = GSS_S_UNAVAILABLE;
 
                return (status);
        }
 
-       return (GSS_S_NO_CONTEXT);
+       return (GSS_S_BAD_MECH);
 }
 
+OM_uint32
+gss_inquire_mechs_for_name(minor_status, input_name, mech_set)
+
+OM_uint32 *            minor_status;
+const gss_name_t       input_name;
+gss_OID_set *          mech_set;
+
+{
+       OM_uint32               status;
+       static char             *mech_list[MAX_MECH_OID_PAIRS+1];
+       gss_OID_set             mech_name_types;
+       int                     present;
+       char                    *mechanism;
+       gss_OID                 mechOid;
+       gss_OID                 name_type;
+       gss_buffer_desc         name_buffer;
+       int                     i;
+
+       if (minor_status == NULL)
+               return (GSS_S_CALL_INACCESSIBLE_WRITE);
+       *minor_status = 0;
+
+       if (input_name == NULL)
+               return (GSS_S_BAD_NAME);
+
+       status = gss_create_empty_oid_set(minor_status, mech_set);
+       if (status != GSS_S_COMPLETE)
+               return (status);
+       *mech_list = NULL;
+       status = __gss_get_mechanisms(mech_list, MAX_MECH_OID_PAIRS+1);
+       if (status != GSS_S_COMPLETE)
+               return (status);
+       for (i = 0; i < MAX_MECH_OID_PAIRS && mech_list[i] != NULL; i++) {
+               mechanism = mech_list[i];
+               if (__gss_mech_to_oid(mechanism, &mechOid) == GSS_S_COMPLETE) {
+                       status = gss_inquire_names_for_mech(
+                                       minor_status,
+                                       mechOid,
+                                       &mech_name_types);
+                       if (status == GSS_S_COMPLETE) {
+                               status = gss_display_name(minor_status,
+                                                       input_name,
+                                                       &name_buffer,
+                                                       &name_type);
+
+                               (void) gss_release_buffer(NULL, &name_buffer);
+
+                               if (status == GSS_S_COMPLETE && name_type) {
+                                       status = gss_test_oid_set_member(
+                                                       minor_status,
+                                                       name_type,
+                                                       mech_name_types,
+                                                       &present);
+                                       if (status == GSS_S_COMPLETE &&
+                                               present) {
+                                               status = gss_add_oid_set_member(
+                                                       minor_status,
+                                                       mechOid,
+                                                       mech_set);
+                                               if (status != GSS_S_COMPLETE) {
+                                               (void) gss_release_oid_set(
+                                                           minor_status,
+                                                           &mech_name_types);
+                                               (void) gss_release_oid_set(
+                                                           minor_status,
+                                                           mech_set);
+                                                       return (status);
+                                               }
+                                       }
+                               }
+                               (void) gss_release_oid_set(
+                                       minor_status,
+                                       &mech_name_types);
+                       }
+               } else {
+                       (void) gss_release_oid_set(
+                               minor_status,
+                               mech_set);
+                       return (GSS_S_FAILURE);
+               }
+       }
+       return (GSS_S_COMPLETE);
+}