*** empty log message ***

diff --git a/ipconfig/main.c b/ipconfig/main.c
index c175532..96b7808 100644
--- a/ipconfig/main.c
+++ b/ipconfig/main.c
@@ -9,6 +9,11 @@
 #include <stdlib.h>
 #include <time.h>
 #include <arpa/inet.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <fcntl.h>
+
+#include <linux/if_arp.h>
 
 #include "ipconfig.h"
 #include "netdev.h"
@@ -17,6 +22,7 @@
 #include "dhcp_proto.h"
 #include "packet.h"
 
+static const char sysfs_class_net[] = "/sys/class/net";
 static const char *progname;
 static char do_not_config;
 static unsigned int default_caps = CAP_DHCP | CAP_BOOTP | CAP_RARP;
@@ -444,53 +450,7 @@
 	}
 }
 
-static struct netdev *add_device(const char *info);
-
-static void add_all_devices(struct netdev *template)
-{
-#define MAX_IFS 128
-	struct ifreq ifr[MAX_IFS];
-	struct ifconf ifc;
-	int fd, nif, i;
-
-	fd = packet_open();
-
-	ifc.ifc_len = sizeof(ifr);
-	ifc.ifc_req = ifr;
-
-	if (ioctl(fd, SIOCGIFCONF, &ifc) == -1) {
-		perror("SIOCGIFCONF");
-		exit(1);
-	}
-	nif = ifc.ifc_len / sizeof(ifr[0]);
-
-	for (i = 0; i < nif; i++) {
-		struct netdev *dev;
-
-		if (strcmp(ifr[i].ifr_name, "lo") == 0)
-			continue;
-		if ((dev = add_device(ifr[i].ifr_name)) == NULL)
-			continue;
-
-		if (template->ip_addr != INADDR_NONE)
-			dev->ip_addr = template->ip_addr;
-		if (template->ip_server != INADDR_NONE)
-			dev->ip_server = template->ip_server;
-		if (template->ip_gateway != INADDR_NONE)
-			dev->ip_gateway = template->ip_gateway;
-		if (template->ip_netmask != INADDR_NONE)
-			dev->ip_netmask = template->ip_netmask;
-		if (template->ip_nameserver[0] != INADDR_NONE)
-			dev->ip_nameserver[0] = template->ip_nameserver[0];
-		if (template->ip_nameserver[1] != INADDR_NONE)
-			dev->ip_nameserver[1] = template->ip_nameserver[1];
-		if (template->hostname[0] != '\0')
-			strcpy(dev->hostname, template->hostname);
-		dev->caps &= template->caps;
-
-		bringup_device(dev);
-	}
-}
+static void add_all_devices(struct netdev *template);
 
 static int parse_device(struct netdev *dev, const char *ip)
 {
@@ -557,6 +517,36 @@
 	return 1;
 }
 
+static void bringup_device(struct netdev *dev)
+{
+	if (netdev_up(dev) == 0) {
+		if (dev->caps) {
+			add_one_dev(dev);
+		} else {
+			complete_device(dev);
+		}
+	}
+}
+
+static void bringup_one_dev(struct netdev *template, struct netdev *dev)
+{
+		if (template->ip_addr != INADDR_NONE)
+			dev->ip_addr = template->ip_addr;
+		if (template->ip_server != INADDR_NONE)
+			dev->ip_server = template->ip_server;
+		if (template->ip_gateway != INADDR_NONE)
+			dev->ip_gateway = template->ip_gateway;
+		if (template->ip_nameserver[0] != INADDR_NONE)
+			dev->ip_nameserver[0] = template->ip_nameserver[0];
+		if (template->ip_nameserver[1] != INADDR_NONE)
+			dev->ip_nameserver[1] = template->ip_nameserver[1];
+		if (template->hostname[0] != '\0')
+			strcpy(dev->hostname, template->hostname);
+		dev->caps &= template->caps;
+
+		bringup_device(dev);
+}
+
 static struct netdev *add_device(const char *info)
 {
 	struct netdev *dev;
@@ -593,6 +583,53 @@
 	return NULL;
 }
 
+static int add_all_devices(struct netdev *template)
+{
+	DIR *d;
+	struct dirent *de;
+	struct netdev *dev;
+	char t[PATH_MAX], p[255];
+	int i, fd;
+	unsigned long flags;
+
+	d = opendir(sysfs_class_net);
+	if (!d)
+		return 0;
+
+	while((de = readdir(d)) != NULL ) {
+		/* This excludes devices beginning with dots or "dummy", as well as . or .. */
+		if ( de->d_name[0] == '.' || !strcmp(de->d_name, "..") )
+			continue;
+		i = snprintf(t, PATH_MAX-1, "%s/%s/flags", sysfs_class_net, de->d_name);
+		if (i < 0 || i >= PATH_MAX-1)
+			continue;
+		t[i] = '\0';
+		fd = open(t, O_RDONLY);
+		if (fd < 0) {
+			perror(t);
+			continue;
+		}
+		i = read(fd, &p, sizeof(p) - 1);
+		close(fd);
+		if (i < 0) {
+			perror(t);
+			continue;
+		}
+		p[i] = '\0';
+		flags = strtoul(p, NULL, 0);
+		/* Heuristic for if this is a reasonable boot interface.  This is the same
+		   logic the in-kernel ipconfig uses... */
+		if ( !(flags & IFF_LOOPBACK) &&
+		     (flags & (IFF_BROADCAST|IFF_POINTOPOINT)) )
+			continue;
+		if ((dev = add_device(de->d_name)) == NULL)
+			continue;
+		bringup_one_dev(template, dev);
+	}
+	closedir(d);
+	return 1;
+}
+
 static int check_autoconfig(void)
 {
 	int ndev = 0, nauto = 0;