diff --git a/kdc/main.c b/kdc/main.c index a6506932a..7933dd1ea 100644 --- a/kdc/main.c +++ b/kdc/main.c @@ -59,9 +59,24 @@ main(int argc, char **argv) configure(argc, argv); - ret = hdb_create(context, &db, database); - if(ret) - krb5_err(context, 1, ret, "hdb_create %s", database); + if(databases == NULL) { + db = malloc(sizeof(*db)); + num_db = 1; + ret = hdb_create(context, &db[0], NULL); + if(ret) + krb5_err(context, 1, ret, "hdb_create %s", HDB_DEFAULT_DB); + } else { + char **d; + int i; + /* count databases */ + for(d = databases, i = 0; *d; d++, i++); + db = malloc(i * sizeof(*db)); + for(d = databases, num_db = 0; *d; d++) { + ret = hdb_create(context, &db[num_db++], *d); + if(ret) + krb5_err(context, 1, ret, "hdb_create %s", *d); + } + } ret = hdb_set_master_keyfile(context, db, keyfile); if (ret) krb5_err(context, 1, ret, "hdb_set_master_keyfile"); diff --git a/kdc/misc.c b/kdc/misc.c index 09290aaab..287c18957 100644 --- a/kdc/misc.c +++ b/kdc/misc.c @@ -47,20 +47,22 @@ db_fetch(krb5_principal principal) { hdb_entry *ent; krb5_error_code ret; - - ret = db->open(context, db, O_RDONLY, 0); - if (ret) { - kdc_log(0, "Failed to open database: %s", - krb5_get_err_text(context, ret)); - return NULL; - } + int i; ALLOC(ent); ent->principal = principal; - ret = db->fetch(context, db, HDB_F_DECRYPT, ent); - db->close(context, db); - if(ret){ - free(ent); - return NULL; + + for(i = 0; i < num_db; i++) { + ret = db[i]->open(context, db[i], O_RDONLY, 0); + if (ret) { + kdc_log(0, "Failed to open database: %s", + krb5_get_err_text(context, ret)); + continue; + } + ret = db[i]->fetch(context, db[i], HDB_F_DECRYPT, ent); + db[i]->close(context, db[i]); + if(ret == 0) + return ent; } - return ent; + free(ent); + return NULL; }