/*
- * $Id: cnid_tdb_open.c,v 1.5 2009-11-21 13:38:11 didg Exp $
- *
* Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT.
*
cdb->cnid_resolve = cnid_tdb_resolve;
cdb->cnid_update = cnid_tdb_update;
cdb->cnid_close = cnid_tdb_close;
-
+ cdb->cnid_wipe = NULL;
+
return cdb;
}
/* ---------------------------- */
-struct _cnid_db *cnid_tdb_open(const char *dir, mode_t mask)
+struct _cnid_db *cnid_tdb_open(struct cnid_open_args *args)
{
struct stat st;
struct _cnid_db *cdb;
size_t len;
char path[MAXPATHLEN + 1];
TDB_DATA key, data;
-
- if (!dir) {
+ int hash_size = 131071;
+ int tdb_flags = 0;
+
+ if (!args->dir) {
+ /* note: dir and path are not used for in memory db */
return NULL;
}
- if ((len = strlen(dir)) > (MAXPATHLEN - DBLEN - 1)) {
- LOG(log_error, logtype_default, "tdb_open: Pathname too large: %s", dir);
+ if ((len = strlen(args->dir)) > (MAXPATHLEN - DBLEN - 1)) {
+ LOG(log_error, logtype_default, "tdb_open: Pathname too large: %s", args->dir);
return NULL;
}
- if ((cdb = cnid_tdb_new(dir)) == NULL) {
+ if ((cdb = cnid_tdb_new(args->dir)) == NULL) {
LOG(log_error, logtype_default, "tdb_open: Unable to allocate memory for tdb");
return NULL;
}
- strcpy(path, dir);
+
+ strcpy(path, args->dir);
if (path[len - 1] != '/') {
strcat(path, "/");
len++;
}
strcpy(path + len, DBHOME);
- if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~mask) < 0)) {
- LOG(log_error, logtype_default, "tdb_open: DBHOME mkdir failed for %s", path);
- goto fail;
+ if (!(args->flags & CNID_FLAG_MEMORY)) {
+ if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~args->mask) < 0)) {
+ LOG(log_error, logtype_default, "tdb_open: DBHOME mkdir failed for %s", path);
+ goto fail;
+ }
+ }
+ else {
+ hash_size = 0;
+ tdb_flags = TDB_INTERNAL;
}
strcat(path, "/");
path[len + DBHOMELEN] = '\0';
strcat(path, DBCNID);
- db->tdb_cnid = tdb_open(path, 131071, 0 , O_RDWR | O_CREAT, 0666 & ~mask);
+
+ db->tdb_cnid = tdb_open(path, hash_size, tdb_flags , O_RDWR | O_CREAT, 0666 & ~args->mask);
if (!db->tdb_cnid) {
LOG(log_error, logtype_default, "tdb_open: unable to open tdb", path);
goto fail;
* to change the format in any way. */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
- key.dptr = DBVERSION_KEY;
+ key.dptr = (unsigned char *)DBVERSION_KEY;
key.dsize = DBVERSION_KEYLEN;
data = tdb_fetch(db->tdb_didname, key);
if (!data.dptr) {
- u_int32_t version = htonl(DBVERSION);
+ uint32_t version = htonl(DBVERSION);
- data.dptr = (char *)&version;
+ data.dptr = (unsigned char *)&version;
data.dsize = sizeof(version);
if (tdb_store(db->tdb_didname, key, data, TDB_REPLACE)) {
LOG(log_error, logtype_default, "tdb_open: Error putting new version");
free(data.dptr);
}
-
return cdb;
fail: