X-Git-Url: http://dolda2000.com/gitweb/?p=statserve.git;a=blobdiff_plain;f=dbsrc.c;h=80a2202410d7b1db17004e265b634ef3c6bdf9a1;hp=bb239ae5f57b85599d4baabd7f27dfdd3e15c563;hb=a823d5b4a231f42a598ac3624f9271a2a3b29a50;hpb=e9b9b1bc0c0dad06b9a9c646adfecdf13247a7c1 diff --git a/dbsrc.c b/dbsrc.c index bb239ae..80a2202 100644 --- a/dbsrc.c +++ b/dbsrc.c @@ -103,6 +103,14 @@ static void dbidle(struct source *src) } } +static void dbclose(struct source *src) +{ + struct dbsrc *d = src->pdata; + + d->db->close(d->db, 0); + d->env->close(d->env, 0); +} + static void enverror(const DB_ENV *env, const char *prefix, const char *msg) { flog(LOG_ERR, "dbsource: environment error: %s", msg); @@ -118,10 +126,11 @@ struct source *mkdbsrc(char *path, char *envpath) omalloc(src); src->serve = dbserve; src->idle = dbidle; + src->close = dbclose; src->pdata = omalloc(d); if((ret = db_env_create(&d->env, 0)) != 0) { flog(LOG_ERR, "could not create bdb environment: %s", db_strerror(ret)); - exit(1); + goto fail; } if(envpath) { d->envnm = sstrdup(envpath); @@ -136,23 +145,32 @@ struct source *mkdbsrc(char *path, char *envpath) } if((ret = d->env->open(d->env, d->envnm, DB_CREATE | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN, 0666)) != 0) { flog(LOG_ERR, "could not open bdb environment: %s", db_strerror(ret)); - exit(1); + goto fail; } d->env->set_lk_detect(d->env, DB_LOCK_RANDOM); d->env->set_errcall(d->env, enverror); if((ret = db_create(&d->db, d->env, 0)) != 0) { flog(LOG_ERR, "could not create bdb database: %s", db_strerror(ret)); - exit(1); + goto fail; } if(dbpagesize) { if((ret = d->db->set_pagesize(d->db, dbpagesize)) != 0) { flog(LOG_ERR, "could not set bdb page size (to %i): %s", dbpagesize, db_strerror(ret)); - exit(1); + goto fail; } } if((ret = d->db->open(d->db, NULL, path, NULL, DB_HASH, DB_AUTO_COMMIT | DB_CREATE, 0666)) != 0) { flog(LOG_ERR, "could not open bdb database: %s", db_strerror(ret)); - exit(1); + goto fail; } return(src); + +fail: + if(d->db) + d->db->close(d->db, 0); + if(d->env) + d->env->close(d->env, 0); + free(d); + free(src); + return(NULL); }