qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32
@ 2019-02-12 16:09 Marc-André Lureau
  2019-02-12 16:09 ` [Qemu-devel] [PATCH 1/2] slirp: remove slirp_ prefix for socket wrappers Marc-André Lureau
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Marc-André Lureau @ 2019-02-12 16:09 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, Jan Kiszka, Samuel Thibault, hsp.cat7,
	Marc-André Lureau

Hi,

QEMU wraps the socket functions in os-win32.h, but in commit
a9d8b3ec4385793815d71217857304, the header inclusion was dropped,
breaking slirp on Windows. Fix the regression by wrapping all the
socket functions.

thanks

Marc-André Lureau (2):
  slirp: remove slirp_ prefix for socket wrappers
  slirp: wrap the remaining socket functions

 slirp/util.h     |  75 ++++++++++++++++++----
 slirp/ip_icmp.c  |   4 +-
 slirp/misc.c     |  14 ++--
 slirp/slirp.c    |   2 +-
 slirp/socket.c   |  14 ++--
 slirp/tcp_subr.c |  10 +--
 slirp/udp.c      |   2 +-
 slirp/util.c     | 164 ++++++++++++++++++++++++++++++++++++++++++++++-
 8 files changed, 246 insertions(+), 39 deletions(-)

-- 
2.21.0.rc0.1.g036caf7885

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 1/2] slirp: remove slirp_ prefix for socket wrappers
  2019-02-12 16:09 [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Marc-André Lureau
@ 2019-02-12 16:09 ` Marc-André Lureau
  2019-02-12 16:09 ` [Qemu-devel] [PATCH 2/2] slirp: wrap the remaining socket functions Marc-André Lureau
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Marc-André Lureau @ 2019-02-12 16:09 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, Jan Kiszka, Samuel Thibault, hsp.cat7,
	Marc-André Lureau

QEMU wraps the socket functions in os-win32.h, but in commit
a9d8b3ec4385793815d71217857304, the header inclusion was dropped,
breaking libslirp on Windows.

There are already a few socket functions that are wrapped in libslirp,
with "slirp_" prefix, but many of them are missing, and we are going
to wrap the missing functions in a second patch.

Using "slirp_" prefix avoids the conflict with socket function #define
wrappers in QEMU os-win32.h, but they are quite intrusive. In the end,
the functions should behave the same as original one, but with errno
being set. To avoid the churn, and potential confusion, remove the
"slirp_" prefix. A series of #undef is necessary until libslirp is
made standalone to prevent the #define conflict with QEMU.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/util.h     | 31 ++++++++++++++++++++-----------
 slirp/ip_icmp.c  |  4 ++--
 slirp/misc.c     | 14 +++++++-------
 slirp/slirp.c    |  2 +-
 slirp/socket.c   | 14 +++++++-------
 slirp/tcp_subr.c | 10 +++++-----
 slirp/udp.c      |  2 +-
 7 files changed, 43 insertions(+), 34 deletions(-)

diff --git a/slirp/util.h b/slirp/util.h
index 4963747aef..685b5af099 100644
--- a/slirp/util.h
+++ b/slirp/util.h
@@ -81,21 +81,30 @@ struct iovec {
 #define ETH_P_NCSI                (0x88f8)
 #define ETH_P_UNKNOWN             (0xffff)
 
+/* FIXME: remove me when made standalone */
 #ifdef _WIN32
+#undef closesocket
+#undef getsockopt
+#undef ioctlsocket
+#undef recv
+#undef setsockopt
+#endif
+
+#ifdef _WIN32
+#define closesocket slirp_closesocket
 int slirp_closesocket(int fd);
+#define ioctlsocket slirp_ioctlsocket
 int slirp_ioctlsocket(int fd, int req, void *val);
-int inet_aton(const char *cp, struct in_addr *ia);
-#define slirp_getsockopt(sockfd, level, optname, optval, optlen) \
+#define getsockopt(sockfd, level, optname, optval, optlen) \
     getsockopt(sockfd, level, optname, (void *)optval, optlen)
-#define slirp_setsockopt(sockfd, level, optname, optval, optlen)        \
+#define setsockopt(sockfd, level, optname, optval, optlen)        \
     setsockopt(sockfd, level, optname, (const void *)optval, optlen)
-#define slirp_recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags)
+#define recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags)
+
+int inet_aton(const char *cp, struct in_addr *ia);
 #else
-#define slirp_setsockopt setsockopt
-#define slirp_getsockopt getsockopt
-#define slirp_recv recv
-#define slirp_closesocket close
-#define slirp_ioctlsocket ioctl
+#define closesocket(s) close(s)
+#define ioctlsocket(s, r, v) ioctl(s, r, v)
 #endif
 
 int slirp_socket(int domain, int type, int protocol);
@@ -104,14 +113,14 @@ void slirp_set_nonblock(int fd);
 static inline int slirp_socket_set_nodelay(int fd)
 {
     int v = 1;
-    return slirp_setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
+    return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v));
 }
 
 static inline int slirp_socket_set_fast_reuse(int fd)
 {
 #ifndef _WIN32
     int v = 1;
-    return slirp_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v));
+    return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v));
 #else
     /* Enabling the reuse of an endpoint that was used by a socket still in
      * TIME_WAIT state is usually performed by setting SO_REUSEADDR. On Windows
diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c
index ce79c0b051..120108f582 100644
--- a/slirp/ip_icmp.c
+++ b/slirp/ip_icmp.c
@@ -114,7 +114,7 @@ static int icmp_send(struct socket *so, struct mbuf *m, int hlen)
 void icmp_detach(struct socket *so)
 {
     so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
-    slirp_closesocket(so->s);
+    closesocket(so->s);
     sofree(so);
 }
 
@@ -421,7 +421,7 @@ void icmp_receive(struct socket *so)
     icp = mtod(m, struct icmp *);
 
     id = icp->icmp_id;
-    len = slirp_recv(so->s, icp, M_ROOM(m), 0);
+    len = recv(so->s, icp, M_ROOM(m), 0);
     /*
      * The behavior of reading SOCK_DGRAM+IPPROTO_ICMP sockets is inconsistent
      * between host OSes.  On Linux, only the ICMP header and payload is
diff --git a/slirp/misc.c b/slirp/misc.c
index 3f4cd852f8..d9fc586a24 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -98,16 +98,16 @@ slirp_socketpair_with_oob(int sv[2])
         goto err;
     }
 
-    slirp_closesocket(s);
+    closesocket(s);
     return 0;
 
 err:
     g_critical("slirp_socketpair(): %s", strerror(errno));
     if (s >= 0) {
-        slirp_closesocket(s);
+        closesocket(s);
     }
     if (sv[1] >= 0) {
-        slirp_closesocket(sv[1]);
+        closesocket(sv[1]);
     }
     return -1;
 }
@@ -211,16 +211,16 @@ fork_exec(struct socket *so, const char *ex)
     if (err) {
         g_critical("fork_exec: %s", err->message);
         g_error_free(err);
-        slirp_closesocket(sp[0]);
-        slirp_closesocket(sp[1]);
+        closesocket(sp[0]);
+        closesocket(sp[1]);
         return 0;
     }
 
     so->s = sp[0];
-    slirp_closesocket(sp[1]);
+    closesocket(sp[1]);
     slirp_socket_set_fast_reuse(so->s);
     opt = 1;
-    slirp_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+    setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
     slirp_set_nonblock(so->s);
     so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque);
     return 1;
diff --git a/slirp/slirp.c b/slirp/slirp.c
index a746c6fd86..55591430dc 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -961,7 +961,7 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr,
             addr.sin_addr.s_addr == host_addr.s_addr &&
             addr.sin_port == port) {
             so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
-            slirp_closesocket(so->s);
+            closesocket(so->s);
             sofree(so);
             return 0;
         }
diff --git a/slirp/socket.c b/slirp/socket.c
index ce1d6ffa1d..4876ea3f31 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -185,7 +185,7 @@ soread(struct socket *so)
 	 */
 	sopreprbuf(so, iov, &n);
 
-	nn = slirp_recv(so->s, iov[0].iov_base, iov[0].iov_len,0);
+	nn = recv(so->s, iov[0].iov_base, iov[0].iov_len,0);
 	if (nn <= 0) {
 		if (nn < 0 && (errno == EINTR || errno == EAGAIN))
 			return 0;
@@ -201,7 +201,7 @@ soread(struct socket *so)
 				if (getpeername(so->s, paddr, &alen) < 0) {
 					err = errno;
 				} else {
-					slirp_getsockopt(so->s, SOL_SOCKET, SO_ERROR,
+					getsockopt(so->s, SOL_SOCKET, SO_ERROR,
 						&err, &elen);
 				}
 			}
@@ -231,7 +231,7 @@ soread(struct socket *so)
 	 */
 	if (n == 2 && nn == iov[0].iov_len) {
             int ret;
-            ret = slirp_recv(so->s, iov[1].iov_base, iov[1].iov_len,0);
+            ret = recv(so->s, iov[1].iov_base, iov[1].iov_len,0);
             if (ret > 0)
                 nn += ret;
         }
@@ -552,7 +552,7 @@ sorecvfrom(struct socket *so)
 	   */
 	  len = M_FREEROOM(m);
 	  /* if (so->so_fport != htons(53)) { */
-	  slirp_ioctlsocket(so->s, FIONREAD, &n);
+	  ioctlsocket(so->s, FIONREAD, &n);
 
 	  if (n > len) {
 	    n = (m->m_data - m->m_dat) + m->m_len + n + 1;
@@ -724,7 +724,7 @@ tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, uint32_t laddr,
 		int tmperrno = errno; /* Don't clobber the real reason we failed */
 
                 if (s >= 0) {
-                    slirp_closesocket(s);
+                    closesocket(s);
                 }
 		sofree(so);
 		/* Restore the real errno */
@@ -735,9 +735,9 @@ tcp_listen(Slirp *slirp, uint32_t haddr, unsigned hport, uint32_t laddr,
 #endif
 		return NULL;
 	}
-	slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+	setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
 	opt = 1;
-	slirp_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int));
+	setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int));
 
 	getsockname(s,(struct sockaddr *)&addr,&addrlen);
 	so->so_ffamily = AF_INET;
diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
index cda94815f6..262a42d6c8 100644
--- a/slirp/tcp_subr.c
+++ b/slirp/tcp_subr.c
@@ -337,7 +337,7 @@ tcp_close(struct tcpcb *tp)
 	if (so == slirp->tcp_last_so)
 		slirp->tcp_last_so = &slirp->tcb;
 	so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
-	slirp_closesocket(so->s);
+	closesocket(so->s);
 	sbfree(&so->so_rcv);
 	sbfree(&so->so_snd);
 	sofree(so);
@@ -416,9 +416,9 @@ int tcp_fconnect(struct socket *so, unsigned short af)
     so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque);
     slirp_socket_set_fast_reuse(s);
     opt = 1;
-    slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt));
+    setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt));
     opt = 1;
-    slirp_setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
+    setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
 
     addr = so->fhost.ss;
     DEBUG_CALL(" connect()ing");
@@ -489,7 +489,7 @@ void tcp_connect(struct socket *inso)
     so->slirp->cb->register_poll_fd(so->s, so->slirp->opaque);
     slirp_socket_set_fast_reuse(s);
     opt = 1;
-    slirp_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
+    setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
     slirp_socket_set_nodelay(s);
 
     so->fhost.ss = addr;
@@ -499,7 +499,7 @@ void tcp_connect(struct socket *inso)
     if (inso->so_state & SS_FACCEPTONCE) {
         /* If we only accept once, close the accept() socket */
         so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
-        slirp_closesocket(so->s);
+        closesocket(so->s);
 
         /* Don't select it yet, even though we have an FD */
         /* if it's not FACCEPTONCE, it's already NOFDREF */
diff --git a/slirp/udp.c b/slirp/udp.c
index 29a31e9400..3d9a19b85a 100644
--- a/slirp/udp.c
+++ b/slirp/udp.c
@@ -292,7 +292,7 @@ void
 udp_detach(struct socket *so)
 {
 	so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
-	slirp_closesocket(so->s);
+	closesocket(so->s);
 	sofree(so);
 }
 
-- 
2.21.0.rc0.1.g036caf7885

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 2/2] slirp: wrap the remaining socket functions
  2019-02-12 16:09 [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Marc-André Lureau
  2019-02-12 16:09 ` [Qemu-devel] [PATCH 1/2] slirp: remove slirp_ prefix for socket wrappers Marc-André Lureau
