From: Amos Jeffries Date: Thu, 20 Nov 2014 12:24:30 +0000 (-0800) Subject: Bug 4145: squid_endian.h compile errors with OpenBSD 5.6 X-Git-Tag: merge-candidate-3-v1~480 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5fc112ea934a48df045b50a343715e1524a8f990;p=thirdparty%2Fsquid.git Bug 4145: squid_endian.h compile errors with OpenBSD 5.6 * Remove unused big-endian macros. * Stop making assumptions about little-endian symbols existence. Test each one explicitly and define only as necessary. * Add support for systems with endian.h available. * Move Endian hacks to libntlmauth which is the only code using them. Also, build only if NTLM is required. --- diff --git a/compat/compat.h b/compat/compat.h index e0218e86ff..ac5a6c238f 100644 --- a/compat/compat.h +++ b/compat/compat.h @@ -105,9 +105,6 @@ /* Valgrind API macros changed between two versions squid supports */ #include "compat/valgrind.h" -/* Endian functions are usualy handled by the OS but not always. */ -#include "squid_endian.h" - /** * A Regular Expression library is bundled with Squid. * Default is to use a system provided one, but the bundle diff --git a/configure.ac b/configure.ac index 43e1e6a7be..bdeb91f193 100644 --- a/configure.ac +++ b/configure.ac @@ -2765,7 +2765,6 @@ AC_CHECK_HEADERS( \ limits.h \ linux/posix_types.h \ linux/types.h \ - machine/byte_swap.h \ malloc.h \ math.h \ memory.h \ @@ -2790,8 +2789,6 @@ AC_CHECK_HEADERS( \ string.h \ strings.h \ sys/bitypes.h \ - sys/bswap.h \ - sys/endian.h \ sys/file.h \ sys/ioctl.h \ sys/ipc.cc \ @@ -3304,10 +3301,6 @@ dnl Check for library functions AC_CHECK_FUNCS(\ backtrace_symbols_fd \ bcopy \ - bswap_16 \ - bswap_32 \ - bswap16 \ - bswap32 \ eui64_aton \ fchmod \ getdtablesize \ @@ -3318,8 +3311,6 @@ AC_CHECK_FUNCS(\ getspnam \ gettimeofday \ glob \ - htobe16 \ - htole16 \ lrand48 \ mallocblksize \ mallopt \ diff --git a/helpers/ntlm_auth/modules.m4 b/helpers/ntlm_auth/modules.m4 index 4444bfb6aa..3e2a163c30 100644 --- a/helpers/ntlm_auth/modules.m4 +++ b/helpers/ntlm_auth/modules.m4 @@ -66,3 +66,16 @@ fi AC_MSG_NOTICE([NTLM auth helpers to be built: $NTLM_AUTH_HELPERS]) AM_CONDITIONAL(ENABLE_AUTH_NTLM, test "x$enable_auth_ntlm" != "xno") AC_SUBST(NTLM_AUTH_HELPERS) + +## NTLM requires some special Little-Endian conversion hacks +if test "x$enable_auth_ntlm" != "xno"; then + AC_CHECK_HEADERS(machine/byte_swap.h sys/bswap.h endian.h sys/endian.h) + AC_CHECK_FUNCS( + bswap_16 bswap16 \ + bswap_32 bswap32 \ + htole16 __htole16 \ + htole32 __htole32 \ + le16toh __le16toh \ + le32toh __le32toh \ + ) +fi diff --git a/include/squid_endian.h b/include/squid_endian.h deleted file mode 100644 index 2261409a32..0000000000 --- a/include/squid_endian.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 1996-2014 The Squid Software Foundation and contributors - * - * Squid software is distributed under GPLv2+ license and includes - * contributions from numerous individuals and organizations. - * Please see the COPYING and CONTRIBUTORS files for details. - */ - -/* - * AUTHOR: Alan Barrett - */ - -#ifndef SQUID_ENDIAN_H -#define SQUID_ENDIAN_H - -/* - * Macros to deal with byte swapping. These macros provide - * the following interface: - * - * // Byte-swap - * uint16_t bswap16(uint16_t); - * uint32_t bswap32(uint32_t); - * - * // Convert from host byte order to big-endian, and vice versa. - * uint16_t htobe16(uint16_t); // equivalent to htons() - * uint32_t htobe32(uint32_t); // equivalent to htonl() - * uint16_t be16toh(uint16_t); // equivalent to ntohs() - * uint32_t be32toh(uint32_t); // equivalent to ntohs() - * - * // Convert from host byte order to little-endian, and vice versa. - * uint16_t htole16(uint16_t); - * uint32_t htole32(uint32_t); - * uint16_t le16toh(uint16_t); - * uint32_t le32toh(uint32_t); - */ - -/* - * Some systems define bswap_16() and bswap_32() in - * - * Some systems define bswap16() and bswap32() in . - * - * Some systems define htobe16()/be16toh() and friends in . - */ -#if HAVE_BYTESWAP_H -# include -#endif /* HAVE_BYTESWAP_H */ -#if HAVE_MACHINE_BYTE_SWAP_H -# include -#endif /* HAVE_MACHINE_BYTE_SWAP_H */ -#if HAVE_SYS_BSWAP_H -# include -#endif /* HAVE_SYS_BSWAP_H */ -#if HAVE_SYS_ENDIAN_H -# include -#endif /* HAVE_SYS_ENDIAN_H */ - -/* - * Define bswap16() and bswap32() in terms of bswap_16() and bswap_32(), - * or the hard way. - */ -#if ! HAVE_BSWAP16 && ! defined(bswap16) -# if defined(bswap_16) -# define bswap16(x) bswap_16(x) -# else -# define bswap16(x) \ - (((((uint16_t)(x)) >> 8) & 0xff) | ((((uint16_t)(x)) & 0xff) << 8)) -# endif -#endif /* ! HAVE_BSWAP16 && ! defined(bswap16) */ -#if ! HAVE_BSWAP32 && ! defined(bswap32) -# if defined(bswap_32) -# define bswap32(x) bswap_32(x) -# else -# define bswap32(x) \ - (((((uint32_t)(x)) & 0xff000000) >> 24) | \ - ((((uint32_t)(x)) & 0x00ff0000) >> 8) | \ - ((((uint32_t)(x)) & 0x0000ff00) << 8) | \ - ((((uint32_t)(x)) & 0x000000ff) << 24)) -# endif -#endif /* ! HAVE_BSWAP32 && ! defined(bswap32) */ - -/* - * Define htobe*()/be*toh() in terms of hton*()/ntoh*(). - * - * XXX: If htobe16() is missing, we assume that the other *be*() functions - * are also missing. - */ -#if ! HAVE_HTOBE16 && ! defined(htobe16) -# ifdef WORDS_BIGENDIAN -# define htobe16(x) (x) -# define htobe32(x) (x) -# define be16toh(x) (x) -# define be32toh(x) (x) -# else /* ! WORDS_BIGENDIAN */ -# define htobe16(x) htons(x) -# define htobe32(x) htonl(x) -# define be16toh(x) ntohs(x) -# define be32toh(x) ntohl(x) -# endif /* ! WORDS_BIGENDIAN */ -#endif /* ! HAVE_HTOBE16 && ! defined(htobe16) */ - -/* - * Define htole*()/le*toh() in terms of bswap*(). - * - * XXX: If htole16() is missing, we assume that the other *le*() functions - * are also missing. - * - * Except OpenBSD - htole16 & 32 exist, but not le16toh etc - */ -#if _SQUID_OPENBSD_ -# define le16toh(x) htole16(x) -# define le32toh(x) htole32(x) -#endif - -#if ! HAVE_HTOLE16 && ! defined(htole16) -# ifdef WORDS_BIGENDIAN -# define htole16(x) bswap16(x) -# define htole32(x) bswap32(x) -# define le16toh(x) bswap16(x) -# define le32toh(x) bswap32(x) -# else /* ! WORDS_BIGENDIAN */ -/* -* XXX: What about unusual byte orders like 3412 or 2143 ? -* Nothing else in squid seems to care about them, -* so we don't worry about them here either. -*/ -# define htole16(x) (x) -# define htole32(x) (x) -# define le16toh(x) (x) -# define le32toh(x) (x) -# endif /* ! WORDS_BIGENDIAN */ -#endif /* ! HAVE_HTOLE16 && ! defined(htole16) */ - -#endif /* SQUID_ENDIAN_H */ diff --git a/lib/ntlmauth/Makefile.am b/lib/ntlmauth/Makefile.am index b260f67047..33923ab452 100644 --- a/lib/ntlmauth/Makefile.am +++ b/lib/ntlmauth/Makefile.am @@ -15,4 +15,5 @@ noinst_LTLIBRARIES = libntlmauth.la libntlmauth_la_SOURCES = \ ntlmauth.cc \ ntlmauth.h \ - support_bits.cci + support_bits.cci \ + support_endian.h diff --git a/lib/ntlmauth/ntlmauth.h b/lib/ntlmauth/ntlmauth.h index c3f0f89762..cb743dbf72 100644 --- a/lib/ntlmauth/ntlmauth.h +++ b/lib/ntlmauth/ntlmauth.h @@ -10,6 +10,8 @@ #define SQUID_NTLMAUTH_H /* NP: All of this cruft is little endian */ +/* Endian functions are usualy handled by the OS but not always. */ +#include "ntlmauth/support_endian.h" #ifdef __cplusplus extern "C" { diff --git a/lib/ntlmauth/support_endian.h b/lib/ntlmauth/support_endian.h new file mode 100644 index 0000000000..33ce04146d --- /dev/null +++ b/lib/ntlmauth/support_endian.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 1996-2014 The Squid Software Foundation and contributors + * + * Squid software is distributed under GPLv2+ license and includes + * contributions from numerous individuals and organizations. + * Please see the COPYING and CONTRIBUTORS files for details. + */ + +#ifndef SQUID_LIB_NTLMAUTH_SUPPORT_ENDIAN_H +#define SQUID_LIB_NTLMAUTH_SUPPORT_ENDIAN_H + +#if HAVE_BYTESWAP_H +#include +#endif +#if HAVE_MACHINE_BYTE_SWAP_H +#include +#endif +#if HAVE_SYS_BSWAP_H +#include +#endif +#if HAVE_ENDIAN_H +#include +#endif +#if HAVE_SYS_ENDIAN_H +#include +#endif + +/* + * Macros to deal with byte swapping. These macros provide + * the following interface: + * + * // Byte-swap + * uint16_t bswap16(uint16_t); + * uint32_t bswap32(uint32_t); + * + * // Convert from host byte order to little-endian, and vice versa. + * uint16_t htole16(uint16_t); + * uint32_t htole32(uint32_t); + * uint16_t le16toh(uint16_t); + * uint32_t le32toh(uint32_t); + * + * XXX: What about unusual byte orders like 3412 or 2143 ? + * Never had any problems reported, so we dont worry about them. + */ + +#if !HAVE_HTOLE16 && !defined(htole16) +/* Define bswap16() in terms of bswap_16() or the hard way. */ +#if !HAVE_BSWAP16 && !defined(bswap16) +# if HAVE_BSWAP_16 || defined(bswap_16) +# define bswap16(x) bswap_16(x) +# else // 'hard way' +# define bswap16(x) \ + (((((uint16_t)(x)) >> 8) & 0xff) | ((((uint16_t)(x)) & 0xff) << 8)) +# endif +#endif + +/* Define htole16() in terms of bswap16(). */ +# if defined(WORDS_BIGENDIAN) +# define htole16(x) bswap16(x) +# else +# define htole16(x) (x) +# endif +#endif + +#if !HAVE_HTOLE32 && !defined(htole32) +#if ! HAVE_BSWAP32 && ! defined(bswap32) +/* Define bswap32() in terms of bswap_32() or the hard way. */ +# if HAVE_BSWAP_32 || defined(bswap_32) +# define bswap32(x) bswap_32(x) +# else // 'hard way' +# define bswap32(x) \ + (((((uint32_t)(x)) & 0xff000000) >> 24) | \ + ((((uint32_t)(x)) & 0x00ff0000) >> 8) | \ + ((((uint32_t)(x)) & 0x0000ff00) << 8) | \ + ((((uint32_t)(x)) & 0x000000ff) << 24)) +# endif + +/* Define htole32() in terms of bswap32(). */ +#endif +# if defined(WORDS_BIGENDIAN) +# define htole32(x) bswap32(x) +# else +# define htole32(x) (x) +# endif +#endif + +/* Define letoh*() in terms of htole*(). The swap is symmetrical. */ +#if !HAVE_LE16TOH && !defined(le16toh) +#define le16toh(x) htole16(x) +#endif +#if !HAVE_LE32TOH && !defined(le32toh) +#define le32toh(x) htole32(x) +#endif + +#endif /* SQUID_LIB_NTLMAUTH_SUPPORT_ENDIAN_H */