root/source4/heimdal/lib/gssapi/mech/gss_set_cred_option.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gss_set_cred_option

   1 /*
   2  * Copyright (c) 2004, PADL Software Pty Ltd.
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  *
   9  * 1. Redistributions of source code must retain the above copyright
  10  *    notice, this list of conditions and the following disclaimer.
  11  *
  12  * 2. Redistributions in binary form must reproduce the above copyright
  13  *    notice, this list of conditions and the following disclaimer in the
  14  *    documentation and/or other materials provided with the distribution.
  15  *
  16  * 3. Neither the name of PADL Software nor the names of its contributors
  17  *    may be used to endorse or promote products derived from this software
  18  *    without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
  21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23  * ARE DISCLAIMED.  IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
  24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30  * SUCH DAMAGE.
  31  */
  32 
  33 #include "mech_locl.h"
  34 RCSID("$Id$");
  35 
  36 OM_uint32 GSSAPI_LIB_FUNCTION
  37 gss_set_cred_option (OM_uint32 *minor_status,
     /* [<][>][^][v][top][bottom][index][help] */
  38                      gss_cred_id_t *cred_handle,
  39                      const gss_OID object,
  40                      const gss_buffer_t value)
  41 {
  42         struct _gss_cred *cred = (struct _gss_cred *) *cred_handle;
  43         OM_uint32       major_status = GSS_S_COMPLETE;
  44         struct _gss_mechanism_cred *mc;
  45         int one_ok = 0;
  46 
  47         *minor_status = 0;
  48 
  49         _gss_load_mech();
  50 
  51         if (cred == NULL) {
  52                 struct _gss_mech_switch *m;
  53 
  54                 cred = malloc(sizeof(*cred));
  55                 if (cred == NULL)
  56                     return GSS_S_FAILURE;
  57 
  58                 SLIST_INIT(&cred->gc_mc);
  59 
  60                 SLIST_FOREACH(m, &_gss_mechs, gm_link) {
  61 
  62                         if (m->gm_mech.gm_set_cred_option == NULL)
  63                                 continue;
  64 
  65                         mc = malloc(sizeof(*mc));
  66                         if (mc == NULL) {
  67                             *cred_handle = (gss_cred_id_t)cred;
  68                             gss_release_cred(minor_status, cred_handle);
  69                             *minor_status = ENOMEM;
  70                             return GSS_S_FAILURE;
  71                         }
  72 
  73                         mc->gmc_mech = &m->gm_mech;
  74                         mc->gmc_mech_oid = &m->gm_mech_oid;
  75                         mc->gmc_cred = GSS_C_NO_CREDENTIAL;
  76 
  77                         major_status = m->gm_mech.gm_set_cred_option(
  78                             minor_status, &mc->gmc_cred, object, value);
  79 
  80                         if (major_status) {
  81                                 free(mc);
  82                                 continue;
  83                         }
  84                         one_ok = 1;
  85                         SLIST_INSERT_HEAD(&cred->gc_mc, mc, gmc_link);
  86                 }
  87                 *cred_handle = (gss_cred_id_t)cred;
  88                 if (!one_ok) {
  89                         OM_uint32 junk;
  90                         gss_release_cred(&junk, cred_handle);
  91                 }
  92         } else {
  93                 gssapi_mech_interface   m;
  94 
  95                 SLIST_FOREACH(mc, &cred->gc_mc, gmc_link) {
  96                         m = mc->gmc_mech;
  97         
  98                         if (m == NULL)
  99                                 return GSS_S_BAD_MECH;
 100         
 101                         if (m->gm_set_cred_option == NULL)
 102                                 continue;
 103         
 104                         major_status = m->gm_set_cred_option(minor_status,
 105                             &mc->gmc_cred, object, value);
 106                         if (major_status == GSS_S_COMPLETE)
 107                                 one_ok = 1;
 108                         else
 109                                 _gss_mg_error(m, major_status, *minor_status);
 110 
 111                 }
 112         }
 113         if (one_ok) {
 114                 *minor_status = 0;
 115                 return GSS_S_COMPLETE;
 116         }
 117         return major_status;
 118 }
 119 

/* [<][>][^][v][top][bottom][index][help] */