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