From 05fe12f8b0ff970b8fa04b6c4b68ae20c48c4e09 Mon Sep 17 00:00:00 2001 From: fredrik Date: Tue, 21 Nov 2006 19:55:57 +0000 Subject: [PATCH] Add variable storage db. git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/doldaconnect@745 959494ce-11ee-0310-bf91-de5d638817bd --- configure.in | 1 + daemon/conf.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ daemon/conf.h | 2 ++ 3 files changed, 49 insertions(+) diff --git a/configure.in b/configure.in index 6620508..3952c66 100644 --- a/configure.in +++ b/configure.in @@ -13,6 +13,7 @@ AC_CHECK_LIB(pam, pam_start, , AC_MSG_ERROR([*** must have PAM])) AC_CHECK_LIB(dl, dlopen, , AC_MSG_ERROR([*** PAM requires a working dynamic loader (libdl)])) AC_CHECK_LIB(z, deflate, , AC_MSG_ERROR([*** must have zlib])) AC_CHECK_LIB(bz2, BZ2_bzWriteOpen, , AC_MSG_ERROR([*** must have bzlib])) +AC_CHECK_LIB(gdbm, gdbm_open, , AC_MSG_ERROR([*** must have gdbm])) clients= extlibs= diff --git a/daemon/conf.c b/daemon/conf.c index 6fd317b..54a79cb 100644 --- a/daemon/conf.c +++ b/daemon/conf.c @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -360,3 +361,48 @@ void readconfig(FILE *stream) if(state != 0) flog(LOG_WARNING, "unexpected end of file"); } + +/* {store,fetch}var re-opens the database every time, just in case two + * doldacond processes would be running simultaneously. */ +void storevar(char *key, void *val, size_t len) +{ + char *dbname; + GDBM_FILE db; + datum k, v; + + dbname = findfile("dc-vardb", "dc-vardb", NULL, 1); + if((db = gdbm_open(dbname, 0, GDBM_WRCREAT, 0666, NULL)) == NULL) + { + flog(LOG_CRIT, "could not open var database for writing, cannot continue: %s", gdbm_strerror(gdbm_errno)); + abort(); + } + free(dbname); + k.dptr = key; + k.dsize = strlen(key); + v.dptr = val; + v.dsize = len; + gdbm_store(db, k, v, GDBM_REPLACE); + gdbm_close(db); +} + +void *fetchvar(char *key, size_t *lenb) +{ + char *dbname; + GDBM_FILE db; + datum k, v; + + if((dbname = findfile("dc-vardb", "dc-vardb", NULL, 0)) == NULL) + return(NULL); + if((db = gdbm_open(dbname, 0, GDBM_READER, 0666, NULL)) == NULL) + return(NULL); + free(dbname); + k.dptr = key; + k.dsize = strlen(key); + v = gdbm_fetch(db, k); + gdbm_close(db); + if(v.dptr == NULL) + return(NULL); + if(lenb != NULL) + *lenb = v.dsize; + return(v.dptr); +} diff --git a/daemon/conf.h b/daemon/conf.h index e6b7465..cd12614 100644 --- a/daemon/conf.h +++ b/daemon/conf.h @@ -68,5 +68,7 @@ struct configvar *confgetvar(char *modname, char *varname); #define confgetstr(m, v) (confgetvar((m), (v))->val.str) void confregmod(struct configmod *mod); void readconfig(FILE *stream); +void storevar(char *key, void *val, size_t len); +void *fetchvar(char *key, size_t *lenb); #endif -- 2.11.0