From patchwork Fri Nov 25 08:34:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 84035 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp31532qgi; Fri, 25 Nov 2016 00:35:09 -0800 (PST) X-Received: by 10.98.141.153 with SMTP id p25mr6437738pfk.148.1480062909764; Fri, 25 Nov 2016 00:35:09 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id q12si15094021pli.269.2016.11.25.00.35.09 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 Nov 2016 00:35:09 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-75160-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-75160-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-75160-patch=linaro.org@sourceware.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:to:cc:from:subject:message-id:date :mime-version:content-type; q=dns; s=default; b=KPB74JN0NsvlJqrF X4hkdXeZk09lWARrlnPh1c1ke9QTB3WEGKDcP29JidcsjR90B7rl3LS5hSSVqXZm rcTHR1PTeWRSpk+t8El5QLELnhYemAMRBe6oZjUpQKDR5LJXhu3gp4myQEF1zglF GwB8NkK6JB6kjHxv1deLDGmDMeE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:to:cc:from:subject:message-id:date :mime-version:content-type; s=default; bh=KeG0qzpv+N80An1NLbjtni zaZok=; b=pJV2LY2QMpVWph1A/m70LBtuGNpaI9hU8UCY3zTfsubGBKoMlqd2Ec wV9CYQGrFkI4755kU8mS/201ky3HU27wCC39eVl6uukSlziEORgVTbtC2zW6Z9Ja 4CEC/ht9zNtFJSd7mW8m9Jy4nrXiaJLxTM6zIW70lIF1lonv4bIxA= Received: (qmail 25199 invoked by alias); 25 Nov 2016 08:34:53 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 25069 invoked by uid 89); 25 Nov 2016 08:34:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.9 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=1626, inh, sk:carlos, Waiting X-HELO: mx1.redhat.com To: GNU C Library Cc: "Carlos O'Donell" From: Florian Weimer Subject: [PATCH] inet: Make IN6_IS_ADDR_UNSPECIFIED etc. usable with POSIX [BZ #16421] Message-ID: <11b8e9fb-8251-d3e0-5f7a-14deefec43af@redhat.com> Date: Fri, 25 Nov 2016 09:34:38 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 This resurrects an old patch from Carlos. I have added a test. Compiling test-skeleton.c without _GNU_SOURCE required some surgery on it. I hope to clear this up soon because I need it for writing other kinds of tests anyway. Are the test-skeleton.c changes okay in the meantime? Thanks, Florian 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. 2016-11-25 Carlos O'Donell Florian Weimer [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-posix.c: New file. * inet/Makefile (tests): Add it. (CFLAGS-tst-checks-posix.c): Compile in C99 mode. * test-skeleton.c (xasprintf, struct temp_name_list) (temp_name_list, add_temp_file, delete_temp_files) (create_temp_file): Define only under _GNU_SOURCE. (usage): Add argv parameter. (main): Call usage with argv argument. Register delete_temp_files and log temporary files only under _GNU_SOURCE. Explicitly retry waitpid. diff --git a/inet/Makefile b/inet/Makefile index 1c30932..c82ad92 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -51,8 +51,8 @@ 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-sockaddr \ - tst-inet6_scopeid_pton + tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-checks-posix \ + tst-sockaddr tst-inet6_scopeid_pton include ../Rules @@ -86,6 +86,7 @@ CFLAGS-either_hton.c = -fexceptions CFLAGS-getnetgrent.c = -fexceptions CFLAGS-getnetgrent_r.c = -fexceptions +CFLAGS-tst-checks-posix.c = -std=c99 CFLAGS-tst-sockaddr.c = -fno-strict-aliasing endif diff --git a/inet/netinet/in.h b/inet/netinet/in.h index c801593..01594c6 100644 --- a/inet/netinet/in.h +++ b/inet/netinet/in.h @@ -213,10 +213,8 @@ struct in6_addr union { uint8_t __u6_addr8[16]; -#ifdef __USE_MISC uint16_t __u6_addr16[8]; uint32_t __u6_addr32[4]; -#endif } __in6_u; #define s6_addr __in6_u.__u6_addr8 #ifdef __USE_MISC @@ -411,52 +409,52 @@ extern uint16_t htons (uint16_t __hostshort) # define IN6_IS_ADDR_UNSPECIFIED(a) \ (__extension__ \ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \ - __a->s6_addr32[0] == 0 \ - && __a->s6_addr32[1] == 0 \ - && __a->s6_addr32[2] == 0 \ - && __a->s6_addr32[3] == 0; })) + __a->__in6_u.__u6_addr32[0] == 0 \ + && __a->__in6_u.__u6_addr32[1] == 0 \ + && __a->__in6_u.__u6_addr32[2] == 0 \ + && __a->__in6_u.__u6_addr32[3] == 0; })) # define IN6_IS_ADDR_LOOPBACK(a) \ (__extension__ \ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \ - __a->s6_addr32[0] == 0 \ - && __a->s6_addr32[1] == 0 \ - && __a->s6_addr32[2] == 0 \ - && __a->s6_addr32[3] == htonl (1); })) + __a->__in6_u.__u6_addr32[0] == 0 \ + && __a->__in6_u.__u6_addr32[1] == 0 \ + && __a->__in6_u.__u6_addr32[2] == 0 \ + && __a->__in6_u.__u6_addr32[3] == htonl (1); })) # define IN6_IS_ADDR_LINKLOCAL(a) \ (__extension__ \ ({ 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) \ (__extension__ \ ({ 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) \ (__extension__ \ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \ - __a->s6_addr32[0] == 0 \ - && __a->s6_addr32[1] == 0 \ - && __a->s6_addr32[2] == htonl (0xffff); })) + __a->__in6_u.__u6_addr32[0] == 0 \ + && __a->__in6_u.__u6_addr32[1] == 0 \ + && __a->__in6_u.__u6_addr32[2] == htonl (0xffff); })) # define IN6_IS_ADDR_V4COMPAT(a) \ (__extension__ \ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \ - __a->s6_addr32[0] == 0 \ - && __a->s6_addr32[1] == 0 \ - && __a->s6_addr32[2] == 0 \ - && ntohl (__a->s6_addr32[3]) > 1; })) + __a->__in6_u.__u6_addr32[0] == 0 \ + && __a->__in6_u.__u6_addr32[1] == 0 \ + && __a->__in6_u.__u6_addr32[2] == 0 \ + && ntohl (__a->__in6_u.__u6_addr32[3]) > 1; })) # define IN6_ARE_ADDR_EQUAL(a,b) \ (__extension__ \ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \ const struct in6_addr *__b = (const struct in6_addr *) (b); \ - __a->s6_addr32[0] == __b->s6_addr32[0] \ - && __a->s6_addr32[1] == __b->s6_addr32[1] \ - && __a->s6_addr32[2] == __b->s6_addr32[2] \ - && __a->s6_addr32[3] == __b->s6_addr32[3]; })) + __a->__in6_u.__u6_addr32[0] == __b->__in6_u.__u6_addr32[0] \ + && __a->__in6_u.__u6_addr32[1] == __b->__in6_u.__u6_addr32[1] \ + && __a->__in6_u.__u6_addr32[2] == __b->__in6_u.__u6_addr32[2] \ + && __a->__in6_u.__u6_addr32[3] == __b->__in6_u.__u6_addr32[3]; })) #else # define IN6_IS_ADDR_UNSPECIFIED(a) \ (((const uint32_t *) (a))[0] == 0 \ diff --git a/inet/tst-checks-posix.c b/inet/tst-checks-posix.c new file mode 100644 index 0000000..aab92ac --- /dev/null +++ b/inet/tst-checks-posix.c @@ -0,0 +1,25 @@ +/* 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 + . */ + +/* Process tst-checks.c in POSIX mode. POSIX 2008 is required by the + test skeleton. */ +#undef _GNU_SOURCE +#define _POSIX_C_SOURCE 200809L +#define _ISOMAC + +#include "tst-checks.c" diff --git a/test-skeleton.c b/test-skeleton.c index fa457be..dcb3e3a 100644 --- a/test-skeleton.c +++ b/test-skeleton.c @@ -149,6 +149,7 @@ xrealloc (void *p, size_t n) return result; } +#ifdef __USE_GNU /* Call asprintf with error checking. */ __attribute__ ((always_inline, format (printf, 1, 2))) static __inline__ char * @@ -162,6 +163,7 @@ xasprintf (const char *format, ...) } return result; } +#endif /* __USE_GNU */ /* Write a message to standard output. Can be used in signal handlers. */ @@ -173,6 +175,7 @@ write_message (const char *message) unused = write (STDOUT_FILENO, message, strlen (message)); } +#ifdef __USE_GNU /* List of temporary files. */ struct temp_name_list { @@ -247,6 +250,7 @@ create_temp_file (const char *base, char **filename) return fd; } +#endif/* __USE_GNU */ /* Timeout handler. We kill the child and exit with an error. */ static void @@ -351,7 +355,7 @@ set_fortify_handler (void (*handler) (int sig)) /* Show people how to run the program. */ static void -usage (void) +usage (char **argv) { size_t i; @@ -361,7 +365,7 @@ usage (void) " TIMEOUTFACTOR An integer used to scale the timeout\n" " TMPDIR Where to place temporary files\n" "\n", - program_invocation_short_name); + argv[0]); printf ("Options:\n"); for (i = 0; options[i].name; ++i) { @@ -407,7 +411,7 @@ main (int argc, char *argv[]) switch (opt) { case '?': - usage (); + usage (argv); exit (1); case OPT_DIRECT: direct = 1; @@ -454,8 +458,10 @@ main (int argc, char *argv[]) /* Make sure we see all message, even those on stdout. */ setvbuf (stdout, NULL, _IONBF, 0); +#ifdef __USE_GNU /* Make sure temporary files are deleted. */ atexit (delete_temp_files); +#endif /* Correct for the possible parameters. */ argv[optind - 1] = argv[0]; @@ -493,6 +499,7 @@ main (int argc, char *argv[]) } #endif +#ifdef __USE_GNU if (temp_name_list != NULL) { struct temp_name_list *n; @@ -503,6 +510,7 @@ main (int argc, char *argv[]) fprintf (f, " '%s'\n", n->name); fprintf (f, ")\n"); } +#endif /* __USE_GNU */ fclose (f); direct = 1; @@ -551,7 +559,9 @@ main (int argc, char *argv[]) signal (SIGINT, signal_handler); /* Wait for the regular termination. */ - termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)); + do + termpid = waitpid (pid, &status, 0); + while (termpid == -1 && errno == EINTR); if (termpid == -1) { printf ("Waiting for test program failed: %m\n");