diff options
Diffstat (limited to 'inet')
-rw-r--r-- | inet/Makefile | 2 | ||||
-rw-r--r-- | inet/netinet/in.h | 9 | ||||
-rw-r--r-- | inet/test-hnto-types.c | 39 |
3 files changed, 45 insertions, 5 deletions
diff --git a/inet/Makefile b/inet/Makefile index 2c2d426189..010792af8f 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -52,7 +52,7 @@ aux := check_pf check_native ifreq tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \ tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line \ tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-checks-posix \ - tst-sockaddr tst-inet6_scopeid_pton + tst-sockaddr tst-inet6_scopeid_pton test-hnto-types include ../Rules diff --git a/inet/netinet/in.h b/inet/netinet/in.h index 419e119172..365bc6878e 100644 --- a/inet/netinet/in.h +++ b/inet/netinet/in.h @@ -383,6 +383,7 @@ extern uint16_t htons (uint16_t __hostshort) /* Get machine dependent optimized versions of byte swapping functions. */ #include <bits/byteswap.h> +#include <bits/uintn-identity.h> #ifdef __OPTIMIZE__ /* We can optimize calls to the conversion functions. Either nothing has @@ -391,10 +392,10 @@ extern uint16_t htons (uint16_t __hostshort) # if __BYTE_ORDER == __BIG_ENDIAN /* The host byte order is the same as network byte order, so these functions are all just identity. */ -# define ntohl(x) (x) -# define ntohs(x) (x) -# define htonl(x) (x) -# define htons(x) (x) +# define ntohl(x) __uint32_identity (x) +# define ntohs(x) __uint16_identity (x) +# define htonl(x) __uint32_identity (x) +# define htons(x) __uint16_identity (x) # else # if __BYTE_ORDER == __LITTLE_ENDIAN # define ntohl(x) __bswap_32 (x) diff --git a/inet/test-hnto-types.c b/inet/test-hnto-types.c new file mode 100644 index 0000000000..b9770352ca --- /dev/null +++ b/inet/test-hnto-types.c @@ -0,0 +1,39 @@ +/* Test netinet/in.h endian-conversion macros always return the correct type. + Copyright (C) 2017 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/>. */ + +#include <netinet/in.h> +#include <stdint.h> + +int i; +uint16_t u16; +uint32_t u32; + +int +do_test (void) +{ + /* This is a compilation test. */ + extern __typeof (htons (i)) u16; + extern __typeof (ntohs (i)) u16; + extern __typeof (htonl (i)) u32; + extern __typeof (ntohl (i)) u32; + (void) u16; + (void) u32; + return 0; +} + +#include <support/test-driver.c> |