aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-11-10 00:21:13 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2011-11-10 00:52:54 +0200
commit4926ea635ee23341615c351db3e4949553ca4dfb (patch)
treea1a8c4aede69cf55b5e27fa1dc1630aeeda70329 /src
parent7e4d54bd39368b36e8451d52975052c00e745f7a (diff)
downloadmailfromd-4926ea635ee23341615c351db3e4949553ca4dfb.tar.gz
mailfromd-4926ea635ee23341615c351db3e4949553ca4dfb.tar.bz2
Switch to libmu_dbm for DBM support.
* configure.ac (DEFAULT_DB_TYPE): New variable. Use mu info to determine which DBM is supported. * lib/Makefile.am (noinst_LIBRARIES): Remove libdbm.a * lib/mf-dbm.c: remove. * lib/mf-dbm.h: remove. * lib/cache.c: Use libmu_dbm functions. * lib/db.c: Likewise. * lib/dbcfg.c: Likewise. * lib/greylist.c: Likewise. * lib/rate.c: Likewise. * lib/tbf_rate.c: Likewise. * src/builtin/db.bi: Likewise. * src/savsrv.c: Likewise. * src/srvcfg.c (srv_cfg_param) <database-type>: New statement. * lib/libmf.h (config_cb_ignore): New proto. * lib/mfdb.h (db_item_printer_t): Change signature. * lib/utils.c (config_cb_ignore): New function. * po/POTFILES.in: Update. * src/Makefile.am (mailfromd_LDADD) (calloutd_LDADD): Remove libdbm.a. * src/calloutd.c: Update. * src/main.c (mf_cfg_param): lock-retry-count and lock-retry-timeout are no-op now. * src/mfdbtool.c: Likewise.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am3
-rw-r--r--src/builtin/db.bi410
-rw-r--r--src/calloutd.c2
-rw-r--r--src/main.c52
-rw-r--r--src/mfdbtool.c76
-rw-r--r--src/savsrv.c1
-rw-r--r--src/srvcfg.c19
7 files changed, 328 insertions, 235 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 4400f8d4..af404ca5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -45,13 +45,12 @@ mailfromd_SOURCES = \
45 45
46mailfromd_LDADD = \ 46mailfromd_LDADD = \
47 ./libcallout.a\ 47 ./libcallout.a\
48 builtin/libbuiltin.a\ 48 builtin/libbuiltin.a\
49 ../lib/libmfdb.a\ 49 ../lib/libmfdb.a\
50 ../lib/libmf.a\ 50 ../lib/libmf.a\
51 ../lib/libdbm.a\
52 ../gnu/libgnu.a\ 51 ../gnu/libgnu.a\
53 $(MAILUTILS_LIBS)\ 52 $(MAILUTILS_LIBS)\
54 $(MILTER)\ 53 $(MILTER)\
55 $(GEOIP_LIBS)\ 54 $(GEOIP_LIBS)\
56 $(DSPAM_LIBS) 55 $(DSPAM_LIBS)
57 56
@@ -68,24 +67,22 @@ calloutd_SOURCES = \
68 calloutd.c 67 calloutd.c
69 68
70calloutd_LDADD = \ 69calloutd_LDADD = \
71 ./libcallout.a\ 70 ./libcallout.a\
72 ../lib/libmfdb.a\ 71 ../lib/libmfdb.a\
73 ../lib/libmf.a\ 72 ../lib/libmf.a\
74 ../lib/libdbm.a\
75 ../gnu/libgnu.a\ 73 ../gnu/libgnu.a\
76 $(MAILUTILS_LIBS)\ 74 $(MAILUTILS_LIBS)\
77 $(MILTER) 75 $(MILTER)
78 76
79mfdbtool_SOURCES = \ 77mfdbtool_SOURCES = \
80 mfdbtool.c 78 mfdbtool.c
81 79
82mfdbtool_LDADD = \ 80mfdbtool_LDADD = \
83 ../lib/libmfdb.a\ 81 ../lib/libmfdb.a\
84 ../lib/libmf.a\ 82 ../lib/libmf.a\
85 ../lib/libdbm.a\
86 ../gnu/libgnu.a\ 83 ../gnu/libgnu.a\
87 $(MAILUTILS_LIBS) 84 $(MAILUTILS_LIBS)
88 85
89EXTRA_DIST = \ 86EXTRA_DIST = \
90 dbgmod.awk\ 87 dbgmod.awk\
91 drv.awk\ 88 drv.awk\
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
@@ -13,13 +13,12 @@
13 13
14 You should have received a copy of the GNU General Public License 14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
16 16
17#define DEFAULT_DB_MODE 0640 17#define DEFAULT_DB_MODE 0640
18#include <fnmatch.h> 18#include <fnmatch.h>
19#include "mf-dbm.h"
20 19
21struct db_prop { /* Database properties */ 20struct db_prop { /* Database properties */
22 char *pat; /* Database name pattern */ 21 char *pat; /* Database name pattern */
23 mode_t mode; /* File mode */ 22 mode_t mode; /* File mode */
24 int null; /* Null byte */ 23 int null; /* Null byte */
25}; 24};
@@ -140,64 +139,100 @@ db_prop_lookup(const char *name)
140 found = p; 139 found = p;
141 } 140 }
142 mu_iterator_destroy(&itr); 141 mu_iterator_destroy(&itr);
143 } 142 }
144 return found; 143 return found;
145} 144}
145
146int
147_mf_dbm_open(mu_dbm_file_t *pdb, char *dbname, int access, int mode)
148{
149 mu_dbm_file_t db;
150 int rc;
151 int sflg = MU_FILE_SAFETY_LINKED_WRDIR |
152 MU_FILE_SAFETY_DIR_IWOTH;
153
154 rc = mu_dbm_create(dbname, &db);
155 if (rc)
156 return rc;
157
158 mu_dbm_safety_set_flags(db,
159 sflg | mf_file_mode_to_safety_criteria(mode));
160 rc = mu_dbm_safety_check(db);
161 if (rc && rc != ENOENT) {
162 mu_error(_("%s fails safety check: %s"),
163 dbname, mu_strerror(rc));
164 mu_dbm_destroy(&db);
165 return rc;
166 }
167 /* FIXME: Safety checking */
168 rc = mu_dbm_open(db, access, mode);
169 if (rc)
170 return rc;
171 *pdb = db;
172 return rc;
173}
146 174
147 175
148#define LOOKUP_NULL_BYTE 0x1 176#define LOOKUP_NULL_BYTE 0x1
149#define LOOKUP_TEST_ONLY 0x2 177#define LOOKUP_TEST_ONLY 0x2
150 178
151MF_DSEXP_SUPPRESS([<dbmap_lookup>],[< 179MF_DSEXP_SUPPRESS([<dbmap_lookup>],[<
152static int 180static int
153dbmap_lookup(eval_environ_t env, char *dbname, const char *keystr, 181dbmap_lookup(eval_environ_t env, char *dbname, const char *keystr,
154 const char *defval, int flags) 182 const char *defval, int flags)
155{ 183{
156 int rc; 184 int rc;
157 MF_DBM_FILE db; 185 mu_dbm_file_t db;
158 MF_DBM_DATUM key; 186 struct mu_dbm_datum key;
159 MF_DBM_DATUM contents; 187 struct mu_dbm_datum contents;
160 188
161 if (!defval) 189 if (!defval)
162 defval = ""; 190 defval = "";
163 if (mf_dbm_open(dbname, &db, MU_STREAM_READ, 0, NULL)) 191 rc = _mf_dbm_open(&db, dbname, MU_STREAM_READ, 0);
192 if (rc)
164 MF_THROW(mfe_dbfailure, 193 MF_THROW(mfe_dbfailure,
165 _("mf_dbm_open(%s) failed: %s"), 194 _("mf_dbm_open(%s) failed: %s"),
166 dbname, 195 dbname,
167 mf_dbm_strerror()); 196 mu_strerror(rc));
168 197
169 memset(&key, 0, sizeof key); 198 memset(&key, 0, sizeof key);
170 memset(&contents, 0, sizeof contents); 199 memset(&contents, 0, sizeof contents);
171 MF_DATUM_PTR(key) = (void*) keystr; 200 key.mu_dptr = (void*) keystr;
172 MF_DATUM_SIZE(key) = strlen(keystr); 201 key.mu_dsize = strlen(keystr);
173 if (flags & LOOKUP_NULL_BYTE) 202 if (flags & LOOKUP_NULL_BYTE)
174 MF_DATUM_SIZE(key)++; 203 key.mu_dsize++;
175 rc = mf_dbm_fetch(&db, key, &contents) == 0; 204 rc = mu_dbm_fetch(db, &key, &contents);
205 if (rc && rc != MU_ERR_NOENT) {
206 mu_dbm_destroy(&db);
207 MF_THROW(mfe_dbfailure,
208 _("cannot fetch data: %s"),
209 mu_dbm_strerror(db));
210 }
176 MF_DEBUG(MU_DEBUG_TRACE5, 211 MF_DEBUG(MU_DEBUG_TRACE5,
177 ("Looking up %s: %s", keystr, rc ? "true" : "false")); 212 ("Looking up %s: %s", keystr, rc ? "false" : "true"));
178 if (flags & LOOKUP_TEST_ONLY) 213 if (flags & LOOKUP_TEST_ONLY)
179 push(env, (STKVAL)rc); 214 push(env, (STKVAL)rc);
180 else { 215 else {
181 if (!rc) { 216 if (!rc) {
182 if (defval) 217 if (defval)
183 pushs(env, (STKVAL)defval); 218 pushs(env, (STKVAL)defval);
184 else 219 else
185 push(env, 0); 220 push(env, 0);
186 } else if (((char*)MF_DATUM_PTR(contents))[MF_DATUM_SIZE(contents)-1]) { 221 } else if (((char*)contents.mu_dptr)[contents.mu_dsize-1]) {
187 size_t off; 222 size_t off;
188 size_t len = MF_DATUM_SIZE(contents); 223 size_t len = contents.mu_dsize;
189 char *s = MF_ALLOC_HEAP(off, len + 1); 224 char *s = MF_ALLOC_HEAP(off, len + 1);
190 memcpy(s, MF_DATUM_PTR(contents), len); 225 memcpy(s, contents.mu_dptr, len);
191 s[len] = 0; 226 s[len] = 0;
192 push(env, (STKVAL) off); 227 push(env, (STKVAL) off);
193 } else 228 } else
194 pushs(env, MF_DATUM_PTR(contents)); 229 pushs(env, contents.mu_dptr);
195 } 230 }
196 mf_dbm_datum_free(&contents); 231 mu_dbm_datum_free(&contents);
197 mf_dbm_close(&db); 232 mu_dbm_destroy(&db);
198 return rc; 233 return rc;
199} 234}
200>]) 235>])
201 236
202MF_DSEXP 237MF_DSEXP
203MF_DEFUN(dbmap, NUMBER, STRING dbname, STRING key, OPTIONAL, NUMBER null)