X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fconf.c;h=54a79cbc775df5fc56b5f3c41bfab8473284e1ee;hb=05fe12f8b0ff970b8fa04b6c4b68ae20c48c4e09;hp=6fd317bd25dae81eb4d6ffa641a33315dc90a9de;hpb=41ac4371df6fb6a6a8b24d3465b4ebc723f8a1aa;p=doldaconnect.git 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); +}