From 2eee835eca960c9d4119279804214b7a1ed5d156 Mon Sep 17 00:00:00 2001 From: DJ Delorie <dj@redhat.com> Date: Thu, 8 Aug 2024 22:44:56 -0400 Subject: [PATCH] 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 <fweimer@redhat.com> --- inet/Makefile | 1 + inet/tst-if_nameindex.c | 116 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 inet/tst-if_nameindex.c 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 + <https://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <errno.h> +#include <net/if.h> +#include <netdb.h> +#include <string.h> +#include <support/check.h> +#include <support/descriptors.h> +#include <support/support.h> + +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; i<min_idx; i++) + checki (i); + for (i=max_idx+1; i<max_idx+3; i++) + checki (i); + + /* Check that a known-invalid name returns 0. */ + + for (i=0; test_names[i] != NULL; i++) + { + /* Make sure our "invalid" name is really invalid. */ + for (ifp = if_ni; !(ifp->if_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 <support/test-driver.c>