]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Some versions of Mac OS X have buggy CMSG_* macros, avoid using them.
authorTimo Sirainen <tss@iki.fi>
Fri, 19 Dec 2008 08:02:49 +0000 (10:02 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 19 Dec 2008 08:02:49 +0000 (10:02 +0200)
Patch by Apple.

--HG--
branch : HEAD

configure.in

index 0faf81387297d3c8a8cfbec6bb314552a93817ff..eff71750bc20d928b17a3aa5ee0801f82a1b63e6 100644 (file)
@@ -1130,9 +1130,17 @@ AC_CACHE_CHECK([whether fd passing works],i_cv_fd_passing,[
       #include <fcntl.h>
       #include "fdpass.h"
       
+      int nopen(void)
+      {
+             int i, n;
+             struct stat sb;
+             for (i = n = 0; i < 256; i++)
+                 if (fstat(i, &sb) == 0) n++;
+             return n;
+      }
       int main(void)
       {
-             int fd[2], send_fd, recv_fd, status;
+             int fd[2], send_fd, recv_fd, status, n1, n2;
              struct stat st, st2;
              char data;
       
@@ -1141,6 +1149,7 @@ AC_CACHE_CHECK([whether fd passing works],i_cv_fd_passing,[
              unlink("conftest.fdpass");
              if (fstat(send_fd, &st) < 0) return 2;
              if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) return 2;
+             n1 = nopen();
       
              switch (fork()) {
              case -1:
@@ -1157,7 +1166,10 @@ AC_CACHE_CHECK([whether fd passing works],i_cv_fd_passing,[
                        return status;
                      if (fd_read(fd[1], &data, 1, &recv_fd) != 1) return 1;
                      if (fstat(recv_fd, &st2) < 0) return 2;
-                     return st.st_ino == st2.st_ino ? 0 : 1;
+                     /* nopen check is for making sure that only a single fd
+                        was received */
+                     n2 = nopen();
+                     return st.st_ino == st2.st_ino && n2 == n1 + 1 ? 0 : 1;
              }
       }
     ], [
@@ -1176,6 +1188,14 @@ AC_CACHE_CHECK([whether fd passing works],i_cv_fd_passing,[
   done
 ]);
 
+case "$host_os" in
+darwin[[1-9]].*)
+       if test "$i_cv_fd_passing" = "yes"; then
+               i_cv_fd_passing=buggy_cmsg_macros
+       fi
+       ;;
+esac
+
 if test $i_cv_fd_passing = buggy_cmsg_macros; then
   AC_DEFINE(BUGGY_CMSG_MACROS,, Define if you have buggy CMSG macros)
 fi