X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Fcnid%2Fcdb%2Fcnid_cdb_open.c;h=0a8cfa39ed8fa4c9811747909e822c7f8d69c2d8;hp=10ecc78d8c34efaf51365820954b1ff5d06c0f6a;hb=5eb3b5ac51c8221009041928a5a08c101d2be743;hpb=18964cebf514f78defd3df1cfed91e34d99cfa28 diff --git a/libatalk/cnid/cdb/cnid_cdb_open.c b/libatalk/cnid/cdb/cnid_cdb_open.c index 10ecc78d..0a8cfa39 100644 --- a/libatalk/cnid/cdb/cnid_cdb_open.c +++ b/libatalk/cnid/cdb/cnid_cdb_open.c @@ -38,6 +38,7 @@ #ifdef CNID_BACKEND_CDB +#include #include #include "cnid_cdb_private.h" @@ -61,20 +62,6 @@ static char *old_dbfiles[] = {"cnid.db", NULL}; -/* ----------------------- - * bandaid for LanTest performance pb. for now not used, cf. ifdef 0 below -*/ -static int my_yield(void) -{ - struct timeval t; - int ret; - - t.tv_sec = 0; - t.tv_usec = 1000; - ret = select(0, NULL, NULL, NULL, &t); - return 0; -} - /* --------------- */ static int didname(DB *dbp _U_, const DBT *pkey _U_, const DBT *pdata, DBT *skey) { @@ -123,7 +110,7 @@ static int my_open(DB * p, const char *f, const char *d, DBTYPE t, u_int32_t fla } /* --------------- */ -static struct _cnid_db *cnid_cdb_new(const char *volpath) +static struct _cnid_db *cnid_cdb_new(struct vol *vol) { struct _cnid_db *cdb; int major, minor, patch; @@ -141,13 +128,8 @@ static struct _cnid_db *cnid_cdb_new(const char *volpath) if ((cdb = (struct _cnid_db *) calloc(1, sizeof(struct _cnid_db))) == NULL) return NULL; - if ((cdb->volpath = strdup(volpath)) == NULL) { - free(cdb); - return NULL; - } - - cdb->flags = CNID_FLAG_PERSISTENT; - + cdb->cnid_db_vol = vol; + cdb->cnid_db_flags = CNID_FLAG_PERSISTENT; cdb->cnid_add = cnid_cdb_add; cdb->cnid_delete = cnid_cdb_delete; cdb->cnid_get = cnid_cdb_get; @@ -158,7 +140,7 @@ static struct _cnid_db *cnid_cdb_new(const char *volpath) cdb->cnid_close = cnid_cdb_close; cdb->cnid_getstamp = cnid_cdb_getstamp; cdb->cnid_rebuild_add = cnid_cdb_rebuild_add; - + cdb->cnid_wipe = NULL; return cdb; } @@ -202,19 +184,16 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) int open_flag, len; static int first = 0; int rc; - - if (!args->dir || *args->dir == 0) { - return NULL; - } + struct vol *vol = args->cnid_args_vol; /* this checks .AppleDB. We need space for dir + '/' + DBHOMELEN + '/' + DBLEN */ - if ((len = strlen(args->dir)) > (MAXPATHLEN - DBHOMELEN - DBLEN - 2)) { - LOG(log_error, logtype_default, "cnid_open: Pathname too large: %s", args->dir); + if ((len = strlen(vol->v_path)) > (MAXPATHLEN - DBHOMELEN - DBLEN - 2)) { + LOG(log_error, logtype_default, "cnid_open: Pathname too large: %s", vol->v_path); return NULL; } - if ((cdb = cnid_cdb_new(args->dir)) == NULL) { + if ((cdb = cnid_cdb_new(vol)) == NULL) { LOG(log_error, logtype_default, "cnid_open: Unable to allocate memory for database"); return NULL; } @@ -224,17 +203,16 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) goto fail_cdb; } - cdb->_private = (void *) db; - db->magic = CNID_DB_MAGIC; + cdb->cnid_db_private = (void *) db; - strcpy(path, args->dir); + strcpy(path, vol->v_path); if (path[len - 1] != '/') { strcat(path, "/"); len++; } strcpy(path + len, DBHOME); - if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~args->mask) < 0)) { + if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~vol->v_umask) < 0)) { LOG(log_error, logtype_default, "cnid_open: DBHOME mkdir failed for %s", path); goto fail_adouble; } @@ -261,7 +239,7 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) } /* Open the database environment. */ - if ((rc = db->dbenv->open(db->dbenv, path, DBOPTIONS, 0666 & ~args->mask)) != 0) { + if ((rc = db->dbenv->open(db->dbenv, path, DBOPTIONS, 0666 & ~vol->v_umask)) != 0) { LOG(log_error, logtype_default, "cnid_open: dbenv->open (rw) of %s failed: %s", path, db_strerror(rc)); /* FIXME: This should probably go. Even if it worked, any use for a read-only DB? Didier? */ if (rc == DB_RUNRECOVERY) { @@ -274,10 +252,10 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) /* We can't get a full transactional environment, so multi-access * is out of the question. Let's assume a read-only environment, * and try to at least get a shared memory pool. */ - if ((rc = db->dbenv->open(db->dbenv, path, DB_INIT_MPOOL, 0666 & ~args->mask)) != 0) { + if ((rc = db->dbenv->open(db->dbenv, path, DB_INIT_MPOOL, 0666 & ~vol->v_umask)) != 0) { /* Nope, not a MPOOL, either. Last-ditch effort: we'll try to * open the environment with no flags. */ - if ((rc = db->dbenv->open(db->dbenv, path, 0, 0666 & ~args->mask)) != 0) { + if ((rc = db->dbenv->open(db->dbenv, path, 0, 0666 & ~vol->v_umask)) != 0) { LOG(log_error, logtype_default, "cnid_open: dbenv->open of %s failed: %s", path, db_strerror(rc)); goto fail_lock; } @@ -296,7 +274,7 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) goto fail_appinit; } - if ((rc = my_open(db->db_cnid, DBCNID, DBCNID, DB_BTREE, open_flag, 0666 & ~args->mask)) != 0) { + if ((rc = my_open(db->db_cnid, DBCNID, DBCNID, DB_BTREE, open_flag, 0666 & ~vol->v_umask)) != 0) { LOG(log_error, logtype_default, "cnid_open: Failed to open dev/ino database: %s", db_strerror(rc)); goto fail_appinit; @@ -311,7 +289,7 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) goto fail_appinit; } - if ((rc = my_open(db->db_didname, DBCNID, DBDIDNAME, DB_BTREE, open_flag, 0666 & ~args->mask))) { + if ((rc = my_open(db->db_didname, DBCNID, DBDIDNAME, DB_BTREE, open_flag, 0666 & ~vol->v_umask))) { LOG(log_error, logtype_default, "cnid_open: Failed to open did/name database: %s", db_strerror(rc)); goto fail_appinit; @@ -326,7 +304,7 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) goto fail_appinit; } - if ((rc = my_open(db->db_devino, DBCNID, DBDEVINO, DB_BTREE, open_flag, 0666 & ~args->mask)) != 0) { + if ((rc = my_open(db->db_devino, DBCNID, DBDEVINO, DB_BTREE, open_flag, 0666 & ~vol->v_umask)) != 0) { LOG(log_error, logtype_default, "cnid_open: Failed to open devino database: %s", db_strerror(rc)); goto fail_appinit; @@ -368,7 +346,6 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) } } - db_env_set_func_yield(my_yield); return cdb; fail_appinit: @@ -388,8 +365,6 @@ struct _cnid_db *cnid_cdb_open(struct cnid_open_args *args) free(db); fail_cdb: - if (cdb->volpath != NULL) - free(cdb->volpath); free(cdb); return NULL;