123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- From 9a90d9b9119906df23cb2db1503cb0f099942dd9 Mon Sep 17 00:00:00 2001
- From: Mats Erik Andersson <gnu@gisladisker.se>
- Date: Sat, 18 Jul 2015 01:12:41 +0200
- Subject: [PATCH 02/60] ifconfig: Improve the support for GNU/Hurd.
- Use system specific code instead of generic code.
- This provides abilities similar to other systems.
- ---
- ChangeLog | 17 +++
- ifconfig/system.c | 10 +-
- ifconfig/system.h | 2 +
- ifconfig/system/Makefile.am | 4 +-
- ifconfig/system/generic.c | 14 +-
- ifconfig/system/hurd.c | 292 ++++++++++++++++++++++++++++++++++++
- ifconfig/system/hurd.h | 50 ++++++
- 7 files changed, 381 insertions(+), 8 deletions(-)
- create mode 100644 ifconfig/system/hurd.c
- create mode 100644 ifconfig/system/hurd.h
- diff --git a/ChangeLog b/ChangeLog
- index 7f799daa..18a584ba 100644
- --- a/ChangeLog
- +++ b/ChangeLog
- @@ -1,3 +1,20 @@
- +2015-07-18 Mats Erik Andersson <gnu@gisladisker.se>
- +
- + ifconfig: Improve the support for GNU/Hurd.
- + Add system specific abilities, including parsing of command
- + line and hardware addresses.
- +
- + * ifconfig/system.h [__GNU__]: Include "system/hurd.h".
- + * ifconfig/system.c [__GNU__]: Include "system/hurd.c".
- + * ifconfig/system/Makefile.am (noinst_HEADERS): Add the
- + files `hurd.h' and `hurd.c'.
- + * ifconfig/system/hurd.h, ifconfig/system/hurd.c: New files.
- +
- + * ifconfig/system/generic.c: Include <unused-parameter.h>.
- + (system_parse_opt, system_parse_opt_rest, system_configure):
- + Apply _GL_UNUSED_PARAMETER to all arguments, as these functions
- + are placeholders and no-ops.
- +
- 2015-07-17 Mats Erik Andersson <gnu@gisladisker.se>
-
- ifconfig: Sporadically appearing regression.
- diff --git a/ifconfig/system.c b/ifconfig/system.c
- index 30677e41..e108dc2e 100644
- --- a/ifconfig/system.c
- +++ b/ifconfig/system.c
- @@ -25,10 +25,12 @@
- # include "system/solaris.c"
- #elif defined __QNX__
- # include "system/qnx.c"
- -# elif defined __DragonFly__ || defined __FreeBSD__ || \
- - defined __FreeBSD_kernel__ || \
- - defined __NetBSD__ || defined __OpenBSD__
- -# include "system/bsd.c"
- +#elif defined __DragonFly__ || defined __FreeBSD__ || \
- + defined __FreeBSD_kernel__ || \
- + defined __NetBSD__ || defined __OpenBSD__
- +# include "system/bsd.c"
- +#elif defined __GNU__
- +# include "system/hurd.c"
- #else
- # include "system/generic.c"
- #endif
- diff --git a/ifconfig/system.h b/ifconfig/system.h
- index 8521ad95..66878d3a 100644
- --- a/ifconfig/system.h
- +++ b/ifconfig/system.h
- @@ -97,6 +97,8 @@ extern struct if_nameindex* (*system_if_nameindex) (void);
- defined __FreeBSD_kernel__ || \
- defined __NetBSD__ || defined __OpenBSD__
- # include "system/bsd.h"
- +# elif defined __GNU__
- +# include "system/hurd.h"
- # else
- # include "system/generic.h"
- # endif
- diff --git a/ifconfig/system/Makefile.am b/ifconfig/system/Makefile.am
- index 954c6774..62a9f1c4 100644
- --- a/ifconfig/system/Makefile.am
- +++ b/ifconfig/system/Makefile.am
- @@ -26,8 +26,10 @@ noinst_HEADERS = \
- linux.h \
- solaris.h \
- qnx.h \
- + hurd.h \
- bsd.c \
- generic.c \
- linux.c \
- solaris.c \
- - qnx.c
- + qnx.c \
- + hurd.c
- diff --git a/ifconfig/system/generic.c b/ifconfig/system/generic.c
- index 9a2bda55..20a78bde 100644
- --- a/ifconfig/system/generic.c
- +++ b/ifconfig/system/generic.c
- @@ -22,6 +22,8 @@
- #include <config.h>
-
- #include "../ifconfig.h"
- +
- +#include <unused-parameter.h>
-
-
- /* Output format stuff. */
- @@ -36,19 +38,25 @@ const char *system_help;
- struct argp_child system_argp_child;
-
- int
- -system_parse_opt (struct ifconfig **ifp, char option, char *optarg)
- +system_parse_opt (struct ifconfig **ifp _GL_UNUSED_PARAMETER,
- + char option _GL_UNUSED_PARAMETER,
- + char *optarg _GL_UNUSED_PARAMETER)
- {
- return 0;
- }
-
- int
- -system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
- +system_parse_opt_rest (struct ifconfig **ifp _GL_UNUSED_PARAMETER,
- + int argc _GL_UNUSED_PARAMETER,
- + char *argv[] _GL_UNUSED_PARAMETER)
- {
- return 0;
- }
-
- int
- -system_configure (int sfd, struct ifreq *ifr, struct system_ifconfig *ifs)
- +system_configure (int sfd _GL_UNUSED_PARAMETER,
- + struct ifreq *ifr _GL_UNUSED_PARAMETER,
- + struct system_ifconfig *ifs _GL_UNUSED_PARAMETER)
- {
- return 0;
- }
- diff --git a/ifconfig/system/hurd.c b/ifconfig/system/hurd.c
- new file mode 100644
- index 00000000..3bd19775
- --- /dev/null
- +++ b/ifconfig/system/hurd.c
- @@ -0,0 +1,292 @@
- +/* hurd.c -- Code for ifconfig specific to GNU/Hurd.
- + Copyright (C) 2015 Free Software Foundation, Inc.
- +
- + This file is part of GNU Inetutils.
- +
- + GNU Inetutils is free software: you can redistribute it and/or modify
- + it under the terms of the GNU General Public License as published by
- + the Free Software Foundation, either version 3 of the License, or (at
- + your option) any later version.
- +
- + GNU Inetutils 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
- + General Public License for more details.
- +
- + You should have received a copy of the GNU General Public License
- + along with this program. If not, see `http://www.gnu.org/licenses/'. */
- +
- +/* Mostly written by Marcus Brinkmann.
- + Adaptions to GNU/Hurd by Mats Erik Andersson. */
- +
- +#include <config.h>
- +
- +#include <stdlib.h>
- +#include <sys/ioctl.h>
- +#include <net/if_arp.h>
- +#include "../ifconfig.h"
- +
- +#include <unused-parameter.h>
- +
- +
- +/* Output format stuff. */
- +
- +const char *system_default_format = "gnu";
- +
- +
- +/* Argument parsing stuff. */
- +
- +const char *system_help = "NAME [ADDR]\
- + [broadcast BRDADDR] [netmask MASK]\
- + [mtu N] [up|down] [FLAGS]";
- +
- +struct argp_child system_argp_child;
- +
- +int
- +system_parse_opt (struct ifconfig **ifp _GL_UNUSED_PARAMETER,
- + char option _GL_UNUSED_PARAMETER,
- + char *optarg _GL_UNUSED_PARAMETER)
- +{
- + return 0;
- +}
- +
- +int
- +system_parse_opt_rest (struct ifconfig **ifp, int argc, char *argv[])
- +{
- + int i = 0, mask, rev;
- + enum {
- + EXPECT_NOTHING,
- + EXPECT_AF,
- + EXPECT_BROADCAST,
- + EXPECT_NETMASK,
- + EXPECT_METRIC,
- + EXPECT_MTU
- + } expect = EXPECT_AF;
- +
- + *ifp = parse_opt_new_ifs (argv[0]);
- +
- + while (++i < argc)
- + {
- + switch (expect)
- + {
- + case EXPECT_BROADCAST:
- + parse_opt_set_brdaddr (*ifp, argv[i]);
- + break;
- +
- + case EXPECT_NETMASK:
- + parse_opt_set_netmask (*ifp, argv[i]);
- + break;
- +
- + case EXPECT_MTU:
- + parse_opt_set_mtu (*ifp, argv[i]);
- + break;
- +
- + /* XXX: 2015-07-18, GNU/Hurd does not yet support
- + ioctl(SIOCSIFMETRIC), but we let the code
- + handle this standard ability anyway!
- + */
- + case EXPECT_METRIC:
- + parse_opt_set_metric (*ifp, argv[i]);
- + break;
- +
- + case EXPECT_AF:
- + expect = EXPECT_NOTHING;
- + if (!strcmp (argv[i], "inet"))
- + continue;
- + else if (!strcmp (argv[i], "inet6"))
- + {
- + error (0, 0, "%s is not a supported address family", argv[i]);
- + return 0;
- + }
- + break;
- +
- + case EXPECT_NOTHING:
- + break;
- + }
- +
- + if (expect != EXPECT_NOTHING)
- + expect = EXPECT_NOTHING;
- + else if (!strcmp (argv[i], "broadcast"))
- + expect = EXPECT_BROADCAST;
- + else if (!strcmp (argv[i], "netmask"))
- + expect = EXPECT_NETMASK;
- + else if (!strcmp (argv[i], "metric"))
- + expect = EXPECT_METRIC;
- + else if (!strcmp (argv[i], "mtu"))
- + expect = EXPECT_MTU;
- + else if (!strcmp (argv[i], "up"))
- + parse_opt_set_flag (*ifp, IFF_UP | IFF_RUNNING, 0);
- + else if (!strcmp (argv[i], "down"))
- + parse_opt_set_flag (*ifp, IFF_UP, 1);
- + else if (((mask = if_nameztoflag (argv[i], &rev))
- + & ~IU_IFF_CANTCHANGE) != 0)
- + parse_opt_set_flag (*ifp, mask, rev);
- + else
- + {
- + if (!((*ifp)->valid & IF_VALID_ADDR))
- + parse_opt_set_address (*ifp, argv[i]);
- + else if (!((*ifp)->valid & IF_VALID_DSTADDR))
- + parse_opt_set_dstaddr (*ifp, argv[i]);
- + }
- + }
- +
- + switch (expect)
- + {
- + case EXPECT_BROADCAST:
- + error (0, 0, "option `broadcast' requires an argument");
- + break;
- +
- + case EXPECT_NETMASK:
- + error (0, 0, "option `netmask' requires an argument");
- + break;
- +
- + case EXPECT_METRIC:
- + error (0, 0, "option `metric' requires an argument");
- + break;
- +
- + case EXPECT_MTU:
- + error (0, 0, "option `mtu' requires an argument");
- + break;
- +
- + case EXPECT_AF:
- + case EXPECT_NOTHING:
- + return 1;
- + }
- +
- + return 0;
- +}
- +
- +int
- +system_configure (int sfd _GL_UNUSED_PARAMETER,
- + struct ifreq *ifr _GL_UNUSED_PARAMETER,
- + struct system_ifconfig *ifs _GL_UNUSED_PARAMETER)
- +{
- + return 0;
- +}
- +
- +struct if_nameindex* (*system_if_nameindex) (void) = if_nameindex;
- +
- +static void
- +print_hwaddr_ether (format_data_t form _GL_UNUSED_PARAMETER,
- + unsigned char *data)
- +{
- + *column += printf ("%02X:%02X:%02X:%02X:%02X:%02X",
- + data[0], data[1], data[2], data[3], data[4], data[5]);
- + had_output = 1;
- +}
- +
- +struct arphrd_symbol
- +{
- + const char *name;
- + const char *title;
- + int value;
- + void (*print_hwaddr) (format_data_t form, unsigned char *data);
- +} arphrd_symbols[] =
- + {
- +#ifdef ARPHRD_ETHER /* Ethernet 10/100Mbps. */
- + { "ETHER", "Ethernet", ARPHRD_ETHER, print_hwaddr_ether},
- +#endif
- +#ifdef ARPHRD_LOOPBACK /* Loopback device. */
- + { "LOOPBACK", "Local Loopback", ARPHRD_LOOPBACK, NULL},
- +#endif
- + /* XXX: The image debian-hurd-20150424 returns the value 4
- + instead of expected ARPHRD_LOOPBACK. This has been
- + discussed in the list debian-hurd, where I was asked
- + to resist the temptation of a work around!
- + */
- + { NULL, NULL, 0, NULL}
- + };
- +
- +struct arphrd_symbol *
- +arphrd_findvalue (int value)
- +{
- + struct arphrd_symbol *arp = arphrd_symbols;
- + while (arp->name != NULL)
- + {
- + if (arp->value == value)
- + break;
- + arp++;
- + }
- + if (arp->name)
- + return arp;
- + else
- + return NULL;
- +}
- +
- +void
- +system_fh_hwaddr_query (format_data_t form, int argc, char *argv[])
- +{
- +#ifdef SIOCGIFHWADDR
- + struct arphrd_symbol *arp;
- +
- + if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) < 0)
- + select_arg (form, argc, argv, 1);
- +
- + arp = arphrd_findvalue (form->ifr->ifr_hwaddr.sa_family);
- + select_arg (form, argc, argv, (arp && arp->print_hwaddr) ? 0 : 1);
- +#else
- + select_arg (form, argc, argv, 1);
- +#endif
- +}
- +
- +void
- +system_fh_hwaddr (format_data_t form, int argc _GL_UNUSED_PARAMETER,
- + char *argv[] _GL_UNUSED_PARAMETER)
- +{
- +#ifdef SIOCGIFHWADDR
- + if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) < 0)
- + error (EXIT_FAILURE, errno,
- + "SIOCGIFHWADDR failed for interface `%s'",
- + form->ifr->ifr_name);
- + else
- + {
- + struct arphrd_symbol *arp;
- +
- + arp = arphrd_findvalue (form->ifr->ifr_hwaddr.sa_family);
- + if (arp && arp->print_hwaddr)
- + arp->print_hwaddr (form,
- + (unsigned char *) form->ifr->ifr_hwaddr.sa_data);
- + else
- + put_string (form, "(hwaddr unknown)");
- + }
- +#else
- + *column += printf ("(not available)");
- + had_output = 1;
- +#endif
- +}
- +
- +void
- +system_fh_hwtype_query (format_data_t form, int argc, char *argv[])
- +{
- +#ifdef SIOCGIFHWADDR
- + if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) >= 0)
- + select_arg (form, argc, argv, 0);
- + else
- +#endif
- + select_arg (form, argc, argv, 1);
- +}
- +
- +void
- +system_fh_hwtype (format_data_t form, int argc _GL_UNUSED_PARAMETER,
- + char *argv[] _GL_UNUSED_PARAMETER)
- +{
- +#ifdef SIOCGIFHWADDR
- + if (ioctl (form->sfd, SIOCGIFHWADDR, form->ifr) < 0)
- + error (EXIT_FAILURE, errno,
- + "SIOCGIFHWADDR failed for interface `%s'",
- + form->ifr->ifr_name);
- + else
- + {
- + struct arphrd_symbol *arp;
- +
- + arp = arphrd_findvalue (form->ifr->ifr_hwaddr.sa_family);
- + if (arp)
- + put_string (form, arp->title);
- + else
- + put_string (form, "(hwtype unknown)");
- + }
- +#else
- + *column += printf ("(not available)");
- + had_output = 1;
- +#endif
- +}
- diff --git a/ifconfig/system/hurd.h b/ifconfig/system/hurd.h
- new file mode 100644
- index 00000000..bab14565
- --- /dev/null
- +++ b/ifconfig/system/hurd.h
- @@ -0,0 +1,50 @@
- +/*
- + Copyright (C) 2015 Free Software Foundation, Inc.
- +
- + This file is part of GNU Inetutils.
- +
- + GNU Inetutils is free software: you can redistribute it and/or modify
- + it under the terms of the GNU General Public License as published by
- + the Free Software Foundation, either version 3 of the License, or (at
- + your option) any later version.
- +
- + GNU Inetutils 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
- + General Public License for more details.
- +
- + You should have received a copy of the GNU General Public License
- + along with this program. If not, see `http://www.gnu.org/licenses/'. */
- +
- +/* Written by Mats Erik Andersson. */
- +
- +#ifndef IFCONFIG_SYSTEM_HURD_H
- +# define IFCONFIG_SYSTEM_HURD_H
- +
- +# include "../printif.h"
- +# include "../options.h"
- +
- +
- +/* Option support. */
- +
- +struct system_ifconfig
- +{
- + int valid;
- +};
- +
- +
- +/* Output format support. */
- +
- +# define SYSTEM_FORMAT_HANDLER \
- + { "hurd", fh_nothing}, \
- + { "hwaddr?", system_fh_hwaddr_query}, \
- + { "hwaddr", system_fh_hwaddr}, \
- + { "hwtype?", system_fh_hwtype_query}, \
- + { "hwtype", system_fh_hwtype},
- +
- +void system_fh_hwaddr_query (format_data_t form, int argc, char *argv[]);
- +void system_fh_hwaddr (format_data_t form, int argc, char *argv[]);
- +void system_fh_hwtype_query (format_data_t form, int argc, char *argv[]);
- +void system_fh_hwtype (format_data_t form, int argc, char *argv[]);
- +
- +#endif /* !IFCONFIG_SYSTEM_HURD_H */
- --
- 2.26.0.292.g33ef6b2f38
|