2007-10-30 Nick Hilliard <nick@inex.ie>

	* bgp_main.c: Add 'listenon' argument, to pass address to bind
	  to.
	* bgp_network.c: (bgp_socket) Extend to take bind address.
	* bgpd.c: (bgp_init) Pass stored address.
	* bgpd.h: (struct bgp_master) storage for bind address

2007-11-01 Paul Jakma <paul.jakma@sun.com>

	* tools/multiple-bgpd.sh: New, quick script to launch a bunch of
	  bgpds.
diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c
index 8040e47..6b8c8a4 100644
--- a/bgpd/bgp_network.c
+++ b/bgpd/bgp_network.c
@@ -282,7 +282,7 @@
 /* IPv6 supported version of BGP server socket setup.  */
 #if defined (HAVE_IPV6) && ! defined (NRL)
 int
-bgp_socket (struct bgp *bgp, unsigned short port)
+bgp_socket (struct bgp *bgp, unsigned short port, char *address)
 {
   int ret, en;
   struct addrinfo req;
@@ -299,7 +299,7 @@
   sprintf (port_str, "%d", port);
   port_str[sizeof (port_str) - 1] = '\0';
 
-  ret = getaddrinfo (NULL, port_str, &req, &ainfo);
+  ret = getaddrinfo (address, port_str, &req, &ainfo);
   if (ret != 0)
     {
       zlog_err ("getaddrinfo: %s", gai_strerror (ret));
@@ -357,7 +357,7 @@
 #else
 /* Traditional IPv4 only version.  */
 int
-bgp_socket (struct bgp *bgp, unsigned short port)
+bgp_socket (struct bgp *bgp, unsigned short port, char *address)
 {
   int sock;
   int socklen;
@@ -379,6 +379,14 @@
   sin.sin_family = AF_INET;
   sin.sin_port = htons (port);
   socklen = sizeof (struct sockaddr_in);
+
+  ret = inet_aton(address, &sin.sin_addr);
+
+  if (ret < 1)
+    {
+      zlog_err("bgp_socket: could not parse ip address %s: ", address, safe_strerror (errno));
+      return ret;
+    }
 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
   sin.sin_len = socklen;
 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */