1 /* $NetBSD: dbinfo.c,v 1.1.1.2 2014/04/24 12:45:28 pettai Exp $ */
4 * Copyright (c) 2005 Kungliga Tekniska Högskolan
5 * (Royal Institute of Technology, Stockholm, Sweden).
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
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.
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.
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
45 const krb5_config_binding
*binding
;
46 struct hdb_dbinfo
*next
;
50 get_dbinfo(krb5_context context
,
51 const krb5_config_binding
*db_binding
,
53 struct hdb_dbinfo
**db
)
55 struct hdb_dbinfo
*di
;
60 p
= krb5_config_get_string(context
, db_binding
, "dbname", NULL
);
64 di
= calloc(1, sizeof(*di
));
66 krb5_set_error_message(context
, ENOMEM
, "malloc: out of memory");
69 di
->label
= strdup(label
);
70 di
->dbname
= strdup(p
);
72 p
= krb5_config_get_string(context
, db_binding
, "realm", NULL
);
74 di
->realm
= strdup(p
);
75 p
= krb5_config_get_string(context
, db_binding
, "mkey_file", NULL
);
77 di
->mkey_file
= strdup(p
);
78 p
= krb5_config_get_string(context
, db_binding
, "acl_file", NULL
);
80 di
->acl_file
= strdup(p
);
81 p
= krb5_config_get_string(context
, db_binding
, "log_file", NULL
);
83 di
->log_file
= strdup(p
);
85 di
->binding
= db_binding
;
93 hdb_get_dbinfo(krb5_context context
, struct hdb_dbinfo
**dbp
)
95 const krb5_config_binding
*db_binding
;
96 struct hdb_dbinfo
*di
, **dt
, *databases
;
97 const char *default_dbname
= HDB_DEFAULT_DB
;
98 const char *default_mkey
= HDB_DB_DIR
"/m-key";
99 const char *default_acl
= HDB_DB_DIR
"/kadmind.acl";
107 db_binding
= krb5_config_get_list(context
, NULL
,
113 ret
= get_dbinfo(context
, db_binding
, "default", &di
);
114 if (ret
== 0 && di
) {
119 for ( ; db_binding
!= NULL
; db_binding
= db_binding
->next
) {
121 if (db_binding
->type
!= krb5_config_list
)
124 ret
= get_dbinfo(context
, db_binding
->u
.list
,
125 db_binding
->name
, &di
);
127 krb5_err(context
, 1, ret
, "failed getting realm");
141 if(databases
== NULL
) {
142 /* if there are none specified, create one and use defaults */
143 di
= calloc(1, sizeof(*di
));
145 di
->label
= strdup("default");
148 for(di
= databases
; di
; di
= di
->next
) {
149 if(di
->dbname
== NULL
) {
150 di
->dbname
= strdup(default_dbname
);
151 if (di
->mkey_file
== NULL
)
152 di
->mkey_file
= strdup(default_mkey
);
154 if(di
->mkey_file
== NULL
) {
155 p
= strrchr(di
->dbname
, '.');
156 if(p
== NULL
|| strchr(p
, '/') != NULL
)
157 /* final pathname component does not contain a . */
158 asprintf(&di
->mkey_file
, "%s.mkey", di
->dbname
);
160 /* the filename is something.else, replace .else with
162 asprintf(&di
->mkey_file
, "%.*s.mkey",
163 (int)(p
- di
->dbname
), di
->dbname
);
165 if(di
->acl_file
== NULL
)
166 di
->acl_file
= strdup(default_acl
);
174 hdb_dbinfo_get_next(struct hdb_dbinfo
*dbp
, struct hdb_dbinfo
*dbprevp
)
179 return dbprevp
->next
;
183 hdb_dbinfo_get_label(krb5_context context
, struct hdb_dbinfo
*dbp
)
189 hdb_dbinfo_get_realm(krb5_context context
, struct hdb_dbinfo
*dbp
)
195 hdb_dbinfo_get_dbname(krb5_context context
, struct hdb_dbinfo
*dbp
)
201 hdb_dbinfo_get_mkey_file(krb5_context context
, struct hdb_dbinfo
*dbp
)
203 return dbp
->mkey_file
;
207 hdb_dbinfo_get_acl_file(krb5_context context
, struct hdb_dbinfo
*dbp
)
209 return dbp
->acl_file
;
213 hdb_dbinfo_get_log_file(krb5_context context
, struct hdb_dbinfo
*dbp
)
215 return dbp
->log_file
;
218 const krb5_config_binding
*
219 hdb_dbinfo_get_binding(krb5_context context
, struct hdb_dbinfo
*dbp
)
225 hdb_free_dbinfo(krb5_context context
, struct hdb_dbinfo
**dbp
)
227 struct hdb_dbinfo
*di
, *ndi
;
229 for(di
= *dbp
; di
!= NULL
; di
= ndi
) {
234 free (di
->mkey_file
);
243 * Return the directory where the hdb database resides.
245 * @param context Kerberos 5 context.
247 * @return string pointing to directory.
251 hdb_db_dir(krb5_context context
)
257 * Return the default hdb database resides.
259 * @param context Kerberos 5 context.
261 * @return string pointing to directory.
265 hdb_default_db(krb5_context context
)
267 return HDB_DEFAULT_DB
;