@ 2019-02-12 16:09 ` Marc-André Lureau
  2019-02-12 17:01 ` [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Howard Spoelstra
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Marc-André Lureau @ 2019-02-12 16:09 UTC (permalink / raw)
  To: qemu-devel
  Cc: peter.maydell, Jan Kiszka, Samuel Thibault, hsp.cat7,
	Marc-André Lureau

QEMU wraps the socket functions in os-win32.h, but in commit
a9d8b3ec4385793815d71217857304, the header inclusion was dropped,
breaking libslirp on Windows.

Wrap the missing functions.

Rename the wrapped function with "slirp_" prefix and "_wrap" suffix,
for consistency and to avoid a clash with existing function (such as
"slirp_socket").

Fixes: a9d8b3ec ("slirp: replace remaining qemu headers dependency")
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 slirp/util.h |  56 +++++++++++++++---
 slirp/util.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 209 insertions(+), 11 deletions(-)

diff --git a/slirp/util.h b/slirp/util.h
index 685b5af099..c4207a49d6 100644
--- a/slirp/util.h
+++ b/slirp/util.h
@@ -83,23 +83,61 @@ struct iovec {
 
 /* FIXME: remove me when made standalone */
 #ifdef _WIN32
+#undef accept
+#undef bind
 #undef closesocket
+#undef connect
+#undef getpeername
+#undef getsockname
 #undef getsockopt
 #undef ioctlsocket
+#undef listen
 #undef recv
+#undef recvfrom
+#undef send
+#undef sendto
 #undef setsockopt
+#undef shutdown
+#undef socket
 #endif
 
 #ifdef _WIN32
-#define closesocket slirp_closesocket
-int slirp_closesocket(int fd);
-#define ioctlsocket slirp_ioctlsocket
-int slirp_ioctlsocket(int fd, int req, void *val);
-#define getsockopt(sockfd, level, optname, optval, optlen) \
-    getsockopt(sockfd, level, optname, (void *)optval, optlen)
-#define setsockopt(sockfd, level, optname, optval, optlen)        \
-    setsockopt(sockfd, level, optname, (const void *)optval, optlen)
-#define recv(sockfd, buf, len, flags) recv(sockfd, (void *)buf, len, flags)
+#define connect slirp_connect_wrap
+int slirp_connect_wrap(int fd, const struct sockaddr *addr, int addrlen);
+#define listen slirp_listen_wrap
+int slirp_listen_wrap(int fd, int backlog);
+#define bind slirp_bind_wrap
+int slirp_bind_wrap(int fd, const struct sockaddr *addr, int addrlen);
+#define socket slirp_socket_wrap
+int slirp_socket_wrap(int domain, int type, int protocol);
+#define accept slirp_accept_wrap
+int slirp_accept_wrap(int fd, struct sockaddr *addr, int *addrlen);
+#define shutdown slirp_shutdown_wrap
+int slirp_shutdown_wrap(int fd, int how);
+#define getpeername slirp_getpeername_wrap
+int slirp_getpeername_wrap(int fd, struct sockaddr *addr, int *addrlen);
+#define getsockname slirp_getsockname_wrap
+int slirp_getsockname_wrap(int fd, struct sockaddr *addr, int *addrlen);
+#define send slirp_send_wrap
+ssize_t slirp_send_wrap(int fd, const void *buf, size_t len, int flags);
+#define sendto slirp_sendto_wrap
+ssize_t slirp_sendto_wrap(int fd, const void *buf, size_t len, int flags,
+                          const struct sockaddr *dest_addr, int addrlen);
+#define recv slirp_recv_wrap
+ssize_t slirp_recv_wrap(int fd, void *buf, size_t len, int flags);
+#define recvfrom slirp_recvfrom_wrap
+ssize_t slirp_recvfrom_wrap(int fd, void *buf, size_t len, int flags,
+                            struct sockaddr *src_addr, int *addrlen);
+#define closesocket slirp_closesocket_wrap
+int slirp_closesocket_wrap(int fd);
+#define ioctlsocket slirp_ioctlsocket_wrap
+int slirp_ioctlsocket_wrap(int fd, int req, void *val);
+#define getsockopt slirp_getsockopt_wrap
+int slirp_getsockopt_wrap(int sockfd, int level, int optname,
+                     void *optval, int *optlen);
+#define setsockopt slirp_setsockopt_wrap
+int slirp_setsockopt_wrap(int sockfd, int level, int optname,
+                          const void *optval, int optlen);
 
 int inet_aton(const char *cp, struct in_addr *ia);
 #else
diff --git a/slirp/util.c b/slirp/util.c
index 84f5afdbc3..1cbaa26b60 100644
--- a/slirp/util.c
+++ b/slirp/util.c
@@ -167,7 +167,7 @@ static int socket_error(void)
 }
 
 #undef ioctlsocket
-int slirp_ioctlsocket(int fd, int req, void *val)
+int slirp_ioctlsocket_wrap(int fd, int req, void *val)
 {
     int ret;
     ret = ioctlsocket(fd, req, val);
@@ -178,7 +178,7 @@ int slirp_ioctlsocket(int fd, int req, void *val)
 }
 
 #undef closesocket
-int slirp_closesocket(int fd)
+int slirp_closesocket_wrap(int fd)
 {
     int ret;
     ret = closesocket(fd);
@@ -187,6 +187,166 @@ int slirp_closesocket(int fd)
     }
     return ret;
 }
