Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' …
Browse files Browse the repository at this point in the history
…into staging

Fix slirp on windows

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

# gpg: Signature made Wed 13 Feb 2019 18:31:21 GMT
# gpg:                using RSA key E61DBB15D4172BDEC97E92D9DB550E89F0FA54F3
# gpg: Good signature from "Samuel Thibault <samuel.thibault@aquilenet.fr>" [unknown]
# gpg:                 aka "Samuel Thibault <sthibault@debian.org>" [marginal]
# gpg:                 aka "Samuel Thibault <samuel.thibault@gnu.org>" [unknown]
# gpg:                 aka "Samuel Thibault <samuel.thibault@inria.fr>" [marginal]
# gpg:                 aka "Samuel Thibault <samuel.thibault@labri.fr>" [marginal]
# gpg:                 aka "Samuel Thibault <samuel.thibault@ens-lyon.org>" [marginal]
# gpg:                 aka "Samuel Thibault <samuel.thibault@u-bordeaux.fr>" [unknown]
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 900C B024 B679 31D4 0F82  304B D017 8C76 7D06 9EE6
#      Subkey fingerprint: E61D BB15 D417 2BDE C97E  92D9 DB55 0E89 F0FA 54F3

* remotes/thibault/tags/samuel-thibault:
  slirp: wrap the remaining socket functions
  slirp: remove slirp_ prefix for socket wrappers

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Feb 14, 2019
2 parents c4c5f65 + adf1add commit 7e40746
Show file tree
Hide file tree
Showing 8 changed files with 246 additions and 39 deletions.
4 changes: 2 additions & 2 deletions slirp/ip_icmp.c
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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
Expand Down
14 changes: 7 additions & 7 deletions slirp/misc.c
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion slirp/slirp.c
Expand Up @@ -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;
}
Expand Down
14 changes: 7 additions & 7 deletions slirp/socket.c
Expand Up @@ -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;
Expand All @@ -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);
}
}
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand All @@ -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;
Expand Down
10 changes: 5 additions & 5 deletions slirp/tcp_subr.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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;
Expand All @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion slirp/udp.c
Expand Up @@ -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);
}

Expand Down
164 changes: 162 additions & 2 deletions slirp/util.c
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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)
Expand Down

0 comments on commit 7e40746

Please sign in to comment.