diff options
author | gilles <gilles@poolp.org> | 2016-06-24 10:32:45 +0200 |
---|---|---|
committer | gilles <gilles@poolp.org> | 2016-06-24 10:32:45 +0200 |
commit | efeb263d0c0bed8a3ab626ac9fef0d434362c3fd (patch) | |
tree | bf03944d54c047aaf5a1db45cf353c16c76aed0e | |
parent | switch from filter_api_get_udata to filter_api_session (diff) | |
download | OpenSMTPD-extras-efeb263d0c0bed8a3ab626ac9fef0d434362c3fd.tar.xz OpenSMTPD-extras-efeb263d0c0bed8a3ab626ac9fef0d434362c3fd.zip |
add transaction allocator/destructor interface
-rw-r--r-- | api/filter_api.c | 60 | ||||
-rw-r--r-- | api/smtpd-api.h | 4 |
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); |