diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2009-06-24 14:42:31 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-06-29 08:52:49 -0500 |
commit | f2360de02906cbcd58181be8698565630a80eed6 (patch) | |
tree | 671aa4af61a0da6080354fa3b02d1ef845bf68fc | |
parent | ad55ea45911dfe3c65840e0c0be1a48dae3670eb (diff) | |
download | slirp-f2360de02906cbcd58181be8698565630a80eed6.zip slirp-f2360de02906cbcd58181be8698565630a80eed6.tar.gz slirp-f2360de02906cbcd58181be8698565630a80eed6.tar.bz2 |
slirp: Allocate/free stack instance dynamically
Allocate the internal slirp state dynamically and provide and call
slirp_cleanup to properly release it after use. This patch finally
unbreaks slirp release and re-instantiation via host_net_* monitor
commands.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | libslirp.h | 1 | ||||
-rw-r--r-- | main.h | 1 | ||||
-rw-r--r-- | slirp.c | 32 | ||||
-rw-r--r-- | slirp.h | 2 |
4 files changed, 21 insertions, 15 deletions
@@ -13,6 +13,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, const char *vhostname, const char *tftp_path, const char *bootfile, struct in_addr vdhcp_start, struct in_addr vnameserver, void *opaque); +void slirp_cleanup(Slirp *slirp); void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds); @@ -11,7 +11,6 @@ #define TOWRITEMAX 512 -extern int link_up; extern int slirp_socket; extern int slirp_socket_unit; extern int slirp_socket_port; @@ -40,8 +40,6 @@ static const uint8_t special_ethaddr[6] = { static const uint8_t zero_ethaddr[6] = { 0, 0, 0, 0, 0, 0 }; -int link_up; // FIXME: kill this - /* XXX: suppress those select globals */ fd_set *global_readfds, *global_writefds, *global_xfds; @@ -49,7 +47,7 @@ u_int curtime; static u_int time_fasttimo, last_slowtimo; static int do_slowtimo; -Slirp slirp_instance; +Slirp *slirp_instance; #ifdef _WIN32 @@ -193,11 +191,10 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, const char *bootfile, struct in_addr vdhcp_start, struct in_addr vnameserver, void *opaque) { - Slirp *slirp = &slirp_instance; + Slirp *slirp = qemu_mallocz(sizeof(Slirp)); slirp_init_once(); - link_up = 1; slirp->restricted = restricted; if_init(slirp); @@ -213,13 +210,9 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, pstrcpy(slirp->client_hostname, sizeof(slirp->client_hostname), vhostname); } - qemu_free(slirp->tftp_prefix); - slirp->tftp_prefix = NULL; if (tftp_path) { slirp->tftp_prefix = qemu_strdup(tftp_path); } - qemu_free(slirp->bootp_filename); - slirp->bootp_filename = NULL; if (bootfile) { slirp->bootp_filename = qemu_strdup(bootfile); } @@ -230,9 +223,22 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, register_savevm("slirp", 0, 2, slirp_state_save, slirp_state_load, slirp); + slirp_instance = slirp; + return slirp; } +void slirp_cleanup(Slirp *slirp) +{ + unregister_savevm("slirp", slirp); + + qemu_free(slirp->tftp_prefix); + qemu_free(slirp->bootp_filename); + qemu_free(slirp); + + slirp_instance = NULL; +} + #define CONN_CANFSEND(so) \ (((so)->so_state & (SS_FCANTSENDMORE | SS_ISFCONNECTED)) == SS_ISFCONNECTED) #define CONN_CANFRCV(so) \ @@ -267,11 +273,11 @@ static void updtime(void) void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds) { - Slirp *slirp = &slirp_instance; + Slirp *slirp = slirp_instance; struct socket *so, *so_next; int nfds; - if (!link_up) { + if (!slirp_instance) { return; } @@ -387,11 +393,11 @@ void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds, void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int select_error) { - Slirp *slirp = &slirp_instance; + Slirp *slirp = slirp_instance; struct socket *so, *so_next; int ret; - if (!link_up) { + if (!slirp_instance) { return; } @@ -259,7 +259,7 @@ struct Slirp { void *opaque; }; -extern Slirp slirp_instance; +extern Slirp *slirp_instance; #ifndef NULL #define NULL (void *)0 |