bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/3] passfd: speed up configure and drop unused code


From: Eric Blake
Subject: [PATCH 3/3] passfd: speed up configure and drop unused code
Date: Thu, 21 Apr 2011 14:26:47 -0600

Ultimately, it would be nice to provide a sendmsg and recvmsg module,
and have those provide a replacement struct msghdr and silently
convert msg_accrights into the replacement struct's msg_control, when
targeting older BSD.  But until that point in time, this is a nice
cleanup.

SCM_RIGHTS really only works on Unix sockets; however, there is
nothing in passfd.c that needs to be hard-coded to this (rather,
the hard-coding of the address family is done externally when
the socket or socketpair is created).

* m4/afunix.m4 (gl_SOCKET_AFUNIX): Rename...
* m4/passfd.m4 (gl_PASSFD): ...to something more fitting of
its use.  Drop test for setting unused HAVE_UNIXSOCKET_SCM_RIGHTS.
Instead of probing at configure for unix_scm_rights_bsd44_way,
instead probe for CMSG_FIRSTHDR at compile time.  Simplify BSD 4.3
check to a struct member probe.
* lib/passfd.c (includes): Nothing here requires <sys/un.h>.
(sendfd, recvfd): Update preprocessor checks.
* modules/passfd (Files): Reflect rename, and drop unused file.
(Depends-on): Drop unused dependency.

Signed-off-by: Eric Blake <address@hidden>
---
 ChangeLog      |   12 ++++++
 lib/passfd.c   |   15 +++----
 m4/afunix.m4   |  117 --------------------------------------------------------
 m4/passfd.m4   |   23 +++++++++++
 modules/passfd |    6 +--
 5 files changed, 43 insertions(+), 130 deletions(-)
 delete mode 100644 m4/afunix.m4
 create mode 100644 m4/passfd.m4

diff --git a/ChangeLog b/ChangeLog
index ffc7bd7..9e2a619 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2011-04-21  Eric Blake  <address@hidden>

+       passfd: speed up configure and drop unused code
+       * m4/afunix.m4 (gl_SOCKET_AFUNIX): Rename...
+       * m4/passfd.m4 (gl_PASSFD): ...to something more fitting of
+       its use.  Drop test for setting unused HAVE_UNIXSOCKET_SCM_RIGHTS.
+       Instead of probing at configure for unix_scm_rights_bsd44_way,
+       instead probe for CMSG_FIRSTHDR at compile time.  Simplify BSD 4.3
+       check to a struct member probe.
+       * lib/passfd.c (includes): Nothing here requires <sys/un.h>.
+       (sendfd, recvfd): Update preprocessor checks.
+       * modules/passfd (Files): Reflect rename, and drop unused file.
+       (Depends-on): Drop unused dependency.
+
        passfd: allow compilation on mingw
        * modules/sys_socket (Depends-on): Add sys_uio.
        * lib/sys_socket.in.h address@hidden@]: Use it for struct
diff --git a/lib/passfd.c b/lib/passfd.c
index 5d4c6a7..a4d8841 100644
--- a/lib/passfd.c
+++ b/lib/passfd.c
@@ -27,9 +27,6 @@
 #include <unistd.h>

 #include <sys/socket.h>
-#if HAVE_SYS_UN_H
-# include <sys/un.h>
-#endif

 #include "cloexec.h"

@@ -49,7 +46,7 @@ sendfd (int sock, int fd)
   char send = 0;
   struct iovec iov;
   struct msghdr msg;
-# if HAVE_UNIXSOCKET_SCM_RIGHTS_BSD44_WAY
+# ifdef CMSG_FIRSTHDR
   struct cmsghdr *cmsg;
   char buf[CMSG_SPACE (sizeof fd)];
 # endif
@@ -63,7 +60,7 @@ sendfd (int sock, int fd)
   msg.msg_name = NULL;
   msg.msg_namelen = 0;

-# if HAVE_UNIXSOCKET_SCM_RIGHTS_BSD44_WAY
+# ifdef CMSG_FIRSTHDR
   msg.msg_control = buf;
   msg.msg_controllen = sizeof buf;
   cmsg = CMSG_FIRSTHDR (&msg);
@@ -72,7 +69,7 @@ sendfd (int sock, int fd)
   cmsg->cmsg_len = CMSG_LEN (sizeof fd);
   /* Initialize the payload: */
   memcpy (CMSG_DATA (cmsg), &fd, sizeof fd);
