+int greylist_initialize(const char *directory, const char *prefix)
+{
+ char path[PATH_MAX];
+
+ if (cfg.do_awl) {
+ snprintf(path, sizeof(path), "%s/%swhitelist.db", directory, prefix);
+ cfg.awl_db = tcbdbnew();
+ if (!tcbdbopen(cfg.awl_db, path, BDBOWRITER | BDBOCREAT)) {
+ tcbdbdel(cfg.awl_db);
+ cfg.awl_db = NULL;
+ }
+ return -1;
+ }
+
+ snprintf(path, sizeof(path), "%s/%sgreylist.db", directory, prefix);
+ cfg.obj_db = tcbdbnew();
+ if (!tcbdbopen(cfg.obj_db, path, BDBOWRITER | BDBOCREAT)) {
+ tcbdbdel(cfg.obj_db);
+ cfg.obj_db = NULL;
+ if (cfg.awl_db) {
+ tcbdbdel(cfg.awl_db);
+ cfg.awl_db = NULL;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+static void greylist_shutdown(void)
+{
+ if (cfg.awl_db) {
+ tcbdbsync(cfg.awl_db);
+ tcbdbdel(cfg.awl_db);
+ cfg.awl_db = NULL;
+ }
+ if (cfg.obj_db) {
+ tcbdbsync(cfg.obj_db);
+ tcbdbdel(cfg.obj_db);
+ cfg.obj_db = NULL;
+ }
+}
+module_exit(greylist_shutdown);
+