diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-06 17:51:14 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2014-12-06 17:51:14 +0000 |
commit | 6319ac5225aec738f134f338f68109822581bff1 (patch) | |
tree | 17e827cff6841eaae0de6b0b733ee2e8958cc9e0 | |
parent | 5d6810d9eb833f923f1543fbb369823f7cd289df (diff) | |
download | skalibs-6319ac5225aec738f134f338f68109822581bff1.tar.xz |
Rewrite unixmessage_receiver without buffer, only cbuffer
-rw-r--r-- | package/deps.mak | 7 | ||||
-rw-r--r-- | src/include/skalibs/buffer.h | 13 | ||||
-rw-r--r-- | src/include/skalibs/unixmessage.h | 27 | ||||
-rw-r--r-- | src/libstddjb/buffer_fill.c | 2 | ||||
-rw-r--r-- | src/libstddjb/buffer_flush.c | 4 | ||||
-rw-r--r-- | src/libstddjb/buffer_flush1read.c | 4 | ||||
-rw-r--r-- | src/libstddjb/buffer_init.c | 4 | ||||
-rw-r--r-- | src/libstddjb/buffer_read.c | 5 | ||||
-rw-r--r-- | src/libstddjb/buffer_write.c | 5 | ||||
-rw-r--r-- | src/libunixonacid/skaclient_server_bidi_ack.c | 2 | ||||
-rw-r--r-- | src/libunixonacid/skaclient_start_cb.c | 2 | ||||
-rw-r--r-- | src/libunixonacid/unixmessage_read.c | 60 | ||||
-rw-r--r-- | src/libunixonacid/unixmessage_receive.c | 106 | ||||
-rw-r--r-- | src/libunixonacid/unixmessage_receiver_0.c | 2 | ||||
-rw-r--r-- | src/libunixonacid/unixmessage_receiver_free.c | 7 | ||||
-rw-r--r-- | src/libunixonacid/unixmessage_receiver_init.c | 12 |
16 files changed, 132 insertions, 130 deletions
diff --git a/package/deps.mak b/package/deps.mak index 71e4764..7e892ca 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -226,7 +226,7 @@ src/libstddjb/buffer_getlen.o src/libstddjb/buffer_getlen.lo: src/libstddjb/buff src/libstddjb/buffer_getv.o src/libstddjb/buffer_getv.lo: src/libstddjb/buffer_getv.c src/include/skalibs/buffer.h src/include/skalibs/diuint.h src/include/skalibs/siovec.h src/libstddjb/buffer_getvall.o src/libstddjb/buffer_getvall.lo: src/libstddjb/buffer_getvall.c src/include/skalibs/buffer.h src/include/skalibs/diuint.h src/include/skalibs/siovec.h src/libstddjb/buffer_getvallnf.o src/libstddjb/buffer_getvallnf.lo: src/libstddjb/buffer_getvallnf.c src/include/skalibs/buffer.h src/include/skalibs/siovec.h -src/libstddjb/buffer_init.o src/libstddjb/buffer_init.lo: src/libstddjb/buffer_init.c src/include/skalibs/buffer.h +src/libstddjb/buffer_init.o src/libstddjb/buffer_init.lo: src/libstddjb/buffer_init.c src/include/skalibs/buffer.h src/include/skalibs/cbuffer.h src/libstddjb/buffer_put.o src/libstddjb/buffer_put.lo: src/libstddjb/buffer_put.c src/include/skalibs/buffer.h src/libstddjb/buffer_putall.o src/libstddjb/buffer_putall.lo: src/libstddjb/buffer_putall.c src/include/skalibs/buffer.h src/libstddjb/buffer_putallnf.o src/libstddjb/buffer_putallnf.lo: src/libstddjb/buffer_putallnf.c src/include/skalibs/buffer.h @@ -742,11 +742,10 @@ src/libunixonacid/unixmessage_bits_closeall.o src/libunixonacid/unixmessage_bits src/libunixonacid/unixmessage_bits_closenone.o src/libunixonacid/unixmessage_bits_closenone.lo: src/libunixonacid/unixmessage_bits_closenone.c src/include/skalibs/bitarray.h src/include/skalibs/unixmessage.h src/libunixonacid/unixmessage_handle.o src/libunixonacid/unixmessage_handle.lo: src/libunixonacid/unixmessage_handle.c src/include/skalibs/unixmessage.h src/libunixonacid/unixmessage_put.o src/libunixonacid/unixmessage_put.lo: src/libunixonacid/unixmessage_put.c src/include/skalibs/bitarray.h src/include/skalibs/bytestr.h src/include/skalibs/diuint.h src/include/skalibs/genalloc.h src/include/skalibs/siovec.h src/include/skalibs/stralloc.h src/include/skalibs/sysdeps.h src/include/skalibs/unixmessage.h -src/libunixonacid/unixmessage_read.o src/libunixonacid/unixmessage_read.lo: src/libunixonacid/unixmessage_read.c src/include/skalibs/buffer.h src/include/skalibs/cbuffer.h src/include/skalibs/djbunix.h src/include/skalibs/error.h src/include/skalibs/nonposix.h src/include/skalibs/siovec.h src/include/skalibs/sysdeps.h src/include/skalibs/unixmessage.h -src/libunixonacid/unixmessage_receive.o src/libunixonacid/unixmessage_receive.lo: src/libunixonacid/unixmessage_receive.c src/include/skalibs/allreadwrite.h src/include/skalibs/buffer.h src/include/skalibs/cbuffer.h src/include/skalibs/error.h src/include/skalibs/stralloc.h src/include/skalibs/uint.h src/include/skalibs/unixmessage.h +src/libunixonacid/unixmessage_receive.o src/libunixonacid/unixmessage_receive.lo: src/libunixonacid/unixmessage_receive.c src/include/skalibs/allreadwrite.h src/include/skalibs/cbuffer.h src/include/skalibs/diuint.h src/include/skalibs/djbunix.h src/include/skalibs/error.h src/include/skalibs/nonposix.h src/include/skalibs/siovec.h src/include/skalibs/stralloc.h src/include/skalibs/sysdeps.h src/include/skalibs/uint.h src/include/skalibs/unixmessage.h src/libunixonacid/unixmessage_receiver_0.o src/libunixonacid/unixmessage_receiver_0.lo: src/libunixonacid/unixmessage_receiver_0.c src/include/skalibs/unixmessage.h src/libunixonacid/unixmessage_receiver_free.o src/libunixonacid/unixmessage_receiver_free.lo: src/libunixonacid/unixmessage_receiver_free.c src/include/skalibs/stralloc.h src/include/skalibs/unixmessage.h -src/libunixonacid/unixmessage_receiver_init.o src/libunixonacid/unixmessage_receiver_init.lo: src/libunixonacid/unixmessage_receiver_init.c src/include/skalibs/buffer.h src/include/skalibs/cbuffer.h src/include/skalibs/stralloc.h src/include/skalibs/unixmessage.h +src/libunixonacid/unixmessage_receiver_init.o src/libunixonacid/unixmessage_receiver_init.lo: src/libunixonacid/unixmessage_receiver_init.c src/include/skalibs/cbuffer.h src/include/skalibs/stralloc.h src/include/skalibs/unixmessage.h src/libunixonacid/unixmessage_sender_1.o src/libunixonacid/unixmessage_sender_1.lo: src/libunixonacid/unixmessage_sender_1.c src/include/skalibs/unixmessage.h src/libunixonacid/unixmessage_sender_flush.o src/libunixonacid/unixmessage_sender_flush.lo: src/libunixonacid/unixmessage_sender_flush.c src/include/skalibs/diuint.h src/include/skalibs/djbunix.h src/include/skalibs/genalloc.h src/include/skalibs/nonposix.h src/include/skalibs/stralloc.h src/include/skalibs/sysdeps.h src/include/skalibs/uint.h src/include/skalibs/unixmessage.h src/libunixonacid/unixmessage_sender_free.o src/libunixonacid/unixmessage_sender_free.lo: src/libunixonacid/unixmessage_sender_free.c src/include/skalibs/diuint.h src/include/skalibs/genalloc.h src/include/skalibs/stralloc.h src/include/skalibs/sysdeps.h src/include/skalibs/unixmessage.h diff --git a/src/include/skalibs/buffer.h b/src/include/skalibs/buffer.h index 3064c51..9060d08 100644 --- a/src/include/skalibs/buffer.h +++ b/src/include/skalibs/buffer.h @@ -9,7 +9,7 @@ #include <skalibs/diuint.h> #include <skalibs/siovec.h> -typedef int buffer_io_func_t (int, siovec_t const *, unsigned int, void *) ; +typedef int buffer_io_func_t (int, siovec_t const *, unsigned int) ; typedef buffer_io_func_t *buffer_io_func_t_ref ; typedef struct buffer_s buffer, buffer_t, *buffer_ref, *buffer_t_ref ; @@ -18,14 +18,13 @@ struct buffer_s buffer_io_func_t *op ; int fd ; cbuffer_t c ; - void *aux ; } ; -#define BUFFER_ZERO { .op = 0, .fd = -1, .c = CBUFFER_ZERO, .aux = 0 } +#define BUFFER_ZERO { .op = 0, .fd = -1, .c = CBUFFER_ZERO } /* Circular buffers need to be 1 char bigger than the storage space, - so that the head == tail case is nonambiguous (empty). + so that the head == tail case is nonambiguous (empty, not full). */ #define BUFFER_INSIZE 8193 @@ -34,10 +33,8 @@ struct buffer_s #define BUFFER_INSIZE_SMALL 513 #define BUFFER_OUTSIZE_SMALL 513 -#define BUFFER_INIT_AUX(f, d, buf, len, data) { .op = (f), .fd = (d), .c = CBUFFER_INIT(buf, len), .aux = (data) } -#define BUFFER_INIT(f, d, buf, len) BUFFER_INIT_AUX(f, d, buf, (len), 0) -extern int buffer_init_aux (buffer *, buffer_io_func_t *, int, char *, unsigned int, void *) ; -#define buffer_init(b, f, d, buf, len) buffer_init_aux(b, f, d, buf, len, 0) +#define BUFFER_INIT(f, d, buf, len) { .op = (f), .fd = (d), .c = CBUFFER_INIT(buf, len) } +extern int buffer_init (buffer *, buffer_io_func_t *, int, char *, unsigned int) ; /* Writing */ diff --git a/src/include/skalibs/unixmessage.h b/src/include/skalibs/unixmessage.h index d603a86..28e084c 100644 --- a/src/include/skalibs/unixmessage.h +++ b/src/include/skalibs/unixmessage.h @@ -6,6 +6,7 @@ #include <skalibs/buffer.h> #include <skalibs/cbuffer.h> #include <skalibs/gccattributes.h> +#include <skalibs/stralloc.h> #include <skalibs/genalloc.h> #include <skalibs/siovec.h> #include <skalibs/stralloc.h> @@ -81,36 +82,34 @@ extern int unixmessage_sender_timed_flush (unixmessage_sender_t *, tain_t const typedef struct unixmessage_receiver_s unixmessage_receiver_t, *unixmessage_receiver_t_ref ; struct unixmessage_receiver_s { - buffer mainb ; + int fd ; + cbuffer_t mainb ; cbuffer_t auxb ; unsigned int mainlen ; unsigned int auxlen ; - stralloc data ; - int fds[UNIXMESSAGE_MAXFDS] ; - unsigned int auxw ; + stralloc maindata ; + stralloc auxdata ; } ; -#define UNIXMESSAGE_RECEIVER_ZERO { .mainb = BUFFER_ZERO, .auxb = CBUFFER_ZERO, .mainlen = 0, .auxlen = 0, .data = STRALLOC_ZERO, .fds = { -1 }, .auxw = 0 } -#define UNIXMESSAGE_RECEIVER_INIT(var, fd, s, n, auxs, auxn) \ +#define UNIXMESSAGE_RECEIVER_ZERO { .fd = -1, .mainb = CBUFFER_ZERO, .auxb = CBUFFER_ZERO, .mainlen = 0, .auxlen = 0, .maindata = STRALLOC_ZERO, .auxdata = STRALLOC_ZERO } +#define UNIXMESSAGE_RECEIVER_INIT(d, mains, mainn, auxs, auxn) \ { \ - .mainb = BUFFER_INIT_AUX(&unixmessage_read, fd, s, n, &(var).auxb), \ + .fd = d, \ + .mainb = CBUFFER_INIT(mains, mainn), \ .auxb = CBUFFER_INIT(auxs, auxn), \ .mainlen = 0, \ .auxlen = 0, \ - .data = STRALLOC_ZERO, \ - .auxw = 0 \ + .maindata = STRALLOC_ZERO, \ + .auxdata = STRALLOC_ZERO \ } -#define UNIXMESSAGE_RECEIVER_DECLARE_AND_INIT(var, fd, s, n, auxs, auxn) unixmessage_receiver_t var = UNIXMESSAGE_RECEIVER_INIT(var, fd, s, n, auxs, auxn) extern int unixmessage_receiver_init (unixmessage_receiver_t *, int, char *, unsigned int, char *, unsigned int) ; extern void unixmessage_receiver_free (unixmessage_receiver_t *) ; -#define unixmessage_receiver_fd(b) buffer_fd(&(b)->mainb) -#define unixmessage_receiver_isempty(b) (buffer_isempty(&(b)->mainb) && cbuffer_isempty(&(b)->auxb)) +#define unixmessage_receiver_fd(b) ((b)->fd) +#define unixmessage_receiver_isempty(b) (cbuffer_isempty(&(b)->mainb) && cbuffer_isempty(&(b)->auxb)) extern int unixmessage_receive (unixmessage_receiver_t *, unixmessage_t *) ; extern int unixmessage_timed_receive (unixmessage_receiver_t *, unixmessage_t *, tain_t const *, tain_t *) ; #define unixmessage_timed_receive_g(receiver, msg, deadline) unixmessage_timed_receive(receiver, msg, (deadline), &STAMP) -extern buffer_io_func_t unixmessage_read ; - typedef int unixmessage_handler_func_t (unixmessage_t const *, void *) ; typedef unixmessage_handler_func_t *unixmessage_handler_func_t_ref ; diff --git a/src/libstddjb/buffer_fill.c b/src/libstddjb/buffer_fill.c index c158abe..07a916b 100644 --- a/src/libstddjb/buffer_fill.c +++ b/src/libstddjb/buffer_fill.c @@ -10,7 +10,7 @@ int buffer_fill (buffer *b) register int r ; if (buffer_isfull(b)) return (errno = ENOBUFS, -1) ; buffer_wpeek(b, v) ; - r = (*b->op)(b->fd, v, 2, b->aux) ; + r = (*b->op)(b->fd, v, 2) ; if (r <= 0) return r ; cbuffer_WSEEK(&b->c, r) ; return r ; diff --git a/src/libstddjb/buffer_flush.c b/src/libstddjb/buffer_flush.c index ca6ca6b..46512fc 100644 --- a/src/libstddjb/buffer_flush.c +++ b/src/libstddjb/buffer_flush.c @@ -1,8 +1,8 @@ /* ISC license. */ -#include <skalibs/buffer.h> #include <skalibs/cbuffer.h> #include <skalibs/siovec.h> +#include <skalibs/buffer.h> int buffer_flush (buffer *b) { @@ -12,7 +12,7 @@ int buffer_flush (buffer *b) register int r ; buffer_rpeek(b, v) ; if (!v[0].len && !v[1].len) break ; - r = (*b->op)(b->fd, v, 2, b->aux) ; + r = (*b->op)(b->fd, v, 2) ; if (r <= 0) return 0 ; cbuffer_RSEEK(&b->c, r) ; } diff --git a/src/libstddjb/buffer_flush1read.c b/src/libstddjb/buffer_flush1read.c index 9dcdf81..1a771ea 100644 --- a/src/libstddjb/buffer_flush1read.c +++ b/src/libstddjb/buffer_flush1read.c @@ -3,8 +3,8 @@ #include <skalibs/buffer.h> #include <skalibs/siovec.h> -int buffer_flush1read (int fd, siovec_t const *v, unsigned int n, void *aux) +int buffer_flush1read (int fd, siovec_t const *v, unsigned int n) { if (!buffer_flush(buffer_1)) return -1 ; - return buffer_read(fd, v, n, aux) ; + return buffer_read(fd, v, n) ; } diff --git a/src/libstddjb/buffer_init.c b/src/libstddjb/buffer_init.c index 09d4910..2831fe1 100644 --- a/src/libstddjb/buffer_init.c +++ b/src/libstddjb/buffer_init.c @@ -1,13 +1,13 @@ /* ISC license. */ #include <errno.h> +#include <skalibs/cbuffer.h> #include <skalibs/buffer.h> -int buffer_init_aux (buffer *b, buffer_io_func_t *op, int fd, char *s, unsigned int len, void *aux) +int buffer_init (buffer *b, buffer_io_func_t *op, int fd, char *s, unsigned int len) { if (!cbuffer_init(&b->c, s, len)) return 0 ; b->fd = fd ; b->op = op ; - b->aux = aux ; return 1 ; } diff --git a/src/libstddjb/buffer_read.c b/src/libstddjb/buffer_read.c index 150bc15..88003b4 100644 --- a/src/libstddjb/buffer_read.c +++ b/src/libstddjb/buffer_read.c @@ -3,13 +3,12 @@ #include <sys/types.h> #include <sys/uio.h> #include <skalibs/allreadwrite.h> -#include <skalibs/buffer.h> #include <skalibs/siovec.h> +#include <skalibs/buffer.h> -int buffer_read (int fd, siovec_t const *v, unsigned int n, void *aux) +int buffer_read (int fd, siovec_t const *v, unsigned int n) { struct iovec iov[n] ; iovec_from_siovec(iov, v, n) ; - (void)aux ; return fd_readv(fd, iov, n) ; } diff --git a/src/libstddjb/buffer_write.c b/src/libstddjb/buffer_write.c index 40ffd46..e669f60 100644 --- a/src/libstddjb/buffer_write.c +++ b/src/libstddjb/buffer_write.c @@ -3,13 +3,12 @@ #include <sys/types.h> #include <sys/uio.h> #include <skalibs/allreadwrite.h> -#include <skalibs/buffer.h> #include <skalibs/siovec.h> +#include <skalibs/buffer.h> -int buffer_write (int fd, siovec_t const *v, unsigned int n, void *aux) +int buffer_write (int fd, siovec_t const *v, unsigned int n) { struct iovec iov[n] ; iovec_from_siovec(iov, v, n) ; - (void)aux ; return fd_writev(fd, iov, n) ; } diff --git a/src/libunixonacid/skaclient_server_bidi_ack.c b/src/libunixonacid/skaclient_server_bidi_ack.c index eede82c..1d3cdbf 100644 --- a/src/libunixonacid/skaclient_server_bidi_ack.c +++ b/src/libunixonacid/skaclient_server_bidi_ack.c @@ -7,6 +7,6 @@ int skaclient_server_bidi_ack (unixmessage_t const *clientmsg, unixmessage_sende { if (!unixmessage_receiver_init(asyncin, -1, mainbuf, mainlen, auxbuf, auxlen)) return 0 ; if (!skaclient_server_ack(clientmsg, out, asyncout, before, beforelen, after, afterlen)) return 0 ; - asyncin->mainb.fd = unixmessage_sender_fd(asyncout) ; + asyncin->fd = unixmessage_sender_fd(asyncout) ; return 1 ; } diff --git a/src/libunixonacid/skaclient_start_cb.c b/src/libunixonacid/skaclient_start_cb.c index 6e641e2..4a82b9b 100644 --- a/src/libunixonacid/skaclient_start_cb.c +++ b/src/libunixonacid/skaclient_start_cb.c @@ -12,7 +12,7 @@ int skaclient_start_cb (unixmessage_t const *m, skaclient_cbdata_t *blah) if (m->len != blah->afterlen || byte_diff(m->s, m->len, blah->after) || m->nfds != 1) return (errno = EPROTO, 0) ; - blah->asyncin->mainb.fd = m->fds[0] ; + blah->asyncin->fd = m->fds[0] ; blah->asyncout->fd = m->fds[0] ; return 1 ; } diff --git a/src/libunixonacid/unixmessage_read.c b/src/libunixonacid/unixmessage_read.c deleted file mode 100644 index 5a23b84..0000000 --- a/src/libunixonacid/unixmessage_read.c +++ /dev/null @@ -1,60 +0,0 @@ -/* ISC license. */ - -#define _XPG4_2 -#include <skalibs/sysdeps.h> -#include <skalibs/nonposix.h> -#include <errno.h> -#include <sys/socket.h> -#include <sys/uio.h> -#include <skalibs/buffer.h> -#include <skalibs/cbuffer.h> -#include <skalibs/djbunix.h> -#include <skalibs/error.h> -#include <skalibs/siovec.h> -#include <skalibs/unixmessage.h> - -int unixmessage_read (int fd, siovec_t const *v, unsigned int n, void *aux) -{ - int r ; - char ancilbuf[CMSG_SPACE(UNIXMESSAGE_MAXFDS * sizeof(int))] ; - struct iovec iov[n] ; - struct msghdr msghdr = - { - .msg_name = 0, - .msg_namelen = 0, - .msg_iov = iov, - .msg_iovlen = n, - .msg_flags = 0, - .msg_control = ancilbuf, - .msg_controllen = sizeof(ancilbuf) - } ; - iovec_from_siovec(iov, v, n) ; -#ifdef SKALIBS_HASCMSGCLOEXEC - r = recvmsg(fd, &msghdr, MSG_WAITALL | MSG_CMSG_CLOEXEC) ; -#else - r = recvmsg(fd, &msghdr, MSG_WAITALL) ; -#endif - if (r > 0) - { - struct cmsghdr *c = CMSG_FIRSTHDR(&msghdr) ; - if (c) - { - cbuffer_t *auxb = aux ; - unsigned int len ; - if (c->cmsg_level != SOL_SOCKET - || c->cmsg_type != SCM_RIGHTS) return (errno = EPROTO, -1-r) ; - len = (unsigned int)(c->cmsg_len - (CMSG_DATA(c) - (unsigned char *)c)) ; -#ifndef SKALIBS_HASCMSGCLOEXEC - { - register unsigned int i = 0 ; - for (; i < len/sizeof(int) ; i++) - if (coe(((int *)CMSG_DATA(c))[i]) < 0) return -1-r ; - } -#endif - if (msghdr.msg_flags | MSG_CTRUNC) return (errno = EPROTO, -1-r) ; - if (cbuffer_put(auxb, (char *)CMSG_DATA(c), len) < len) - return (errno = ENOBUFS, -1-r) ; - } - } - return r ; -} diff --git a/src/libunixonacid/unixmessage_receive.c b/src/libunixonacid/unixmessage_receive.c index dc75263..fed1b03 100644 --- a/src/libunixonacid/unixmessage_receive.c +++ b/src/libunixonacid/unixmessage_receive.c @@ -1,44 +1,112 @@ /* ISC license. */ +#define _XPG4_2 +#include <skalibs/sysdeps.h> +#include <skalibs/nonposix.h> #include <errno.h> -#include <skalibs/allreadwrite.h> -#include <skalibs/buffer.h> +#include <sys/socket.h> +#include <sys/uio.h> +#include <skalibs/uint.h> +#include <skalibs/diuint.h> #include <skalibs/cbuffer.h> +#include <skalibs/djbunix.h> #include <skalibs/error.h> +#include <skalibs/allreadwrite.h> #include <skalibs/stralloc.h> -#include <skalibs/uint.h> +#include <skalibs/siovec.h> #include <skalibs/unixmessage.h> +static int unixmessage_receiver_fill (unixmessage_receiver_t *b, diuint *d) +{ + char ancilbuf[CMSG_SPACE(b->auxb.a - 1)] ; + struct iovec iov[2] ; + struct msghdr msghdr = + { + .msg_name = 0, + .msg_namelen = 0, + .msg_iov = iov, + .msg_iovlen = 2, + .msg_flags = 0, + .msg_control = ancilbuf, + .msg_controllen = sizeof(ancilbuf) + } ; + unsigned int auxlen ; + int r ; + if (cbuffer_isfull(&b->mainb) || cbuffer_isfull(&b->auxb)) + return (errno = ENOBUFS, -1) ; + { + siovec_t v[2] ; + cbuffer_wpeek(&b->mainb, v) ; + iovec_from_siovec(iov, v, 2) ; + } +#ifdef SKALIBS_HASCMSGCLOEXEC + r = recvmsg(b->fd, &msghdr, MSG_WAITALL | MSG_CMSG_CLOEXEC) ; +#else + r = recvmsg(b->fd, &msghdr, MSG_WAITALL) ; +#endif + if (r <= 0) return r ; + { + struct cmsghdr *c = CMSG_FIRSTHDR(&msghdr) ; + if (c) + { + if (c->cmsg_level != SOL_SOCKET + || c->cmsg_type != SCM_RIGHTS) return (errno = EPROTO, -1) ; + auxlen = (unsigned int)(c->cmsg_len - (CMSG_DATA(c) - (unsigned char *)c)) ; +#ifndef SKALIBS_HASCMSGCLOEXEC + { + register unsigned int i = 0 ; + for (; i < auxlen/sizeof(int) ; i++) + if (coe(((int *)CMSG_DATA(c))[i]) < 0) return -1 ; + } +#endif + if (msghdr.msg_flags & MSG_CTRUNC) return (errno = EPROTO, -1) ; + if (cbuffer_put(&b->auxb, (char *)CMSG_DATA(c), auxlen) < auxlen) + return (errno = ENOBUFS, -1) ; + d->right = auxlen / sizeof(int) ; + r -= c->cmsg_len ; + } + } + d->left = cbuffer_WSEEK(&b->mainb, r) ; + return 1 ; +} + int unixmessage_receive (unixmessage_receiver_t *b, unixmessage_t *m) { - if (b->data.len == b->mainlen) + if (b->maindata.len == b->mainlen && b->auxdata.len == b->auxlen) { char pack[sizeof(unsigned int) << 1] ; - if (buffer_len(&b->mainb) < sizeof(unsigned int) << 1) + if (cbuffer_len(&b->mainb) < sizeof(unsigned int) << 1) { - register int r = sanitize_read(buffer_fill(&b->mainb)) ; + diuint d ; + register int r = sanitize_read(unixmessage_receiver_fill(b, &d)) ; if (r <= 0) return r ; - if (r < sizeof(unsigned int) << 1) return (errno = EWOULDBLOCK, 0) ; + if (cbuffer_len(&b->mainb) < sizeof(unsigned int) << 1) + return (errno = EWOULDBLOCK, 0) ; } - buffer_getnofill(&b->mainb, pack, sizeof(unsigned int) << 1) ; + cbuffer_get(&b->mainb, pack, sizeof(unsigned int) << 1) ; uint_unpack_big(pack, &b->mainlen) ; uint_unpack_big(pack + sizeof(unsigned int), &b->auxlen) ; - if (b->auxlen > UNIXMESSAGE_MAXFDS) return (errno = EPROTO, -1) ; b->auxlen *= sizeof(int) ; - if (!stralloc_ready(&b->data, b->mainlen)) return -1 ; - b->data.len = 0 ; - b->auxw = cbuffer_get(&b->auxb, (char *)b->fds, b->auxlen) ; + if (!stralloc_ready(&b->maindata, b->mainlen)) return -1 ; + b->maindata.len = 0 ; + if (!stralloc_ready(&b->auxdata, b->auxlen)) return -1 ; + b->auxdata.len = 0 ; } + + for (;;) { - register int r = buffer_getall(&b->mainb, b->data.s, b->mainlen, &b->data.len) ; + diuint d ; + register int r ; + b->maindata.len += cbuffer_get(&b->mainb, b->maindata.s + b->maindata.len, cbuffer_len(&b->mainb)) ; + b->auxdata.len += cbuffer_get(&b->auxb, b->auxdata.s + b->auxdata.len, cbuffer_len(&b->auxb)) ; + if (b->maindata.len == b->mainlen && b->auxdata.len == b->auxlen) break ; + r = sanitize_read(unixmessage_receiver_fill(b, &d)) ; if (r <= 0) return r ; } - if (b->auxw < b->auxlen) - b->auxw += cbuffer_get(&b->auxb, (char *)b->fds, b->auxlen - b->auxw) ; - if (b->auxw < b->auxlen) return (errno = EPROTO, -1) ; - m->s = b->data.s ; - m->len = b->data.len ; - m->fds = b->fds ; + + m->s = b->maindata.s ; + m->len = b->maindata.len ; + m->fds = (int *)b->auxdata.s ; m->nfds = b->auxlen / sizeof(int) ; return 1 ; } diff --git a/src/libunixonacid/unixmessage_receiver_0.c b/src/libunixonacid/unixmessage_receiver_0.c index 6d48daa..76a537f 100644 --- a/src/libunixonacid/unixmessage_receiver_0.c +++ b/src/libunixonacid/unixmessage_receiver_0.c @@ -7,4 +7,4 @@ static char mainbuf[UNIXMESSAGE_BUFSIZE] ; static char auxbuf[UNIXMESSAGE_AUXBUFSIZE] ; -UNIXMESSAGE_RECEIVER_DECLARE_AND_INIT(unixmessage_receiver_0_, 0, mainbuf, UNIXMESSAGE_BUFSIZE, auxbuf, UNIXMESSAGE_AUXBUFSIZE) ; +unixmessage_receiver_t unixmessage_receiver_0_ = UNIXMESSAGE_RECEIVER_INIT(0, mainbuf, UNIXMESSAGE_BUFSIZE, auxbuf, UNIXMESSAGE_AUXBUFSIZE) ; diff --git a/src/libunixonacid/unixmessage_receiver_free.c b/src/libunixonacid/unixmessage_receiver_free.c index c23cc77..353797b 100644 --- a/src/libunixonacid/unixmessage_receiver_free.c +++ b/src/libunixonacid/unixmessage_receiver_free.c @@ -5,7 +5,8 @@ void unixmessage_receiver_free (unixmessage_receiver_t *b) { - stralloc_free(&b->data) ; - b->mainb.fd = -1 ; - b->mainlen = b->auxlen = b->auxw = 0 ; + b->fd = -1 ; + stralloc_free(&b->maindata) ; + stralloc_free(&b->auxdata) ; + b->mainlen = b->auxlen = 0 ; } diff --git a/src/libunixonacid/unixmessage_receiver_init.c b/src/libunixonacid/unixmessage_receiver_init.c index 982547c..5f702cf 100644 --- a/src/libunixonacid/unixmessage_receiver_init.c +++ b/src/libunixonacid/unixmessage_receiver_init.c @@ -1,17 +1,17 @@ /* ISC license. */ #include <errno.h> -#include <skalibs/buffer.h> #include <skalibs/cbuffer.h> #include <skalibs/stralloc.h> #include <skalibs/unixmessage.h> int unixmessage_receiver_init (unixmessage_receiver_t *b, int fd, char *mainbuf, unsigned int mainlen, char *auxbuf, unsigned int auxlen) { - if (mainlen < 9 || auxlen < UNIXMESSAGE_MAXFDS * sizeof(int) + 1) return (errno = EINVAL, 0) ; - if (!cbuffer_init(&b->auxb, auxbuf, auxlen)) return 0 ; - if (!buffer_init_aux(&b->mainb, &unixmessage_read, fd, mainbuf, mainlen, &b->auxb)) return 0 ; - b->mainlen = b->auxlen = b->auxw = 0 ; - b->data = stralloc_zero ; + if (!cbuffer_init(&b->mainb, mainbuf, mainlen) + || !cbuffer_init(&b->auxb, auxbuf, auxlen)) return 0 ; + b->fd = fd ; + b->mainlen = b->auxlen = 0 ; + b->maindata = stralloc_zero ; + b->auxdata = stralloc_zero ; return 1 ; } |