Message ID | 20210312154958.13842-1-lukma@denx.de |
---|---|
State | Dropped |
Delegated to: | Adhemerval Zanella Netto |
Headers |
Return-Path: <libc-alpha-bounces@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 29AC539C5013; Fri, 12 Mar 2021 15:50:23 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.10]) by sourceware.org (Postfix) with ESMTPS id 6F1953870856; Fri, 12 Mar 2021 15:50:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 6F1953870856 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: sourceware.org; spf=none smtp.mailfrom=lukma@denx.de Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 4Dxqyc1xHmz1s1Jp; Fri, 12 Mar 2021 16:50:16 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 4Dxqyc0Xmtz1qr5L; Fri, 12 Mar 2021 16:50:16 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id uL_sOlv75R9s; Fri, 12 Mar 2021 16:50:13 +0100 (CET) X-Auth-Info: n8MWIXRp8Xt3Lb0jyUW4vNGBC9PFVuagWiV/Dus2BUI= Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Fri, 12 Mar 2021 16:50:13 +0100 (CET) From: Lukasz Majewski <lukma@denx.de> To: Joseph Myers <joseph@codesourcery.com>, Adhemerval Zanella <adhemerval.zanella@linaro.org>, Florian Weimer <fweimer@redhat.com>, DJ Delorie <dj@redhat.com> Subject: [RFC PATCH] tst: Add test for gai_suspend Date: Fri, 12 Mar 2021 16:49:58 +0100 Message-Id: <20210312154958.13842-1-lukma@denx.de> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-14.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list <libc-alpha.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/libc-alpha>, <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/libc-alpha/> List-Post: <mailto:libc-alpha@sourceware.org> List-Help: <mailto:libc-alpha-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/libc-alpha>, <mailto:libc-alpha-request@sourceware.org?subject=subscribe> Cc: GNU C Library <libc-alpha@sourceware.org>, libc-help@sourceware.org, Florian Weimer <fw@deneb.enyo.de>, Alistair Francis <alistair.francis@wdc.com> Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" <libc-alpha-bounces@sourceware.org> |
Series |
[RFC] tst: Add test for gai_suspend
|
|
Commit Message
Lukasz Majewski
March 12, 2021, 3:49 p.m. UTC
--- resolv/Makefile | 2 ++ resolv/tst-gai_suspend.c | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 resolv/tst-gai_suspend.c
Comments
Dear Community, > --- > resolv/Makefile | 2 ++ > resolv/tst-gai_suspend.c | 53 > ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 > insertions(+) create mode 100644 resolv/tst-gai_suspend.c > > diff --git a/resolv/Makefile b/resolv/Makefile > index 1047bb6ae5..e7e66fe903 100644 > --- a/resolv/Makefile > +++ b/resolv/Makefile > @@ -60,6 +60,7 @@ tests += \ > tst-resolv-res_init-multi \ > tst-resolv-search \ > tst-resolv-trailing \ > + tst-gai_suspend \ > > # This test calls __res_context_send directly, which is not exported > # from libresolv. > @@ -209,3 +210,4 @@ $(objpfx)tst-ns_name_compress: > $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: $(objpfx)libresolv.so > $(objpfx)tst-res_hnok: $(objpfx)libresolv.so > $(objpfx)tst-p_secstodate: $(objpfx)libresolv.so > +$(objpfx)tst-gai_suspend: $(objpfx)libanl.so > diff --git a/resolv/tst-gai_suspend.c b/resolv/tst-gai_suspend.c > new file mode 100644 > index 0000000000..bbafd13fc4 > --- /dev/null > +++ b/resolv/tst-gai_suspend.c > @@ -0,0 +1,53 @@ > +/* Test for gai_suspend timeout > + Copyright (C) 2021 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 > + <https://www.gnu.org/licenses/>. */ > + > +#include <time.h> > +#include <netdb.h> > +#include <errno.h> > +#include <string.h> > +#include <support/check.h> > +#include <support/xtime.h> > +#include <support/timespec.h> > + > +static int > +do_test (void) > +{ > + struct timespec ts; > + xclock_gettime (CLOCK_REALTIME, &ts); > + struct timespec timeout = make_timespec (1, 0); > + ts = timespec_add (ts, timeout); > + > + /* Ignore gaicb content - just wait for timeout. */ > + struct addrinfo result; > + > + struct gaicb gai = { "foo.baz", "0", NULL, &result }; > + const struct gaicb * const gai_s[] = { &gai }; > + struct gaicb *gai_p = &gai; > + > + int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > + if (ret != 0) > + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); > + > + ret = gai_suspend (gai_s, 1, &timeout); > + TEST_COMPARE (ret, EAI_AGAIN); > + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); > + > + return 0; > +} > + > +#include <support/test-driver.c> I'm a bit puzzled with the above gai_suspend() test. The idea for Y2038 test is to check if one can timeout when passed crafted struct gaicb causes the gai_suspend() to exit with timeout. This approach is similar to one from tst-ppoll.c 1. When I do run it by hand on the remove machine (from glibc test suite): -------------------------------------------------- rm -rf ./resolv/* make PARALLELMFLAGS="-j8" test-wrapper='/home/lukma/work/yocto/y2038/build/workspace/sources/y2038-glibc/scripts/cross-test-ssh.sh --allow-time-setting root@192.168.7.2' subdirs=resolv check I do see the following error: ----------------------------- cat ./resolv/tst-gai_suspend.out Didn't expect signal from child: got `Segmentation fault' This is strange, as I've passed NULL to getaddrinfo_a as the last parameter, which causes passing no signals to program running it. What am I missing here? Has the test setup any strict policy to handle LWPs ? 2. On the VM (armv7): gai_suspend.c test program: --------------------------- #define _GNU_SOURCE #include <stdio.h> #include <time.h> #include <netdb.h> int main (int argc, char **argv) { struct timespec ts, timeout, now; clock_gettime (CLOCK_REALTIME, &ts); timeout.tv_sec = ts.tv_sec + 3; timeout.tv_nsec = ts.tv_nsec; struct addrinfo result; struct gaicb gai = { "foo.baz", "0", NULL, &result }; const struct gaicb * const gai_s[] = { &gai }; struct gaicb *gai_p = &gai; int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); if (ret != 0) printf("getaddrinfo_a error"); ret = gai_suspend (gai_s, 1, &timeout); // According to man getaddrinfo_s I shall receive ret == -3 // when conversion from name to IP credentials is performed if (ret != 0) printf("gai_suspend error"); clock_gettime (CLOCK_REALTIME, &now); printf("gai_suspend seconds diff: %llu\n", now.tv_sec - ts.tv_sec); return 0; } gcc -Wall -ggdb -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -I/opt/include \ -I/opt/usr/include -L/opt/usr/lib -Wl,-rpath=/opt/lib \ -Wl,--dynamic-linker=/opt/lib/ld-linux.so.2 gai_suspend.c -o gs -lanl \ -lpthread -static The above line has some manual adjustments for linker, but this works for other syscalls for some long time now - more info [1]. In this case the program quits without any issues with threads, but the output and behavior of gai_suspend is not as expected (according at least to the manual [2]). The return code from gai_suspend shall be EAI_AGAIN and the result struct has some garbage in it. The question(s): ================ 1. Why I do experience thread error in glibc test suite? 2. Is the code for gai_suspend testing wrong (not much reference in glibc), or do we have a bug in the the implementation? Thanks in advance for any help/hints. Links: [1] - https://github.com/lmajewski/meta-y2038/ [2] - https://linux.die.net/man/3/gai_suspend Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
On Mär 12 2021, Lukasz Majewski wrote: > 1. When I do run it by hand on the remove machine (from glibc test > suite): > -------------------------------------------------- > > rm -rf ./resolv/* > make PARALLELMFLAGS="-j8" > test-wrapper='/home/lukma/work/yocto/y2038/build/workspace/sources/y2038-glibc/scripts/cross-test-ssh.sh > --allow-time-setting root@192.168.7.2' subdirs=resolv check > > I do see the following error: > ----------------------------- > > cat ./resolv/tst-gai_suspend.out > Didn't expect signal from child: got `Segmentation fault' Where does it crash? Andreas.
On 12/03/2021 13:09, Lukasz Majewski wrote: > Dear Community, > >> --- >> resolv/Makefile | 2 ++ >> resolv/tst-gai_suspend.c | 53 >> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 >> insertions(+) create mode 100644 resolv/tst-gai_suspend.c >> >> diff --git a/resolv/Makefile b/resolv/Makefile >> index 1047bb6ae5..e7e66fe903 100644 >> --- a/resolv/Makefile >> +++ b/resolv/Makefile >> @@ -60,6 +60,7 @@ tests += \ >> tst-resolv-res_init-multi \ >> tst-resolv-search \ >> tst-resolv-trailing \ >> + tst-gai_suspend \ >> >> # This test calls __res_context_send directly, which is not exported >> # from libresolv. >> @@ -209,3 +210,4 @@ $(objpfx)tst-ns_name_compress: >> $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: $(objpfx)libresolv.so >> $(objpfx)tst-res_hnok: $(objpfx)libresolv.so >> $(objpfx)tst-p_secstodate: $(objpfx)libresolv.so >> +$(objpfx)tst-gai_suspend: $(objpfx)libanl.so >> diff --git a/resolv/tst-gai_suspend.c b/resolv/tst-gai_suspend.c >> new file mode 100644 >> index 0000000000..bbafd13fc4 >> --- /dev/null >> +++ b/resolv/tst-gai_suspend.c >> @@ -0,0 +1,53 @@ >> +/* Test for gai_suspend timeout >> + Copyright (C) 2021 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 >> + <https://www.gnu.org/licenses/>. */ >> + >> +#include <time.h> >> +#include <netdb.h> >> +#include <errno.h> >> +#include <string.h> >> +#include <support/check.h> >> +#include <support/xtime.h> >> +#include <support/timespec.h> >> + >> +static int >> +do_test (void) >> +{ >> + struct timespec ts; >> + xclock_gettime (CLOCK_REALTIME, &ts); >> + struct timespec timeout = make_timespec (1, 0); >> + ts = timespec_add (ts, timeout); >> + >> + /* Ignore gaicb content - just wait for timeout. */ >> + struct addrinfo result; >> + >> + struct gaicb gai = { "foo.baz", "0", NULL, &result }; >> + const struct gaicb * const gai_s[] = { &gai }; >> + struct gaicb *gai_p = &gai; >> + >> + int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); >> + if (ret != 0) >> + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); >> + >> + ret = gai_suspend (gai_s, 1, &timeout); >> + TEST_COMPARE (ret, EAI_AGAIN); >> + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); >> + >> + return 0; >> +} >> + >> +#include <support/test-driver.c> > > I'm a bit puzzled with the above gai_suspend() test. > > > The idea for Y2038 test is to check if one can timeout when passed > crafted struct gaicb causes the gai_suspend() to exit with timeout. > This approach is similar to one from tst-ppoll.c > > > 1. When I do run it by hand on the remove machine (from glibc test > suite): > -------------------------------------------------- > > rm -rf ./resolv/* > make PARALLELMFLAGS="-j8" > test-wrapper='/home/lukma/work/yocto/y2038/build/workspace/sources/y2038-glibc/scripts/cross-test-ssh.sh > --allow-time-setting root@192.168.7.2' subdirs=resolv check > > I do see the following error: > ----------------------------- > > cat ./resolv/tst-gai_suspend.out > Didn't expect signal from child: got `Segmentation fault' > > This is strange, as I've passed NULL to getaddrinfo_a as the last > parameter, which causes passing no signals to program running it. > > What am I missing here? Has the test setup any strict policy to handle > LWPs ? > > > 2. On the VM (armv7): > > gai_suspend.c test program: > --------------------------- > > #define _GNU_SOURCE > > #include <stdio.h> > #include <time.h> > #include <netdb.h> > > int main (int argc, char **argv) > { > struct timespec ts, timeout, now; > > clock_gettime (CLOCK_REALTIME, &ts); > > timeout.tv_sec = ts.tv_sec + 3; > timeout.tv_nsec = ts.tv_nsec; > > struct addrinfo result; > struct gaicb gai = { "foo.baz", "0", NULL, &result }; > const struct gaicb * const gai_s[] = { &gai }; > struct gaicb *gai_p = &gai; > > int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > if (ret != 0) > printf("getaddrinfo_a error"); > > ret = gai_suspend (gai_s, 1, &timeout); > // According to man getaddrinfo_s I shall receive ret == -3 > // when conversion from name to IP credentials is performed > if (ret != 0) > printf("gai_suspend error"); > > clock_gettime (CLOCK_REALTIME, &now); > > printf("gai_suspend seconds diff: %llu\n", now.tv_sec - > ts.tv_sec); > > return 0; > } > > > gcc -Wall -ggdb -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -I/opt/include \ > -I/opt/usr/include -L/opt/usr/lib -Wl,-rpath=/opt/lib \ > -Wl,--dynamic-linker=/opt/lib/ld-linux.so.2 gai_suspend.c -o gs > -lanl \ -lpthread -static > > The above line has some manual adjustments for linker, but this works > for other syscalls for some long time now - more info [1]. > > > In this case the program quits without any issues with threads, but the > output and behavior of gai_suspend is not as expected (according at > least to the manual [2]). The return code from gai_suspend shall be > EAI_AGAIN and the result struct has some garbage in it. > > > The question(s): > ================ > > 1. Why I do experience thread error in glibc test suite? > > 2. Is the code for gai_suspend testing wrong (not much reference in > glibc), or do we have a bug in the the implementation? > > > Thanks in advance for any help/hints. > > > > Links: > [1] - https://github.com/lmajewski/meta-y2038/ > [2] - https://linux.die.net/man/3/gai_suspend > > Best regards, > > Lukasz Majewski I am not sure from where the failure come from, on my environment I am not seeing the SEGFAULT failure on neither x86_64 nor on i686. But I am seeing: $ ./testrun.sh resolv/tst-gai_suspend tst-gai_suspend.c:47: numeric comparison failure left: 0 (0x0); from: ret right: -3 (0xfffffffd); from: EAI_AGAIN tst-gai_suspend.c:48: 1616504556.995728406s not after 1616504557.971222237s (difference 0.975493831s) error: 2 test failures The issue is tests is using the system NSS and possible DNS cache so the expected name resolution timeout does not happen reliable. I am not sure how we can accomplish it, maybe through running it on a container with a custom NSS module to actually emulate the delay.
Hi Adhemerval, > On 12/03/2021 13:09, Lukasz Majewski wrote: > > Dear Community, > > > >> --- > >> resolv/Makefile | 2 ++ > >> resolv/tst-gai_suspend.c | 53 > >> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 > >> insertions(+) create mode 100644 resolv/tst-gai_suspend.c > >> > >> diff --git a/resolv/Makefile b/resolv/Makefile > >> index 1047bb6ae5..e7e66fe903 100644 > >> --- a/resolv/Makefile > >> +++ b/resolv/Makefile > >> @@ -60,6 +60,7 @@ tests += \ > >> tst-resolv-res_init-multi \ > >> tst-resolv-search \ > >> tst-resolv-trailing \ > >> + tst-gai_suspend \ > >> > >> # This test calls __res_context_send directly, which is not > >> exported # from libresolv. > >> @@ -209,3 +210,4 @@ $(objpfx)tst-ns_name_compress: > >> $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: > >> $(objpfx)libresolv.so $(objpfx)tst-res_hnok: $(objpfx)libresolv.so > >> $(objpfx)tst-p_secstodate: $(objpfx)libresolv.so > >> +$(objpfx)tst-gai_suspend: $(objpfx)libanl.so > >> diff --git a/resolv/tst-gai_suspend.c b/resolv/tst-gai_suspend.c > >> new file mode 100644 > >> index 0000000000..bbafd13fc4 > >> --- /dev/null > >> +++ b/resolv/tst-gai_suspend.c > >> @@ -0,0 +1,53 @@ > >> +/* Test for gai_suspend timeout > >> + Copyright (C) 2021 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 > >> + <https://www.gnu.org/licenses/>. */ > >> + > >> +#include <time.h> > >> +#include <netdb.h> > >> +#include <errno.h> > >> +#include <string.h> > >> +#include <support/check.h> > >> +#include <support/xtime.h> > >> +#include <support/timespec.h> > >> + > >> +static int > >> +do_test (void) > >> +{ > >> + struct timespec ts; > >> + xclock_gettime (CLOCK_REALTIME, &ts); > >> + struct timespec timeout = make_timespec (1, 0); > >> + ts = timespec_add (ts, timeout); > >> + > >> + /* Ignore gaicb content - just wait for timeout. */ > >> + struct addrinfo result; > >> + > >> + struct gaicb gai = { "foo.baz", "0", NULL, &result }; > >> + const struct gaicb * const gai_s[] = { &gai }; > >> + struct gaicb *gai_p = &gai; > >> + > >> + int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > >> + if (ret != 0) > >> + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); > >> + > >> + ret = gai_suspend (gai_s, 1, &timeout); > >> + TEST_COMPARE (ret, EAI_AGAIN); > >> + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); > >> + > >> + return 0; > >> +} > >> + > >> +#include <support/test-driver.c> > > > > I'm a bit puzzled with the above gai_suspend() test. > > > > > > The idea for Y2038 test is to check if one can timeout when passed > > crafted struct gaicb causes the gai_suspend() to exit with timeout. > > This approach is similar to one from tst-ppoll.c > > > > > > 1. When I do run it by hand on the remove machine (from glibc test > > suite): > > -------------------------------------------------- > > > > rm -rf ./resolv/* > > make PARALLELMFLAGS="-j8" > > test-wrapper='/home/lukma/work/yocto/y2038/build/workspace/sources/y2038-glibc/scripts/cross-test-ssh.sh > > --allow-time-setting root@192.168.7.2' subdirs=resolv check > > > > I do see the following error: > > ----------------------------- > > > > cat ./resolv/tst-gai_suspend.out > > Didn't expect signal from child: got `Segmentation fault' > > > > This is strange, as I've passed NULL to getaddrinfo_a as the last > > parameter, which causes passing no signals to program running it. > > > > What am I missing here? Has the test setup any strict policy to > > handle LWPs ? > > > > > > 2. On the VM (armv7): > > > > gai_suspend.c test program: > > --------------------------- > > > > #define _GNU_SOURCE > > > > #include <stdio.h> > > #include <time.h> > > #include <netdb.h> > > > > int main (int argc, char **argv) > > { > > struct timespec ts, timeout, now; > > > > clock_gettime (CLOCK_REALTIME, &ts); > > > > timeout.tv_sec = ts.tv_sec + 3; > > timeout.tv_nsec = ts.tv_nsec; > > > > struct addrinfo result; > > struct gaicb gai = { "foo.baz", "0", NULL, &result }; > > const struct gaicb * const gai_s[] = { &gai }; > > struct gaicb *gai_p = &gai; > > > > int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > > if (ret != 0) > > printf("getaddrinfo_a error"); > > > > ret = gai_suspend (gai_s, 1, &timeout); > > // According to man getaddrinfo_s I shall receive ret == -3 > > // when conversion from name to IP credentials is performed > > if (ret != 0) > > printf("gai_suspend error"); > > > > clock_gettime (CLOCK_REALTIME, &now); > > > > printf("gai_suspend seconds diff: %llu\n", now.tv_sec - > > ts.tv_sec); > > > > return 0; > > } > > > > > > gcc -Wall -ggdb -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 > > -I/opt/include \ -I/opt/usr/include -L/opt/usr/lib > > -Wl,-rpath=/opt/lib \ -Wl,--dynamic-linker=/opt/lib/ld-linux.so.2 > > gai_suspend.c -o gs -lanl \ -lpthread -static > > > > The above line has some manual adjustments for linker, but this > > works for other syscalls for some long time now - more info [1]. > > > > > > In this case the program quits without any issues with threads, but > > the output and behavior of gai_suspend is not as expected > > (according at least to the manual [2]). The return code from > > gai_suspend shall be EAI_AGAIN and the result struct has some > > garbage in it. > > > > > > The question(s): > > ================ > > > > 1. Why I do experience thread error in glibc test suite? > > > > 2. Is the code for gai_suspend testing wrong (not much reference in > > glibc), or do we have a bug in the the implementation? > > > > > > Thanks in advance for any help/hints. > > > > > > > > Links: > > [1] - https://github.com/lmajewski/meta-y2038/ > > [2] - https://linux.die.net/man/3/gai_suspend > > > > Best regards, > > > > Lukasz Majewski > > I am not sure from where the failure come from, on my environment I am > not seeing the SEGFAULT failure on neither x86_64 nor on i686. > > But I am seeing: > > $ ./testrun.sh resolv/tst-gai_suspend > tst-gai_suspend.c:47: numeric comparison failure > left: 0 (0x0); from: ret > right: -3 (0xfffffffd); from: EAI_AGAIN > tst-gai_suspend.c:48: 1616504556.995728406s not after > 1616504557.971222237s (difference 0.975493831s) > error: 2 test failures > > The issue is tests is using the system NSS and possible DNS cache so > the expected name resolution timeout does not happen reliable. I am > not sure how we can accomplish it, maybe through running it on a > container with a custom NSS module to actually emulate the delay. I thought that calling: int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); ret = gai_suspend (gai_s, 1, &timeout); shall just timeout as struct gaicb is providing data which shall be not resolved. As a result we will have timeout (as we do in e.g. select or ppoll). Anyway, I'm wondering how this can be easily tested? I mean crafting container with custom NSS to check timeout seems not so easy. Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Hi Adhemerval, > On 12/03/2021 13:09, Lukasz Majewski wrote: > > Dear Community, > > > >> --- > >> resolv/Makefile | 2 ++ > >> resolv/tst-gai_suspend.c | 53 > >> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 > >> insertions(+) create mode 100644 resolv/tst-gai_suspend.c > >> > >> diff --git a/resolv/Makefile b/resolv/Makefile > >> index 1047bb6ae5..e7e66fe903 100644 > >> --- a/resolv/Makefile > >> +++ b/resolv/Makefile > >> @@ -60,6 +60,7 @@ tests += \ > >> tst-resolv-res_init-multi \ > >> tst-resolv-search \ > >> tst-resolv-trailing \ > >> + tst-gai_suspend \ > >> > >> # This test calls __res_context_send directly, which is not > >> exported # from libresolv. > >> @@ -209,3 +210,4 @@ $(objpfx)tst-ns_name_compress: > >> $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: > >> $(objpfx)libresolv.so $(objpfx)tst-res_hnok: $(objpfx)libresolv.so > >> $(objpfx)tst-p_secstodate: $(objpfx)libresolv.so > >> +$(objpfx)tst-gai_suspend: $(objpfx)libanl.so > >> diff --git a/resolv/tst-gai_suspend.c b/resolv/tst-gai_suspend.c > >> new file mode 100644 > >> index 0000000000..bbafd13fc4 > >> --- /dev/null > >> +++ b/resolv/tst-gai_suspend.c > >> @@ -0,0 +1,53 @@ > >> +/* Test for gai_suspend timeout > >> + Copyright (C) 2021 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 > >> + <https://www.gnu.org/licenses/>. */ > >> + > >> +#include <time.h> > >> +#include <netdb.h> > >> +#include <errno.h> > >> +#include <string.h> > >> +#include <support/check.h> > >> +#include <support/xtime.h> > >> +#include <support/timespec.h> > >> + > >> +static int > >> +do_test (void) > >> +{ > >> + struct timespec ts; > >> + xclock_gettime (CLOCK_REALTIME, &ts); > >> + struct timespec timeout = make_timespec (1, 0); > >> + ts = timespec_add (ts, timeout); > >> + > >> + /* Ignore gaicb content - just wait for timeout. */ > >> + struct addrinfo result; > >> + > >> + struct gaicb gai = { "foo.baz", "0", NULL, &result }; > >> + const struct gaicb * const gai_s[] = { &gai }; > >> + struct gaicb *gai_p = &gai; > >> + > >> + int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > >> + if (ret != 0) > >> + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); > >> + > >> + ret = gai_suspend (gai_s, 1, &timeout); > >> + TEST_COMPARE (ret, EAI_AGAIN); > >> + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); > >> + > >> + return 0; > >> +} > >> + > >> +#include <support/test-driver.c> > > > > I'm a bit puzzled with the above gai_suspend() test. > > > > > > The idea for Y2038 test is to check if one can timeout when passed > > crafted struct gaicb causes the gai_suspend() to exit with timeout. > > This approach is similar to one from tst-ppoll.c > > > > > > 1. When I do run it by hand on the remove machine (from glibc test > > suite): > > -------------------------------------------------- > > > > rm -rf ./resolv/* > > make PARALLELMFLAGS="-j8" > > test-wrapper='/home/lukma/work/yocto/y2038/build/workspace/sources/y2038-glibc/scripts/cross-test-ssh.sh > > --allow-time-setting root@192.168.7.2' subdirs=resolv check > > > > I do see the following error: > > ----------------------------- > > > > cat ./resolv/tst-gai_suspend.out > > Didn't expect signal from child: got `Segmentation fault' > > > > This is strange, as I've passed NULL to getaddrinfo_a as the last > > parameter, which causes passing no signals to program running it. > > > > What am I missing here? Has the test setup any strict policy to > > handle LWPs ? > > > > > > 2. On the VM (armv7): > > > > gai_suspend.c test program: > > --------------------------- > > > > #define _GNU_SOURCE > > > > #include <stdio.h> > > #include <time.h> > > #include <netdb.h> > > > > int main (int argc, char **argv) > > { > > struct timespec ts, timeout, now; > > > > clock_gettime (CLOCK_REALTIME, &ts); > > > > timeout.tv_sec = ts.tv_sec + 3; > > timeout.tv_nsec = ts.tv_nsec; > > > > struct addrinfo result; > > struct gaicb gai = { "foo.baz", "0", NULL, &result }; > > const struct gaicb * const gai_s[] = { &gai }; > > struct gaicb *gai_p = &gai; > > > > int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > > if (ret != 0) > > printf("getaddrinfo_a error"); > > > > ret = gai_suspend (gai_s, 1, &timeout); > > // According to man getaddrinfo_s I shall receive ret == -3 > > // when conversion from name to IP credentials is performed > > if (ret != 0) > > printf("gai_suspend error"); > > > > clock_gettime (CLOCK_REALTIME, &now); > > > > printf("gai_suspend seconds diff: %llu\n", now.tv_sec - > > ts.tv_sec); > > > > return 0; > > } > > > > > > gcc -Wall -ggdb -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 > > -I/opt/include \ -I/opt/usr/include -L/opt/usr/lib > > -Wl,-rpath=/opt/lib \ -Wl,--dynamic-linker=/opt/lib/ld-linux.so.2 > > gai_suspend.c -o gs -lanl \ -lpthread -static > > > > The above line has some manual adjustments for linker, but this > > works for other syscalls for some long time now - more info [1]. > > > > > > In this case the program quits without any issues with threads, but > > the output and behavior of gai_suspend is not as expected > > (according at least to the manual [2]). The return code from > > gai_suspend shall be EAI_AGAIN and the result struct has some > > garbage in it. > > > > > > The question(s): > > ================ > > > > 1. Why I do experience thread error in glibc test suite? > > > > 2. Is the code for gai_suspend testing wrong (not much reference in > > glibc), or do we have a bug in the the implementation? > > > > > > Thanks in advance for any help/hints. > > > > > > > > Links: > > [1] - https://github.com/lmajewski/meta-y2038/ > > [2] - https://linux.die.net/man/3/gai_suspend > > > > Best regards, > > > > Lukasz Majewski > > I am not sure from where the failure come from, on my environment I am > not seeing the SEGFAULT failure on neither x86_64 nor on i686. > > But I am seeing: > > $ ./testrun.sh resolv/tst-gai_suspend > tst-gai_suspend.c:47: numeric comparison failure > left: 0 (0x0); from: ret > right: -3 (0xfffffffd); from: EAI_AGAIN > tst-gai_suspend.c:48: 1616504556.995728406s not after > 1616504557.971222237s (difference 0.975493831s) > error: 2 test failures > > The issue is tests is using the system NSS and possible DNS cache so > the expected name resolution timeout does not happen reliable. Even more strange (tested on x86_64): 1. For "sourceware.org" + "http" struct gaicb gai = { "sourceware.org", "http", NULL, &result }; getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); gai_suspend (gai_s, 1, &timeout); ret = gai_error(gai_p); Here the ret is 0 as expected. 2. For "foo.baz" + "0" (the gai_suspend and getaddrinfo_a are called in the same way as above) struct gaicb gai = { "foo.baz", "0", NULL, &result }; Here the ret is -2 as expected (EAI_NONAME - NAME or SERVICE unknown) - the "0" here is wrong. 3. For "foo.baz" + "http" (the gai_suspend and getaddrinfo_a are called in the same way as above) struct gaicb gai = { "foo.baz", "http", NULL, &result }; Here the ret is also -2, which I don't understand. I would expect that the foo.baz name is going to be resolved as it "looks" correctly and hence the timeout will occur. Any hints on how timeout can be forced? > I am > not sure how we can accomplish it, maybe through running it on a > container with a custom NSS module to actually emulate the delay. Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
On Fri, 26 Mar 2021 12:30:43 +0100 Lukasz Majewski <lukma@denx.de> wrote: > Hi Adhemerval, > > > On 12/03/2021 13:09, Lukasz Majewski wrote: > > > Dear Community, > > > > > >> --- > > >> resolv/Makefile | 2 ++ > > >> resolv/tst-gai_suspend.c | 53 > > >> ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 > > >> insertions(+) create mode 100644 resolv/tst-gai_suspend.c > > >> > > >> diff --git a/resolv/Makefile b/resolv/Makefile > > >> index 1047bb6ae5..e7e66fe903 100644 > > >> --- a/resolv/Makefile > > >> +++ b/resolv/Makefile > > >> @@ -60,6 +60,7 @@ tests += \ > > >> tst-resolv-res_init-multi \ > > >> tst-resolv-search \ > > >> tst-resolv-trailing \ > > >> + tst-gai_suspend \ > > >> > > >> # This test calls __res_context_send directly, which is not > > >> exported # from libresolv. > > >> @@ -209,3 +210,4 @@ $(objpfx)tst-ns_name_compress: > > >> $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: > > >> $(objpfx)libresolv.so $(objpfx)tst-res_hnok: > > >> $(objpfx)libresolv.so $(objpfx)tst-p_secstodate: > > >> $(objpfx)libresolv.so +$(objpfx)tst-gai_suspend: > > >> $(objpfx)libanl.so diff --git a/resolv/tst-gai_suspend.c > > >> b/resolv/tst-gai_suspend.c new file mode 100644 > > >> index 0000000000..bbafd13fc4 > > >> --- /dev/null > > >> +++ b/resolv/tst-gai_suspend.c > > >> @@ -0,0 +1,53 @@ > > >> +/* Test for gai_suspend timeout > > >> + Copyright (C) 2021 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 > > >> + <https://www.gnu.org/licenses/>. */ > > >> + > > >> +#include <time.h> > > >> +#include <netdb.h> > > >> +#include <errno.h> > > >> +#include <string.h> > > >> +#include <support/check.h> > > >> +#include <support/xtime.h> > > >> +#include <support/timespec.h> > > >> + > > >> +static int > > >> +do_test (void) > > >> +{ > > >> + struct timespec ts; > > >> + xclock_gettime (CLOCK_REALTIME, &ts); > > >> + struct timespec timeout = make_timespec (1, 0); > > >> + ts = timespec_add (ts, timeout); > > >> + > > >> + /* Ignore gaicb content - just wait for timeout. */ > > >> + struct addrinfo result; > > >> + > > >> + struct gaicb gai = { "foo.baz", "0", NULL, &result }; > > >> + const struct gaicb * const gai_s[] = { &gai }; > > >> + struct gaicb *gai_p = &gai; > > >> + > > >> + int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > > >> + if (ret != 0) > > >> + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); > > >> + > > >> + ret = gai_suspend (gai_s, 1, &timeout); > > >> + TEST_COMPARE (ret, EAI_AGAIN); > > >> + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); > > >> + > > >> + return 0; > > >> +} > > >> + > > >> +#include <support/test-driver.c> > > > > > > I'm a bit puzzled with the above gai_suspend() test. > > > > > > > > > The idea for Y2038 test is to check if one can timeout when passed > > > crafted struct gaicb causes the gai_suspend() to exit with > > > timeout. This approach is similar to one from tst-ppoll.c > > > > > > > > > 1. When I do run it by hand on the remove machine (from glibc test > > > suite): > > > -------------------------------------------------- > > > > > > rm -rf ./resolv/* > > > make PARALLELMFLAGS="-j8" > > > test-wrapper='/home/lukma/work/yocto/y2038/build/workspace/sources/y2038-glibc/scripts/cross-test-ssh.sh > > > --allow-time-setting root@192.168.7.2' subdirs=resolv check > > > > > > I do see the following error: > > > ----------------------------- > > > > > > cat ./resolv/tst-gai_suspend.out > > > Didn't expect signal from child: got `Segmentation fault' > > > > > > This is strange, as I've passed NULL to getaddrinfo_a as the last > > > parameter, which causes passing no signals to program running it. > > > > > > What am I missing here? Has the test setup any strict policy to > > > handle LWPs ? > > > > > > > > > 2. On the VM (armv7): > > > > > > gai_suspend.c test program: > > > --------------------------- > > > > > > #define _GNU_SOURCE > > > > > > #include <stdio.h> > > > #include <time.h> > > > #include <netdb.h> > > > > > > int main (int argc, char **argv) > > > { > > > struct timespec ts, timeout, now; > > > > > > clock_gettime (CLOCK_REALTIME, &ts); > > > > > > timeout.tv_sec = ts.tv_sec + 3; > > > timeout.tv_nsec = ts.tv_nsec; > > > > > > struct addrinfo result; > > > struct gaicb gai = { "foo.baz", "0", NULL, &result }; > > > const struct gaicb * const gai_s[] = { &gai }; > > > struct gaicb *gai_p = &gai; > > > > > > int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > > > if (ret != 0) > > > printf("getaddrinfo_a error"); > > > > > > ret = gai_suspend (gai_s, 1, &timeout); > > > // According to man getaddrinfo_s I shall receive ret == > > > -3 // when conversion from name to IP credentials is performed > > > if (ret != 0) > > > printf("gai_suspend error"); > > > > > > clock_gettime (CLOCK_REALTIME, &now); > > > > > > printf("gai_suspend seconds diff: %llu\n", now.tv_sec - > > > ts.tv_sec); > > > > > > return 0; > > > } > > > > > > > > > gcc -Wall -ggdb -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 > > > -I/opt/include \ -I/opt/usr/include -L/opt/usr/lib > > > -Wl,-rpath=/opt/lib \ -Wl,--dynamic-linker=/opt/lib/ld-linux.so.2 > > > gai_suspend.c -o gs -lanl \ -lpthread -static > > > > > > The above line has some manual adjustments for linker, but this > > > works for other syscalls for some long time now - more info [1]. > > > > > > > > > In this case the program quits without any issues with threads, > > > but the output and behavior of gai_suspend is not as expected > > > (according at least to the manual [2]). The return code from > > > gai_suspend shall be EAI_AGAIN and the result struct has some > > > garbage in it. > > > > > > > > > The question(s): > > > ================ > > > > > > 1. Why I do experience thread error in glibc test suite? > > > > > > 2. Is the code for gai_suspend testing wrong (not much reference > > > in glibc), or do we have a bug in the the implementation? > > > > > > > > > Thanks in advance for any help/hints. > > > > > > > > > > > > Links: > > > [1] - https://github.com/lmajewski/meta-y2038/ > > > [2] - https://linux.die.net/man/3/gai_suspend > > > > > > Best regards, > > > > > > Lukasz Majewski > > > > I am not sure from where the failure come from, on my environment I > > am not seeing the SEGFAULT failure on neither x86_64 nor on i686. > > > > But I am seeing: > > > > $ ./testrun.sh resolv/tst-gai_suspend > > tst-gai_suspend.c:47: numeric comparison failure > > left: 0 (0x0); from: ret > > right: -3 (0xfffffffd); from: EAI_AGAIN > > tst-gai_suspend.c:48: 1616504556.995728406s not after > > 1616504557.971222237s (difference 0.975493831s) > > error: 2 test failures > > > > The issue is tests is using the system NSS and possible DNS cache so > > the expected name resolution timeout does not happen reliable. > > Even more strange (tested on x86_64): > > 1. For "sourceware.org" + "http" > struct gaicb gai = { "sourceware.org", "http", NULL, &result }; > > getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); > gai_suspend (gai_s, 1, &timeout); > > ret = gai_error(gai_p); > > Here the ret is 0 as expected. > > 2. For "foo.baz" + "0" (the gai_suspend and getaddrinfo_a are called > in the same way as above) > > struct gaicb gai = { "foo.baz", "0", NULL, &result }; > > Here the ret is -2 as expected (EAI_NONAME - NAME or SERVICE unknown) > - the "0" here is wrong. > > > 3. For "foo.baz" + "http" (the gai_suspend and getaddrinfo_a are > called in the same way as above) > > struct gaicb gai = { "foo.baz", "http", NULL, &result }; > > Here the ret is also -2, which I don't understand. I would expect that > the foo.baz name is going to be resolved as it "looks" correctly and > hence the timeout will occur. > > Any hints on how timeout can be forced? Gentle ping on this problem. > > > I am > > not sure how we can accomplish it, maybe through running it on a > > container with a custom NSS module to actually emulate the delay. > > > Best regards, > > Lukasz Majewski > > -- > > DENX Software Engineering GmbH, Managing Director: Wolfgang Denk > HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany > Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: > lukma@denx.de Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
diff --git a/resolv/Makefile b/resolv/Makefile index 1047bb6ae5..e7e66fe903 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -60,6 +60,7 @@ tests += \ tst-resolv-res_init-multi \ tst-resolv-search \ tst-resolv-trailing \ + tst-gai_suspend \ # This test calls __res_context_send directly, which is not exported # from libresolv. @@ -209,3 +210,4 @@ $(objpfx)tst-ns_name_compress: $(objpfx)libresolv.so $(objpfx)tst-ns_name_pton: $(objpfx)libresolv.so $(objpfx)tst-res_hnok: $(objpfx)libresolv.so $(objpfx)tst-p_secstodate: $(objpfx)libresolv.so +$(objpfx)tst-gai_suspend: $(objpfx)libanl.so diff --git a/resolv/tst-gai_suspend.c b/resolv/tst-gai_suspend.c new file mode 100644 index 0000000000..bbafd13fc4 --- /dev/null +++ b/resolv/tst-gai_suspend.c @@ -0,0 +1,53 @@ +/* Test for gai_suspend timeout + Copyright (C) 2021 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 + <https://www.gnu.org/licenses/>. */ + +#include <time.h> +#include <netdb.h> +#include <errno.h> +#include <string.h> +#include <support/check.h> +#include <support/xtime.h> +#include <support/timespec.h> + +static int +do_test (void) +{ + struct timespec ts; + xclock_gettime (CLOCK_REALTIME, &ts); + struct timespec timeout = make_timespec (1, 0); + ts = timespec_add (ts, timeout); + + /* Ignore gaicb content - just wait for timeout. */ + struct addrinfo result; + + struct gaicb gai = { "foo.baz", "0", NULL, &result }; + const struct gaicb * const gai_s[] = { &gai }; + struct gaicb *gai_p = &gai; + + int ret = getaddrinfo_a (GAI_NOWAIT, &gai_p, 1, NULL); + if (ret != 0) + FAIL_EXIT1 ("getaddrinfo_a failed: %m\n"); + + ret = gai_suspend (gai_s, 1, &timeout); + TEST_COMPARE (ret, EAI_AGAIN); + TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts); + + return 0; +} + +#include <support/test-driver.c>