r12785: make the iface_*() functions return strings which do not get
authorAndrew Tridgell <tridge@samba.org>
Mon, 9 Jan 2006 02:43:38 +0000 (02:43 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:49:55 +0000 (13:49 -0500)
overwritten by another call (due to the implied static in
iface_ntoa()). This should save abartlet some pain
(This used to be commit 2244f298ace9f8832695cafd17c54324c11416f1)

source4/lib/netif/interface.c

index efb7ecce3332fb2d57fe66b70bc5d0101158e1ca..1135bbf868765379a3f30164cb5a8a3bc5a3475c 100644 (file)
@@ -31,6 +31,9 @@ struct interface {
        struct ipv4_addr ip;
        struct ipv4_addr bcast;
        struct ipv4_addr nmask;
        struct ipv4_addr ip;
        struct ipv4_addr bcast;
        struct ipv4_addr nmask;
+       const char *ip_s;
+       const char *bcast_s;
+       const char *nmask_s;
 };
 
 static struct interface *local_interfaces;
 };
 
 static struct interface *local_interfaces;
@@ -88,11 +91,16 @@ static void add_interface(struct in_addr ip, struct in_addr nmask)
        iface->nmask = tov4(nmask);
        iface->bcast.addr = MKBCADDR(iface->ip.addr, iface->nmask.addr);
 
        iface->nmask = tov4(nmask);
        iface->bcast.addr = MKBCADDR(iface->ip.addr, iface->nmask.addr);
 
+       /* keep string versions too, to avoid people tripping over the implied
+          static in sys_inet_ntoa() */
+       iface->ip_s = talloc_strdup(iface, sys_inet_ntoa(iface->ip));
+       iface->bcast_s = talloc_strdup(iface, sys_inet_ntoa(iface->bcast));
+       iface->nmask_s = talloc_strdup(iface, sys_inet_ntoa(iface->nmask));
+
        DLIST_ADD_END(local_interfaces, iface, struct interface *);
 
        DLIST_ADD_END(local_interfaces, iface, struct interface *);
 
-       DEBUG(2,("added interface ip=%s ",sys_inet_ntoa(iface->ip)));
-       DEBUG(2,("bcast=%s ",sys_inet_ntoa(iface->bcast)));
-       DEBUG(2,("nmask=%s\n",sys_inet_ntoa(iface->nmask)));         
+       DEBUG(2,("added interface ip=%s bcast=%s nmask=%s\n", 
+                iface->ip_s, iface->bcast_s, iface->nmask_s));
 }
 
 
 }
 
 
@@ -261,7 +269,7 @@ const char *iface_n_ip(int n)
                n--;
 
        if (i) {
                n--;
 
        if (i) {
-               return sys_inet_ntoa(i->ip);
+               return i->ip_s;
        }
        return NULL;
 }
        }
        return NULL;
 }
@@ -279,7 +287,7 @@ const char *iface_n_bcast(int n)
                n--;
 
        if (i) {
                n--;
 
        if (i) {
-               return sys_inet_ntoa(i->bcast);
+               return i->bcast_s;
        }
        return NULL;
 }
        }
        return NULL;
 }
@@ -297,7 +305,7 @@ const char *iface_n_netmask(int n)
                n--;
 
        if (i) {
                n--;
 
        if (i) {
-               return sys_inet_ntoa(i->nmask);
+               return i->nmask_s;
        }
        return NULL;
 }
        }
        return NULL;
 }
@@ -316,7 +324,7 @@ const char *iface_best_ip(const char *dest)
        ip.s_addr = interpret_addr(dest);
        iface = iface_find(ip, True);
        if (iface) {
        ip.s_addr = interpret_addr(dest);
        iface = iface_find(ip, True);
        if (iface) {
-               return sys_inet_ntoa(iface->ip);
+               return iface->ip_s;
        }
        return iface_n_ip(0);
 }
        }
        return iface_n_ip(0);
 }