slirp: remove slirp_ prefix for socket wrappers
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Tue, 12 Feb 2019 16:09:52 +0000 (17:09 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 12 Feb 2019 19:47:42 +0000 (20:47 +0100)
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>
Message-Id: <20190212160953.29051-2-marcandre.lureau@redhat.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
slirp/ip_icmp.c
slirp/misc.c
slirp/slirp.c
slirp/socket.c
slirp/tcp_subr.c
slirp/udp.c
slirp/util.h

index ce79c0b051cfa67c92f28c3615adada4552b3598..120108f5825112972b97e12189ca8f7ac3cf00a9 100644 (file)
@@ -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
index 3f4cd852f80dada23115ee795e069092de25699a..d9fc586a244bae25a73528edc3a22901f3d56362 100644 (file)
@@ -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;
index a746c6fd8635884db376113b0d3a08ca2acccba8..55591430dc750b6fd757513bb319a07ef549c40f 100644 (file)
@@ -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;
         }
index ce1d6ffa1d2d8b7f8e87030cbb9c2c6e4c854d73..4876ea3f315acb9d9ca0ef46f818080abdc3d40d 100644 (file)
@@ -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;
index cda94815f627843550c0b86c30595256a7a7b287..262a42d6c86f747e4fdb25ebee85d040d3b220e7 100644 (file)
@@ -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 */
index 29a31e9400dc73b357c150333c93a9406ea5cca9..3d9a19b85a00e55e2d75309ac3b1a6be5bc88040 100644 (file)
@@ -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);
 }
 
index 4963747aefca46926fcb9e845e8c22c62b7ecfc2..685b5af09971d615b0a6308f9f36230fc5647779 100644 (file)
@@ -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