/ kdc / set_dbinfo.c
set_dbinfo.c
  1  /*
  2   * Copyright (c) 1997-2007 Kungliga Tekniska Högskolan
  3   * (Royal Institute of Technology, Stockholm, Sweden).
  4   * All rights reserved.
  5   *
  6   * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
  7   *
  8   * Redistribution and use in source and binary forms, with or without
  9   * modification, are permitted provided that the following conditions
 10   * are met:
 11   *
 12   * 1. Redistributions of source code must retain the above copyright
 13   *    notice, this list of conditions and the following disclaimer.
 14   *
 15   * 2. Redistributions in binary form must reproduce the above copyright
 16   *    notice, this list of conditions and the following disclaimer in the
 17   *    documentation and/or other materials provided with the distribution.
 18   *
 19   * 3. Neither the name of the Institute nor the names of its contributors
 20   *    may be used to endorse or promote products derived from this software
 21   *    without specific prior written permission.
 22   *
 23   * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 24   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 25   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 26   * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 27   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 28   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 29   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 30   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 31   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 32   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 33   * SUCH DAMAGE.
 34   */
 35  
 36  #include "kdc_locl.h"
 37  
 38  static krb5_error_code
 39  add_db(krb5_context context, struct krb5_kdc_configuration *c,
 40         const char *conf, const char *master_key)
 41  {
 42      krb5_error_code ret;
 43      void *ptr;
 44  
 45      ptr = realloc(c->db, (c->num_db + 1) * sizeof(*c->db));
 46      if (ptr == NULL) {
 47  	krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
 48  	return ENOMEM;
 49      }
 50      c->db = ptr;
 51  
 52      ret = hdb_create(context, &c->db[c->num_db], conf);
 53      if(ret)
 54  	return ret;
 55  
 56      c->num_db++;
 57  
 58      if (master_key) {
 59  	ret = hdb_set_master_keyfile(context, c->db[c->num_db - 1], master_key);
 60  	if (ret)
 61  	    return ret;
 62      }
 63  
 64      return 0;
 65  }
 66  
 67  krb5_error_code
 68  krb5_kdc_set_dbinfo(krb5_context context, struct krb5_kdc_configuration *c)
 69  {
 70      struct hdb_dbinfo *info, *d;
 71      krb5_error_code ret;
 72      unsigned i;
 73  
 74      /* fetch the databases */
 75      ret = hdb_get_dbinfo(context, &info);
 76      if (ret)
 77  	return ret;
 78  
 79      d = NULL;
 80      while ((d = hdb_dbinfo_get_next(info, d)) != NULL) {
 81  
 82  	ret = add_db(context, c,
 83  		     hdb_dbinfo_get_dbname(context, d),
 84  		     hdb_dbinfo_get_mkey_file(context, d));
 85  	if (ret)
 86  	    goto out;
 87  
 88  	kdc_log(context, c, 0, "label: %s",
 89  		hdb_dbinfo_get_label(context, d));
 90  	kdc_log(context, c, 0, "\tdbname: %s",
 91  		hdb_dbinfo_get_dbname(context, d));
 92  	kdc_log(context, c, 0, "\tmkey_file: %s",
 93  		hdb_dbinfo_get_mkey_file(context, d));
 94  	kdc_log(context, c, 0, "\tacl_file: %s",
 95  		hdb_dbinfo_get_acl_file(context, d));
 96      }
 97      hdb_free_dbinfo(context, &info);
 98  
 99      return 0;
100  out:
101      for (i = 0; i < c->num_db; i++)
102  	if (c->db[i] && c->db[i]->hdb_destroy)
103  	    (*c->db[i]->hdb_destroy)(context, c->db[i]);
104      c->num_db = 0;
105      free(c->db);
106      c->db = NULL;
107  
108      hdb_free_dbinfo(context, &info);
109  
110      return ret;
111  }
112  
113