From: Sergiy Vyshnevetskiy <serg @ vostok.net>
Subject: [zebra 19019] [PATCH] daemons -A option

Works now. Patch attached. Not tested for IPv6, but should work there too.
diff --git a/lib/vty.c b/lib/vty.c
index d31521c..d1db7f4 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -1776,14 +1776,37 @@
 
 /* Make vty server socket. */
 void
-vty_serv_sock_family (unsigned short port, int family)
+vty_serv_sock_family (const char* addr, unsigned short port, int family)
 {
   int ret;
   union sockunion su;
   int accept_sock;
+  void* naddr=NULL;
 
   memset (&su, 0, sizeof (union sockunion));
   su.sa.sa_family = family;
+  if(addr)
+    switch(family)
+    {
+      case AF_INET:
+        naddr=&su.sin.sin_addr;
+#ifdef HAVE_IPV6
+      case AF_INET6:
+        naddr=&su.sin6.sin6_addr;
+#endif	
+    }
+
+  if(naddr)
+    switch(inet_pton(family,addr,naddr))
+    {
+      case -1:
+        zlog_err("bad address %s",addr);
+	naddr=NULL;
+	break;
+      case 0:
+        zlog_err("error translating address %s: %s",addr,strerror(errno));
+	naddr=NULL;
+    }
 
   /* Make new socket. */
   accept_sock = sockunion_stream_socket (&su);
@@ -1795,9 +1818,10 @@
   sockopt_reuseport (accept_sock);
 
   /* Bind socket to universal address and given port. */
-  ret = sockunion_bind (accept_sock, &su, port, NULL);
+  ret = sockunion_bind (accept_sock, &su, port, naddr);
   if (ret < 0)
     {
+      zlog_warn("can't bind socket");
       close (accept_sock);	/* Avoid sd leak. */
       return;
     }
@@ -1966,7 +1990,7 @@
 
 /* Determine address family to bind. */
 void
-vty_serv_sock (const char *hostname, unsigned short port, char *path)
+vty_serv_sock (const char *addr, unsigned short port, char *path)
 {
   /* If port is set to 0, do not listen on TCP/IP at all! */
   if (port)
@@ -1974,13 +1998,13 @@
 
 #ifdef HAVE_IPV6
 #ifdef NRL
-      vty_serv_sock_family (port, AF_INET);
-      vty_serv_sock_family (port, AF_INET6);
+      vty_serv_sock_family (addr, port, AF_INET);
+      vty_serv_sock_family (addr, port, AF_INET6);
 #else /* ! NRL */
-      vty_serv_sock_addrinfo (hostname, port);
+      vty_serv_sock_addrinfo (addr, port);
 #endif /* NRL*/
 #else /* ! HAVE_IPV6 */
-      vty_serv_sock_family (port, AF_INET);
+      vty_serv_sock_family (addr,port, AF_INET);
 #endif /* HAVE_IPV6 */
     }