summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--slirp/misc.c17
-rw-r--r--slirp/misc.h1
-rw-r--r--slirp/slirp.c60
3 files changed, 41 insertions, 37 deletions
diff --git a/slirp/misc.c b/slirp/misc.c
index ae6f211490..cffb3a0dac 100644
--- a/slirp/misc.c
+++ b/slirp/misc.c
@@ -16,23 +16,6 @@ int slirp_debug = DBG_CALL|DBG_MISC|DBG_ERROR;
u_int curtime, time_fasttimo, last_slowtimo;
-/*
- * Get our IP address and put it in our_addr
- */
-void
-getouraddr(void)
-{
- char buff[256];
- struct hostent *he = NULL;
-
- if (gethostname(buff,256) == 0)
- he = gethostbyname(buff);
- if (he)
- our_addr = *(struct in_addr *)he->h_addr;
- if (our_addr.s_addr == 0)
- our_addr.s_addr = loopback_addr.s_addr;
-}
-
struct quehead {
struct quehead *qh_link;
struct quehead *qh_rlink;
diff --git a/slirp/misc.h b/slirp/misc.h
index 82dd5965c3..c21f69b068 100644
--- a/slirp/misc.h
+++ b/slirp/misc.h
@@ -63,7 +63,6 @@ extern int x_port, x_server, x_display;
int show_x _P((char *, struct socket *));
void redir_x _P((u_int32_t, int, int, int));
-void getouraddr _P((void));
void slirp_insque _P((void *, void *));
void slirp_remque _P((void *));
int add_exec _P((struct ex_list **, int, char *, struct in_addr, int));
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 44a53cdfe5..ea66c0cee7 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -102,6 +102,11 @@ static int get_dns_addr(struct in_addr *pdns_addr)
return 0;
}
+static void winsock_cleanup(void)
+{
+ WSACleanup();
+}
+
#else
static int get_dns_addr(struct in_addr *pdns_addr)
@@ -152,13 +157,44 @@ static int get_dns_addr(struct in_addr *pdns_addr)
#endif
-#ifdef _WIN32
-static void slirp_cleanup(void)
+static void slirp_init_once(void)
{
- WSACleanup();
-}
+ static int initialized;
+ struct hostent *he;
+ char our_name[256];
+#ifdef _WIN32
+ WSADATA Data;
#endif
+ if (initialized) {
+ return;
+ }
+ initialized = 1;
+
+#ifdef _WIN32
+ WSAStartup(MAKEWORD(2,0), &Data);
+ atexit(winsock_cleanup);
+#endif
+
+ loopback_addr.s_addr = htonl(INADDR_LOOPBACK);
+
+ /* FIXME: This address may change during runtime */
+ if (gethostname(our_name, sizeof(our_name)) == 0) {
+ he = gethostbyname(our_name);
+ if (he) {
+ our_addr = *(struct in_addr *)he->h_addr;
+ }
+ }
+ if (our_addr.s_addr == 0) {
+ our_addr = loopback_addr;
+ }
+
+ /* FIXME: This address may change during runtime */
+ if (get_dns_addr(&dns_addr) < 0) {
+ dns_addr = loopback_addr;
+ }
+}
+
static void slirp_state_save(QEMUFile *f, void *opaque);
static int slirp_state_load(QEMUFile *f, void *opaque, int version_id);
@@ -168,12 +204,7 @@ void slirp_init(int restricted, struct in_addr vnetwork,
const char *bootfile, struct in_addr vdhcp_start,
struct in_addr vnameserver)
{
-#ifdef _WIN32
- WSADATA Data;
-
- WSAStartup(MAKEWORD(2,0), &Data);
- atexit(slirp_cleanup);
-#endif
+ slirp_init_once();
link_up = 1;
slirp_restrict = restricted;
@@ -184,14 +215,6 @@ void slirp_init(int restricted, struct in_addr vnetwork,
/* Initialise mbufs *after* setting the MTU */
m_init();
- /* set default addresses */
- inet_aton("127.0.0.1", &loopback_addr);
-
- if (get_dns_addr(&dns_addr) < 0) {
- dns_addr = loopback_addr;
- fprintf (stderr, "Warning: No DNS servers found\n");
- }
-
vnetwork_addr = vnetwork;
vnetwork_mask = vnetmask;
vhost_addr = vhost;
@@ -211,7 +234,6 @@ void slirp_init(int restricted, struct in_addr vnetwork,
vdhcp_startaddr = vdhcp_start;
vnameserver_addr = vnameserver;
- getouraddr();
register_savevm("slirp", 0, 1, slirp_state_save, slirp_state_load, NULL);
}