[vlc-devel] [PATCH 1/5] network: add convenience wrappers for send/sendto/sendmsg

Steve Lhomme robux4 at ycbcr.xyz
Sat Mar 28 15:08:28 CET 2020



On 2020-03-28 8:20, RĂ©mi Denis-Courmont wrote:
> ---
>   include/vlc_network.h  | 54 ++++++++++++++++++++++++++++++++++++++++++
>   src/libvlccore.sym     |  3 +++
>   src/posix/filesystem.c | 27 +++++++++++++++++++++
>   src/win32/filesystem.c | 24 +++++++++++++++++++
>   4 files changed, 108 insertions(+)
> 
> diff --git a/include/vlc_network.h b/include/vlc_network.h
> index 88dcfefbca..c403e9a638 100644
> --- a/include/vlc_network.h
> +++ b/include/vlc_network.h
> @@ -113,6 +113,60 @@ struct sockaddr;
>   VLC_API int vlc_accept(int lfd, struct sockaddr *addr, socklen_t *alen,
>                          bool nonblock) VLC_USED;
>   
> +/**
> + * Sends data.
> + *
> + * Like @c send(), this function sends raw data to the peer of a
> + * connection-mode socket, or to the predefined peer of a connection-less
> + * socket.
> + * Unlike @c send(), this function never triggers a signal; if the peer hung
> + * up, it returns an error.
> + *
> + * @param fd socket to send data through
> + * @param buf start address of data
> + * @param buflen byte size of data
> + * @param flags socket send flags (see @c send() documentation)
> + * @return number of bytes actually sent, or -1 on error (@c errno is set)
> + */
> +VLC_API ssize_t vlc_send(int fd, const void *buf, size_t buflen, int flags);
> +
> +/**
> + * Sends data to a peer.
> + *
> + * This function operates like @c sendto() with the exception that it never
> + * triggers a signal.
> + *
> + * This function mainly exists for the sakes of completeness and consistency:
> + * - To send data on a connection-mode socket, using \ref vlc_send() is
> + *   simpler.
> + * - To send data on a connection-less socket, @c sendto() and/or @c send() can
> + *   be used directly.
> + *
> + * @param fd socket to send data through
> + * @param buf start address of data
> + * @param buflen byte size of data
> + * @param flags socket send flags (see @c send() documentation)
> + * @param dst destination address (ignored for connection-mode sockets)
> + * @param dstlen byte size of destination address
> + * @return number of bytes actually sent, or -1 on error (@c errno is set)
> + */
> +VLC_API ssize_t vlc_sendto(int fd, const void *buf, size_t buflen, int flags,
> +                           const struct sockaddr *dst, socklen_t dstlen);
> +
> +/**
> + * Sends a socket message.
> + *
> + * Like @c sendmsg(), this function sends a message through a socket.
> + * Unlike @c sendmsg(), this function never triggers a signal; if the peer hung
> + * up, it returns an error.
> + *
> + * @param fd socket to send data through
> + * @param msg message to send (see @c sendmsg() documentation)
> + * @param flags socket send flags (see @c sendmsg() documentation)
> + * @return number of bytes actually sent, or -1 on error (@c errno is set)
> + */
> +VLC_API ssize_t vlc_sendmsg(int fd, const struct msghdr *msg, int flags);
> +
>   # ifdef __cplusplus
>   extern "C" {
>   # endif
> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
> index 66ae6f3ecd..9effd1246e 100644
> --- a/src/libvlccore.sym
> +++ b/src/libvlccore.sym
> @@ -446,6 +446,9 @@ vlc_writev
>   vlc_socket
>   vlc_socketpair
>   vlc_accept
> +vlc_send
> +vlc_sendto
> +vlc_sendmsg
>   utf8_vfprintf
>   var_AddCallback
>   var_AddListCallback
> diff --git a/src/posix/filesystem.c b/src/posix/filesystem.c
> index 3f94b76f92..89782a4bc2 100644
> --- a/src/posix/filesystem.c
> +++ b/src/posix/filesystem.c
> @@ -315,3 +315,30 @@ int vlc_accept (int lfd, struct sockaddr *addr, socklen_t *alen, bool nonblock)
>   #endif
>       return fd;
>   }
> +
> +ssize_t vlc_send(int fd, const void *buf, size_t len, int flags)
> +{
> +    return vlc_sendto(fd, buf, len, flags, NULL, 0);
> +}
> +
> +ssize_t vlc_sendto(int fd, const void *buf, size_t len, int flags,
> +                   const struct sockaddr *dst, socklen_t dstlen)
> +{
> +    struct iovec iov = {
> +        .iov_base = (void *)buf,
> +        .iov_len = len,
> +    };
> +    struct msghdr msg = {
> +        .msg_name = (struct sockaddr *)dst,
> +        .msg_namelen = dstlen,
> +        .msg_iov = &iov,
> +        .msg_iovlen = 1,
> +    };
> +
> +    return vlc_sendmsg(fd, &msg, flags);
> +}
> +
> +ssize_t vlc_sendmsg(int fd, const struct msghdr *msg, int flags)
> +{
> +    return sendmsg(fd, msg, flags | MSG_NOSIGNAL);
> +}
> diff --git a/src/win32/filesystem.c b/src/win32/filesystem.c
> index e2df866b28..0a0656dbba 100644
> --- a/src/win32/filesystem.c
> +++ b/src/win32/filesystem.c
> @@ -353,6 +353,30 @@ int vlc_accept (int lfd, struct sockaddr *addr, socklen_t *alen, bool nonblock)
>       return fd;
>   }
>   
> +ssize_t vlc_send(int fd, const void *buf, size_t len, int flags)
> +{
> +    WSABUF wsabuf = { .buf = (char *)buf, .len = len };
> +    DWORD sent;
> +
> +    return WSASend(fd, &wsabuf, 1, &sent, flags,
> +                   NULL, NULL) ? -1 : (ssize_t)sent;

Is this equivalent to the calls done before ? Why not keep send() for 
now and replace it in another patch ?

> +}
> +
> +ssize_t vlc_sendto(int fd, const void *buf, size_t len, int flags,
> +                   const struct sockaddr *dst, socklen_t dstlen)
> +{
> +    WSABUF wsabuf = { .buf = (char *)buf, .len = len };
> +    DWORD sent;
> +
> +    return WSASendTo(fd, &wsabuf, 1, &sent, flags, dst, dstlen,
> +                     NULL, NULL) ? -1 : (ssize_t)sent;
> +}
> +
> +ssize_t vlc_sendmsg(int fd, const struct msghdr *msg, int flags)
> +{
> +    return sendmsg(fd, msg, flags);
> +}
> +
>   #if !VLC_WINSTORE_APP
>   FILE *vlc_win32_tmpfile(void)
>   {
> -- 
> 2.26.0
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list