diff -r ab32d7e2c0d6 src/login-common/main.c
--- a/src/login-common/main.c	Tue Oct 20 15:49:01 2009 -0400
+++ b/src/login-common/main.c	Thu Oct 22 12:50:52 2009 -0400
@@ -18,6 +18,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <syslog.h>
+#include <sys/stat.h>
 
 bool disable_plaintext_auth, process_per_connection;
 bool verbose_proctitle, verbose_ssl, verbose_auth, auth_debug;
@@ -427,6 +428,13 @@
 	   restrict_access_by_env() is called */
 	lib_init();
 
+	for (i = 3; i < 20; i++) {
+		struct stat st;
+
+		if (fstat(i, &st) == 0 && major(st.st_dev) == 0 && minor(st.st_dev) == 12)
+			i_panic("login fd %d is ino %ld", i, (long)st.st_ino);
+	}
+
 	if (is_inetd) {
 		/* running from inetd. create master process before
 		   dropping privileges. */
diff -r ab32d7e2c0d6 src/master/listener.c
--- a/src/master/listener.c	Tue Oct 20 15:49:01 2009 -0400
+++ b/src/master/listener.c	Thu Oct 22 12:50:52 2009 -0400
@@ -8,6 +8,41 @@
 
 #include <stdlib.h>
 #include <unistd.h>
+#include <sys/stat.h>
+
+static void check_listeners(struct settings *set)
+{
+	const struct listener *listens;
+	unsigned int i, listen_count;
+
+	if (array_is_created(&set->listens)) {
+		listens = array_get(&set->listens, &listen_count);
+		for (i = 0; i < listen_count; i++) {
+			struct stat st;
+
+			if (listens[i].fd < 0) continue;
+			if (net_getsockname(listens[i].fd, NULL, NULL) == 0) continue;
+
+			if (fstat(listens[i].fd, &st) < 0) i_panic("fstat(%d) failed: %m", listens[i].fd);
+			i_panic("listener %d is dev %d.%d ino %ld", i,
+				major(st.st_dev), minor(st.st_dev), (long)st.st_ino);
+		}
+	}
+
+	if (array_is_created(&set->ssl_listens)) {
+		listens = array_get(&set->ssl_listens, &listen_count);
+		for (i = 0; i < listen_count; i++) {
+			struct stat st;
+
+			if (listens[i].fd < 0) continue;
+			if (net_getsockname(listens[i].fd, NULL, NULL) == 0) continue;
+
+			if (fstat(listens[i].fd, &st) < 0) i_panic("fstat(ssl %d) failed: %m", listens[i].fd);
+			i_panic("ssl listener %d is dev %d.%d ino %ld", i,
+				major(st.st_dev), minor(st.st_dev), (long)st.st_ino);
+		}
+	}
+}
 
 static void resolve_ip(const char *set_name, const char *name,
 		       struct ip_addr *ip, unsigned int *port)
@@ -345,10 +380,14 @@
 	}
 
 	for (server = settings_root; server != NULL; server = server->next) {
-		if (server->imap != NULL)
+		if (server->imap != NULL) {
 			listener_listen_missing(server->imap, "imap", retry);
-		if (server->pop3 != NULL)
+			check_listeners(server->imap);
+		}
+		if (server->pop3 != NULL) {
 			listener_listen_missing(server->pop3, "pop3", retry);
+			check_listeners(server->pop3);
+		}
 	}
 }
 
diff -r ab32d7e2c0d6 src/master/login-process.c
--- a/src/master/login-process.c	Tue Oct 20 15:49:01 2009 -0400
+++ b/src/master/login-process.c	Thu Oct 22 12:50:52 2009 -0400
@@ -698,15 +698,31 @@
 	cur_fd = LOGIN_MASTER_SOCKET_FD + 1;
 	if (array_is_created(&group->set->listens)) {
 		listens = array_get(&group->set->listens, &listen_count);
-		for (i = 0; i < listen_count; i++, cur_fd++)
+		for (i = 0; i < listen_count; i++, cur_fd++) {
+			struct stat st;
+
+			if (net_getsockname(listens[i].fd, NULL, NULL) < 0) {
+				if (fstat(listens[i].fd, &st) < 0) i_panic("fstat(%d) failed: %m", listens[i].fd);
+				i_panic("ssl listener %d is dev %d.%d ino %ld", i,
+					major(st.st_dev), minor(st.st_dev), (long)st.st_ino);
+			}
 			dup2_append(&dups, listens[i].fd, cur_fd);
+		}
 	}
 
 	if (array_is_created(&group->set->ssl_listens)) {
 		listens = array_get(&group->set->ssl_listens,
 				    &ssl_listen_count);
-		for (i = 0; i < ssl_listen_count; i++, cur_fd++)
+		for (i = 0; i < ssl_listen_count; i++, cur_fd++) {
+			struct stat st;
+
+			if (net_getsockname(listens[i].fd, NULL, NULL) < 0) {
+				if (fstat(listens[i].fd, &st) < 0) i_panic("fstat(%d) failed: %m", listens[i].fd);
+				i_panic("ssl listener %d is dev %d.%d ino %ld", i,
+					major(st.st_dev), minor(st.st_dev), (long)st.st_ino);
+			}
 			dup2_append(&dups, listens[i].fd, cur_fd);
+		}
 	}
 
 	/* make sure we don't leak syslog fd. try to do it as late as possible,