+
+#undef connect
+int slirp_connect_wrap(int sockfd, const struct sockaddr *addr, int addrlen)
+{
+    int ret;
+    ret = connect(sockfd, addr, addrlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef listen
+int slirp_listen_wrap(int sockfd, int backlog)
+{
+    int ret;
+    ret = listen(sockfd, backlog);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef bind
+int slirp_bind_wrap(int sockfd, const struct sockaddr *addr, int addrlen)
+{
+    int ret;
+    ret = bind(sockfd, addr, addrlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef socket
+int slirp_socket_wrap(int domain, int type, int protocol)
+{
+    int ret;
+    ret = socket(domain, type, protocol);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef accept
+int slirp_accept_wrap(int sockfd, struct sockaddr *addr, int *addrlen)
+{
+    int ret;
+    ret = accept(sockfd, addr, addrlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef shutdown
+int slirp_shutdown_wrap(int sockfd, int how)
+{
+    int ret;
+    ret = shutdown(sockfd, how);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef getsockopt
+int slirp_getsockopt_wrap(int sockfd, int level, int optname,
+                          void *optval, int *optlen)
+{
+    int ret;
+    ret = getsockopt(sockfd, level, optname, optval, optlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef setsockopt
+int slirp_setsockopt_wrap(int sockfd, int level, int optname,
+                          const void *optval, int optlen)
+{
+    int ret;
+    ret = setsockopt(sockfd, level, optname, optval, optlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef getpeername
+int slirp_getpeername_wrap(int sockfd, struct sockaddr *addr,
+                           int *addrlen)
+{
+    int ret;
+    ret = getpeername(sockfd, addr, addrlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef getsockname
+int slirp_getsockname_wrap(int sockfd, struct sockaddr *addr,
+                           int *addrlen)
+{
+    int ret;
+    ret = getsockname(sockfd, addr, addrlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef send
+ssize_t slirp_send_wrap(int sockfd, const void *buf, size_t len, int flags)
+{
+    int ret;
+    ret = send(sockfd, buf, len, flags);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef sendto
+ssize_t slirp_sendto_wrap(int sockfd, const void *buf, size_t len, int flags,
+                     const struct sockaddr *addr, int addrlen)
+{
+    int ret;
+    ret = sendto(sockfd, buf, len, flags, addr, addrlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef recv
+ssize_t slirp_recv_wrap(int sockfd, void *buf, size_t len, int flags)
+{
+    int ret;
+    ret = recv(sockfd, buf, len, flags);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
+
+#undef recvfrom
+ssize_t slirp_recvfrom_wrap(int sockfd, void *buf, size_t len, int flags,
+                            struct sockaddr *addr, int *addrlen)
+{
+    int ret;
+    ret = recvfrom(sockfd, buf, len, flags, addr, addrlen);
+    if (ret < 0) {
+        errno = socket_error();
+    }
+    return ret;
+}
 #endif /* WIN32 */
 
 void slirp_pstrcpy(char *buf, int buf_size, const char *str)
-- 
2.21.0.rc0.1.g036caf7885

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32
  2019-02-12 16:09 [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Marc-André Lureau
  2019-02-12 16:09 ` [Qemu-devel] [PATCH 1/2] slirp: remove slirp_ prefix for socket wrappers Marc-André Lureau
  2019-02-12 16:09 ` [Qemu-devel] [PATCH 2/2] slirp: wrap the remaining socket functions Marc-André Lureau
@ 2019-02-12 17:01 ` Howard Spoelstra
  2019-02-12 19:49 ` Samuel Thibault
  2019-02-13 16:32 ` no-reply
  4 siblings, 0 replies; 6+ messages in thread
From: Howard Spoelstra @ 2019-02-12 17:01 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: qemu-devel qemu-devel, Peter Maydell, Jan Kiszka, Samuel Thibault

On Tue, Feb 12, 2019 at 5:09 PM Marc-André Lureau <
marcandre.lureau@redhat.com> wrote:

> Hi,
>
> QEMU wraps the socket functions in os-win32.h, but in commit
> a9d8b3ec4385793815d71217857304, the header inclusion was dropped,
> breaking slirp on Windows. Fix the regression by wrapping all the
> socket functions.
>
> thanks
>
> Marc-André Lureau (2):
>   slirp: remove slirp_ prefix for socket wrappers
>   slirp: wrap the remaining socket functions
>
>  slirp/util.h     |  75 ++++++++++++++++++----
>  slirp/ip_icmp.c  |   4 +-
>  slirp/misc.c     |  14 ++--
>  slirp/slirp.c    |   2 +-
>  slirp/socket.c   |  14 ++--
>  slirp/tcp_subr.c |  10 +--
>  slirp/udp.c      |   2 +-
>  slirp/util.c     | 164 ++++++++++++++++++++++++++++++++++++++++++++++-
>  8 files changed, 246 insertions(+), 39 deletions(-)
>
> --
> 2.21.0.rc0.1.g036caf7885
>

Confirmed, slirp working again in qemu-system-ppc for windows, so

Tested-by: Howard Spoelstra

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32
  2019-02-12 16:09 [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Marc-André Lureau
                   ` (2 preceding siblings ...)
  2019-02-12 17:01 ` [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Howard Spoelstra
@ 2019-02-12 19:49 ` Samuel Thibault
  2019-02-13 16:32 ` no-reply
  4 siblings, 0 replies; 6+ messages in thread
From: Samuel Thibault @ 2019-02-12 19:49 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, peter.maydell, Jan Kiszka, hsp.cat7

Marc-André Lureau, le mar. 12 févr. 2019 17:09:51 +0100, a ecrit:
> QEMU wraps the socket functions in os-win32.h, but in commit
> a9d8b3ec4385793815d71217857304, the header inclusion was dropped,
> breaking slirp on Windows. Fix the regression by wrapping all the
> socket functions.

Applied to my tree, thanks!

Samuel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32
  2019-02-12 16:09 [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Marc-André Lureau
                   ` (3 preceding siblings ...)
  2019-02-12 19:49 ` Samuel Thibault
@ 2019-02-13 16:32 ` no-reply
  4 siblings, 0 replies; 6+ messages in thread
From: no-reply @ 2019-02-13 16:32 UTC (permalink / raw)
  To: marcandre.lureau
  Cc: fam, qemu-devel, peter.maydell, hsp.cat7, samuel.thibault,
	jan.kiszka

Patchew URL: https://patchew.org/QEMU/20190212160953.29051-1-marcandre.lureau@redhat.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Subject: [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32
Type: series
Message-id: 20190212160953.29051-1-marcandre.lureau@redhat.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
8efa2500fe slirp: wrap the remaining socket functions
6db690637f slirp: remove slirp_ prefix for socket wrappers

=== OUTPUT BEGIN ===
1/2 Checking commit 6db690637f48 (slirp: remove slirp_ prefix for socket wrappers)
ERROR: code indent should never use tabs
#115: FILE: slirp/socket.c:188:
+^Inn = recv(so->s, iov[0].iov_base, iov[0].iov_len,0);$

ERROR: space required after that ',' (ctx:VxV)
#115: FILE: slirp/socket.c:188:
+       nn = recv(so->s, iov[0].iov_base, iov[0].iov_len,0);
                                                        ^

ERROR: code indent should never use tabs
#124: FILE: slirp/socket.c:204:
+^I^I^I^I^Igetsockopt(so->s, SOL_SOCKET, SO_ERROR,$

ERROR: space required after that ',' (ctx:VxV)
#133: FILE: slirp/socket.c:234:
+            ret = recv(so->s, iov[1].iov_base, iov[1].iov_len,0);
                                                              ^

ERROR: code indent should never use tabs
#142: FILE: slirp/socket.c:555:
+^I  ioctlsocket(so->s, FIONREAD, &n);$

ERROR: code indent should never use tabs
#160: FILE: slirp/socket.c:738:
+^Isetsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));$

ERROR: code indent should never use tabs
#163: FILE: slirp/socket.c:740:
+^Isetsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int));$

ERROR: code indent should never use tabs
#176: FILE: slirp/tcp_subr.c:340:
+^Iclosesocket(so->s);$

ERROR: code indent should never use tabs
#219: FILE: slirp/udp.c:295:
+^Iclosesocket(so->s);$

total: 9 errors, 0 warnings, 212 lines checked

Patch 1/2 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

2/2 Checking commit 8efa2500febb (slirp: wrap the remaining socket functions)
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/20190212160953.29051-1-marcandre.lureau@redhat.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-02-13 16:48 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-02-12 16:09 [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Marc-André Lureau
2019-02-12 16:09 ` [Qemu-devel] [PATCH 1/2] slirp: remove slirp_ prefix for socket wrappers Marc-André Lureau
2019-02-12 16:09 ` [Qemu-devel] [PATCH 2/2] slirp: wrap the remaining socket functions Marc-André Lureau
2019-02-12 17:01 ` [Qemu-devel] [PATCH 0/2] Fix slirp regression on win32 Howard Spoelstra
2019-02-12 19:49 ` Samuel Thibault
2019-02-13 16:32 ` no-reply

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).