vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun May 10 15:08:44 2020 +0300| [886a2558c1adc61d82a33d6413631ffadf073ef9] | committer: Rémi Denis-Courmont
rtp: add connection-oriented datagram socket support (in other words, DCCP) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=886a2558c1adc61d82a33d6413631ffadf073ef9 --- modules/access/rtp/datagram.c | 53 +++++++++++++++++++++++++++++++++++++++++++ modules/access/rtp/vlc_dtls.h | 1 + 2 files changed, 54 insertions(+) diff --git a/modules/access/rtp/datagram.c b/modules/access/rtp/datagram.c index 47dad02464..b6f1e37e17 100644 --- a/modules/access/rtp/datagram.c +++ b/modules/access/rtp/datagram.c @@ -22,7 +22,9 @@ # include "config.h" #endif +#include <errno.h> #include <stdlib.h> +#include <poll.h> #include <vlc_common.h> #include <vlc_network.h> @@ -99,3 +101,54 @@ struct vlc_dtls *vlc_datagram_CreateFD(int fd) return &s->s; } + +static ssize_t vlc_dccp_Recv(struct vlc_dtls *dgs, struct iovec *iov, + unsigned iovlen, bool *truncated) +{ + ssize_t ret = vlc_datagram_Recv(dgs, iov, iovlen, truncated); + + if (unlikely(ret == 0)) { + int fd = container_of(dgs, struct vlc_dgram_sock, s)->fd; + struct pollfd ufd = { .fd = fd, }; + + /* On a connection-oriented datagram socket, recv() can return zero + * when a zero-bytes packet was received or when the other end closed + * the connection. We need to distinguish the two, so check if the + * socket is hung up or not. + * + * Note that this test can only be done *after* the zero read. The HUP + * flag is not set by the IP stack until then. + */ + poll(&ufd, 1, 0); + + if (ufd.revents & POLLHUP) { + /* We need a distinct error code. EPIPE is normally only used on + * send(), so there are no ambiguities and it is somewhat + * descriptive of the connection having been closed. + */ + errno = EPIPE; + ret = -1; + } + } + + return ret; +} + +static const struct vlc_dtls_operations vlc_dccp_ops = { + vlc_datagram_Close, + vlc_datagram_GetPollFD, + vlc_dccp_Recv, + vlc_datagram_Send, +}; + +struct vlc_dtls *vlc_dccp_CreateFD(int fd) +{ + struct vlc_dgram_sock *s = malloc(sizeof (*s)); + + if (likely(s != NULL)) { + s->fd = fd; + s->s.ops = &vlc_dccp_ops; + } + + return &s->s; +} diff --git a/modules/access/rtp/vlc_dtls.h b/modules/access/rtp/vlc_dtls.h index fcba496e98..1706924b43 100644 --- a/modules/access/rtp/vlc_dtls.h +++ b/modules/access/rtp/vlc_dtls.h @@ -66,5 +66,6 @@ static inline ssize_t vlc_dtls_Send(struct vlc_dtls *dgs, const void *buf, } struct vlc_dtls *vlc_datagram_CreateFD(int fd); +struct vlc_dtls *vlc_dccp_CreateFD(int fd); #endif _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
