mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
inet: Make IN6_IS_ADDR_UNSPECIFIED etc. usable with POSIX [BZ #16421]
Previously, under some feature test macros and compilers, the macros were defined, but references undefined struct members in their implementation.
This commit is contained in:
parent
c23de0aacb
commit
0abbe7cd70
15
ChangeLog
15
ChangeLog
@ -1,3 +1,18 @@
|
|||||||
|
2016-12-09 Carlos O'Donell <carlos@redhat.com>
|
||||||
|
Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
[BZ #16421]
|
||||||
|
* inet/netinet/in.h (struct in6_addr): Always define __u6_addr16
|
||||||
|
and __u6_addr32 members.
|
||||||
|
(IN6_IS_ADDR_UNSPECIFIED, IN6_IS_ADDR_LOOPBACK)
|
||||||
|
(IN6_IS_ADDR_LINKLOCAL, IN6_IS_ADDR_SITELOCAL)
|
||||||
|
(IN6_IS_ADDR_V4MAPPED, IN6_IS_ADDR_V4COMPAT, IN6_ARE_ADDR_EQUAL):
|
||||||
|
Use __u6_addr32.
|
||||||
|
* inet/tst-checks.c: Use <support/test-driver.c>
|
||||||
|
* inet/tst-checks-posix.c: New file.
|
||||||
|
* inet/Makefile (tests): Add it.
|
||||||
|
(CFLAGS-tst-checks-posix.c): Compile in C99 mode.
|
||||||
|
|
||||||
2016-12-09 Florian Weimer <fweimer@redhat.com>
|
2016-12-09 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
New subdirectory support for build and test infrastructure.
|
New subdirectory support for build and test infrastructure.
|
||||||
|
@ -51,8 +51,8 @@ aux := check_pf check_native ifreq
|
|||||||
|
|
||||||
tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \
|
tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \
|
||||||
tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line \
|
tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line \
|
||||||
tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-sockaddr \
|
tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-checks-posix \
|
||||||
tst-inet6_scopeid_pton
|
tst-sockaddr tst-inet6_scopeid_pton
|
||||||
|
|
||||||
include ../Rules
|
include ../Rules
|
||||||
|
|
||||||
@ -86,6 +86,7 @@ CFLAGS-either_hton.c = -fexceptions
|
|||||||
CFLAGS-getnetgrent.c = -fexceptions
|
CFLAGS-getnetgrent.c = -fexceptions
|
||||||
CFLAGS-getnetgrent_r.c = -fexceptions
|
CFLAGS-getnetgrent_r.c = -fexceptions
|
||||||
|
|
||||||
|
CFLAGS-tst-checks-posix.c = -std=c99
|
||||||
CFLAGS-tst-sockaddr.c = -fno-strict-aliasing
|
CFLAGS-tst-sockaddr.c = -fno-strict-aliasing
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -213,10 +213,8 @@ struct in6_addr
|
|||||||
union
|
union
|
||||||
{
|
{
|
||||||
uint8_t __u6_addr8[16];
|
uint8_t __u6_addr8[16];
|
||||||
#ifdef __USE_MISC
|
|
||||||
uint16_t __u6_addr16[8];
|
uint16_t __u6_addr16[8];
|
||||||
uint32_t __u6_addr32[4];
|
uint32_t __u6_addr32[4];
|
||||||
#endif
|
|
||||||
} __in6_u;
|
} __in6_u;
|
||||||
#define s6_addr __in6_u.__u6_addr8
|
#define s6_addr __in6_u.__u6_addr8
|
||||||
#ifdef __USE_MISC
|
#ifdef __USE_MISC
|
||||||
@ -411,52 +409,52 @@ extern uint16_t htons (uint16_t __hostshort)
|
|||||||
# define IN6_IS_ADDR_UNSPECIFIED(a) \
|
# define IN6_IS_ADDR_UNSPECIFIED(a) \
|
||||||
(__extension__ \
|
(__extension__ \
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
||||||
__a->s6_addr32[0] == 0 \
|
__a->__in6_u.__u6_addr32[0] == 0 \
|
||||||
&& __a->s6_addr32[1] == 0 \
|
&& __a->__in6_u.__u6_addr32[1] == 0 \
|
||||||
&& __a->s6_addr32[2] == 0 \
|
&& __a->__in6_u.__u6_addr32[2] == 0 \
|
||||||
&& __a->s6_addr32[3] == 0; }))
|
&& __a->__in6_u.__u6_addr32[3] == 0; }))
|
||||||
|
|
||||||
# define IN6_IS_ADDR_LOOPBACK(a) \
|
# define IN6_IS_ADDR_LOOPBACK(a) \
|
||||||
(__extension__ \
|
(__extension__ \
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
||||||
__a->s6_addr32[0] == 0 \
|
__a->__in6_u.__u6_addr32[0] == 0 \
|
||||||
&& __a->s6_addr32[1] == 0 \
|
&& __a->__in6_u.__u6_addr32[1] == 0 \
|
||||||
&& __a->s6_addr32[2] == 0 \
|
&& __a->__in6_u.__u6_addr32[2] == 0 \
|
||||||
&& __a->s6_addr32[3] == htonl (1); }))
|
&& __a->__in6_u.__u6_addr32[3] == htonl (1); }))
|
||||||
|
|
||||||
# define IN6_IS_ADDR_LINKLOCAL(a) \
|
# define IN6_IS_ADDR_LINKLOCAL(a) \
|
||||||
(__extension__ \
|
(__extension__ \
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
||||||
(__a->s6_addr32[0] & htonl (0xffc00000)) == htonl (0xfe800000); }))
|
(__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfe800000); }))
|
||||||
|
|
||||||
# define IN6_IS_ADDR_SITELOCAL(a) \
|
# define IN6_IS_ADDR_SITELOCAL(a) \
|
||||||
(__extension__ \
|
(__extension__ \
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
||||||
(__a->s6_addr32[0] & htonl (0xffc00000)) == htonl (0xfec00000); }))
|
(__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfec00000); }))
|
||||||
|
|
||||||
# define IN6_IS_ADDR_V4MAPPED(a) \
|
# define IN6_IS_ADDR_V4MAPPED(a) \
|
||||||
(__extension__ \
|
(__extension__ \
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
||||||
__a->s6_addr32[0] == 0 \
|
__a->__in6_u.__u6_addr32[0] == 0 \
|
||||||
&& __a->s6_addr32[1] == 0 \
|
&& __a->__in6_u.__u6_addr32[1] == 0 \
|
||||||
&& __a->s6_addr32[2] == htonl (0xffff); }))
|
&& __a->__in6_u.__u6_addr32[2] == htonl (0xffff); }))
|
||||||
|
|
||||||
# define IN6_IS_ADDR_V4COMPAT(a) \
|
# define IN6_IS_ADDR_V4COMPAT(a) \
|
||||||
(__extension__ \
|
(__extension__ \
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
||||||
__a->s6_addr32[0] == 0 \
|
__a->__in6_u.__u6_addr32[0] == 0 \
|
||||||
&& __a->s6_addr32[1] == 0 \
|
&& __a->__in6_u.__u6_addr32[1] == 0 \
|
||||||
&& __a->s6_addr32[2] == 0 \
|
&& __a->__in6_u.__u6_addr32[2] == 0 \
|
||||||
&& ntohl (__a->s6_addr32[3]) > 1; }))
|
&& ntohl (__a->__in6_u.__u6_addr32[3]) > 1; }))
|
||||||
|
|
||||||
# define IN6_ARE_ADDR_EQUAL(a,b) \
|
# define IN6_ARE_ADDR_EQUAL(a,b) \
|
||||||
(__extension__ \
|
(__extension__ \
|
||||||
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
|
||||||
const struct in6_addr *__b = (const struct in6_addr *) (b); \
|
const struct in6_addr *__b = (const struct in6_addr *) (b); \
|
||||||
__a->s6_addr32[0] == __b->s6_addr32[0] \
|
__a->__in6_u.__u6_addr32[0] == __b->__in6_u.__u6_addr32[0] \
|
||||||
&& __a->s6_addr32[1] == __b->s6_addr32[1] \
|
&& __a->__in6_u.__u6_addr32[1] == __b->__in6_u.__u6_addr32[1] \
|
||||||
&& __a->s6_addr32[2] == __b->s6_addr32[2] \
|
&& __a->__in6_u.__u6_addr32[2] == __b->__in6_u.__u6_addr32[2] \
|
||||||
&& __a->s6_addr32[3] == __b->s6_addr32[3]; }))
|
&& __a->__in6_u.__u6_addr32[3] == __b->__in6_u.__u6_addr32[3]; }))
|
||||||
#else
|
#else
|
||||||
# define IN6_IS_ADDR_UNSPECIFIED(a) \
|
# define IN6_IS_ADDR_UNSPECIFIED(a) \
|
||||||
(((const uint32_t *) (a))[0] == 0 \
|
(((const uint32_t *) (a))[0] == 0 \
|
||||||
|
24
inet/tst-checks-posix.c
Normal file
24
inet/tst-checks-posix.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* Test IPv6 classification macros in POSIX mode.
|
||||||
|
Copyright (C) 2016 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, see
|
||||||
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Process tst-checks.c in POSIX mode. */
|
||||||
|
#undef _GNU_SOURCE
|
||||||
|
#define _POSIX_C_SOURCE 200112L
|
||||||
|
#define _ISOMAC
|
||||||
|
|
||||||
|
#include "tst-checks.c"
|
@ -169,5 +169,4 @@ do_test (void)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TEST_FUNCTION do_test ()
|
#include <support/test-driver.c>
|
||||||
#include "../test-skeleton.c"
|
|
||||||
|
Loading…
Reference in New Issue
Block a user