Initialize database with version number.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3169 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -255,17 +255,69 @@ hdb_foreach(krb5_context context,
|
||||
return ret;
|
||||
}
|
||||
|
||||
krb5_error_code
|
||||
hdb_check_db_format(krb5_context context, HDB *db)
|
||||
{
|
||||
krb5_data tag;
|
||||
krb5_data version;
|
||||
krb5_error_code ret;
|
||||
unsigned ver;
|
||||
tag.data = HDB_DB_FORMAT_ENTRY;
|
||||
tag.length = strlen(tag.data);
|
||||
ret = (*db->_get)(context, db, tag, &version);
|
||||
if(ret)
|
||||
return ret;
|
||||
if(sscanf(version.data, "%u", &ver) != 1)
|
||||
return HDB_ERR_BADVERSION;
|
||||
if(ver != HDB_DB_FORMAT)
|
||||
return HDB_ERR_BADVERSION;
|
||||
return 0;
|
||||
}
|
||||
|
||||
krb5_error_code
|
||||
hdb_init_db(krb5_context context, HDB *db)
|
||||
{
|
||||
krb5_error_code ret;
|
||||
krb5_data tag;
|
||||
krb5_data version;
|
||||
char ver[32];
|
||||
|
||||
ret = hdb_check_db_format(context, db);
|
||||
if(ret != HDB_ERR_NOENTRY)
|
||||
return ret;
|
||||
|
||||
tag.data = HDB_DB_FORMAT_ENTRY;
|
||||
tag.length = strlen(tag.data);
|
||||
snprintf(ver, sizeof(ver), "%u", HDB_DB_FORMAT);
|
||||
version.data = ver;
|
||||
version.length = strlen(version.data) + 1; /* zero terminated */
|
||||
ret = (*db->_put)(context, db, 0, tag, version);
|
||||
return ret;
|
||||
}
|
||||
|
||||
krb5_error_code
|
||||
hdb_open(krb5_context context, HDB **db,
|
||||
const char *filename, int flags, mode_t mode)
|
||||
{
|
||||
krb5_error_code ret = 0;
|
||||
if(filename == NULL)
|
||||
filename = HDB_DEFAULT_DB;
|
||||
initialize_hdb_error_table(&context->et_list);
|
||||
#ifdef HAVE_DB_H
|
||||
return hdb_db_open(context, db, filename, flags, mode);
|
||||
ret = hdb_db_open(context, db, filename, flags, mode);
|
||||
#elif HAVE_NDBM_H
|
||||
return hdb_ndbm_open(context, db, filename, flags, mode);
|
||||
ret = hdb_ndbm_open(context, db, filename, flags, mode);
|
||||
#else
|
||||
#error No suitable database library
|
||||
krb5_errx(context, 1, "No database support! (hdb_open)");
|
||||
#endif
|
||||
if(ret == 0){
|
||||
if(((flags & O_ACCMODE) == O_WRONLY || (flags & O_ACCMODE) == O_RDWR) &&
|
||||
(flags & O_CREAT))
|
||||
ret = hdb_init_db(context, *db);
|
||||
else
|
||||
ret = hdb_check_db_format(context, *db);
|
||||
if(ret)
|
||||
(*db)->close(context, *db);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user