[vlc-commits] compat: replace sendmsg()
Rémi Denis-Courmont
git at videolan.org
Wed Jan 13 21:49:48 CET 2016
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jan 10 17:03:41 2016 +0200| [95ba2e83f13eb639bb48e8e613b29c89f7dea239] | committer: Rémi Denis-Courmont
compat: replace sendmsg()
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=95ba2e83f13eb639bb48e8e613b29c89f7dea239
---
compat/sendmsg.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++
configure.ac | 2 +-
include/vlc_fixups.h | 24 +++++++++++++++++
include/vlc_network.h | 18 -------------
4 files changed, 96 insertions(+), 19 deletions(-)
diff --git a/compat/sendmsg.c b/compat/sendmsg.c
new file mode 100644
index 0000000..c0bb31b
--- /dev/null
+++ b/compat/sendmsg.c
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * sendmsg.c: POSIX sendmsg() replacement
+ *****************************************************************************
+ * Copyright © 2016 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _WIN32
+# include <errno.h>
+# include <stdlib.h>
+# include <mswsock.h>
+
+ssize_t sendmsg(int fd, const struct msghdr *msg, int flags)
+{
+ if (msg->msg_controllen != 0)
+ {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ if (msg->msg_iovlen > IOV_MAX)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ WSABUF *buf = malloc(msg->msg_iovlen * sizeof (*buf));
+ if (buf == NULL)
+ return -1;
+
+ for (unsigned i = 0; i < msg->msg_iovlen; i++)
+ {
+ buf[i].len = msg->msg_iov[i].iov_len;
+ buf[i].buf = (void *)msg->msg_iov[i].iov_base;
+ }
+
+ DWORD sent;
+
+ int ret = WSASendTo(fd, buf, msg->msg_iovlen, &sent, flags,
+ msg->msg_name, msg->msg_namelen, NULL, NULL);
+ free(buf);
+
+ if (ret == 0)
+ return sent;
+
+ switch (WSAGetLastError())
+ {
+ case WSAEWOULDBLOCK:
+ errno = EAGAIN;
+ break;
+ }
+ return -1;
+}
+#endif
diff --git a/configure.ac b/configure.ac
index 2ffe14d..fedf527 100644
--- a/configure.ac
+++ b/configure.ac
@@ -565,7 +565,7 @@ need_libc=false
dnl Check for usual libc functions
AC_CHECK_DECLS([nanosleep],,,[#include <time.h>])
AC_CHECK_FUNCS([daemon fcntl flock fstatvfs fork getenv getpwuid_r isatty lstat memalign mkostemp mmap open_memstream openat pread posix_fadvise posix_madvise setlocale stricmp strnicmp strptime uselocale pthread_cond_timedwait_monotonic_np pthread_condattr_setclock])
-AC_REPLACE_FUNCS([atof atoll dirfd fdopendir ffsll flockfile fsync getdelim getpid lldiv nrand48 poll posix_memalign rewind setenv strcasecmp strcasestr strdup strlcpy strndup strnlen strnstr strsep strtof strtok_r strtoll swab tdestroy timegm timespec_get strverscmp])
+AC_REPLACE_FUNCS([atof atoll dirfd fdopendir ffsll flockfile fsync getdelim getpid lldiv nrand48 poll posix_memalign rewind sendmsg setenv strcasecmp strcasestr strdup strlcpy strndup strnlen strnstr strsep strtof strtok_r strtoll swab tdestroy timegm timespec_get strverscmp])
AC_CHECK_FUNCS(fdatasync,,
[AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.])
])
diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
index c865bee..fdb6ccf 100644
--- a/include/vlc_fixups.h
+++ b/include/vlc_fixups.h
@@ -346,6 +346,30 @@ struct if_nameindex
# define if_freenameindex(list) (void)0
#endif
+#ifdef _WIN32
+struct iovec
+{
+ void *iov_base;
+ size_t iov_len;
+};
+#define IOV_MAX 255
+struct msghdr
+{
+ void *msg_name;
+ size_t msg_namelen;
+ struct iovec *msg_iov;
+ size_t msg_iovlen;
+ void *msg_control;
+ size_t msg_controllen;
+ int msg_flags;
+};
+#endif
+
+#ifndef HAVE_SENDMSG
+struct msghdr;
+ssize_t sendmsg(int, const struct msghdr *, int);
+#endif
+
/* search.h */
#ifndef HAVE_SEARCH_H
typedef struct entry {
diff --git a/include/vlc_network.h b/include/vlc_network.h
index 6205790..28a9fa6 100644
--- a/include/vlc_network.h
+++ b/include/vlc_network.h
@@ -41,24 +41,6 @@
# include <winsock2.h>
# include <ws2tcpip.h>
# define net_errno (WSAGetLastError())
-
-struct iovec
-{
- void *iov_base;
- size_t iov_len;
-};
-
-struct msghdr
-{
- void *msg_name;
- size_t msg_namelen;
- struct iovec *msg_iov;
- size_t msg_iovlen;
- void *msg_control;
- size_t msg_controllen;
- int msg_flags;
-};
-
# ifndef IPV6_V6ONLY
# define IPV6_V6ONLY 27
# endif
More information about the vlc-commits
mailing list