From: DJ Delorie Date: Fri, 9 Aug 2024 02:44:56 +0000 (-0400) Subject: inet: test if_nametoindex and if_indextoname X-Git-Tag: glibc-2.41~724 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2eee835eca960c9d4119279804214b7a1ed5d156;p=thirdparty%2Fglibc.git inet: test if_nametoindex and if_indextoname Tests for if_nameindex, if_name2index, and if_index2name Tests that valid results are consistent. Tests that invalid parameters fail correctly. Reviewed-by: Florian Weimer --- diff --git a/inet/Makefile b/inet/Makefile index 2f03e6f7ee..cb97b45f0f 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -91,6 +91,7 @@ tests := \ tst-getni1 \ tst-getni2 \ tst-if_index-long \ + tst-if_nameindex \ tst-inet6_rth \ tst-network \ tst-ntoa \ diff --git a/inet/tst-if_nameindex.c b/inet/tst-if_nameindex.c new file mode 100644 index 0000000000..b025cdb3a7 --- /dev/null +++ b/inet/tst-if_nameindex.c @@ -0,0 +1,116 @@ +/* Tests for if_nameindex et al. + Copyright (C) 2024 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 + . */ + +#include +#include +#include +#include +#include +#include +#include +#include + +static char *buffer; + +static const char *test_names[] = { + "testing", + "invalid", + "dont-match", + "", + "\001\001\001\177", + NULL +}; + +static void +checki (int i) +{ + char *ifname; + + /* Test that a known-invalid index returns NULL. */ + /* BUFFER should not be accessed. */ + + printf ("Testing if_indextoname (%d) == NULL\n", i); + ifname = if_indextoname (i, NULL); + TEST_VERIFY (ifname == NULL); + TEST_VERIFY (errno == ENXIO); +} + +static int +do_test (void) +{ + struct if_nameindex *if_ni, *ifp; + int min_idx, max_idx, buflen = 0; + int i; + + if_ni = if_nameindex (); + TEST_VERIFY (if_ni != NULL); + + min_idx = max_idx = if_ni->if_index; + + for (ifp = if_ni; !(ifp->if_index == 0 && ifp->if_name == NULL); ifp++) + { + printf ("%u: %s\n", ifp->if_index, ifp->if_name); + if (ifp->if_index < min_idx) + min_idx = ifp->if_index; + if (ifp->if_index > max_idx) + max_idx = ifp->if_index; + if (strlen (ifp->if_name) + 1 > buflen) + buflen = strlen (ifp->if_name) + 1; + } + buffer = (char *) xmalloc (buflen); + + /* Check normal operation. */ + for (ifp = if_ni; !(ifp->if_index == 0 && ifp->if_name == NULL); ifp++) + { + unsigned int idx = if_nametoindex (ifp->if_name); + TEST_VERIFY (idx == ifp->if_index); + + char *fn = if_indextoname (ifp->if_index, buffer); + TEST_VERIFY (strcmp (fn, ifp->if_name) == 0); + } + + for (i=-2; iif_index == 0 && ifp->if_name == NULL); ifp++) + if (strcmp (test_names[i], ifp->if_name) == 0) + goto not_this_one; + + printf ("Testing if_nametoindex (%s) == 0\n", test_names[i]); + + unsigned int idx = if_nametoindex (test_names[i]); + TEST_VERIFY (idx == 0); + TEST_VERIFY (errno == ENODEV); + + not_this_one: + } + + + if_freenameindex (if_ni); + + return 0; +} + +#include