aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenzo Davoli <renzo@cs.unibo.it>2019-12-29 16:13:22 +0100
committerMarc-André Lureau <marcandre.lureau@redhat.com>2020-01-04 11:41:47 +0400
commit3d9118b4a0e8e12a9cffabcfa967a7d14eac0b6e (patch)
treeb865f5c5e482e01a52a17bd850dc6acfba7d20e4
parent4a8136db28dae56817f53d61f51346fbb6eee726 (diff)
downloadslirp-3d9118b4a0e8e12a9cffabcfa967a7d14eac0b6e.zip
slirp-3d9118b4a0e8e12a9cffabcfa967a7d14eac0b6e.tar.gz
slirp-3d9118b4a0e8e12a9cffabcfa967a7d14eac0b6e.tar.bz2
Add slirp_remove_guestfwd()
Signed-off-by: Renzo Davoli <renzo@cs.unibo.it> [ Marc-André Lureau - squash & fixup indentation ] Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
-rw-r--r--CHANGELOG.md3
-rw-r--r--src/libslirp.h3
-rw-r--r--src/libslirp.map4
-rw-r--r--src/misc.c14
-rw-r--r--src/misc.h2
-rw-r--r--src/slirp.c7
6 files changed, 33 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d6c9c21..5218a36 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
+ - New API function `slirp_remove_guestfwd`: remove a forward rule previously
+ added by `slirp_add_exec` or `slirp_add_guestfwd`
+
### Changed
### Deprecated
diff --git a/src/libslirp.h b/src/libslirp.h
index 582c711..3c8baba 100644
--- a/src/libslirp.h
+++ b/src/libslirp.h
@@ -140,6 +140,9 @@ int slirp_add_exec(Slirp *slirp, const char *cmdline,
struct in_addr *guest_addr, int guest_port);
int slirp_add_guestfwd(Slirp *slirp, SlirpWriteCb write_cb, void *opaque,
struct in_addr *guest_addr, int guest_port);
+/* remove entries added by slirp_add_exec or slirp_add_guestfwd */
+int slirp_remove_guestfwd(Slirp *slirp, struct in_addr guest_addr,
+ int guest_port);
char *slirp_connection_info(Slirp *slirp);
diff --git a/src/libslirp.map b/src/libslirp.map
index 6dd63a5..20f9c8d 100644
--- a/src/libslirp.map
+++ b/src/libslirp.map
@@ -23,3 +23,7 @@ local:
SLIRP_4.1 {
slirp_new;
} SLIRP_4.0;
+
+SLIRP_4.2 {
+ slirp_remove_guestfwd;
+} SLIRP_4.1;
diff --git a/src/misc.c b/src/misc.c
index 560d5f1..924eb0d 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -50,6 +50,20 @@ struct gfwd_list *add_exec(struct gfwd_list **ex_ptr, const char *cmdline,
return f;
}
+int remove_guestfwd(struct gfwd_list **ex_ptr, struct in_addr addr, int port)
+{
+ for (; *ex_ptr != NULL; ex_ptr = &((*ex_ptr)->ex_next)) {
+ struct gfwd_list *f = *ex_ptr;
+ if (f->ex_addr.s_addr == addr.s_addr && f->ex_fport == port) {
+ *ex_ptr = f->ex_next;
+ g_free(f->ex_exec);
+ g_free(f);
+ return 0;
+ }
+ }
+ return -1;
+}
+
static int slirp_socketpair_with_oob(int sv[2])
{
struct sockaddr_in addr = {
diff --git a/src/misc.h b/src/misc.h
index ccf8cf0..6ff7f54 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -60,4 +60,6 @@ struct gfwd_list *add_guestfwd(struct gfwd_list **ex_ptr, SlirpWriteCb write_cb,
struct gfwd_list *add_exec(struct gfwd_list **ex_ptr, const char *cmdline,
struct in_addr addr, int port);
+int remove_guestfwd(struct gfwd_list **ex_ptr, struct in_addr addr, int port);
+
#endif
diff --git a/src/slirp.c b/src/slirp.c
index 22ca7d3..1abbce5 100644
--- a/src/slirp.c
+++ b/src/slirp.c
@@ -1061,6 +1061,13 @@ int slirp_add_guestfwd(Slirp *slirp, SlirpWriteCb write_cb, void *opaque,
return 0;
}
+int slirp_remove_guestfwd(Slirp *slirp, struct in_addr guest_addr,
+ int guest_port)
+{
+ return remove_guestfwd(&slirp->guestfwd_list, guest_addr,
+ htons(guest_port));
+}
+
ssize_t slirp_send(struct socket *so, const void *buf, size_t len, int flags)
{
if (so->s == -1 && so->guestfwd) {