diff options
author | Renzo Davoli <renzo@cs.unibo.it> | 2019-12-29 16:13:22 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@redhat.com> | 2020-01-04 11:41:47 +0400 |
commit | 3d9118b4a0e8e12a9cffabcfa967a7d14eac0b6e (patch) | |
tree | b865f5c5e482e01a52a17bd850dc6acfba7d20e4 /src | |
parent | 4a8136db28dae56817f53d61f51346fbb6eee726 (diff) | |
download | slirp-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>
Diffstat (limited to 'src')
-rw-r--r-- | src/libslirp.h | 3 | ||||
-rw-r--r-- | src/libslirp.map | 4 | ||||
-rw-r--r-- | src/misc.c | 14 | ||||
-rw-r--r-- | src/misc.h | 2 | ||||
-rw-r--r-- | src/slirp.c | 7 |
5 files changed, 30 insertions, 0 deletions
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; @@ -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 = { @@ -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) { |