changeset 4978:8d2efdb73816 HEAD

debug: OSX leaks an fd from gettimeofday(), ignore it. Also cleaned up the code a bit.
author Timo Sirainen <tss@iki.fi>
date Fri, 29 Dec 2006 00:52:00 +0200
parents a9babc1b3c65
children b51777b0834c
files src/lib/fd-close-on-exec.c
diffstat 1 files changed, 43 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/fd-close-on-exec.c	Thu Dec 28 22:54:59 2006 +0200
+++ b/src/lib/fd-close-on-exec.c	Fri Dec 29 00:52:00 2006 +0200
@@ -27,50 +27,58 @@
 	struct ip_addr addr, raddr;
 	unsigned int port, rport;
 	struct stat st;
-
-	while (first_fd < last_fd) {
-		if (fcntl(first_fd, F_GETFD, 0) != -1 || errno != EBADF) {
-			int old_errno = errno;
+	int old_errno;
 
-			if (net_getsockname(first_fd, &addr, &port) == 0) {
-				if (addr.family == AF_UNIX) {
-					struct sockaddr_un sa;
-					socklen_t socklen = sizeof(sa);
+	for (; first_fd < last_fd; first_fd++) {
+		if (fcntl(first_fd, F_GETFD, 0) == -1 && errno == EBADF)
+			continue;
+
+		old_errno = errno;
 
-					if (getsockname(first_fd, (void *)&sa,
-							&socklen) < 0)
-						sa.sun_path[0] = '\0';
+		if (net_getsockname(first_fd, &addr, &port) == 0) {
+			if (addr.family == AF_UNIX) {
+				struct sockaddr_un sa;
 
-					i_panic("Leaked UNIX socket fd %d: %s",
-						first_fd, sa.sun_path);
-				}
+				socklen_t socklen = sizeof(sa);
 
-				if (net_getpeername(first_fd,
-						    &raddr, &rport) < 0) {
-					memset(&raddr, 0, sizeof(raddr));
-					rport = 0;
-				}
-				i_panic("Leaked socket fd %d: %s:%u -> %s:%u",
-					first_fd, net_ip2addr(&addr), port,
-					net_ip2addr(&raddr), rport);
+				if (getsockname(first_fd, (void *)&sa,
+						&socklen) < 0)
+					sa.sun_path[0] = '\0';
+
+				i_panic("Leaked UNIX socket fd %d: %s",
+					first_fd, sa.sun_path);
 			}
 
-			if (fstat(first_fd, &st) == 0) {
+			if (net_getpeername(first_fd, &raddr, &rport) < 0) {
+				memset(&raddr, 0, sizeof(raddr));
+				rport = 0;
+			}
+			i_panic("Leaked socket fd %d: %s:%u -> %s:%u",
+				first_fd, net_ip2addr(&addr), port,
+				net_ip2addr(&raddr), rport);
+		}
+
+		if (fstat(first_fd, &st) == 0) {
+#ifdef __APPLE__
+			/* OSX workaround: gettimeofday() calls shm_open()
+			   internally and the fd won't get closed on exec.
+			   We'll just skip all ino/dev=0 files and hope they
+			   weren't anything else. */
+			if (st.st_ino == 0 && st.st_dev == 0)
+				continue;
+#endif
 #ifdef HAVE_SYS_SYSMACROS_H
-				i_panic("Leaked file fd %d: dev %s.%s inode %s", first_fd,
-					dec2str(major(st.st_dev)),
-					dec2str(minor(st.st_dev)),
-					dec2str(st.st_ino));
+			i_panic("Leaked file fd %d: dev %s.%s inode %s",
+				first_fd, dec2str(major(st.st_dev)),
+				dec2str(minor(st.st_dev)), dec2str(st.st_ino));
 #else
-				i_panic("Leaked file fd %d: dev %s inode %s",
-					first_fd, dec2str(st.st_dev),
-					dec2str(st.st_ino));
+			i_panic("Leaked file fd %d: dev %s inode %s",
+				first_fd, dec2str(st.st_dev),
+				dec2str(st.st_ino));
 #endif
-			}
+		}
 
-			i_panic("Leaked unknown fd %d (errno = %s)",
-				first_fd, strerror(old_errno));
-		}
-		first_fd++;
+		i_panic("Leaked unknown fd %d (errno = %s)",
+			first_fd, strerror(old_errno));
 	}
 }