From 087484091f9707e3b2897f7945ca26398b22e75f Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Sat, 8 Mar 2014 18:44:07 -0700 Subject: [PATCH] Portability: define CMSG related structures individually Some OS provide the CMSG related definitions and others only partially define them. Sometimes (Windows particularly) this varies between build environments. Checking for each symbol separately and providing only those needed avoids problems we have been having with missing or redefined symbols on Windows and elsewhere. --- compat/cmsg.h | 43 ++++++++++++++++++++++++++----------------- configure.ac | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/compat/cmsg.h b/compat/cmsg.h index dc340e3703..9f68d91abf 100644 --- a/compat/cmsg.h +++ b/compat/cmsg.h @@ -12,21 +12,22 @@ // WinSock2.h defines these for Windows #if HAVE_WINSOCK2_H #include -#define CMSG_H_ // prevent re-definition #endif -#ifndef CMSG_H_ -#define CMSG_H_ +// sockaddr_un might be in sys/un.h if not pulled in already +#if HAVE_SYS_UN_H +#include +#endif -/* mostly windows-specific */ -#ifndef CMSG_SPACE +#if !HAVE_CMSGHDR struct cmsghdr { - unsigned int cmsg_len; - int cmsg_level; - int cmsg_type; + unsigned int cmsg_len; + int cmsg_level; + int cmsg_type; unsigned char cmsg_data[16]; /* dummy */ /* followed by UCHAR cmsg_data[]; */ -} ; +}; +#endif /* lifted off https://metacpan.org/source/SAMPO/Socket-PassAccessRights-0.03/passfd.c */ #ifndef CMSG_DATA @@ -48,15 +49,25 @@ struct cmsghdr { & ~(sizeof (size_t) - 1)) #endif +#ifndef CMSG_SPACE # define CMSG_SPACE(len) (CMSG_ALIGN (len) \ + CMSG_ALIGN (sizeof (struct cmsghdr))) #undef HAVE_CONSTANT_CMSG_SPACE #define HAVE_CONSTANT_CMSG_SPACE 1 +#endif #ifndef CMSG_LEN # define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len)) #endif +#if !HAVE_IOVEC +struct iovec { + void *iov_base; + size_t iov_len; +}; +#endif + +#if !HAVE_MSGHDR struct msghdr { void *msg_name; /* Address to send to/receive from. */ socklen_t msg_namelen; /* Length of address data. */ @@ -72,19 +83,19 @@ struct msghdr { int msg_flags; /* Flags on received message. */ }; +#endif -struct iovec { - void *iov_base; - size_t iov_len; -}; +#if !HAVE_SOCKADDR_UN struct sockaddr_un { char sun_family; char sun_path[256]; /* pathname */ }; +#endif + +#ifndef SUN_LEN # define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \ + strlen ((ptr)->sun_path)) - -#endif /* CMSG_SPACE */ +#endif #ifndef SCM_RIGHTS #define SCM_RIGHTS 1 @@ -100,8 +111,6 @@ struct sockaddr_un { #define AF_LOCAL 1 #endif -#endif /* CMSG_H_ */ - // CMSG_SPACE is not constant on some systems (in particular Max OS X), // provide a replacement that can be used at build time in that case // NP: this must go below our replacement definitions. diff --git a/configure.ac b/configure.ac index eb1ba037f8..0fb87e8119 100644 --- a/configure.ac +++ b/configure.ac @@ -3193,6 +3193,45 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ AC_MSG_RESULT(no) ]) +AC_CHECK_TYPE(struct cmsghdr,AC_DEFINE(HAVE_CMSGHDR,1,[The system provides struct cmsghdr]),,[ + #if HAVE_SYS_SOCKET_H + #include + #endif + #if HAVE_WINSOCK2_H + #include + #endif +]) + +AC_CHECK_TYPE(struct iovec,AC_DEFINE(HAVE_IOVEC,1,[The system provides struct iovec]),,[ + #if HAVE_SYS_SOCKET_H + #include + #endif + #if HAVE_WINSOCK2_H + #include + #endif +]) + +AC_CHECK_TYPE(struct msghdr,AC_DEFINE(HAVE_MSGHDR,1,[The system provides struct msghdr]),,[ + #if HAVE_SYS_SOCKET_H + #include + #endif + #if HAVE_WINSOCK2_H + #include + #endif +]) + +AC_CHECK_TYPE(struct sockaddr_un,AC_DEFINE(HAVE_SOCKADDR_UN,1,[The system provides sockaddr_un]),,[ + #if HAVE_SYS_UN_H + #include + #endif + #if HAVE_SYS_SOCKET_H + #include + #endif + #if HAVE_WINSOCK2_H + #include + #endif +]) + SQUID_CHECK_FUNC_STRNSTR SQUID_CHECK_FUNC_VACOPY SQUID_CHECK_FUNC___VACOPY -- 2.47.2