diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-11-10 00:21:13 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-11-10 00:52:54 +0200 |
commit | 4926ea635ee23341615c351db3e4949553ca4dfb (patch) | |
tree | a1a8c4aede69cf55b5e27fa1dc1630aeeda70329 /src | |
parent | 7e4d54bd39368b36e8451d52975052c00e745f7a (diff) | |
download | mailfromd-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.am | 3 | ||||
-rw-r--r-- | src/builtin/db.bi | 410 | ||||
-rw-r--r-- | src/calloutd.c | 2 | ||||
-rw-r--r-- | src/main.c | 52 | ||||
-rw-r--r-- | src/mfdbtool.c | 76 | ||||
-rw-r--r-- | src/savsrv.c | 1 | ||||
-rw-r--r-- | src/srvcfg.c | 19 |
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 | ||
46 | mailfromd_LDADD = \ | 46 | mailfromd_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 | ||
70 | calloutd_LDADD = \ | 69 | calloutd_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 | ||
79 | mfdbtool_SOURCES = \ | 77 | mfdbtool_SOURCES = \ |
80 | mfdbtool.c | 78 | mfdbtool.c |
81 | 79 | ||
82 | mfdbtool_LDADD = \ | 80 | mfdbtool_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 | ||
89 | EXTRA_DIST = \ | 86 | EXTRA_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 | ||
21 | struct db_prop { /* Database properties */ | 20 | struct 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 | |||
146 | int | ||
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 | ||
151 | MF_DSEXP_SUPPRESS([<dbmap_lookup>],[< | 179 | MF_DSEXP_SUPPRESS([<dbmap_lookup>],[< |
152 | static int | 180 | static int |
153 | dbmap_lookup(eval_environ_t env, char *dbname, const char *keystr, | 181 | dbmap_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 | ||
202 | MF_DSEXP | 237 | MF_DSEXP |
203 | MF_DEFUN(dbmap, NUMBER, STRING dbname, STRING key, OPTIONAL, NUMBER null) |