From c9c7e241a7b68f67e0cc8a7d3874510dced532d6 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Mon, 18 Jan 2016 23:56:21 +0000 Subject: Add support for advanced closing callbacks to unixmessage_sender_flush. (Typically, this will be used for refcounting when broadcasting copies of the same fd.) --- src/libunixonacid/unixmessage_sender_closecb.c | 10 ++++++++++ src/libunixonacid/unixmessage_sender_flush.c | 4 ++-- src/libunixonacid/unixmessage_sender_init.c | 9 +-------- src/libunixonacid/unixmessage_sender_init_withclosecb.c | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 src/libunixonacid/unixmessage_sender_closecb.c create mode 100644 src/libunixonacid/unixmessage_sender_init_withclosecb.c (limited to 'src/libunixonacid') diff --git a/src/libunixonacid/unixmessage_sender_closecb.c b/src/libunixonacid/unixmessage_sender_closecb.c new file mode 100644 index 0000000..1234ff5 --- /dev/null +++ b/src/libunixonacid/unixmessage_sender_closecb.c @@ -0,0 +1,10 @@ +/* ISC license. */ + +#include +#include + +void unixmessage_sender_closecb (int fd, void *p) +{ + fd_close(fd) ; + (void)p ; +} diff --git a/src/libunixonacid/unixmessage_sender_flush.c b/src/libunixonacid/unixmessage_sender_flush.c index 75412fb..6559083 100644 --- a/src/libunixonacid/unixmessage_sender_flush.c +++ b/src/libunixonacid/unixmessage_sender_flush.c @@ -97,13 +97,13 @@ int unixmessage_sender_flush (unixmessage_sender_t *b) while (r < 0 && errno == EINTR) ; if (r <= 0) return 0 ; #ifndef SKALIBS_HASANCILAUTOCLOSE - if (nfds) + if (nfds && b->closecb) { register unsigned int i = 0 ; for (; i < nfds ; i++) { register int fd = genalloc_s(int, &b->fds)[offsets[b->head].right + i] ; - if (fd < 0) fd_close(-(fd+1)) ; + if (fd < 0) (*b->closecb)(-(fd+1), b->closecbdata) ; } } #endif diff --git a/src/libunixonacid/unixmessage_sender_init.c b/src/libunixonacid/unixmessage_sender_init.c index d986f29..71a8b3b 100644 --- a/src/libunixonacid/unixmessage_sender_init.c +++ b/src/libunixonacid/unixmessage_sender_init.c @@ -1,15 +1,8 @@ /* ISC license. */ -#include -#include #include void unixmessage_sender_init (unixmessage_sender_t *b, int fd) { - b->fd = fd ; - b->data = stralloc_zero ; - b->fds = genalloc_zero ; - b->offsets = genalloc_zero ; - b->head = 0 ; - b->shorty = 0 ; + unixmessage_sender_init_withclosecb(b, fd, &unixmessage_sender_closecb, 0) ; } diff --git a/src/libunixonacid/unixmessage_sender_init_withclosecb.c b/src/libunixonacid/unixmessage_sender_init_withclosecb.c new file mode 100644 index 0000000..32743ec --- /dev/null +++ b/src/libunixonacid/unixmessage_sender_init_withclosecb.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include + +void unixmessage_sender_init_withclosecb (unixmessage_sender_t *b, int fd, unixmessage_sender_closecb_func_t_ref f, void *p) +{ + b->fd = fd ; + b->data = stralloc_zero ; + b->fds = genalloc_zero ; + b->offsets = genalloc_zero ; + b->head = 0 ; + b->shorty = 0 ; + b->closecb = f ; + b->closecbdata = 0 ; +} -- cgit v1.2.3