From e22d9a3b0b6979a518e3b292317088245d959e13 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bastien=20Roucari=C3=A8s?= Date: Tue, 8 Mar 2011 10:37:18 +0100 Subject: [PATCH] passfd module, part 1. * m4/afunix.m4: New file. * m4/sockpfaf.m4 (gl_SOCKET_FAMILIES): Also test for UNIX domain sockets. --- ChangeLog | 7 +++++ m4/afunix.m4 | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ m4/sockpfaf.m4 | 23 +++++++++++++- 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 m4/afunix.m4 diff --git a/ChangeLog b/ChangeLog index d93ea6928..a84346a09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-03-07 Bastien Roucariès + + passfd module, part 1. + * m4/afunix.m4: New file. + * m4/sockpfaf.m4 (gl_SOCKET_FAMILIES): Also test for UNIX domain + sockets. + 2011-03-08 Bruno Haible regex-quote: New API. diff --git a/m4/afunix.m4 b/m4/afunix.m4 new file mode 100644 index 000000000..760c49489 --- /dev/null +++ b/m4/afunix.m4 @@ -0,0 +1,95 @@ +# afunix.m4 serial 1 +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_FAMILIES]) + + AC_MSG_CHECKING([for UNIX domain sockets SCM_RIGHT]) + AC_CACHE_VAL([gl_cv_socket_unix_scm_rights], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_UN_H +#include +#endif +#ifdef HAVE_WINSOCK2_H +#include +#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 defines SCM_RIGHTS.]) + fi + + AC_MSG_CHECKING([for UNIX domain sockets SCM_RIGHT behave in BSD4.4 way]) + AC_CACHE_VAL([gl_cv_socket_unix_scm_rights_bsd44_way], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_UN_H +#include +#endif +#ifdef HAVE_WINSOCK2_H +#include +#endif +]], +[[struct msghdr msg = {0}; + struct cmsghdr *cmsg; + int myfds[1] = {0}; + char buf[CMSG_SPACE(sizeof(myfds))]; + int *fdptr; + + 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 could be send/received in the BSD4.4 way.]) + fi + + AC_MSG_CHECKING([for UNIX domain sockets SCM_RIGHT behave in BSD4.3 way]) + AC_CACHE_VAL([gl_cv_socket_unix_scm_rights_bsd43_way], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_UN_H +#include +#endif +#ifdef HAVE_WINSOCK2_H +#include +#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 could be send/received in the BSD4.3 way.]) + fi +]) diff --git a/m4/sockpfaf.m4 b/m4/sockpfaf.m4 index 27899aa59..b8a64ad99 100644 --- a/m4/sockpfaf.m4 +++ b/m4/sockpfaf.m4 @@ -1,4 +1,4 @@ -# sockpfaf.m4 serial 7 +# sockpfaf.m4 serial 8 dnl Copyright (C) 2004, 2006, 2009-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, @@ -58,4 +58,25 @@ AC_DEFUN([gl_SOCKET_FAMILIES], if test $gl_cv_socket_ipv6 = yes; then AC_DEFINE([HAVE_IPV6], [1], [Define to 1 if defines AF_INET6.]) fi + + AC_CHECK_HEADERS_ONCE([sys/un.h]) + AC_MSG_CHECKING([for UNIX domain sockets]) + AC_CACHE_VAL([gl_cv_socket_unix], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_SYS_UN_H +#include +#endif +#ifdef HAVE_WINSOCK2_H +#include +#endif]], +[[int x = AF_UNIX; struct sockaddr_un y; + if (&x && &y) return 0;]])], + gl_cv_socket_unix=yes, gl_cv_socket_unix=no)]) + AC_MSG_RESULT([$gl_cv_socket_unix]) + if test $gl_cv_socket_unix = yes; then + AC_DEFINE([HAVE_UNIXSOCKET], [1], [Define to 1 if defines AF_UNIX.]) + fi ]) -- 2.11.0