-# elif HAVE_UNIXSOCKET_SCM_RIGHTS_BSD43_WAY
+# elif HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
   msg.msg_accrights = &fd;
   msg.msg_accrightslen = sizeof fd;
 # else
@@ -107,7 +104,7 @@ recvfd (int sock, int flags)
   struct iovec iov;
   struct msghdr msg;
   int fd = -1;
-# if HAVE_UNIXSOCKET_SCM_RIGHTS_BSD44_WAY
+# ifdef CMSG_FIRSTHDR
   struct cmsghdr *cmsg;
   char buf[CMSG_SPACE (sizeof fd)];
   int flags_recvmsg = flags & O_CLOEXEC ? MSG_CMSG_CLOEXEC : 0;
@@ -128,7 +125,7 @@ recvfd (int sock, int flags)
   msg.msg_name = NULL;
   msg.msg_namelen = 0;

-# if HAVE_UNIXSOCKET_SCM_RIGHTS_BSD44_WAY
+# ifdef CMSG_FIRSTHDR
   msg.msg_control = buf;
   msg.msg_controllen = sizeof buf;
   cmsg = CMSG_FIRSTHDR (&msg);
@@ -166,7 +163,7 @@ recvfd (int sock, int flags)
         }
     }

-# elif HAVE_UNIXSOCKET_SCM_RIGHTS_BSD43_WAY
+# elif HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
   msg.msg_accrights = &fd;
   msg.msg_accrightslen = sizeof fd;
   if (recvmsg (sock, &msg, 0) < 0)
