aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgilles <gilles@poolp.org>2016-06-24 10:32:45 +0200
committergilles <gilles@poolp.org>2016-06-24 10:32:45 +0200
commitefeb263d0c0bed8a3ab626ac9fef0d434362c3fd (patch)
treebf03944d54c047aaf5a1db45cf353c16c76aed0e
parentswitch from filter_api_get_udata to filter_api_session (diff)
downloadOpenSMTPD-extras-efeb263d0c0bed8a3ab626ac9fef0d434362c3fd.tar.xz
OpenSMTPD-extras-efeb263d0c0bed8a3ab626ac9fef0d434362c3fd.zip
add transaction allocator/destructor interface
-rw-r--r--api/filter_api.c60
-rw-r--r--api/smtpd-api.h4
2 files changed, 61 insertions, 3 deletions
diff --git a/api/filter_api.c b/api/filter_api.c
index 2be9cae..9de5378 100644
--- a/api/filter_api.c
+++ b/api/filter_api.c
@@ -73,6 +73,7 @@ struct filter_session {
void *datahold_arg;
void *session;
+ void *transaction;
void *udata;
};
@@ -113,6 +114,9 @@ static struct filter_internals {
void *(*session_allocator)(uint64_t);
void (*session_destructor)(void *);
+
+ void *(*transaction_allocator)(uint64_t);
+ void (*transaction_destructor)(void *);
} fi;
static void filter_api_init(void);
@@ -261,20 +265,43 @@ filter_dispatch(struct mproc *p, struct imsg *imsg)
break;
case EVENT_DISCONNECT:
filter_dispatch_disconnect(id);
- s = tree_xget(&sessions, id);
- if (fi.session_destructor)
- fi.session_destructor(s->session);
+ if (fi.session_destructor) {
+ s = tree_xget(&sessions, id);
+ if (s->session)
+ fi.session_destructor(s->session);
+ }
s = tree_xpop(&sessions, id);
free(s);
break;
case EVENT_RESET:
filter_dispatch_reset(id);
+ if (fi.transaction_destructor) {
+ s = tree_xget(&sessions, id);
+ if (s->transaction) {
+ fi.transaction_destructor(s->transaction);
+ s->transaction = NULL;
+ }
+ }
break;
case EVENT_COMMIT:
filter_dispatch_commit(id);
+ if (fi.transaction_destructor) {
+ s = tree_xget(&sessions, id);
+ if (s->transaction) {
+ fi.transaction_destructor(s->transaction);
+ s->transaction = NULL;
+ }
+ }
break;
case EVENT_ROLLBACK:
filter_dispatch_rollback(id);
+ if (fi.transaction_destructor) {
+ s = tree_xget(&sessions, id);
+ if (s->transaction) {
+ fi.transaction_destructor(s->transaction);
+ s->transaction = NULL;
+ }
+ }
break;
default:
log_warnx("warn: filter-api:%s bad event %d", filter_name, type);
@@ -305,6 +332,12 @@ filter_dispatch(struct mproc *p, struct imsg *imsg)
case QUERY_MAIL:
m_get_mailaddr(&m, &maddr);
m_end(&m);
+
+ if (fi.transaction_allocator) {
+ s = tree_xget(&sessions, id);
+ s->transaction = fi.transaction_allocator(id);
+ }
+
filter_register_query(id, qid, type);
filter_dispatch_mail(id, &maddr);
break;
@@ -802,6 +835,27 @@ filter_api_session(uint64_t id)
}
void
+filter_api_transaction_allocator(void *(*f)(uint64_t))
+{
+ fi.transaction_allocator = f;
+}
+
+void
+filter_api_transaction_destructor(void (*f)(void *))
+{
+ fi.transaction_destructor = f;
+}
+
+void *
+filter_api_transaction(uint64_t id)
+{
+ struct filter_session *s;
+
+ s = tree_xget(&sessions, id);
+ return s->transaction;
+}
+
+void
filter_api_setugid(uid_t uid, gid_t gid)
{
filter_api_init();
diff --git a/api/smtpd-api.h b/api/smtpd-api.h
index 9bb7b37..696975f 100644
--- a/api/smtpd-api.h
+++ b/api/smtpd-api.h
@@ -383,6 +383,10 @@ void filter_api_session_allocator(void *(*)(uint64_t));
void filter_api_session_destructor(void (*)(void *));
void *filter_api_session(uint64_t);
+void filter_api_transaction_allocator(void *(*)(uint64_t));
+void filter_api_transaction_destructor(void (*)(void *));
+void *filter_api_transaction(uint64_t);
+
void filter_api_setugid(uid_t, gid_t);
void filter_api_set_chroot(const char *);
void filter_api_no_chroot(void);