diff options
Diffstat (limited to 'src/builtin/db.bi')
-rw-r--r-- | src/builtin/db.bi | 410 |
1 files changed, 247 insertions, 163 deletions
diff --git a/src/builtin/db.bi b/src/builtin/db.bi index a734dc10..90d926eb 100644 --- a/src/builtin/db.bi +++ b/src/builtin/db.bi @@ -16,7 +16,6 @@ #define DEFAULT_DB_MODE 0640 #include <fnmatch.h> -#include "mf-dbm.h" struct db_prop { /* Database properties */ char *pat; /* Database name pattern */ @@ -143,6 +142,35 @@ db_prop_lookup(const char *name) } return found; } + +int +_mf_dbm_open(mu_dbm_file_t *pdb, char *dbname, int access, int mode) +{ + mu_dbm_file_t db; + int rc; + int sflg = MU_FILE_SAFETY_LINKED_WRDIR | + MU_FILE_SAFETY_DIR_IWOTH; + + rc = mu_dbm_create(dbname, &db); + if (rc) + return rc; + + mu_dbm_safety_set_flags(db, + sflg | mf_file_mode_to_safety_criteria(mode)); + rc = mu_dbm_safety_check(db); + if (rc && rc != ENOENT) { + mu_error(_("%s fails safety check: %s"), + dbname, mu_strerror(rc)); + mu_dbm_destroy(&db); + return rc; + } + /* FIXME: Safety checking */ + rc = mu_dbm_open(db, access, mode); + if (rc) + return rc; + *pdb = db; + return rc; +} #define LOOKUP_NULL_BYTE 0x1 @@ -154,27 +182,34 @@ dbmap_lookup(eval_environ_t env, char *dbname, const char *keystr, const char *defval, int flags) { int rc; - MF_DBM_FILE db; - MF_DBM_DATUM key; - MF_DBM_DATUM contents; + mu_dbm_file_t db; + struct mu_dbm_datum key; + struct mu_dbm_datum contents; if (!defval) defval = ""; - if (mf_dbm_open(dbname, &db, MU_STREAM_READ, 0, NULL)) + rc = _mf_dbm_open(&db, dbname, MU_STREAM_READ, 0); + if (rc) MF_THROW(mfe_dbfailure, _("mf_dbm_open(%s) failed: %s"), dbname, - mf_dbm_strerror()); + mu_strerror(rc)); memset(&key, 0, sizeof key); memset(&contents, 0, sizeof contents); - MF_DATUM_PTR(key) = (void*) keystr; - MF_DATUM_SIZE(key) = strlen(keystr); + key.mu_dptr = (void*) keystr; + key.mu_dsize = strlen(keystr); if (flags & LOOKUP_NULL_BYTE) - MF_DATUM_SIZE(key)++; - rc = mf_dbm_fetch(&db, key, &contents) == 0; + key.mu_dsize++; + rc = mu_dbm_fetch(db, &key, &contents); + if (rc && rc != MU_ERR_NOENT) { + mu_dbm_destroy(&db); + MF_THROW(mfe_dbfailure, + _("cannot fetch data: %s"), + mu_dbm_strerror(db)); + } MF_DEBUG(MU_DEBUG_TRACE5, - ("Looking up %s: %s", keystr, rc ? "true" : "false")); + ("Looking up %s: %s", keystr, rc ? "false" : "true")); if (flags & LOOKUP_TEST_ONLY) push(env, (STKVAL)rc); else { @@ -183,18 +218,18 @@ dbmap_lookup(eval_environ_t env, char *dbname, const char *keystr, pushs(env, (STKVAL)defval); else push(env, 0); - } else if (((char*)MF_DATUM_PTR(contents))[MF_DATUM_SIZE(contents)-1]) { + } else if (((char*)contents.mu_dptr)[contents.mu_dsize-1]) { size_t off; - size_t len = MF_DATUM_SIZE(contents); + size_t len = contents.mu_dsize; char *s = MF_ALLOC_HEAP(off, len + 1); - memcpy(s, MF_DATUM_PTR(contents), len); + memcpy(s, contents.mu_dptr, len); s[len] = 0; push(env, (STKVAL) off); } else - pushs(env, MF_DATUM_PTR(contents)); + pushs(env, contents.mu_dptr); } - mf_dbm_datum_free(&contents); - mf_dbm_close(&db); + mu_dbm_datum_free(&contents); + mu_dbm_destroy(&db); return rc; } >]) @@ -225,37 +260,41 @@ MF_DEFUN(dbput, VOID, STRING dbname, STRING keystr, STRING value, OPTIONAL, NUMBER null, NUMBER mode) { int rc; - MF_DBM_FILE db; - MF_DBM_DATUM key; - MF_DBM_DATUM contents; + mu_dbm_file_t db; + struct mu_dbm_datum key; + struct mu_dbm_datum contents; const struct db_prop *prop = db_prop_lookup(dbname); - if (mf_dbm_open(dbname, &db, MU_STREAM_RDWR, - MF_OPTVAL(mode, (prop ? prop->mode : DEFAULT_DB_MODE)), - NULL)) + rc = _mf_dbm_open(&db, dbname, MU_STREAM_RDWR, + MF_OPTVAL(mode, + (prop ? prop->mode : DEFAULT_DB_MODE))); + if (rc) MF_THROW(mfe_dbfailure, _("mf_dbm_open(%s) failed: %s"), dbname, - mf_dbm_strerror()); + mu_strerror(rc)); memset(&key, 0, sizeof key); - MF_DATUM_PTR(key) = keystr; - MF_DATUM_SIZE(key) = strlen(keystr); + key.mu_dptr = keystr; + key.mu_dsize = strlen(keystr); if (MF_OPTVAL(null, prop && prop->null)) - MF_DATUM_SIZE(key)++; + key.mu_dsize++; memset(&contents, 0, sizeof contents); - MF_DATUM_PTR(contents) = value; - MF_DATUM_SIZE(contents) = strlen(value) + 1; + contents.mu_dptr = value; + contents.mu_dsize = strlen(value) + 1; - rc = mf_dbm_insert(&db, key, contents, 1); - mf_dbm_close(&db); - MF_ASSERT(rc == 0, - mfe_dbfailure, - _("failed to insert data to %s: %s %s: %s"), - dbname, - keystr, - value, - mf_dbm_strerror()); + rc = mu_dbm_store(db, &key, &contents, 1); + if (rc) { + const char *errstr = mu_dbm_strerror(db); + mu_dbm_destroy(&db); + MF_THROW(mfe_dbfailure, + _("failed to insert data to %s: %s %s: %s"), + dbname, + keystr, + value, + errstr); + } + mu_dbm_destroy(&db); } END @@ -263,30 +302,34 @@ MF_DEFUN(dbinsert, VOID, STRING dbname, STRING keystr, STRING value, OPTIONAL, NUMBER replace, NUMBER null, NUMBER mode) { int rc; - MF_DBM_FILE db; - MF_DBM_DATUM key; - MF_DBM_DATUM contents; + mu_dbm_file_t db; + struct mu_dbm_datum key; + struct mu_dbm_datum contents; const struct db_prop *prop = db_prop_lookup(dbname); + const char *errstr; - if (mf_dbm_open(dbname, &db, MU_STREAM_RDWR, - MF_OPTVAL(mode, (prop ? prop->mode : DEFAULT_DB_MODE)), - NULL)) + rc = _mf_dbm_open(&db, dbname, MU_STREAM_RDWR, + MF_OPTVAL(mode, + (prop ? prop->mode : DEFAULT_DB_MODE))); + if (rc) MF_THROW(mfe_dbfailure, _("mf_dbm_open(%s) failed: %s"), dbname, - mf_dbm_strerror()); + mu_strerror(rc)); memset(&key, 0, sizeof key); - MF_DATUM_PTR(key) = keystr; - MF_DATUM_SIZE(key) = strlen(keystr); + key.mu_dptr = keystr; + key.mu_dsize = strlen(keystr); if (MF_OPTVAL(null, prop && prop->null)) - MF_DATUM_SIZE(key)++; + key.mu_dsize++; memset(&contents, 0, sizeof contents); - MF_DATUM_PTR(contents) = value; - MF_DATUM_SIZE(contents) = strlen(value) + 1; + contents.mu_dptr = value; + contents.mu_dsize = strlen(value) + 1; - rc = mf_dbm_insert(&db, key, contents, MF_OPTVAL(replace)); - mf_dbm_close(&db); + rc = mu_dbm_store(db, &key, &contents, MF_OPTVAL(replace)); + if (rc && rc != MU_ERR_EXISTS) + errstr = mu_dbm_strerror(db); + mu_dbm_destroy(&db); if (rc == MU_ERR_EXISTS) MF_THROW(mfe_exists, _("record already exists")); @@ -296,38 +339,42 @@ MF_DEFUN(dbinsert, VOID, STRING dbname, STRING keystr, STRING value, dbname, keystr, value, - mf_dbm_strerror()); + errstr); } END MF_DEFUN(dbdel, VOID, STRING dbname, STRING keystr, OPTIONAL, NUMBER null, NUMBER mode) { - MF_DBM_FILE db; - MF_DBM_DATUM key; + mu_dbm_file_t db; + struct mu_dbm_datum key; int rc; const struct db_prop *prop = db_prop_lookup(dbname); - if (mf_dbm_open(dbname, &db, MU_STREAM_RDWR, - MF_OPTVAL(mode, (prop ? prop->mode : DEFAULT_DB_MODE)), - NULL)) - MF_THROW(mfe_dbfailure, - _("mf_dbm_open(%s) failed: %s"), - dbname, - mf_dbm_strerror()); + rc = _mf_dbm_open(&db, dbname, MU_STREAM_RDWR, + MF_OPTVAL(mode, + (prop ? prop->mode : DEFAULT_DB_MODE))); + MF_ASSERT(rc == 0, + mfe_dbfailure, + _("mf_dbm_open(%s) failed: %s"), + dbname, + mu_strerror(rc)); memset(&key, 0, sizeof key); - MF_DATUM_PTR(key) = keystr; - MF_DATUM_SIZE(key) = strlen(keystr); + key.mu_dptr = keystr; + key.mu_dsize = strlen(keystr); if (MF_OPTVAL(null, prop && prop->null)) - MF_DATUM_SIZE(key)++; - rc = mf_dbm_delete(&db, key); - mf_dbm_close(&db); + key.mu_dsize++; + rc = mu_dbm_delete(db, &key); + if (rc && rc != MU_ERR_FAILURE) + mu_error(_("error deleting %s from %s: %s"), + keystr, dbname, mu_dbm_strerror(db)); + mu_dbm_destroy(&db); MF_ASSERT(rc == 0, mfe_dbfailure, _("failed to delete data `%s' from `%s': %s"), keystr, dbname, - mf_dbm_strerror()); + mu_strerror(rc)); } END @@ -336,8 +383,8 @@ END struct db_tab { int used; - MF_DBM_FILE db; - MF_DBM_DATUM key; + mu_dbm_file_t db; + struct mu_dbm_datum key; }; static void * @@ -350,8 +397,8 @@ static void close_db_tab(struct db_tab *dbt) { if (dbt->used) { - mf_dbm_datum_free(&dbt->key); - mf_dbm_close(&dbt->db); + mu_dbm_datum_free(&dbt->key); + mu_dbm_destroy(&dbt->db); dbt->used = 0; } } @@ -387,18 +434,28 @@ MF_DEFUN(dbfirst, NUMBER, STRING dbname) int rc; int n; struct db_tab *dbt = MF_GET_DATA; - MF_DBM_FILE db; - MF_DBM_DATUM key; - - if (mf_dbm_open(dbname, &db, MU_STREAM_READ, 0, NULL)) - MF_THROW(mfe_dbfailure, - _("mf_dbm_open(%s) failed: %s"), - dbname, - mf_dbm_strerror()); - rc = mf_dbm_firstkey(&db, &key); - MF_ASSERT(rc == 0, mfe_dbfailure, - _("mf_dbm_firstkey failed: %s"), - mf_dbm_strerror()); + mu_dbm_file_t db; + struct mu_dbm_datum key; + + rc = _mf_dbm_open(&db, dbname, MU_STREAM_READ, 0); + MF_ASSERT(rc == 0, + mfe_dbfailure, + _("mf_dbm_open(%s) failed: %s"), + dbname, + mu_strerror(rc)); + memset(&key, 0, sizeof key); + rc = mu_dbm_firstkey(db, &key); + if (rc) { + if (rc == MU_ERR_NOENT) { + mu_dbm_destroy(&db); + MF_RETURN(0); + } else if (rc) { + mu_dbm_destroy(&db); + MF_THROW(mfe_dbfailure, + _("mf_dbm_firstkey failed: %s"), + mu_strerror(rc)); + } + } n = new_db_tab(dbt); MF_ASSERT(n >= 0, mfe_failure, @@ -413,19 +470,22 @@ END MF_DEFUN(dbnext, NUMBER, NUMBER dn) { struct db_tab *dbt = MF_GET_DATA + dn; - MF_DBM_DATUM nextkey; + struct mu_dbm_datum nextkey; int rc; MF_ASSERT(dn >= 0 && dn < NUMDB && dbt->used, mfe_range, _("invalid database descriptor")); - rc = mf_dbm_nextkey(&dbt->db, dbt->key, &nextkey); + rc = mu_dbm_nextkey(dbt->db, &nextkey); if (rc) { + if (rc == MU_ERR_FAILURE) + mu_error(_("mu_dbm_nextkey: %s"), + mu_dbm_strerror(dbt->db)); close_db_tab(dbt); MF_RETURN(0); } - mf_dbm_datum_free(&dbt->key); + mu_dbm_datum_free(&nextkey); dbt->key = nextkey; MF_RETURN(1); } @@ -441,9 +501,9 @@ MF_DEFUN(dbkey, STRING, NUMBER dn) mfe_range, _("invalid database descriptor")); - len = MF_DATUM_SIZE(dbt->key); + len = dbt->key.mu_dsize; s = MF_ALLOC_HEAP(off, len + 1); - memcpy(s, MF_DATUM_PTR(dbt->key), len); + memcpy(s, dbt->key.mu_dptr, len); s[len] = 0; MF_RETURN(off); } @@ -455,24 +515,25 @@ MF_DEFUN(dbvalue, STRING, NUMBER dn) size_t off, len; char *s; struct db_tab *dbt = MF_GET_DATA + dn; - MF_DBM_DATUM contents; + struct mu_dbm_datum contents; MF_ASSERT(dn >= 0 && dn < NUMDB && dbt->used, mfe_range, _("invalid database descriptor")); memset(&contents, 0, sizeof contents); - rc = mf_dbm_fetch(&dbt->db, dbt->key, &contents); + rc = mu_dbm_fetch(dbt->db, &dbt->key, &contents); MF_ASSERT(rc == 0, mfe_dbfailure, - _("key not found: %s"), - mf_dbm_strerror()); + _("cannot fetch key: %s"), + rc == MU_ERR_FAILURE ? + mu_dbm_strerror(dbt->db) : mu_strerror (rc)); - len = MF_DATUM_SIZE(contents); + len = contents.mu_dsize; s = MF_ALLOC_HEAP(off, len + 1); - memcpy(s, MF_DATUM_PTR(contents), len); + memcpy(s, contents.mu_dptr, len); s[len] = 0; - mf_dbm_datum_free(&contents); + mu_dbm_datum_free(&contents); MF_RETURN(off); } END @@ -522,32 +583,37 @@ static int do_greylist_traditional(eval_environ_t env, char *email, long interval) { int rc; - MF_DBM_FILE db; - MF_DBM_DATUM key; - MF_DBM_DATUM contents; - int readonly; + mu_dbm_file_t db; + struct mu_dbm_datum key; + struct mu_dbm_datum contents; + int readonly = 0; time_t now; - rc = mf_dbm_open(greylist_format->dbname, &db, MU_STREAM_RDWR, 0600, - &readonly); + rc = _mf_dbm_open(&db, greylist_format->dbname, MU_STREAM_RDWR, 0600); + if (rc) { + rc = _mf_dbm_open(&db, greylist_format->dbname, + MU_STREAM_READ, 0); + readonly = 1; + } MF_ASSERT(rc == 0, mfe_dbfailure, _("mf_dbm_open(%s) failed: %s"), - greylist_format->dbname, mf_dbm_strerror()); + greylist_format->dbname, mu_strerror(rc)); memset(&key, 0, sizeof key); memset(&contents, 0, sizeof contents); - MF_DATUM_PTR(key) = email; - MF_DATUM_SIZE(key) = strlen(email)+1; + key.mu_dptr = email; + key.mu_dsize = strlen(email)+1; time(&now); - if (mf_dbm_fetch(&db, key, &contents) == 0) { + rc = mu_dbm_fetch(db, &key, &contents); + if (rc == 0) { time_t timestamp, diff; - MF_ASSERT(MF_DATUM_SIZE(contents) == sizeof timestamp, + MF_ASSERT(contents.mu_dsize == sizeof timestamp, mfe_dbfailure, _("greylist database %s has wrong data size"), - greylist_format->dbname); + greylist_format->dbname); - timestamp = *(time_t*) MF_DATUM_PTR(contents); + timestamp = *(time_t*) contents.mu_dptr; diff = now - timestamp; if (mu_debug_level_p(debug_handle, MU_DEBUG_TRACE5)) { @@ -559,10 +625,10 @@ do_greylist_traditional(eval_environ_t env, char *email, long interval) sizeof timebuf), (long) diff); } - + if (diff < interval) { diff = interval - diff; - + MF_VAR_REF(greylist_seconds_left, diff); MF_DEBUG(MU_DEBUG_TRACE6, @@ -575,15 +641,17 @@ do_greylist_traditional(eval_environ_t env, char *email, long interval) ("greylist record for %s expired", email)); MF_VAR_REF(greylist_seconds_left, interval); if (!readonly) { - memcpy(MF_DATUM_PTR(contents), - &now, sizeof now); - if (mf_dbm_insert(&db, key, contents, 1)) + memcpy(contents.mu_dptr, &now, sizeof now); + rc = mu_dbm_store(db, &key, &contents, 1); + if (rc) mu_error(_("cannot insert datum `%-.*s' in " "greylist database %s: %s"), - MF_DATUM_SIZE(key), - (char*)MF_DATUM_PTR(key), + key.mu_dsize, + (char*)key.mu_dptr, greylist_format->dbname, - mf_dbm_strerror()); + rc == MU_ERR_FAILURE ? + mu_dbm_strerror(db) : + mu_strerror(rc)); } else MF_DEBUG(MU_DEBUG_TRACE6, ("database opened in readonly mode: " @@ -594,23 +662,25 @@ do_greylist_traditional(eval_environ_t env, char *email, long interval) ("%s finished greylisting period", email)); rc = 0; } - mf_dbm_datum_free(&contents); + mu_dbm_datum_free(&contents); } else if (!readonly) { MF_DEBUG(MU_DEBUG_TRACE6, ("greylisting %s", email)); MF_VAR_REF(greylist_seconds_left, interval); - MF_DATUM_PTR(contents) = (void*)&now; - MF_DATUM_SIZE(contents) = sizeof now; - if (mf_dbm_insert(&db, key, contents, 1)) + contents.mu_dptr = (void*)&now; + contents.mu_dsize = sizeof now; + rc = mu_dbm_store(db, &key, &contents, 1); + if (rc) mu_error(_("Cannot insert datum `%-.*s' in greylist " "database %s: %s"), - MF_DATUM_SIZE(key), (char*)MF_DATUM_PTR(key), + key.mu_dsize, (char*)key.mu_dptr, greylist_format->dbname, - mf_dbm_strerror()); + rc == MU_ERR_FAILURE ? + mu_dbm_strerror(db) : mu_strerror(rc)); rc = 1; } else rc = 0; - mf_dbm_close(&db); + mu_dbm_destroy(&db); return rc; } @@ -638,32 +708,37 @@ static int do_greylist_ct(eval_environ_t env, char *email, long interval) { int rc; - MF_DBM_FILE db; - MF_DBM_DATUM key; - MF_DBM_DATUM contents; - int readonly; + mu_dbm_file_t db; + struct mu_dbm_datum key; + struct mu_dbm_datum contents; + int readonly = 0; time_t now; - rc = mf_dbm_open(greylist_format->dbname, &db, MU_STREAM_RDWR, 0600, - &readonly); + rc = _mf_dbm_open(&db, greylist_format->dbname, MU_STREAM_RDWR, 0600); + if (rc) { + rc = _mf_dbm_open(&db, greylist_format->dbname, + MU_STREAM_READ, 0); + readonly = 1; + } MF_ASSERT(rc == 0, mfe_dbfailure, _("mf_dbm_open(%s) failed: %s"), - greylist_format->dbname, mf_dbm_strerror()); + greylist_format->dbname, mu_strerror(rc)); memset(&key, 0, sizeof key); memset(&contents, 0, sizeof contents); - MF_DATUM_PTR(key) = email; - MF_DATUM_SIZE(key) = strlen(email)+1; + key.mu_dptr = email; + key.mu_dsize = strlen(email) + 1; time(&now); - if (mf_dbm_fetch(&db, key, &contents) == 0) { + rc = mu_dbm_fetch(db, &key, &contents); + if (rc == 0) { time_t timestamp; - MF_ASSERT(MF_DATUM_SIZE(contents) == sizeof timestamp, + MF_ASSERT(contents.mu_dsize == sizeof timestamp, mfe_dbfailure, _("greylist database %s has wrong data size"), greylist_format->dbname); - timestamp = *(time_t*) MF_DATUM_PTR(contents); + timestamp = *(time_t*) contents.mu_dptr; if (now < timestamp) { time_t diff = timestamp - now; @@ -681,16 +756,18 @@ do_greylist_ct(eval_environ_t env, char *email, long interval) MF_VAR_REF(greylist_seconds_left, interval); if (!readonly) { now += interval; - memcpy(MF_DATUM_PTR(contents), - &now, sizeof now); - if (mf_dbm_insert(&db, key, contents, 1)) + memcpy(contents.mu_dptr, &now, sizeof now); + rc = mu_dbm_store(db, &key, &contents, 1); + if (rc) mu_error(_("Cannot insert datum " "`%-.*s' in greylist " "database %s: %s"), - MF_DATUM_SIZE(key), - (char*)MF_DATUM_PTR(key), + key.mu_dsize, + (char*)key.mu_dptr, greylist_format->dbname, - mf_dbm_strerror()); + rc == MU_ERR_FAILURE ? + mu_dbm_strerror(db) : + mu_strerror(rc)); } else MF_DEBUG(MU_DEBUG_TRACE6, ("database opened in readonly mode: " @@ -701,24 +778,26 @@ do_greylist_ct(eval_environ_t env, char *email, long interval) ("%s finished greylisting period", email)); rc = 0; } - mf_dbm_datum_free(&contents); + mu_dbm_datum_free(&contents); } else if (!readonly) { MF_DEBUG(MU_DEBUG_TRACE6, ("greylisting %s", email)); MF_VAR_REF(greylist_seconds_left, interval); now += interval; - MF_DATUM_PTR(contents) = (void*)&now; - MF_DATUM_SIZE(contents) = sizeof now; - if (mf_dbm_insert(&db, key, contents, 1)) + contents.mu_dptr = (void*)&now; + contents.mu_dsize = sizeof now; + rc = mu_dbm_store(db, &key, &contents, 1); + if (rc) mu_error(_("Cannot insert datum `%-.*s' in greylist " "database %s: %s"), - MF_DATUM_SIZE(key), (char*)MF_DATUM_PTR(key), + key.mu_dsize, (char*)key.mu_dptr, greylist_format->dbname, - mf_dbm_strerror()); + rc == MU_ERR_FAILURE ? + mu_dbm_strerror(db) : mu_strerror(rc)); rc = 1; } else rc = 0; - mf_dbm_close(&db); + mu_dbm_destroy(&db); return rc; } @@ -728,42 +807,47 @@ static int is_greylisted_ct(eval_environ_t env, char *email) { int rc; - MF_DBM_FILE db; - MF_DBM_DATUM key; - MF_DBM_DATUM contents; - int readonly; + mu_dbm_file_t db; + struct mu_dbm_datum key; + struct mu_dbm_datum contents; + int readonly = 0; time_t now; - rc = mf_dbm_open(greylist_format->dbname, &db, MU_STREAM_RDWR, 0600, - &readonly); + rc = _mf_dbm_open(&db, greylist_format->dbname, MU_STREAM_RDWR, 0600); + if (rc) { + rc = _mf_dbm_open(&db, greylist_format->dbname, + MU_STREAM_READ, 0); + readonly = 1; + } MF_ASSERT(rc == 0, mfe_dbfailure, _("mf_dbm_open(%s) failed: %s"), - greylist_format->dbname, mf_dbm_strerror()); + greylist_format->dbname, mu_strerror(rc)); memset(&key, 0, sizeof key); memset(&contents, 0, sizeof contents); - MF_DATUM_PTR(key) = email; - MF_DATUM_SIZE(key) = strlen(email) + 1; + key.mu_dptr = email; + key.mu_dsize = strlen(email) + 1; time(&now); - if (mf_dbm_fetch(&db, key, &contents) == 0) { + rc = mu_dbm_fetch(db, &key, &contents); + if (rc == 0) { time_t timestamp; - MF_ASSERT(MF_DATUM_SIZE(contents) == sizeof timestamp, + MF_ASSERT(contents.mu_dsize == sizeof timestamp, mfe_dbfailure, _("greylist database %s has wrong data size"), greylist_format->dbname); - timestamp = *(time_t*) MF_DATUM_PTR(contents); + timestamp = *(time_t*) contents.mu_dptr; rc = timestamp > now; if (rc) MF_VAR_REF(greylist_seconds_left, timestamp - now); - mf_dbm_datum_free(&contents); + mu_dbm_datum_free(&contents); } else rc = 0; - mf_dbm_close(&db); + mu_dbm_destroy(&db); return rc; } |