diff --git a/m4/afunix.m4 b/m4/afunix.m4
deleted file mode 100644
index 3f5eb44..0000000
--- a/m4/afunix.m4
+++ /dev/null
@@ -1,117 +0,0 @@
-# afunix.m4 serial 7
-dnl Copyright (C) 2011 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([gl_SOCKET_AFUNIX],
-[
-  AC_REQUIRE([gl_HEADER_SYS_SOCKET])
-  AC_REQUIRE([gl_SOCKET_FAMILY_UNIX])
-  AC_CHECK_FUNCS_ONCE([recvmsg sendmsg])
-
-  AC_MSG_CHECKING([for UNIX domain sockets SCM_RIGHTS])
-  AC_CACHE_VAL([gl_cv_socket_unix_scm_rights],
-    [AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM(
-          [[#include <sys/types.h>
-            #ifdef HAVE_SYS_SOCKET_H
-            #include <sys/socket.h>
-            #endif
-            #ifdef HAVE_SYS_UN_H
-            #include <sys/un.h>
-            #endif
-            #ifdef HAVE_WINSOCK2_H
-            #include <winsock2.h>
-            #endif
-          ]],
-          [[struct cmsghdr cmh;
-            cmh.cmsg_level = SOL_SOCKET;
-            cmh.cmsg_type = SCM_RIGHTS;
-            if (&cmh) return 0;
-          ]])],
-       [gl_cv_socket_unix_scm_rights=yes],
-       [gl_cv_socket_unix_scm_rights=no])
-    ])
-  AC_MSG_RESULT([$gl_cv_socket_unix_scm_rights])
-  if test $gl_cv_socket_unix_scm_rights = yes; then
-    AC_DEFINE([HAVE_UNIXSOCKET_SCM_RIGHTS], [1],
-      [Define to 1 if <sys/socket.h> defines SCM_RIGHTS.])
-  fi
-
-  dnl Persuade AIX 5.2 <sys/socket.h> to declare CMSG_SPACE, CMSG_LEN.
-  AC_DEFINE([_LINUX_SOURCE_COMPAT], [1],
-    [Define in order to get some macros on AIX systems.])
-
-  AC_MSG_CHECKING([for UNIX domain sockets SCM_RIGHTS that behave in BSD4.4 
way])
-  AC_CACHE_VAL([gl_cv_socket_unix_scm_rights_bsd44_way],
-    [AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM(
-          [[#include <sys/types.h>
-            #include <stddef.h>
-            #ifdef HAVE_SYS_SOCKET_H
-            #include <sys/socket.h>
-            #endif
-            #ifdef HAVE_SYS_UN_H
-            #include <sys/un.h>
-            #endif
-            #ifdef HAVE_WINSOCK2_H
-            #include <winsock2.h>
-            #endif
-            ]],
-            [[struct msghdr msg = {0};
-              struct cmsghdr *cmsg;
-              int myfds[1] = {0};
-              char buf[CMSG_SPACE (sizeof (myfds))];
-
-              msg.msg_control = buf;
-              msg.msg_controllen = sizeof buf;
-              cmsg = CMSG_FIRSTHDR (&msg);
-              cmsg->cmsg_level = SOL_SOCKET;
-              cmsg->cmsg_type = SCM_RIGHTS;
-              cmsg->cmsg_len = CMSG_LEN (sizeof (int));
-              /* fake Initialize the payload: */
-              (void) CMSG_DATA (cmsg);
-              /* Sum of the length of all control messages in the buffer: */
-              msg.msg_controllen = cmsg->cmsg_len;
-              return 0;
-            ]])],
-       [gl_cv_socket_unix_scm_rights_bsd44_way=yes],
-       [gl_cv_socket_unix_scm_rights_bsd44_way=no])
-    ])
-  AC_MSG_RESULT([$gl_cv_socket_unix_scm_rights_bsd44_way])
-  if test $gl_cv_socket_unix_scm_rights_bsd44_way = yes; then
-    AC_DEFINE([HAVE_UNIXSOCKET_SCM_RIGHTS_BSD44_WAY], [1],
-      [Define to 1 if fd can be sent/received in the BSD4.4 way.])
-  fi
-
-  AC_MSG_CHECKING([for UNIX domain sockets SCM_RIGHTS that behave in BSD4.3 
way])
-  AC_CACHE_VAL([gl_cv_socket_unix_scm_rights_bsd43_way],
-    [AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM(
-          [[#include <sys/types.h>
-            #ifdef HAVE_SYS_SOCKET_H
-            #include <sys/socket.h>
-            #endif
-            #ifdef HAVE_SYS_UN_H
-            #include <sys/un.h>
-            #endif
-            #ifdef HAVE_WINSOCK2_H
-            #include <winsock2.h>
-            #endif
-            ]],
-            [[struct msghdr msg;
-              int fd = 0;
-              msg.msg_accrights = &fd;
-              msg.msg_accrightslen = sizeof (fd);
-              if (&msg) return 0;
-            ]])],
-       [gl_cv_socket_unix_scm_rights_bsd43_way=yes],
-       [gl_cv_socket_unix_scm_rights_bsd43_way=no])
-    ])
-  AC_MSG_RESULT([$gl_cv_socket_unix_scm_rights_bsd43_way])
-  if test $gl_cv_socket_unix_scm_rights_bsd43_way = yes; then
-    AC_DEFINE([HAVE_UNIXSOCKET_SCM_RIGHTS_BSD43_WAY], [1],
-      [Define to 1 if fd can be sent/received in the BSD4.3 way.])
-  fi
-])
diff --git a/m4/passfd.m4 b/m4/passfd.m4
new file mode 100644
index 0000000..2028f7f
--- /dev/null
+++ b/m4/passfd.m4
@@ -0,0 +1,23 @@
+# passfd.m4 serial 8
+dnl Copyright (C) 2011 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_PASSFD],
+[
+  AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+  AC_CHECK_FUNCS_ONCE([recvmsg sendmsg])
+
+  dnl Persuade AIX 5.2 <sys/socket.h> to declare CMSG_SPACE, CMSG_LEN.
+  dnl CMSG_FIRSTHDR is POSIX 2008, but CMSG_SPACE is only in RFC 3542.
+  AC_DEFINE([_LINUX_SOURCE_COMPAT], [1],
+    [Define in order to get some macros on AIX systems.])
+
+  dnl Passfd prefers the POSIX use of msg.msg_control if the CMSG_* macros
+  dnl are present, but can fall back to BSD 4.3 style of msg.msg_accrights.
+  AC_CHECK_MEMBERS([struct msghdr.msg_accrights], [], [], [[
+    #include <sys/types.h>
+    #include <sys/socket.h>
+  ]])
+])
diff --git a/modules/passfd b/modules/passfd
index 74ef410..b3d8a3c 100644
--- a/modules/passfd
+++ b/modules/passfd
@@ -4,17 +4,15 @@ Pass file descriptors along Unix domain sockets
 Files:
 lib/passfd.h
 lib/passfd.c
-m4/afunix.m4
-m4/sockpfaf.m4
+m4/passfd.m4

 Depends-on:
 cloexec
 sys_socket
 socketlib
-extensions

 configure.ac:
-gl_SOCKET_AFUNIX
+gl_PASSFD

 Makefile.am:
 lib_SOURCES += passfd.c
-- 
1.7.4.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]