From bc714f8001edbb26ebf07411cf92e9ba2f756b35 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Mon, 26 Oct 2020 21:31:16 +0000 Subject: Refactor textmessage/textclient with channel creation around ancil_* --- src/libunixonacid/textmessage_recv_channel.c | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/libunixonacid/textmessage_recv_channel.c (limited to 'src/libunixonacid/textmessage_recv_channel.c') diff --git a/src/libunixonacid/textmessage_recv_channel.c b/src/libunixonacid/textmessage_recv_channel.c new file mode 100644 index 0000000..69adbcf --- /dev/null +++ b/src/libunixonacid/textmessage_recv_channel.c @@ -0,0 +1,47 @@ +/* ISC license. */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static int getfd (void *p) +{ + return ((int *)p)[0] ; +} + +static ssize_t get (void *p) +{ + int *fd = p ; + int r = ancil_recv_fd(fd[0], '|') ; + if (r < 0) return error_isagain(errno) ? (errno = 0, 0) : r ; + fd[1] = r ; + return 1 ; +} + +int textmessage_recv_channel (int sock, textmessage_receiver_t *asyncin, char *asyncbuf, size_t asyncbufsize, char const *after, size_t afterlen, tain_t const *deadline, tain_t *stamp) +{ + struct iovec v ; + int fd[2] = { sock, -1 } ; + ssize_t r = timed_get(fd, &getfd, &get, deadline, stamp) ; + if (!r) errno = EPIPE ; + if (r <= 0) return 0 ; + textmessage_receiver_init(asyncin, fd[1], asyncbuf, asyncbufsize, TEXTMESSAGE_MAXLEN) ; + if (sanitize_read(textmessage_timed_receive(asyncin, &v, deadline, stamp)) <= 0) goto serr ; + if (v.iov_len != afterlen || memcmp(v.iov_base, after, afterlen)) goto berr ; + return 1 ; + + berr: + errno = EPROTO ; + serr: + textmessage_receiver_free(asyncin) ; + fd_close(fd[1]) ; + return 0 ; +} -- cgit v1.3.1