aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Ngai <nicholas@ngai.me>2021-11-29 16:21:17 -0800
committerNicholas Ngai <nicholas@ngai.me>2021-11-29 16:21:17 -0800
commitd2eb3b45aae71b3831fbf658d18b78b53eba23f9 (patch)
treeb4fd2c6ea37501935ecbdeeab7738fcfd95bb354
parent87ea58f2f5a99515fd6544aa1a66bbfb26af2b6f (diff)
downloadslirp-d2eb3b45aae71b3831fbf658d18b78b53eba23f9.zip
slirp-d2eb3b45aae71b3831fbf658d18b78b53eba23f9.tar.gz
slirp-d2eb3b45aae71b3831fbf658d18b78b53eba23f9.tar.bz2
socket: Add s_aux field to struct socket for storing auxilliary socket
Signed-off-by: Nicholas Ngai <nicholas@ngai.me>
-rw-r--r--src/socket.c5
-rw-r--r--src/socket.h2
-rw-r--r--src/tcp_subr.c3
-rw-r--r--src/udp.c3
4 files changed, 11 insertions, 2 deletions
diff --git a/src/socket.c b/src/socket.c
index 7869e6a..a92cfd3 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -50,6 +50,7 @@ struct socket *socreate(Slirp *slirp)
memset(so, 0, sizeof(struct socket));
so->so_state = SS_NOFDREF;
so->s = -1;
+ so->s_aux = -1;
so->slirp = slirp;
so->pollfds_idx = -1;
@@ -1098,7 +1099,7 @@ void sotranslate_accept(struct socket *so)
closesocket(s);
goto unix2inet_cont;
}
- so->s = s;
+ so->s_aux = s;
so->so_fport = in_addr.sin_port;
unix2inet_cont:
@@ -1132,7 +1133,7 @@ unix2inet_cont:
closesocket(s);
goto unix2inet6_cont;
}
- so->s = s;
+ so->s_aux = s;
so->so_fport6 = in6_addr.sin6_port;
unix2inet6_cont:
diff --git a/src/socket.h b/src/socket.h
index 17901ad..ac77c5e 100644
--- a/src/socket.h
+++ b/src/socket.h
@@ -40,6 +40,8 @@ struct socket {
struct socket *so_next, *so_prev; /* For a linked list of sockets */
int s; /* The actual socket */
+ int s_aux; /* An auxiliary socket for miscellaneous use. Currently used to
+ * reserve OS ports in UNIX-to-inet translation. */
struct gfwd_list *guestfwd;
int pollfds_idx; /* GPollFD GArray index */
diff --git a/src/tcp_subr.c b/src/tcp_subr.c
index 7c63f49..d1a95f0 100644
--- a/src/tcp_subr.c
+++ b/src/tcp_subr.c
@@ -339,6 +339,9 @@ struct tcpcb *tcp_close(struct tcpcb *tp)
slirp->tcp_last_so = &slirp->tcb;
so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
closesocket(so->s);
+ if (so->s_aux != -1) {
+ closesocket(so->s_aux);
+ }
sbfree(&so->so_rcv);
sbfree(&so->so_snd);
sofree(so);
diff --git a/src/udp.c b/src/udp.c
index 06b7b7d..48bd8ae 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -339,6 +339,9 @@ void udp_detach(struct socket *so)
{
so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
closesocket(so->s);
+ if (so->s_aux != -1) {
+ closesocket(so->s_aux);
+ }
sofree(so);
}