Mercurial > dovecot > original-hg > dovecot-1.2
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)); } }