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

Jean-Baptiste Kempf jb at videolan.org
Sat Mar 28 13:57:57 CET 2020


Looks cool.
But should it really be in filesystem.c and not another networking file per platform?

On Sat, Mar 28, 2020, at 08: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;
> +}
> +
> +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

-- 
Jean-Baptiste Kempf -  President
+33 672 704 734


More information about the vlc-devel mailing list