]> git.proxmox.com Git - qemu.git/commitdiff
slirp: Factor out one-time initialization
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 24 Jun 2009 12:42:30 +0000 (14:42 +0200)
committerAnthony Liguori <aliguori@us.ibm.com>
Mon, 29 Jun 2009 13:52:47 +0000 (08:52 -0500)
In order to prepare re-initialization and multi-instance slirp, factor
out init code that is of global scope and (at least for now) only need
to be run once.

This also fixes the potentially uninitialized use of our_addr in
get_dns_addr.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
slirp/misc.c
slirp/misc.h
slirp/slirp.c

index ae6f2114907e09a8a8009c62d7c7900ed8711afb..cffb3a0dac9e707526c2a7a678cc80eadfd83c2e 100644 (file)
@@ -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;
index 82dd5965c317a74effece6e12d809ac71b8d0853..c21f69b0681d1b177b41805cd82d996fee3adec8 100644 (file)
@@ -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));
index 44a53cdfe530c1f1acd7187c5bdd763341d96f70..ea66c0cee78db7a5a9682547602faf5acf352a52 100644 (file)
@@ -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);
 }